diff --git a/src/main/java/org/mtransit/android/commons/LiveDataExt.kt b/src/main/java/org/mtransit/android/commons/LiveDataExt.kt deleted file mode 100644 index 367255aa..00000000 --- a/src/main/java/org/mtransit/android/commons/LiveDataExt.kt +++ /dev/null @@ -1,22 +0,0 @@ -@file:Suppress("unused") - -package org.mtransit.android.commons - -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LiveData -import androidx.lifecycle.Observer - -fun LiveData.observeNonNull(owner: LifecycleOwner, observer: (t: T) -> Unit) { - this.observe(owner) { - it?.let(observer) - } -} - -fun LiveData.observeOnce(lifecycleOwner: LifecycleOwner, block: (T) -> Unit) { - observe(lifecycleOwner, object : Observer { - override fun onChanged(value: T) { - block(value) - removeObserver(this) - } - }) -} diff --git a/src/main/java/org/mtransit/android/commons/PreferenceUtils.java b/src/main/java/org/mtransit/android/commons/PreferenceUtils.java index f61592f8..17692cce 100644 --- a/src/main/java/org/mtransit/android/commons/PreferenceUtils.java +++ b/src/main/java/org/mtransit/android/commons/PreferenceUtils.java @@ -4,7 +4,7 @@ import android.content.SharedPreferences; import android.preference.PreferenceManager; -import androidx.annotation.MainThread; +import androidx.annotation.AnyThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; @@ -135,162 +135,135 @@ public static String getPREFS_AGENCY_POIS_SHOWING_LIST_INSTEAD_OF_MAP(@NonNull S public static final boolean PREFS_KEEP_MODULE_APP_LAUNCHER_ICON_DEFAULT = true; public static final String PREFS_KEEP_MODULE_APP_LAUNCHER_ICON = "pKeepModuleAppLauncherIcon"; - @WorkerThread - @NonNull - public static SharedPreferences getPrefDefault(@NonNull Context context) { - return PreferenceManager.getDefaultSharedPreferences(context); - } + // region Common @WorkerThread - public static int getPrefDefault(@Nullable Context context, @NonNull String prefKey, int defaultValue) { - if (context == null) { - return defaultValue; - } - return getPref(getPrefDefault(context), prefKey, defaultValue); + private static int getPref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, int defaultValue) { + return sharedPreferences.getInt(prefKey, defaultValue); } @WorkerThread - public static long getPrefDefault(@Nullable Context context, @NonNull String prefKey, long defaultValue) { - if (context == null) { - return defaultValue; - } - return getPref(getPrefDefault(context), prefKey, defaultValue); + private static boolean getPref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, boolean defaultValue) { + return sharedPreferences.getBoolean(prefKey, defaultValue); } @WorkerThread - @Nullable - public static String getPrefDefault(@Nullable Context context, @NonNull String prefKey, @Nullable String defaultValue) { - if (context == null) { - MTLog.w(LOG_TAG, "Context null, using default value '%s' for preference '%s'!", defaultValue, prefKey); - return defaultValue; - } - return getPref(getPrefDefault(context), prefKey, defaultValue); + private static long getPref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, long defaultValue) { + return sharedPreferences.getLong(prefKey, defaultValue); } + @Nullable @WorkerThread - @NonNull - public static String getPrefDefaultNN(@NonNull Context context, @NonNull String prefKey, @NonNull String defaultValue) { - return getPref(getPrefDefault(context), prefKey, defaultValue); + private static Set getPref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, @Nullable Set defaultValue) { + return sharedPreferences.getStringSet(prefKey, defaultValue); } @WorkerThread - public static boolean getPrefDefault(@Nullable Context context, @NonNull String prefKey, boolean defaultValue) { - if (context == null) { - MTLog.w(LOG_TAG, "Context null, using default value '%s' for preference '%s'!", defaultValue, prefKey); - return defaultValue; - } - return getPref(getPrefDefault(context), prefKey, defaultValue); + private static String getPref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, @Nullable String defaultValue) { + return sharedPreferences.getString(prefKey, defaultValue); } @WorkerThread - public static boolean hasPrefDefault(@Nullable Context context, @NonNull String prefKey) { - if (context == null) { - return false; + private static void savePref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, @Nullable Integer newValue) { + final SharedPreferences.Editor editor = sharedPreferences.edit(); + if (newValue == null) { + editor.remove(prefKey); + } else { + editor.putInt(prefKey, newValue); } - return getPrefDefault(context).contains(prefKey); + editor.apply(); } @WorkerThread - public static int getPrefLcl(@Nullable Context context, @NonNull String prefKey, int defaultValue) { - if (context == null) { - return defaultValue; + private static void savePref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, @Nullable Boolean newValue) { + final SharedPreferences.Editor editor = sharedPreferences.edit(); + if (newValue == null) { + editor.remove(prefKey); + } else { + editor.putBoolean(prefKey, newValue); } - return getPref(getPrefLcl(context), prefKey, defaultValue); + editor.apply(); } @WorkerThread - public static boolean getPrefLcl(@Nullable Context context, @NonNull String prefKey, boolean defaultValue) { - if (context == null) { - return defaultValue; + private static void savePref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, @Nullable Long newValue) { + final SharedPreferences.Editor editor = sharedPreferences.edit(); + if (newValue == null) { + editor.remove(prefKey); + } else { + editor.putLong(prefKey, newValue); } - return getPref(getPrefLcl(context), prefKey, defaultValue); + editor.apply(); } @WorkerThread - public static long getPrefLcl(@Nullable Context context, @NonNull String prefKey, long defaultValue) { - if (context == null) { - return defaultValue; - } - return getPref(getPrefLcl(context), prefKey, defaultValue); + private static void savePref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, @Nullable String newValue) { + final SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putString(prefKey, newValue); + editor.apply(); } @WorkerThread - @Nullable - public static String getPrefLcl(@Nullable Context context, @NonNull String prefKey, @Nullable String defaultValue) { - if (context == null) { - return defaultValue; - } - return getPref(getPrefLcl(context), prefKey, defaultValue); + private static void savePref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, @Nullable Set newValue) { + final SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putStringSet(prefKey, newValue); + editor.apply(); } - @WorkerThread - @NonNull - public static String getPrefLclNN(@NonNull Context context, @NonNull String prefKey, @NonNull String defaultValue) { - return getPref(getPrefLcl(context), prefKey, defaultValue); - } + // endregion Common - @WorkerThread - @Nullable - public static Set getPrefLcl(@Nullable Context context, @NonNull String prefKey, @Nullable Set defaultValue) { - if (context == null) { - return defaultValue; - } - return getPref(getPrefLcl(context), prefKey, defaultValue); - } + // region Default @WorkerThread @NonNull - public static SharedPreferences getPrefLcl(@NonNull Context context) { - return context.getSharedPreferences(LCL_PREF_NAME, Context.MODE_PRIVATE); + public static SharedPreferences getPrefDefault(@NonNull Context context) { + return PreferenceManager.getDefaultSharedPreferences(context); } @WorkerThread - public static boolean hasPrefLcl(@Nullable Context context, @NonNull String prefKey) { - if (context == null) { - return false; - } - return getPrefLcl(context).contains(prefKey); + public static int getPrefDefault(@Nullable Context context, @NonNull String prefKey, int defaultValue) { + if (context == null) return defaultValue; + return getPref(getPrefDefault(context), prefKey, defaultValue); } @WorkerThread - private static int getPref(SharedPreferences sharedPreferences, String prefKey, int defaultValue) { - return sharedPreferences.getInt(prefKey, defaultValue); + public static long getPrefDefault(@Nullable Context context, @NonNull String prefKey, long defaultValue) { + if (context == null) return defaultValue; + return getPref(getPrefDefault(context), prefKey, defaultValue); } @WorkerThread - private static boolean getPref(SharedPreferences sharedPreferences, String prefKey, boolean defaultValue) { - return sharedPreferences.getBoolean(prefKey, defaultValue); + @Nullable + public static String getPrefDefault(@Nullable Context context, @NonNull String prefKey, @Nullable String defaultValue) { + if (context == null) return defaultValue; + return getPref(getPrefDefault(context), prefKey, defaultValue); } @WorkerThread - private static long getPref(SharedPreferences sharedPreferences, String prefKey, long defaultValue) { - return sharedPreferences.getLong(prefKey, defaultValue); + @NonNull + public static String getPrefDefaultNN(@NonNull Context context, @NonNull String prefKey, @NonNull String defaultValue) { + return getPref(getPrefDefault(context), prefKey, defaultValue); } - @Nullable @WorkerThread - private static Set getPref(SharedPreferences sharedPreferences, String prefKey, Set defaultValue) { - return sharedPreferences.getStringSet(prefKey, defaultValue); + public static boolean getPrefDefault(@Nullable Context context, @NonNull String prefKey, boolean defaultValue) { + if (context == null) return defaultValue; + return getPref(getPrefDefault(context), prefKey, defaultValue); } @WorkerThread - private static String getPref(SharedPreferences sharedPreferences, String prefKey, String defaultValue) { - return sharedPreferences.getString(prefKey, defaultValue); + public static boolean hasPrefDefault(@Nullable Context context, @NonNull String prefKey) { + if (context == null) return false; + return getPrefDefault(context).contains(prefKey); } - @Deprecated // Thread? - public static void savePrefDefault(@Nullable final Context context, @NonNull final String prefKey, final int newValue, final boolean sync) { - if (context == null) { - return; - } - if (sync) { - savePref(getPrefDefault(context), prefKey, newValue); - return; - } - savePrefDefaultAsync(context, prefKey, newValue); + @WorkerThread + public static void savePrefDefaultSync(@Nullable final Context context, @NonNull final String prefKey, final int newValue) { + if (context == null) return; + savePref(getPrefDefault(context), prefKey, newValue); } - @MainThread + @AnyThread public static void savePrefDefaultAsync(@NonNull Context context, @NonNull String prefKey, int newValue) { new MTAsyncTask() { @NonNull @@ -307,19 +280,13 @@ protected Void doInBackgroundMT(Void... params) { }.executeOnExecutor(TaskUtils.THREAD_POOL_EXECUTOR); } - @Deprecated // Thread? - public static void savePrefDefault(@Nullable final Context context, @NonNull final String prefKey, final long newValue, final boolean sync) { - if (context == null) { - return; - } - if (sync) { - savePref(getPrefDefault(context), prefKey, newValue); - return; - } - savePrefDefaultAsync(context, prefKey, newValue); + @WorkerThread + public static void savePrefDefaultSync(@Nullable final Context context, @NonNull final String prefKey, final long newValue) { + if (context == null) return; + savePref(getPrefDefault(context), prefKey, newValue); } - @MainThread + @AnyThread public static void savePrefDefaultAsync(@NonNull Context context, @NonNull String prefKey, long newValue) { new MTAsyncTask() { @NonNull @@ -336,19 +303,13 @@ protected Void doInBackgroundMT(Void... params) { }.executeOnExecutor(TaskUtils.THREAD_POOL_EXECUTOR); } - @Deprecated // Thread? - public static void savePrefDefault(@Nullable final Context context, @NonNull final String prefKey, @Nullable final Boolean newValue, final boolean sync) { - if (context == null) { - return; - } - if (sync) { - savePref(getPrefDefault(context), prefKey, newValue); - return; - } - savePrefDefaultAsync(context, prefKey, newValue); + @WorkerThread + public static void savePrefDefaultSync(@Nullable final Context context, @NonNull final String prefKey, @Nullable final Boolean newValue) { + if (context == null) return; + savePref(getPrefDefault(context), prefKey, newValue); } - @MainThread + @AnyThread public static void savePrefDefaultAsync(@NonNull Context context, @NonNull String prefKey, @Nullable Boolean newValue) { new MTAsyncTask() { @NonNull @@ -365,19 +326,13 @@ protected Void doInBackgroundMT(Void... params) { }.executeOnExecutor(TaskUtils.THREAD_POOL_EXECUTOR); } - @Deprecated // Thread? - public static void savePrefDefault(@Nullable final Context context, @NonNull final String prefKey, @Nullable final String newValue, final boolean sync) { - if (context == null) { - return; - } - if (sync) { - savePref(getPrefDefault(context), prefKey, newValue); - return; - } - savePrefDefaultAsync(context, prefKey, newValue); + @WorkerThread + public static void savePrefDefaultSync(@Nullable final Context context, @NonNull final String prefKey, @Nullable final String newValue) { + if (context == null) return; + savePref(getPrefDefault(context), prefKey, newValue); } - @MainThread + @AnyThread public static void savePrefDefaultAsync(@NonNull Context context, @NonNull String prefKey, @Nullable String newValue) { new MTAsyncTask() { @NonNull @@ -394,27 +349,67 @@ protected Void doInBackgroundMT(Void... params) { }.executeOnExecutor(TaskUtils.THREAD_POOL_EXECUTOR); } - @Deprecated // Thread? - public static void savePrefLcl(@Nullable final Context context, @NonNull final String prefKey, @Nullable final Integer newValue, final boolean sync) { - if (context == null) { - return; - } - if (sync) { - savePref(getPrefLcl(context), prefKey, newValue); - return; - } - savePrefLclAsync(context, prefKey, newValue); + // endregion Default + + // region Local + + @WorkerThread + public static int getPrefLcl(@Nullable Context context, @NonNull String prefKey, int defaultValue) { + if (context == null) return defaultValue; + return getPref(getPrefLcl(context), prefKey, defaultValue); + } + + @WorkerThread + public static boolean getPrefLcl(@Nullable Context context, @NonNull String prefKey, boolean defaultValue) { + if (context == null) return defaultValue; + return getPref(getPrefLcl(context), prefKey, defaultValue); + } + + @WorkerThread + public static long getPrefLcl(@Nullable Context context, @NonNull String prefKey, long defaultValue) { + if (context == null) return defaultValue; + return getPref(getPrefLcl(context), prefKey, defaultValue); + } + + @WorkerThread + @Nullable + public static String getPrefLcl(@Nullable Context context, @NonNull String prefKey, @Nullable String defaultValue) { + if (context == null) return defaultValue; + return getPref(getPrefLcl(context), prefKey, defaultValue); + } + + @WorkerThread + @NonNull + public static String getPrefLclNN(@NonNull Context context, @NonNull String prefKey, @NonNull String defaultValue) { + return getPref(getPrefLcl(context), prefKey, defaultValue); + } + + @WorkerThread + @Nullable + public static Set getPrefLcl(@Nullable Context context, @NonNull String prefKey, @Nullable Set defaultValue) { + if (context == null) return defaultValue; + return getPref(getPrefLcl(context), prefKey, defaultValue); + } + + @WorkerThread + @NonNull + public static SharedPreferences getPrefLcl(@NonNull Context context) { + return context.getSharedPreferences(LCL_PREF_NAME, Context.MODE_PRIVATE); + } + + @WorkerThread + public static boolean hasPrefLcl(@Nullable Context context, @NonNull String prefKey) { + if (context == null) return false; + return getPrefLcl(context).contains(prefKey); } @WorkerThread public static void savePrefLclSync(@Nullable final Context context, @NonNull final String prefKey, @Nullable final Integer newValue) { - if (context == null) { - return; - } + if (context == null) return; savePref(getPrefLcl(context), prefKey, newValue); } - @MainThread + @AnyThread public static void savePrefLclAsync(@NonNull Context context, @NonNull String prefKey, @Nullable Integer newValue) { new MTAsyncTask() { @NonNull @@ -431,27 +426,13 @@ protected Void doInBackgroundMT(Void... params) { }.executeOnExecutor(TaskUtils.THREAD_POOL_EXECUTOR); } - @Deprecated // Thread? - public static void savePrefLcl(@Nullable final Context context, @NonNull final String prefKey, @Nullable final Boolean newValue, final boolean sync) { - if (context == null) { - return; - } - if (sync) { - savePref(getPrefLcl(context), prefKey, newValue); - return; - } - savePrefLclAsync(context, prefKey, newValue); - } - @WorkerThread public static void savePrefLclSync(@Nullable final Context context, @NonNull final String prefKey, @Nullable final Boolean newValue) { - if (context == null) { - return; - } + if (context == null) return; savePref(getPrefLcl(context), prefKey, newValue); } - @MainThread + @AnyThread public static void savePrefLclAsync(@NonNull Context context, @NonNull String prefKey, @Nullable Boolean newValue) { new MTAsyncTask() { @NonNull @@ -468,27 +449,13 @@ protected Void doInBackgroundMT(Void... params) { }.executeOnExecutor(TaskUtils.THREAD_POOL_EXECUTOR); } - @Deprecated // Thread? - public static void savePrefLcl(@Nullable final Context context, @NonNull final String prefKey, @Nullable final Long newValue, final boolean sync) { - if (context == null) { - return; - } - if (sync) { - savePref(getPrefLcl(context), prefKey, newValue); - return; - } - savePrefLclAsync(context, prefKey, newValue); - } - @WorkerThread public static void savePrefLclSync(@Nullable final Context context, @NonNull final String prefKey, @Nullable final Long newValue) { - if (context == null) { - return; - } + if (context == null) return; savePref(getPrefLcl(context), prefKey, newValue); } - @MainThread + @AnyThread public static void savePrefLclAsync(@NonNull Context context, @NonNull String prefKey, @Nullable Long newValue) { new MTAsyncTask() { @NonNull @@ -505,27 +472,13 @@ protected Void doInBackgroundMT(Void... params) { }.executeOnExecutor(TaskUtils.THREAD_POOL_EXECUTOR); } - @Deprecated // Thread? - public static void savePrefLcl(@Nullable final Context context, @NonNull final String prefKey, @Nullable final String newValue, final boolean sync) { - if (context == null) { - return; - } - if (sync) { - savePref(getPrefLcl(context), prefKey, newValue); - return; - } - savePrefLclAsync(context, prefKey, newValue); - } - @WorkerThread public static void savePrefLclSync(@Nullable final Context context, @NonNull final String prefKey, @Nullable final String newValue) { - if (context == null) { - return; - } + if (context == null) return; savePref(getPrefLcl(context), prefKey, newValue); } - @MainThread + @AnyThread public static void savePrefLclAsync(@NonNull Context context, @NonNull String prefKey, @Nullable String newValue) { new MTAsyncTask() { @NonNull @@ -542,27 +495,13 @@ protected Void doInBackgroundMT(Void... params) { }.executeOnExecutor(TaskUtils.THREAD_POOL_EXECUTOR); } - @Deprecated // Thread? - public static void savePrefLcl(@Nullable final Context context, @NonNull final String prefKey, @Nullable final Set newValue, final boolean sync) { - if (context == null) { - return; - } - if (sync) { - savePref(getPrefLcl(context), prefKey, newValue); - return; - } - savePrefLclAsync(context, prefKey, newValue); - } - @WorkerThread public static void savePrefLclSync(@Nullable final Context context, @NonNull final String prefKey, @Nullable final Set newValue) { - if (context == null) { - return; - } + if (context == null) return; savePref(getPrefLcl(context), prefKey, newValue); } - @MainThread + @AnyThread public static void savePrefLclAsync(@NonNull Context context, @NonNull String prefKey, @Nullable Set newValue) { new MTAsyncTask() { @NonNull @@ -579,50 +518,5 @@ protected Void doInBackgroundMT(Void... params) { }.executeOnExecutor(TaskUtils.THREAD_POOL_EXECUTOR); } - @WorkerThread - private static void savePref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, @Nullable Integer newValue) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - if (newValue == null) { - editor.remove(prefKey); - } else { - editor.putInt(prefKey, newValue); - } - editor.apply(); - } - - @WorkerThread - private static void savePref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, @Nullable Boolean newValue) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - if (newValue == null) { - editor.remove(prefKey); - } else { - editor.putBoolean(prefKey, newValue); - } - editor.apply(); - } - - @WorkerThread - private static void savePref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, @Nullable Long newValue) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - if (newValue == null) { - editor.remove(prefKey); - } else { - editor.putLong(prefKey, newValue); - } - editor.apply(); - } - - @WorkerThread - private static void savePref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, @Nullable String newValue) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(prefKey, newValue); - editor.apply(); - } - - @WorkerThread - private static void savePref(@NonNull SharedPreferences sharedPreferences, @NonNull String prefKey, @Nullable Set newValue) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putStringSet(prefKey, newValue); - editor.apply(); - } + // endregion Local } diff --git a/src/main/java/org/mtransit/android/commons/TaskUtils.java b/src/main/java/org/mtransit/android/commons/TaskUtils.java index 4e7e437b..871040f4 100644 --- a/src/main/java/org/mtransit/android/commons/TaskUtils.java +++ b/src/main/java/org/mtransit/android/commons/TaskUtils.java @@ -1,5 +1,6 @@ package org.mtransit.android.commons; +import androidx.annotation.AnyThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -7,6 +8,7 @@ import java.util.concurrent.Executor; +@SuppressWarnings("deprecation") public final class TaskUtils implements MTLog.Loggable { private static final String LOG_TAG = TaskUtils.class.getSimpleName(); @@ -21,18 +23,15 @@ public String getLogTag() { public static final Executor THREAD_POOL_EXECUTOR = MTAsyncTask.THREAD_POOL_EXECUTOR; @SuppressWarnings("unchecked") + @AnyThread public static void execute(@Nullable MTAsyncTask asyncTask, Params... params) { - if (asyncTask == null) { - return; - } + if (asyncTask == null) return; asyncTask.executeOnExecutor(THREAD_POOL_EXECUTOR, params); } public static boolean cancelQuietly(@Nullable MTAsyncTask asyncTask, boolean mayInterruptIfRunning) { try { - if (asyncTask == null) { - return false; - } + if (asyncTask == null) return false; return asyncTask.cancel(mayInterruptIfRunning); } catch (Exception e) { MTLog.w(LOG_TAG, e, "Error while cancelling task!"); diff --git a/src/main/java/org/mtransit/android/commons/pref/PreferenceChangeLiveData.kt b/src/main/java/org/mtransit/android/commons/pref/PreferenceChangeLiveData.kt new file mode 100644 index 00000000..30e7452c --- /dev/null +++ b/src/main/java/org/mtransit/android/commons/pref/PreferenceChangeLiveData.kt @@ -0,0 +1,27 @@ +package org.mtransit.android.commons.pref + +import android.content.SharedPreferences +import androidx.lifecycle.LiveData + +class PreferenceChangeLiveData( + private val preferences: SharedPreferences, +) : LiveData() { + + private val listener: SharedPreferences.OnSharedPreferenceChangeListener by lazy { + SharedPreferences.OnSharedPreferenceChangeListener { _, key -> + postValue(key) + } + } + + override fun onActive() { + super.onActive() + preferences.registerOnSharedPreferenceChangeListener(listener) + } + + override fun onInactive() { + super.onInactive() + preferences.unregisterOnSharedPreferenceChangeListener(listener) + } +} + +fun SharedPreferences.preferenceChangeLiveData(): LiveData = PreferenceChangeLiveData(this) diff --git a/src/main/java/org/mtransit/android/commons/pref/PreferenceListener.kt b/src/main/java/org/mtransit/android/commons/pref/PreferenceListener.kt new file mode 100644 index 00000000..ac0af654 --- /dev/null +++ b/src/main/java/org/mtransit/android/commons/pref/PreferenceListener.kt @@ -0,0 +1,50 @@ +package org.mtransit.android.commons.pref + +import android.content.SharedPreferences +import androidx.annotation.AnyThread +import androidx.annotation.MainThread + +class PreferenceListener( + private val preferences: SharedPreferences, + notifyInitValue: Boolean, + private val valueKey: String, + @AnyThread + private val getPreferencesValue: () -> T, + @MainThread + private val setValue: (T) -> Unit, + @AnyThread + private val postValue: (T) -> Unit, + @AnyThread + private val getValue: () -> T?, +) : SharedPreferences.OnSharedPreferenceChangeListener { + private var needCheckWhenRegister = false + + init { + if (notifyInitValue) { + setValue(getPreferencesValue()) + } + } + + fun register() { + preferences.registerOnSharedPreferenceChangeListener(this) + if (needCheckWhenRegister) { + needCheckWhenRegister = false + updateValue(getPreferencesValue()) + } + } + + fun unregister() { + preferences.unregisterOnSharedPreferenceChangeListener(this) + needCheckWhenRegister = true + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + if (key != valueKey) return + updateValue(getPreferencesValue()) + } + + private fun updateValue(newValue: T) { + if (getValue() == newValue) return + postValue(newValue) + } +} diff --git a/src/main/java/org/mtransit/android/commons/pref/PreferenceLiveData.kt b/src/main/java/org/mtransit/android/commons/pref/PreferenceLiveData.kt index 5a58a095..3a2d2c75 100644 --- a/src/main/java/org/mtransit/android/commons/pref/PreferenceLiveData.kt +++ b/src/main/java/org/mtransit/android/commons/pref/PreferenceLiveData.kt @@ -1,6 +1,7 @@ package org.mtransit.android.commons.pref import android.content.SharedPreferences +import androidx.annotation.AnyThread import androidx.lifecycle.LiveData // https://github.com/Jintin/PreferencesExtension/blob/master/preferences/src/main/java/com/jintin/preferencesextension/PreferenceLiveData.kt @@ -10,7 +11,17 @@ abstract class PreferenceLiveData( private val notifyInitValue: Boolean ) : LiveData() { - private val listener = PreferenceListener() + private val listener by lazy { + PreferenceListener( + preferences = preferences, + notifyInitValue = notifyInitValue, + valueKey = key, + getPreferencesValue = ::getPreferencesValue, + setValue = ::setValue, + postValue = ::postValue, + getValue = ::getValue + ) + } override fun onActive() { super.onActive() @@ -22,43 +33,7 @@ abstract class PreferenceLiveData( listener.unregister() } + @AnyThread abstract fun getPreferencesValue(): T - inner class PreferenceListener : SharedPreferences.OnSharedPreferenceChangeListener { - private var needCheckWhenRegister = false - - init { - if (notifyInitValue) { - value = getPreferencesValue() - } - } - - fun register() { - preferences.registerOnSharedPreferenceChangeListener(listener) - if (needCheckWhenRegister) { - needCheckWhenRegister = false - updateValue(getPreferencesValue()) - } - } - - fun unregister() { - preferences.unregisterOnSharedPreferenceChangeListener(listener) - needCheckWhenRegister = true - } - - override fun onSharedPreferenceChanged( - sharedPreferences: SharedPreferences?, - key: String? - ) { - if (key == this@PreferenceLiveData.key) { - updateValue(getPreferencesValue()) - } - } - - private fun updateValue(newValue: T) { - if (value != newValue) { - value = newValue - } - } - } -} \ No newline at end of file +} diff --git a/src/main/java/org/mtransit/android/commons/pref/PreferencesExt.kt b/src/main/java/org/mtransit/android/commons/pref/PreferencesExt.kt index dc3787f8..aa143392 100644 --- a/src/main/java/org/mtransit/android/commons/pref/PreferencesExt.kt +++ b/src/main/java/org/mtransit/android/commons/pref/PreferencesExt.kt @@ -1,6 +1,7 @@ package org.mtransit.android.commons.pref import android.content.SharedPreferences +import androidx.annotation.AnyThread import androidx.lifecycle.LiveData // https://github.com/Jintin/PreferencesExtension/blob/master/preferences/src/main/java/com/jintin/preferencesextension/PreferencesExtension.kt @@ -25,16 +26,16 @@ inline fun SharedPreferences.liveDataN( key: String, defaultValue: T? = null, notifyInitValue: Boolean = true, -): LiveData = - object : PreferenceLiveData(this, key, notifyInitValue) { - override fun getPreferencesValue(): T? = get(key, defaultValue) - } +): LiveData = object : PreferenceLiveData(this, key, notifyInitValue) { + @AnyThread + override fun getPreferencesValue(): T? = get(key, defaultValue) +} inline fun SharedPreferences.liveData( key: String, defaultValue: T, notifyInitValue: Boolean = true, -): LiveData = - object : PreferenceLiveData(this, key, notifyInitValue) { - override fun getPreferencesValue(): T = get(key, defaultValue) ?: defaultValue - } \ No newline at end of file +): LiveData = object : PreferenceLiveData(this, key, notifyInitValue) { + @AnyThread + override fun getPreferencesValue(): T = get(key, defaultValue) ?: defaultValue +}