From e33de47d34a12fb1f19dad91157e6160c0549f76 Mon Sep 17 00:00:00 2001 From: HuanCheng65 <22636177+HuanCheng65@users.noreply.github.com> Date: Tue, 2 Aug 2022 16:20:48 +0800 Subject: [PATCH] =?UTF-8?q?pref:=20=E8=BF=81=E7=A7=BB=E8=87=B3=20DataStore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tieba/post/BaseApplication.kt | 1 + .../com/huanchengfly/tieba/post/DataStore.kt | 97 +++++++++- ...Activity.java => PreferencesActivity.java} | 10 +- .../tieba/post/activities/UserActivity.kt | 2 +- ...ingsFragment.kt => PreferencesFragment.kt} | 115 ++++++++++-- .../post/fragments/intro/ExploreFragment.java | 4 +- .../tieba/post/utils/AppPreferencesUtils.kt | 173 ++++++++++++++---- app/src/main/res/layout/activity_settings.xml | 2 +- 8 files changed, 341 insertions(+), 63 deletions(-) rename app/src/main/java/com/huanchengfly/tieba/post/activities/{SettingsActivity.java => PreferencesActivity.java} (78%) rename app/src/main/java/com/huanchengfly/tieba/post/fragments/{SettingsFragment.kt => PreferencesFragment.kt} (76%) diff --git a/app/src/main/java/com/huanchengfly/tieba/post/BaseApplication.kt b/app/src/main/java/com/huanchengfly/tieba/post/BaseApplication.kt index c4f0b55e..d87452e2 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/BaseApplication.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/BaseApplication.kt @@ -255,6 +255,7 @@ class BaseApplication : Application(), IApp { //禁止app字体大小跟随系统字体大小调节 override fun getResources(): Resources { + INSTANCE = this val fontScale = appPreferences.fontScale val resources = super.getResources() if (resources.configuration.fontScale != fontScale) { diff --git a/app/src/main/java/com/huanchengfly/tieba/post/DataStore.kt b/app/src/main/java/com/huanchengfly/tieba/post/DataStore.kt index 1e51ebdf..9b5ae0c4 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/DataStore.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/DataStore.kt @@ -2,11 +2,102 @@ package com.huanchengfly.tieba.post import android.content.Context import androidx.datastore.core.DataStore -import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.SharedPreferencesMigration +import androidx.datastore.preferences.core.* import androidx.datastore.preferences.preferencesDataStore +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.runBlocking object DataStoreConst { - const val DATA_STORE_NAME = "app_data" + const val DATA_STORE_NAME = "app_preferences" + + val KEY_THEME = stringPreferencesKey("theme") } -val Context.dataStore: DataStore by preferencesDataStore(name = DataStoreConst.DATA_STORE_NAME) \ No newline at end of file +val Context.dataStore: DataStore by preferencesDataStore( + name = DataStoreConst.DATA_STORE_NAME, + produceMigrations = { context -> + listOf(SharedPreferencesMigration(context, "settings")) + } +) + +fun DataStore.getInt(key: String, defaultValue: Int): Int { + var resultValue = defaultValue + + runBlocking { + BaseApplication.INSTANCE.dataStore.data.first { + resultValue = it[intPreferencesKey(key)] ?: resultValue + true + } + } + + return resultValue +} + +fun DataStore.getString(key: String, defaultValue: String? = null): String? { + var resultValue = defaultValue + + runBlocking { + BaseApplication.INSTANCE.dataStore.data.first { + resultValue = it[stringPreferencesKey(key)] ?: resultValue + true + } + } + + return resultValue +} + +fun DataStore.getStringSet( + key: String, + defaultValues: MutableSet? = null +): MutableSet? { + var resultValue = defaultValues + + runBlocking { + BaseApplication.INSTANCE.dataStore.data.first { + resultValue = it[stringSetPreferencesKey(key)]?.toMutableSet() ?: resultValue + true + } + } + + return resultValue +} + +fun DataStore.getBoolean(key: String, defaultValue: Boolean): Boolean { + var resultValue = defaultValue + + runBlocking { + BaseApplication.INSTANCE.dataStore.data.first { + resultValue = it[booleanPreferencesKey(key)] ?: resultValue + true + } + } + + return resultValue +} + +fun DataStore.getFloat(key: String, defaultValue: Float): Float { + var resultValue = defaultValue + + runBlocking { + BaseApplication.INSTANCE.dataStore.data.first { + resultValue = it[floatPreferencesKey(key)] ?: resultValue + true + } + } + + return resultValue +} + +fun DataStore.getLong(key: String, defaultValue: Long): Long { + var resultValue = defaultValue + + runBlocking { + BaseApplication.INSTANCE.dataStore.data.first { + resultValue = it[longPreferencesKey(key)] ?: resultValue + true + } + } + + return resultValue +} \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/activities/SettingsActivity.java b/app/src/main/java/com/huanchengfly/tieba/post/activities/PreferencesActivity.java similarity index 78% rename from app/src/main/java/com/huanchengfly/tieba/post/activities/SettingsActivity.java rename to app/src/main/java/com/huanchengfly/tieba/post/activities/PreferencesActivity.java index f76be0dc..e3deda2f 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/activities/SettingsActivity.java +++ b/app/src/main/java/com/huanchengfly/tieba/post/activities/PreferencesActivity.java @@ -7,10 +7,10 @@ import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.FragmentManager; import com.huanchengfly.tieba.post.R; -import com.huanchengfly.tieba.post.fragments.SettingsFragment; +import com.huanchengfly.tieba.post.fragments.PreferencesFragment; import com.huanchengfly.tieba.post.utils.ThemeUtil; -public class SettingsActivity extends BaseActivity { +public class PreferencesActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { @@ -27,12 +27,12 @@ public class SettingsActivity extends BaseActivity { } String scrollToPreference = getIntent().getStringExtra("scroll_to_preference"); FragmentManager fragmentManager = getSupportFragmentManager(); - SettingsFragment settingsFragment = new SettingsFragment(); + PreferencesFragment preferencesFragment = new PreferencesFragment(); fragmentManager.beginTransaction() - .add(R.id.main, settingsFragment) + .add(R.id.main, preferencesFragment) .commit(); if (scrollToPreference != null) { - settingsFragment.scrollToPreference(scrollToPreference); + preferencesFragment.scrollToPreference(scrollToPreference); } } } diff --git a/app/src/main/java/com/huanchengfly/tieba/post/activities/UserActivity.kt b/app/src/main/java/com/huanchengfly/tieba/post/activities/UserActivity.kt index 43767194..6f51bee0 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/activities/UserActivity.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/activities/UserActivity.kt @@ -259,7 +259,7 @@ class UserActivity : BaseActivity() { @OnClick(R.id.user_center_action_btn) fun onActionBtnClick(view: View?) { if (TextUtils.equals(profileBean!!.user!!.id, AccountUtil.getUid(this))) { - startActivity(WebViewActivity.newIntent(this, getString(R.string.url_edit_info))) + goToActivity() return } if ("1" == profileBean!!.user!!.hasConcerned) { diff --git a/app/src/main/java/com/huanchengfly/tieba/post/fragments/SettingsFragment.kt b/app/src/main/java/com/huanchengfly/tieba/post/fragments/PreferencesFragment.kt similarity index 76% rename from app/src/main/java/com/huanchengfly/tieba/post/fragments/SettingsFragment.kt rename to app/src/main/java/com/huanchengfly/tieba/post/fragments/PreferencesFragment.kt index de15811a..22e1092b 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/fragments/SettingsFragment.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/fragments/PreferencesFragment.kt @@ -12,11 +12,10 @@ import android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS import android.view.View import android.widget.Toast import androidx.core.content.ContextCompat -import androidx.preference.EditTextPreference -import androidx.preference.ListPreference -import androidx.preference.Preference -import androidx.preference.SwitchPreference +import androidx.datastore.preferences.core.* +import androidx.preference.* import com.google.android.material.snackbar.Snackbar +import com.huanchengfly.tieba.post.* import com.huanchengfly.tieba.post.R import com.huanchengfly.tieba.post.activities.BlockListActivity import com.huanchengfly.tieba.post.activities.LoginActivity @@ -24,11 +23,13 @@ import com.huanchengfly.tieba.post.components.prefs.TimePickerPreference import com.huanchengfly.tieba.post.fragments.preference.PreferencesFragment import com.huanchengfly.tieba.post.models.database.Account import com.huanchengfly.tieba.post.models.database.Block -import com.huanchengfly.tieba.post.toastShort import com.huanchengfly.tieba.post.ui.theme.utils.ThemeUtils import com.huanchengfly.tieba.post.utils.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.launch -class SettingsFragment : PreferencesFragment() { +class PreferencesFragment : PreferencesFragment() { private var loginInfo: Account? = null override fun onResume() { super.onResume() @@ -69,7 +70,8 @@ class SettingsFragment : PreferencesFragment() { @SuppressLint("ApplySharedPref") override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - preferenceManager.sharedPreferencesName = "settings" + //preferenceManager.sharedPreferencesName = "settings" + preferenceManager.preferenceDataStore = DataStorePreference() addPreferencesFromResource(R.xml.preferences) val accountsPreference = findPreference("switch_account") accountsPreference!!.onPreferenceChangeListener = @@ -197,7 +199,7 @@ class SettingsFragment : PreferencesFragment() { } timePickerPreference.summary = attachContext.getString( R.string.summary_auto_sign_time, - preferenceManager.sharedPreferences!!.getString("auto_sign_time", "09:00") + preferenceManager.preferenceDataStore!!.getString("auto_sign_time", "09:00") ) val clearCache = findPreference("clear_cache") clearCache!!.summary = attachContext.getString( @@ -216,7 +218,7 @@ class SettingsFragment : PreferencesFragment() { true } val littleTaliPreference = findPreference("little_tail") - val littleTali = preferenceManager.sharedPreferences!!.getString("little_tail", "") + val littleTali = preferenceManager.preferenceDataStore!!.getString("little_tail", "") if (littleTali!!.isEmpty()) { littleTaliPreference!!.setSummary(R.string.tip_no_little_tail) } else { @@ -238,7 +240,7 @@ class SettingsFragment : PreferencesFragment() { val aboutPreference = findPreference("about") val useCustomTabs = findPreference("use_custom_tabs") useCustomTabs!!.isEnabled = - !preferenceManager.sharedPreferences!!.getBoolean("use_webview", true) + !preferenceManager.preferenceDataStore!!.getBoolean("use_webview", true) findPreference("use_webview")!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any? -> useCustomTabs.isEnabled = !(newValue as Boolean) @@ -282,17 +284,102 @@ class SettingsFragment : PreferencesFragment() { defValue: Boolean = false ) { val value = - preferenceManager.sharedPreferences!!.getBoolean(switchPreference!!.key, defValue) + preferenceManager.preferenceDataStore!!.getBoolean(switchPreference!!.key, defValue) switchPreference.isChecked = value } private fun initListPreference(key: String, defValue: String) { val listPreference = findPreference(key) - val value = preferenceManager.sharedPreferences!!.getString(key, defValue) + val value = preferenceManager.preferenceDataStore!!.getString(key, defValue) listPreference!!.value = value } companion object { - const val TAG = "SettingsFragment" + const val TAG = "PreferencesFragment" } -} \ No newline at end of file + + class DataStorePreference : PreferenceDataStore() { + override fun putString(key: String, value: String?) { + MainScope().launch(Dispatchers.IO) { + BaseApplication.INSTANCE.dataStore.edit { + if (value == null) { + it.remove(stringPreferencesKey(key)) + } else { + it[stringPreferencesKey(key)] = value + } + } + } + } + + override fun putStringSet(key: String, values: MutableSet?) { + MainScope().launch(Dispatchers.IO) { + BaseApplication.INSTANCE.dataStore.edit { + if (values == null) { + it.remove(stringSetPreferencesKey(key)) + } else { + it[stringSetPreferencesKey(key)] = values + } + } + } + } + + override fun putInt(key: String, value: Int) { + MainScope().launch(Dispatchers.IO) { + BaseApplication.INSTANCE.dataStore.edit { + it[intPreferencesKey(key)] = value + } + } + } + + override fun putLong(key: String, value: Long) { + MainScope().launch(Dispatchers.IO) { + BaseApplication.INSTANCE.dataStore.edit { + it[longPreferencesKey(key)] = value + } + } + } + + override fun putFloat(key: String, value: Float) { + MainScope().launch(Dispatchers.IO) { + BaseApplication.INSTANCE.dataStore.edit { + it[floatPreferencesKey(key)] = value + } + } + } + + override fun putBoolean(key: String, value: Boolean) { + MainScope().launch(Dispatchers.IO) { + BaseApplication.INSTANCE.dataStore.edit { + it[booleanPreferencesKey(key)] = value + } + } + } + + override fun getString(key: String, defValue: String?): String? { + return BaseApplication.INSTANCE.dataStore.getString(key, defValue) + } + + override fun getStringSet( + key: String, + defValues: MutableSet? + ): MutableSet? { + return BaseApplication.INSTANCE.dataStore.getStringSet(key, defValues) + } + + override fun getInt(key: String, defValue: Int): Int { + return BaseApplication.INSTANCE.dataStore.getInt(key, defValue) + } + + override fun getLong(key: String, defValue: Long): Long { + return BaseApplication.INSTANCE.dataStore.getLong(key, defValue) + } + + override fun getFloat(key: String, defValue: Float): Float { + return BaseApplication.INSTANCE.dataStore.getFloat(key, defValue) + } + + override fun getBoolean(key: String, defValue: Boolean): Boolean { + return BaseApplication.INSTANCE.dataStore.getBoolean(key, defValue) + } + } +} diff --git a/app/src/main/java/com/huanchengfly/tieba/post/fragments/intro/ExploreFragment.java b/app/src/main/java/com/huanchengfly/tieba/post/fragments/intro/ExploreFragment.java index 18da4f7f..1f7833dc 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/fragments/intro/ExploreFragment.java +++ b/app/src/main/java/com/huanchengfly/tieba/post/fragments/intro/ExploreFragment.java @@ -7,7 +7,7 @@ import android.view.ViewGroup; import androidx.annotation.Nullable; import com.huanchengfly.tieba.post.R; -import com.huanchengfly.tieba.post.activities.SettingsActivity; +import com.huanchengfly.tieba.post.activities.PreferencesActivity; import com.huanchengfly.tieba.post.ui.intro.fragments.BaseIntroFragment; import com.huanchengfly.tieba.post.ui.theme.utils.ThemeUtils; @@ -59,7 +59,7 @@ public class ExploreFragment extends BaseIntroFragment implements View.OnClickLi public void onClick(View v) { switch (v.getId()) { case R.id.explore_auto_sign: - startActivity(new Intent(getAttachContext(), SettingsActivity.class).putExtra("scroll_to_preference", "auto_sign")); + startActivity(new Intent(getAttachContext(), PreferencesActivity.class).putExtra("scroll_to_preference", "auto_sign")); break; } } diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/AppPreferencesUtils.kt b/app/src/main/java/com/huanchengfly/tieba/post/utils/AppPreferencesUtils.kt index e9af031f..f93eac30 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/utils/AppPreferencesUtils.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/AppPreferencesUtils.kt @@ -2,7 +2,13 @@ package com.huanchengfly.tieba.post.utils import android.content.Context import android.content.SharedPreferences +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.* +import com.huanchengfly.tieba.post.* import com.huanchengfly.tieba.post.utils.ThemeUtil.TRANSLUCENT_THEME_LIGHT +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.launch import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty @@ -11,123 +17,216 @@ open class AppPreferencesUtils(context: Context) { private val preferences: SharedPreferences = context.getSharedPreferences("settings", Context.MODE_PRIVATE) - var autoSign by SharedPreferenceDelegates.boolean(defaultValue = false, key = "auto_sign") + private val preferencesDataStore: DataStore = context.dataStore - var autoSignTime by SharedPreferenceDelegates.string( + var autoSign by DataStoreDelegates.boolean(defaultValue = false, key = "auto_sign") + + var autoSignTime by DataStoreDelegates.string( defaultValue = "09:00", key = "auto_sign_time" ) - var checkCIUpdate by SharedPreferenceDelegates.boolean( + var checkCIUpdate by DataStoreDelegates.boolean( defaultValue = false ) - var collectThreadSeeLz by SharedPreferenceDelegates.boolean( + var collectThreadSeeLz by DataStoreDelegates.boolean( defaultValue = true, key = "collect_thread_see_lz" ) - var customPrimaryColor by SharedPreferenceDelegates.string(key = "custom_primary_color") + var customPrimaryColor by DataStoreDelegates.string(key = "custom_primary_color") - var customStatusBarFontDark by SharedPreferenceDelegates.boolean( + var customStatusBarFontDark by DataStoreDelegates.boolean( defaultValue = false, key = "custom_status_bar_font_dark" ) - var customToolbarPrimaryColor by SharedPreferenceDelegates.boolean( + var customToolbarPrimaryColor by DataStoreDelegates.boolean( defaultValue = true, key = "custom_toolbar_primary_color" ) - var defaultSortType by SharedPreferenceDelegates.string( + var defaultSortType by DataStoreDelegates.string( key = "default_sort_type", defaultValue = "0" ) - var darkTheme by SharedPreferenceDelegates.string(key = "dark_theme", defaultValue = "dark") + var darkTheme by DataStoreDelegates.string(key = "dark_theme", defaultValue = "dark") - var followSystemNight by SharedPreferenceDelegates.boolean( + var followSystemNight by DataStoreDelegates.boolean( defaultValue = true, key = "follow_system_night" ) - var fontScale by SharedPreferenceDelegates.float(defaultValue = 1.0f) + var fontScale by DataStoreDelegates.float(defaultValue = 1.0f) - var forumFabFunction by SharedPreferenceDelegates.string(defaultValue = "post") + var forumFabFunction by DataStoreDelegates.string(defaultValue = "post") - var hideExplore by SharedPreferenceDelegates.boolean(defaultValue = false) + var hideExplore by DataStoreDelegates.boolean(defaultValue = false) - var hideForumIntroAndStat by SharedPreferenceDelegates.boolean(defaultValue = false) + var hideForumIntroAndStat by DataStoreDelegates.boolean(defaultValue = false) - var homePageScroll by SharedPreferenceDelegates.boolean(defaultValue = false) + var homePageScroll by DataStoreDelegates.boolean(defaultValue = false) - var imageLoadType by SharedPreferenceDelegates.string( + var imageLoadType by DataStoreDelegates.string( key = "image_load_type", defaultValue = "0" ) - var listItemsBackgroundIntermixed by SharedPreferenceDelegates.boolean(defaultValue = true) + var listItemsBackgroundIntermixed by DataStoreDelegates.boolean(defaultValue = true) - var listSingle by SharedPreferenceDelegates.boolean(defaultValue = false) + var listSingle by DataStoreDelegates.boolean(defaultValue = false) - var littleTail by SharedPreferenceDelegates.string(key = "little_tail") + var littleTail by DataStoreDelegates.string(key = "little_tail") - var loadPictureWhenScroll by SharedPreferenceDelegates.boolean(defaultValue = true) + var loadPictureWhenScroll by DataStoreDelegates.boolean(defaultValue = true) - var oldTheme by SharedPreferenceDelegates.string(key = "old_theme") + var oldTheme by DataStoreDelegates.string(key = "old_theme") - var oksignSlowMode by SharedPreferenceDelegates.boolean( + var oksignSlowMode by DataStoreDelegates.boolean( defaultValue = true, key = "oksign_slow_mode" ) - var postOrReplyWarning by SharedPreferenceDelegates.boolean(defaultValue = true) + var postOrReplyWarning by DataStoreDelegates.boolean(defaultValue = true) - var radius by SharedPreferenceDelegates.int(defaultValue = 8) + var radius by DataStoreDelegates.int(defaultValue = 8) - var signDay by SharedPreferenceDelegates.int(defaultValue = -1, key = "sign_day") + var signDay by DataStoreDelegates.int(defaultValue = -1, key = "sign_day") - var showBothUsernameAndNickname by SharedPreferenceDelegates.boolean( + var showBothUsernameAndNickname by DataStoreDelegates.boolean( defaultValue = false, key = "show_both_username_and_nickname" ) - var showShortcutInThread by SharedPreferenceDelegates.boolean(defaultValue = true) + var showShortcutInThread by DataStoreDelegates.boolean(defaultValue = true) - var showTopForumInNormalList by SharedPreferenceDelegates.boolean( + var showTopForumInNormalList by DataStoreDelegates.boolean( defaultValue = true, key = "show_top_forum_in_normal_list" ) - var statusBarDarker by SharedPreferenceDelegates.boolean( + var statusBarDarker by DataStoreDelegates.boolean( defaultValue = true, key = "status_bar_darker" ) - var theme by SharedPreferenceDelegates.string(defaultValue = ThemeUtil.THEME_WHITE) + var theme by DataStoreDelegates.string(defaultValue = ThemeUtil.THEME_WHITE) - var translucentBackgroundAlpha by SharedPreferenceDelegates.int( + var translucentBackgroundAlpha by DataStoreDelegates.int( defaultValue = 255, key = "translucent_background_alpha" ) - var translucentBackgroundBlur by SharedPreferenceDelegates.int(key = "translucent_background_blur") + var translucentBackgroundBlur by DataStoreDelegates.int(key = "translucent_background_blur") - var translucentBackgroundTheme by SharedPreferenceDelegates.int( + var translucentBackgroundTheme by DataStoreDelegates.int( defaultValue = TRANSLUCENT_THEME_LIGHT, key = "translucent_background_theme" ) - var translucentThemeBackgroundPath by SharedPreferenceDelegates.string(key = "translucent_theme_background_path") + var translucentThemeBackgroundPath by DataStoreDelegates.string(key = "translucent_theme_background_path") - var translucentPrimaryColor by SharedPreferenceDelegates.string(key = "translucent_primary_color") + var translucentPrimaryColor by DataStoreDelegates.string(key = "translucent_primary_color") - var useCustomTabs by SharedPreferenceDelegates.boolean( + var useCustomTabs by DataStoreDelegates.boolean( defaultValue = true, key = "use_custom_tabs" ) - var useWebView by SharedPreferenceDelegates.boolean(defaultValue = true, key = "use_webview") + var useWebView by DataStoreDelegates.boolean(defaultValue = true, key = "use_webview") + + private object DataStoreDelegates { + fun int( + defaultValue: Int = 0, + key: String? = null + ) = object : ReadWriteProperty { + override fun getValue(thisRef: AppPreferencesUtils, property: KProperty<*>): Int { + return thisRef.preferencesDataStore.getInt(key ?: property.name, defaultValue) + } + + override fun setValue( + thisRef: AppPreferencesUtils, + property: KProperty<*>, + value: Int + ) { + MainScope().launch(Dispatchers.IO) { + thisRef.preferencesDataStore.edit { + it[intPreferencesKey(key ?: property.name)] = value + } + } + } + } + + fun string( + defaultValue: String? = null, + key: String? = null + ) = object : ReadWriteProperty { + override fun getValue(thisRef: AppPreferencesUtils, property: KProperty<*>): String? { + return thisRef.preferencesDataStore.getString(key ?: property.name, defaultValue) + ?: defaultValue + } + + override fun setValue( + thisRef: AppPreferencesUtils, + property: KProperty<*>, + value: String? + ) { + MainScope().launch(Dispatchers.IO) { + thisRef.preferencesDataStore.edit { + if (value == null) { + it.remove(stringPreferencesKey(key ?: property.name)) + } else { + it[stringPreferencesKey(key ?: property.name)] = value + } + } + } + } + } + + fun float( + defaultValue: Float = 0F, + key: String? = null + ) = object : ReadWriteProperty { + override fun getValue(thisRef: AppPreferencesUtils, property: KProperty<*>): Float { + return thisRef.preferencesDataStore.getFloat(key ?: property.name, defaultValue) + } + + override fun setValue( + thisRef: AppPreferencesUtils, + property: KProperty<*>, + value: Float + ) { + MainScope().launch(Dispatchers.IO) { + thisRef.preferencesDataStore.edit { + it[floatPreferencesKey(key ?: property.name)] = value + } + } + } + } + + fun boolean( + defaultValue: Boolean = false, + key: String? = null + ) = object : ReadWriteProperty { + override fun getValue(thisRef: AppPreferencesUtils, property: KProperty<*>): Boolean { + return thisRef.preferencesDataStore.getBoolean(key ?: property.name, defaultValue) + } + + override fun setValue( + thisRef: AppPreferencesUtils, + property: KProperty<*>, + value: Boolean + ) { + MainScope().launch(Dispatchers.IO) { + thisRef.preferencesDataStore.edit { + it[booleanPreferencesKey(key ?: property.name)] = value + } + } + } + } + } private object SharedPreferenceDelegates { fun int( diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 1a967c27..70f2b7bc 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -6,7 +6,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" app:backgroundTint="@color/default_color_window_background" - tools:context=".activities.SettingsActivity"> + tools:context=".activities.PreferencesActivity">