Add preview in icon settings

This commit is contained in:
MM20 2023-07-15 21:33:38 +02:00
parent fee45590d1
commit 87acb161c7
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
2 changed files with 59 additions and 0 deletions

View File

@ -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),

View File

@ -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<List<LauncherIcon>> {
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(),
)
}
}