Add preview in icon settings
This commit is contained in:
parent
fee45590d1
commit
87acb161c7
@ -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),
|
||||||
|
|||||||
@ -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(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user