pref: 迁移至 DataStore

This commit is contained in:
HuanCheng65 2022-08-02 16:20:48 +08:00
parent bb0ba2bc8b
commit e33de47d34
No known key found for this signature in database
GPG Key ID: E9031EF91A805148
8 changed files with 341 additions and 63 deletions

View File

@ -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) {

View File

@ -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<Preferences> by preferencesDataStore(name = DataStoreConst.DATA_STORE_NAME)
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(
name = DataStoreConst.DATA_STORE_NAME,
produceMigrations = { context ->
listOf(SharedPreferencesMigration(context, "settings"))
}
)
fun DataStore<Preferences>.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<Preferences>.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<Preferences>.getStringSet(
key: String,
defaultValues: MutableSet<String>? = null
): MutableSet<String>? {
var resultValue = defaultValues
runBlocking {
BaseApplication.INSTANCE.dataStore.data.first {
resultValue = it[stringSetPreferencesKey(key)]?.toMutableSet() ?: resultValue
true
}
}
return resultValue
}
fun DataStore<Preferences>.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<Preferences>.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<Preferences>.getLong(key: String, defaultValue: Long): Long {
var resultValue = defaultValue
runBlocking {
BaseApplication.INSTANCE.dataStore.data.first {
resultValue = it[longPreferencesKey(key)] ?: resultValue
true
}
}
return resultValue
}

View File

@ -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);
}
}
}

View File

@ -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<EditProfileActivity>()
return
}
if ("1" == profileBean!!.user!!.hasConcerned) {

View File

@ -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<ListPreference>("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<Preference>("clear_cache")
clearCache!!.summary = attachContext.getString(
@ -216,7 +218,7 @@ class SettingsFragment : PreferencesFragment() {
true
}
val littleTaliPreference = findPreference<EditTextPreference>("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<Preference>("about")
val useCustomTabs = findPreference<SwitchPreference>("use_custom_tabs")
useCustomTabs!!.isEnabled =
!preferenceManager.sharedPreferences!!.getBoolean("use_webview", true)
!preferenceManager.preferenceDataStore!!.getBoolean("use_webview", true)
findPreference<Preference>("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<ListPreference>(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"
}
}
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<String>?) {
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<String>?
): MutableSet<String>? {
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)
}
}
}

View File

@ -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;
}
}

View File

@ -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<Preferences> = 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<AppPreferencesUtils, Int> {
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<AppPreferencesUtils, String?> {
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<AppPreferencesUtils, Float> {
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<AppPreferencesUtils, Boolean> {
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(

View File

@ -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">
<include layout="@layout/layout_appbar" />