From ae2f7204fa08ee965e815ebee35fa281b7dc0bdc Mon Sep 17 00:00:00 2001 From: tarsin Date: Mon, 5 Jun 2023 01:09:41 +0800 Subject: [PATCH] Implement Compose SimpleMenuPreference 2 --- .../main/java/com/hippo/ehviewer/Settings.kt | 1 + .../com/hippo/ehviewer/SettingsCollector.kt | 22 +++++++++++++++++++ .../ehviewer/ui/settings/AdvancedScreen.kt | 8 ++++++- .../ehviewer/ui/settings/PreferenceWidgets.kt | 16 +++++++++++++- 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/hippo/ehviewer/SettingsCollector.kt diff --git a/app/src/main/java/com/hippo/ehviewer/Settings.kt b/app/src/main/java/com/hippo/ehviewer/Settings.kt index f85913b9b..1f0541edf 100755 --- a/app/src/main/java/com/hippo/ehviewer/Settings.kt +++ b/app/src/main/java/com/hippo/ehviewer/Settings.kt @@ -111,6 +111,7 @@ object Settings : DefaultPreferences() { var proxyIp by stringOrNullPref("proxy_ip", null) var dohUrl by stringPref("doh_url", "") + var language by stringPref("app_language", "system").apply { changesFlow().observe { updateWhenLocaleChanges() } } var lastDawnDay by longPref("last_dawn_day", 0) init { diff --git a/app/src/main/java/com/hippo/ehviewer/SettingsCollector.kt b/app/src/main/java/com/hippo/ehviewer/SettingsCollector.kt new file mode 100644 index 000000000..09f9cf6a6 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/SettingsCollector.kt @@ -0,0 +1,22 @@ +package com.hippo.ehviewer + +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.launch + +val collectScope = CoroutineScope(Dispatchers.Main + SupervisorJob()) + +fun Flow.observe(func: (Unit) -> Unit) = collectScope.launch { collect(func) } + +fun updateWhenLocaleChanges() { + val newValue = Settings.language + if ("system" == newValue) { + AppCompatDelegate.setApplicationLocales(LocaleListCompat.getEmptyLocaleList()) + } else { + AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(newValue)) + } +} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt index 422aa0ff9..fbdd4fae2 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/settings/AdvancedScreen.kt @@ -50,12 +50,18 @@ fun AdvancedScreen() { title = stringResource(id = R.string.settings_advanced_dump_logcat), summary = stringResource(id = R.string.settings_advanced_dump_logcat_summary), ) - SimpleMenuPreference( + SimpleMenuPreferenceInt( title = stringResource(id = R.string.settings_advanced_read_cache_size), entry = R.array.read_cache_size_entries, entryValueRes = R.array.read_cache_size_entry_values, value = Settings::readCacheSize, ) + SimpleMenuPreference( + title = stringResource(id = R.string.settings_advanced_app_language_title), + entry = R.array.app_language_entries, + entryValueRes = R.array.app_language_entry_values, + value = Settings::language, + ) } } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/settings/PreferenceWidgets.kt b/app/src/main/java/com/hippo/ehviewer/ui/settings/PreferenceWidgets.kt index a9bf90cb5..64fd15aeb 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/settings/PreferenceWidgets.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/settings/PreferenceWidgets.kt @@ -86,7 +86,7 @@ fun HtmlPreference(title: String, summary: AnnotatedString? = null, onClick: () } @Composable -fun SimpleMenuPreference(title: String, @ArrayRes entry: Int, @ArrayRes entryValueRes: Int, value: KMutableProperty0) { +fun SimpleMenuPreferenceInt(title: String, @ArrayRes entry: Int, @ArrayRes entryValueRes: Int, value: KMutableProperty0) { val entryArray = stringArrayResource(id = entry) val valuesArray = stringArrayResource(id = entryValueRes) val map = remember { @@ -98,3 +98,17 @@ fun SimpleMenuPreference(title: String, @ArrayRes entry: Int, @ArrayRes entryVal check(entryArray.size == valuesArray.size) DropDownPref(title = title, defaultValue = v.toString(), onValueChange = ::set, useSelectedAsSummary = true, entries = map) } + +@Composable +fun SimpleMenuPreference(title: String, @ArrayRes entry: Int, @ArrayRes entryValueRes: Int, value: KMutableProperty0) { + val entryArray = stringArrayResource(id = entry) + val valuesArray = stringArrayResource(id = entryValueRes) + val map = remember { + val iter = entryArray.iterator() + valuesArray.associateWith { iter.next() } + } + var v by remember { mutableStateOf(value.get()) } + fun set(new: String) = value.set(new.also { v = it }) + check(entryArray.size == valuesArray.size) + DropDownPref(title = title, defaultValue = v, onValueChange = ::set, useSelectedAsSummary = true, entries = map) +}