From 87acb161c7c0bcc1ec8846bad9b6cf89f5ef5185 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 15 Jul 2023 21:33:38 +0200 Subject: [PATCH] Add preview in icon settings --- .../ui/settings/icons/IconsSettingsScreen.kt | 34 +++++++++++++++++++ .../settings/icons/IconsSettingsScreenVM.kt | 25 ++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreen.kt index e7d9c56a..e3556601 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreen.kt @@ -3,6 +3,7 @@ package de.mm20.launcher2.ui.settings.icons import android.graphics.drawable.ColorDrawable import androidx.appcompat.app.AppCompatActivity import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -23,6 +24,7 @@ import androidx.compose.material3.FilledIconToggleButton import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedCard import androidx.compose.material3.PlainTooltipBox import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -37,6 +39,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow @@ -60,6 +63,7 @@ import de.mm20.launcher2.ui.component.preferences.SliderPreference import de.mm20.launcher2.ui.component.preferences.SwitchPreference import de.mm20.launcher2.ui.component.preferences.label import de.mm20.launcher2.ui.component.preferences.value +import de.mm20.launcher2.ui.ktx.toPixels @Composable fun IconsSettingsScreen() { @@ -67,6 +71,7 @@ fun IconsSettingsScreen() { val context = LocalContext.current val iconSize by viewModel.iconSize.collectAsStateWithLifecycle(48) + val density = LocalDensity.current val showLabels by viewModel.showLabels.collectAsStateWithLifecycle(null) val columnCount by viewModel.columnCount.collectAsStateWithLifecycle(5) val iconShape by viewModel.iconShape.collectAsStateWithLifecycle(Settings.IconSettings.IconShape.PlatformDefault) @@ -84,6 +89,12 @@ fun IconsSettingsScreen() { val cloudFileBadges by viewModel.cloudFileBadges.collectAsStateWithLifecycle(null) val suspendedAppBadges by viewModel.suspendedAppBadges.collectAsStateWithLifecycle(null) val shortcutBadges by viewModel.shortcutBadges.collectAsStateWithLifecycle(null) + + val previewIcons by remember(iconSize) { + viewModel.getPreviewIcons(with(density) { iconSize.dp.toPx() }.toInt()) + }.collectAsState( + emptyList() + ) PreferenceScreen(title = stringResource(id = R.string.preference_screen_icons)) { item { @@ -119,6 +130,29 @@ fun IconsSettingsScreen() { } item { PreferenceCategory(stringResource(R.string.preference_category_icons)) { + if (previewIcons.isNotEmpty()) { + Surface( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + shape = MaterialTheme.shapes.medium, + color = MaterialTheme.colorScheme.surfaceContainer, + border = BorderStroke(1.dp, MaterialTheme.colorScheme.outlineVariant) + ) { + Row( + modifier = Modifier.padding(vertical = 24.dp, horizontal = 8.dp) + ) { + for (icon in previewIcons) { + Box( + modifier = Modifier.weight(1f), + contentAlignment = Alignment.Center + ) { + ShapedLauncherIcon(size = iconSize.dp, icon = { icon }) + } + } + } + } + } IconShapePreference( title = stringResource(R.string.preference_icon_shape), summary = getShapeName(iconShape), diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreenVM.kt index 033039bc..c9723d09 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreenVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/icons/IconsSettingsScreenVM.kt @@ -7,11 +7,16 @@ import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory import de.mm20.launcher2.icons.IconPack import de.mm20.launcher2.icons.IconService +import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.permissions.PermissionGroup import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.preferences.LauncherDataStore import de.mm20.launcher2.preferences.Settings +import de.mm20.launcher2.search.data.LauncherApp +import de.mm20.launcher2.services.favorites.FavoritesService import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import org.koin.core.component.KoinComponent @@ -20,6 +25,7 @@ import org.koin.core.component.get class IconsSettingsScreenVM( private val dataStore: LauncherDataStore, private val iconService: IconService, + private val favoritesService: FavoritesService, private val permissionsManager: PermissionsManager, ) : ViewModel() { @@ -215,6 +221,24 @@ class IconsSettingsScreenVM( } } + fun getPreviewIcons(size: Int): Flow> { + return columnCount.flatMapLatest { cols -> + favoritesService.getFavorites( + includeTypes = listOf(LauncherApp.Domain), + limit = cols, + manuallySorted = true, + automaticallySorted = true, + frequentlyUsed = true, + ) + }.flatMapLatest { apps -> + combine(apps.map { + iconService.getIcon(it, size) + }) { + it.toList() + } + } + } + companion object : KoinComponent { val Factory = viewModelFactory { initializer { @@ -222,6 +246,7 @@ class IconsSettingsScreenVM( dataStore = get(), iconService = get(), permissionsManager = get(), + favoritesService = get(), ) } }