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 android.graphics.drawable.ColorDrawable
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
@ -23,6 +24,7 @@ import androidx.compose.material3.FilledIconToggleButton
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedCard
import androidx.compose.material3.PlainTooltipBox import androidx.compose.material3.PlainTooltipBox
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
@ -37,6 +39,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.alpha
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow 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.SwitchPreference
import de.mm20.launcher2.ui.component.preferences.label import de.mm20.launcher2.ui.component.preferences.label
import de.mm20.launcher2.ui.component.preferences.value import de.mm20.launcher2.ui.component.preferences.value
import de.mm20.launcher2.ui.ktx.toPixels
@Composable @Composable
fun IconsSettingsScreen() { fun IconsSettingsScreen() {
@ -67,6 +71,7 @@ fun IconsSettingsScreen() {
val context = LocalContext.current val context = LocalContext.current
val iconSize by viewModel.iconSize.collectAsStateWithLifecycle(48) val iconSize by viewModel.iconSize.collectAsStateWithLifecycle(48)
val density = LocalDensity.current
val showLabels by viewModel.showLabels.collectAsStateWithLifecycle(null) val showLabels by viewModel.showLabels.collectAsStateWithLifecycle(null)
val columnCount by viewModel.columnCount.collectAsStateWithLifecycle(5) val columnCount by viewModel.columnCount.collectAsStateWithLifecycle(5)
val iconShape by viewModel.iconShape.collectAsStateWithLifecycle(Settings.IconSettings.IconShape.PlatformDefault) val iconShape by viewModel.iconShape.collectAsStateWithLifecycle(Settings.IconSettings.IconShape.PlatformDefault)
@ -84,6 +89,12 @@ fun IconsSettingsScreen() {
val cloudFileBadges by viewModel.cloudFileBadges.collectAsStateWithLifecycle(null) val cloudFileBadges by viewModel.cloudFileBadges.collectAsStateWithLifecycle(null)
val suspendedAppBadges by viewModel.suspendedAppBadges.collectAsStateWithLifecycle(null) val suspendedAppBadges by viewModel.suspendedAppBadges.collectAsStateWithLifecycle(null)
val shortcutBadges by viewModel.shortcutBadges.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)) { PreferenceScreen(title = stringResource(id = R.string.preference_screen_icons)) {
item { item {
@ -119,6 +130,29 @@ fun IconsSettingsScreen() {
} }
item { item {
PreferenceCategory(stringResource(R.string.preference_category_icons)) { 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( IconShapePreference(
title = stringResource(R.string.preference_icon_shape), title = stringResource(R.string.preference_icon_shape),
summary = getShapeName(iconShape), summary = getShapeName(iconShape),

View File

@ -7,11 +7,16 @@ import androidx.lifecycle.viewmodel.initializer
import androidx.lifecycle.viewmodel.viewModelFactory import androidx.lifecycle.viewmodel.viewModelFactory
import de.mm20.launcher2.icons.IconPack import de.mm20.launcher2.icons.IconPack
import de.mm20.launcher2.icons.IconService import de.mm20.launcher2.icons.IconService
import de.mm20.launcher2.icons.LauncherIcon
import de.mm20.launcher2.permissions.PermissionGroup import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.preferences.LauncherDataStore import de.mm20.launcher2.preferences.LauncherDataStore
import de.mm20.launcher2.preferences.Settings 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.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
@ -20,6 +25,7 @@ import org.koin.core.component.get
class IconsSettingsScreenVM( class IconsSettingsScreenVM(
private val dataStore: LauncherDataStore, private val dataStore: LauncherDataStore,
private val iconService: IconService, private val iconService: IconService,
private val favoritesService: FavoritesService,
private val permissionsManager: PermissionsManager, private val permissionsManager: PermissionsManager,
) : ViewModel() { ) : 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 { companion object : KoinComponent {
val Factory = viewModelFactory { val Factory = viewModelFactory {
initializer { initializer {
@ -222,6 +246,7 @@ class IconsSettingsScreenVM(
dataStore = get(), dataStore = get(),
iconService = get(), iconService = get(),
permissionsManager = get(), permissionsManager = get(),
favoritesService = get(),
) )
} }
} }