diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheetVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheetVM.kt index 30b85c39..efa1fa06 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheetVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheetVM.kt @@ -57,9 +57,7 @@ class CustomizeSearchableSheetVM( val iconSearchResults = mutableStateOf(emptyList()) val isSearchingIcons = mutableStateOf(false) - val installedIconPacks = flow { - emit(iconRepository.getInstalledIconPacks().sortedBy { it.name }) - } + val installedIconPacks = iconRepository.getInstalledIconPacks() private var debounceSearchJob: Job? = null suspend fun searchIcon(query: String, iconPack: IconPack?) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt index 93b92867..843fb290 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt @@ -25,6 +25,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState @@ -248,7 +249,7 @@ fun AppearanceSettingsScreen() { ) val iconPackPackage by viewModel.iconPack.observeAsState() - val installedIconPacks by viewModel.installedIconPacks.observeAsState(emptyList()) + val installedIconPacks by viewModel.installedIconPacks.collectAsState(emptyList()) val iconPack by remember { derivedStateOf { installedIconPacks.firstOrNull { it.packageName == iconPackPackage } } } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt index deed068d..7daa4916 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt @@ -5,16 +5,21 @@ import android.content.Intent import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity import androidx.core.content.getSystemService -import androidx.lifecycle.* +import androidx.lifecycle.ViewModel +import androidx.lifecycle.asLiveData +import androidx.lifecycle.viewModelScope import de.mm20.launcher2.icons.IconPack import de.mm20.launcher2.icons.IconRepository import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.preferences.LauncherDataStore import de.mm20.launcher2.preferences.Settings -import de.mm20.launcher2.preferences.Settings.AppearanceSettings.* +import de.mm20.launcher2.preferences.Settings.AppearanceSettings.ColorScheme +import de.mm20.launcher2.preferences.Settings.AppearanceSettings.Font +import de.mm20.launcher2.preferences.Settings.AppearanceSettings.Theme import de.mm20.launcher2.preferences.Settings.SearchBarSettings import de.mm20.launcher2.preferences.Settings.SearchBarSettings.SearchBarColors import de.mm20.launcher2.preferences.Settings.SystemBarsSettings +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import org.koin.core.component.KoinComponent @@ -193,18 +198,14 @@ class AppearanceSettingsScreenVM : ViewModel(), KoinComponent { } } - val installedIconPacks: LiveData> = liveData { - emit( - listOf( - IconPack( - name = "System", - packageName = "", - version = "", - ) - ) + - iconRepository.getInstalledIconPacks() - ) - } + val installedIconPacks: Flow> = iconRepository.getInstalledIconPacks().map { + listOf(IconPack( + name = "System", + packageName = "", + version = "", + )) + it + } + val iconPack = dataStore.data.map { it.icons.iconPack }.asLiveData() fun setIconPack(iconPack: String) { viewModelScope.launch { diff --git a/core/database/src/main/java/de/mm20/launcher2/database/IconDao.kt b/core/database/src/main/java/de/mm20/launcher2/database/IconDao.kt index 0cb17589..a6a9a14c 100644 --- a/core/database/src/main/java/de/mm20/launcher2/database/IconDao.kt +++ b/core/database/src/main/java/de/mm20/launcher2/database/IconDao.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData import androidx.room.* import de.mm20.launcher2.database.entities.IconEntity import de.mm20.launcher2.database.entities.IconPackEntity +import kotlinx.coroutines.flow.Flow internal val AppTypes = listOf("app", "calendar", "clock") @@ -33,8 +34,8 @@ interface IconDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun installIconPack(iconPack: IconPackEntity) - @Query("SELECT * FROM IconPack") - suspend fun getInstalledIconPacks(): List + @Query("SELECT * FROM IconPack ORDER BY name ASC") + fun getInstalledIconPacks(): Flow> @Query("SELECT * FROM IconPack WHERE packageName = :packageName LIMIT 1") suspend fun getIconPack(packageName: String): IconPackEntity? diff --git a/services/icons/src/main/java/de/mm20/launcher2/icons/IconPackManager.kt b/services/icons/src/main/java/de/mm20/launcher2/icons/IconPackManager.kt index 873c64bb..e0126330 100644 --- a/services/icons/src/main/java/de/mm20/launcher2/icons/IconPackManager.kt +++ b/services/icons/src/main/java/de/mm20/launcher2/icons/IconPackManager.kt @@ -24,6 +24,8 @@ import de.mm20.launcher2.icons.loaders.GrayscaleMapIconPackInstaller import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.ktx.randomElementOrNull import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.withContext import kotlin.math.roundToInt @@ -33,11 +35,9 @@ class IconPackManager( private val context: Context, private val appDatabase: AppDatabase, ) { - suspend fun getInstalledIconPacks(): List { - return withContext(Dispatchers.IO) { - appDatabase.iconDao().getInstalledIconPacks().map { - IconPack(it) - } + fun getInstalledIconPacks(): Flow> { + return appDatabase.iconDao().getInstalledIconPacks().map { + it.map { IconPack(it) } } } @@ -375,6 +375,7 @@ class IconPackManager( backgroundLayer = ColorLayer(), ) } + icon.themed -> { StaticLauncherIcon( foregroundLayer = TintedClockLayer( @@ -387,6 +388,7 @@ class IconPackManager( backgroundLayer = ColorLayer(), ) } + drawable is AdaptiveIconDrawable -> { StaticLauncherIcon( foregroundLayer = ClockLayer( @@ -402,6 +404,7 @@ class IconPackManager( ), ) } + else -> { StaticLauncherIcon( foregroundLayer = ClockLayer( diff --git a/services/icons/src/main/java/de/mm20/launcher2/icons/IconRepository.kt b/services/icons/src/main/java/de/mm20/launcher2/icons/IconRepository.kt index 9bf3b004..b5fa2914 100644 --- a/services/icons/src/main/java/de/mm20/launcher2/icons/IconRepository.kt +++ b/services/icons/src/main/java/de/mm20/launcher2/icons/IconRepository.kt @@ -229,7 +229,7 @@ class IconRepository( } } - suspend fun getInstalledIconPacks(): List { + fun getInstalledIconPacks(): Flow> { return iconPackManager.getInstalledIconPacks() }