Migrate grid column count preference

This commit is contained in:
MM20 2022-01-25 21:21:46 +01:00
parent 8799c15682
commit b01f9d3f4d
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
8 changed files with 149 additions and 94 deletions

View File

@ -4,6 +4,7 @@ import android.content.Context
import de.mm20.launcher2.database.AppDatabase
import de.mm20.launcher2.database.entities.FavoritesItemEntity
import de.mm20.launcher2.ktx.ceilToInt
import de.mm20.launcher2.preferences.LauncherDataStore
import de.mm20.launcher2.preferences.LauncherPreferences
import de.mm20.launcher2.search.SearchableDeserializer
import de.mm20.launcher2.search.data.CalendarEvent
@ -33,7 +34,8 @@ interface FavoritesRepository {
internal class FavoritesRepositoryImpl(
private val context: Context,
private val database: AppDatabase
private val database: AppDatabase,
private val dataStore: LauncherDataStore
) : FavoritesRepository, KoinComponent {
private val scope = CoroutineScope(Job() + Dispatchers.Default)
@ -42,16 +44,7 @@ internal class FavoritesRepositoryImpl(
withContext(Dispatchers.IO) {
val gridColumns = callbackFlow {
send(LauncherPreferences.instance.gridColumnCount)
val unregister =
LauncherPreferences.instance.doOnPreferenceChange("grid_column_count") {
trySendBlocking(LauncherPreferences.instance.gridColumnCount)
}
awaitClose {
unregister()
}
}
val gridColumns = dataStore.data.map { it.grid.columnCount }.distinctUntilChanged()
val dao = database.searchDao()
val pinnedFavorites = dao.getFavorites().map {

View File

@ -91,5 +91,5 @@ val favoritesModule = module {
return@factory NullDeserializer()
}
single<FavoritesRepository> { FavoritesRepositoryImpl(androidContext(), get()) }
single<FavoritesRepository> { FavoritesRepositoryImpl(androidContext(), get(), get()) }
}

View File

@ -4,81 +4,101 @@ import android.content.Context
fun createFactorySettings(context: Context): Settings {
return Settings.newBuilder()
.setAppearance(Settings.AppearanceSettings
.newBuilder()
.setTheme(Settings.AppearanceSettings.Theme.System)
.setColorScheme(Settings.AppearanceSettings.ColorScheme.Default)
.build()
.setAppearance(
Settings.AppearanceSettings
.newBuilder()
.setTheme(Settings.AppearanceSettings.Theme.System)
.setColorScheme(Settings.AppearanceSettings.ColorScheme.Default)
.build()
)
.setWeather(Settings.WeatherSettings
.newBuilder()
.setProvider(Settings.WeatherSettings.WeatherProvider.MetNo)
.setImperialUnits(context.resources.getBoolean(R.bool.default_imperialUnits))
.build()
.setWeather(
Settings.WeatherSettings
.newBuilder()
.setProvider(Settings.WeatherSettings.WeatherProvider.MetNo)
.setImperialUnits(context.resources.getBoolean(R.bool.default_imperialUnits))
.build()
)
.setMusicWidget(Settings.MusicWidgetSettings
.newBuilder()
.setFilterSources(true)
.build()
.setMusicWidget(
Settings.MusicWidgetSettings
.newBuilder()
.setFilterSources(true)
.build()
)
.setCalendarWidget(Settings.CalendarWidgetSettings
.newBuilder()
.setHideAlldayEvents(false)
.setCalendarWidget(
Settings.CalendarWidgetSettings
.newBuilder()
.setHideAlldayEvents(false)
)
.setClockWidget(Settings.ClockWidgetSettings
.newBuilder()
.setLayout(Settings.ClockWidgetSettings.ClockWidgetLayout.Vertical)
.setClockStyle(Settings.ClockWidgetSettings.ClockStyle.DigitalClock1)
.build()
.setClockWidget(
Settings.ClockWidgetSettings
.newBuilder()
.setLayout(Settings.ClockWidgetSettings.ClockWidgetLayout.Vertical)
.setClockStyle(Settings.ClockWidgetSettings.ClockStyle.DigitalClock1)
.build()
)
.setFavorites(Settings.FavoritesSettings
.newBuilder()
.setEnabled(true)
.setFavorites(
Settings.FavoritesSettings
.newBuilder()
.setEnabled(true)
)
.setFileSearch(Settings.FilesSearchSettings
.newBuilder()
.setLocalFiles(true)
.setNextcloud(false)
.setGdrive(false)
.setOnedrive(false)
.setNextcloud(false)
.setFileSearch(
Settings.FilesSearchSettings
.newBuilder()
.setLocalFiles(true)
.setNextcloud(false)
.setGdrive(false)
.setOnedrive(false)
.setNextcloud(false)
)
.setContactsSearch(Settings.ContactsSearchSettings
.newBuilder()
.setEnabled(true)
.setContactsSearch(
Settings.ContactsSearchSettings
.newBuilder()
.setEnabled(true)
)
.setCalendarSearch(Settings.CalendarSearchSettings
.newBuilder()
.setEnabled(true)
.setCalendarSearch(
Settings.CalendarSearchSettings
.newBuilder()
.setEnabled(true)
)
.setCalculatorSearch(Settings.CalculatorSearchSettings
.newBuilder()
.setEnabled(true)
.setCalculatorSearch(
Settings.CalculatorSearchSettings
.newBuilder()
.setEnabled(true)
)
.setUnitConverterSearch(Settings.UnitConverterSearchSettings
.newBuilder()
.setEnabled(true)
.setUnitConverterSearch(
Settings.UnitConverterSearchSettings
.newBuilder()
.setEnabled(true)
)
.setWikipediaSearch(Settings.WikipediaSearchSettings
.newBuilder()
.setEnabled(false)
.setImages(false)
.setCustomUrl("")
.setWikipediaSearch(
Settings.WikipediaSearchSettings
.newBuilder()
.setEnabled(false)
.setImages(false)
.setCustomUrl("")
)
.setWebsiteSearch(Settings.WebsiteSearchSettings
.newBuilder()
.setEnabled(false)
.setWebsiteSearch(
Settings.WebsiteSearchSettings
.newBuilder()
.setEnabled(false)
)
.setWebSearch(Settings.WebSearchSettings
.newBuilder()
.setEnabled(true)
.setWebSearch(
Settings.WebSearchSettings
.newBuilder()
.setEnabled(true)
)
.setBadges(Settings.BadgeSettings
.newBuilder()
.setNotifications(true)
.setCloudFiles(true)
.setShortcuts(true)
.setSuspendedApps(true)
.setBadges(
Settings.BadgeSettings
.newBuilder()
.setNotifications(true)
.setCloudFiles(true)
.setShortcuts(true)
.setSuspendedApps(true)
)
.setGrid(
Settings.GridSettings.newBuilder()
.setColumnCount(context.resources.getInteger(R.integer.config_columnCount))
.build()
)
.build()
}

View File

@ -74,19 +74,6 @@ class LauncherPreferences(val context: Application, version: Int = 3) {
var easterEggEnabled by BooleanPreference("easter_egg", default = false)
var gridColumnCount by IntPreference("grid_column_count", default = context.resources.getInteger(R.integer.config_columnCount))
fun doOnPreferenceChange(vararg keys: String, action: (String) -> Unit): () -> Unit {
val listener = { _: SharedPreferences, key: String ->
if (keys.contains(key)) action(key)
}
preferences.registerOnSharedPreferenceChangeListener(listener)
return {
preferences.unregisterOnSharedPreferenceChangeListener(listener)
}
}
companion object {
lateinit var instance: LauncherPreferences
fun initialize(app: Application) {

View File

@ -117,4 +117,9 @@ message Settings {
}
BadgeSettings badges = 18;
message GridSettings {
uint32 column_count = 1;
}
GridSettings grid = 19;
}

View File

@ -6,36 +6,61 @@ import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import androidx.core.view.children
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListUpdateCallback
import de.mm20.launcher2.ktx.ceilToInt
import de.mm20.launcher2.ktx.lifecycleOwner
import de.mm20.launcher2.ktx.lifecycleScope
import de.mm20.launcher2.legacy.helper.ActivityStarter
import de.mm20.launcher2.legacy.helper.ActivityStarterCallback
import de.mm20.launcher2.preferences.LauncherDataStore
import de.mm20.launcher2.preferences.LauncherPreferences
import de.mm20.launcher2.search.data.Searchable
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.legacy.searchable.SearchableView
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ObsoleteCoroutinesApi
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.actor
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import java.util.*
import kotlin.math.min
class SearchGridView : ViewGroup, ActivityStarterCallback {
class SearchGridView : ViewGroup, ActivityStarterCallback, KoinComponent {
override fun onResume() {
while (postponedDiffs.isNotEmpty()) {
postponedDiffs.poll()?.let { applyDiff(it, true) }
}
}
val dataStore: LauncherDataStore by inject()
var job: Job? = null
override fun onAttachedToWindow() {
super.onAttachedToWindow()
job?.cancel()
lifecycleScope.launch {
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
dataStore.data.map { it.grid.columnCount }.distinctUntilChanged().collectLatest {
columnCount = it
}
}
}
}
var columnCount: Int = 1
set(value) {
if (value > 0) field = value
if (value > 0) {
field = value
requestLayout()
}
else throw IllegalArgumentException("columnCount must be positive (is $value)")
}
@ -100,8 +125,9 @@ class SearchGridView : ViewGroup, ActivityStarterCallback {
}
init {
columnCount = LauncherPreferences.instance.gridColumnCount.takeIf { it > 1 }
?: context.resources.getInteger(R.integer.config_columnCount)
columnCount = runBlocking {
dataStore.data.map { it.grid.columnCount }.first().takeIf { it > 0 } ?: 5
}
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {

View File

@ -45,6 +45,19 @@ fun AppearanceSettingsScreen() {
}
)
}
PreferenceCategory(title = stringResource(R.string.preference_category_grid)) {
val columnCount by viewModel.columnCount.observeAsState()
ListPreference(
title = stringResource(R.string.preference_grid_column_count),
items = (3..8).map {
it.toString() to it
},
value = columnCount,
onValueChanged = {
if (it != null) viewModel.setColumnCount(it)
}
)
}
}
}
}

View File

@ -35,4 +35,15 @@ class AppearanceSettingsScreenVM : ViewModel(), KoinComponent {
}
}
}
val columnCount = dataStore.data.map { it.grid.columnCount }.asLiveData()
fun setColumnCount(columnCount: Int) {
viewModelScope.launch {
dataStore.updateData {
it.toBuilder()
.setGrid(it.grid.toBuilder().setColumnCount(columnCount))
.build()
}
}
}
}