diff --git a/vector/src/debug/java/im/vector/app/receivers/DebugReceiver.kt b/vector/src/debug/java/im/vector/app/receivers/DebugReceiver.kt index 7b64bed08e..0cea9e3d8e 100644 --- a/vector/src/debug/java/im/vector/app/receivers/DebugReceiver.kt +++ b/vector/src/debug/java/im/vector/app/receivers/DebugReceiver.kt @@ -22,7 +22,7 @@ import android.content.Intent import android.content.IntentFilter import android.content.SharedPreferences import androidx.core.content.edit -import androidx.preference.PreferenceManager +import im.vector.app.core.di.DefaultSharedPreferences import im.vector.app.core.utils.lsFiles import timber.log.Timber @@ -44,7 +44,7 @@ class DebugReceiver : BroadcastReceiver() { } private fun dumpPreferences(context: Context) { - logPrefs("DefaultSharedPreferences", PreferenceManager.getDefaultSharedPreferences(context)) + logPrefs("DefaultSharedPreferences", DefaultSharedPreferences.getInstance(context)) } private fun logPrefs(name: String, sharedPreferences: SharedPreferences?) { @@ -58,7 +58,7 @@ class DebugReceiver : BroadcastReceiver() { } private fun alterScalarToken(context: Context) { - PreferenceManager.getDefaultSharedPreferences(context).edit { + DefaultSharedPreferences.getInstance(context).edit { // putString("SCALAR_TOKEN_PREFERENCE_KEY" + Matrix.getInstance(context).defaultSession.myUserId, "bad_token") } } diff --git a/vector/src/gplay/java/im/vector/app/push/fcm/FcmHelper.kt b/vector/src/gplay/java/im/vector/app/push/fcm/FcmHelper.kt index 6c68d6c3b5..84ca392c45 100755 --- a/vector/src/gplay/java/im/vector/app/push/fcm/FcmHelper.kt +++ b/vector/src/gplay/java/im/vector/app/push/fcm/FcmHelper.kt @@ -19,7 +19,6 @@ package im.vector.app.push.fcm import android.app.Activity import android.content.Context -import androidx.preference.PreferenceManager import android.widget.Toast import androidx.core.content.edit import com.google.android.gms.common.ConnectionResult @@ -27,6 +26,7 @@ import com.google.android.gms.common.GoogleApiAvailability import com.google.firebase.iid.FirebaseInstanceId import im.vector.app.R import im.vector.app.core.di.ActiveSessionHolder +import im.vector.app.core.di.DefaultSharedPreferences import im.vector.app.core.pushers.PushersManager import im.vector.app.features.settings.VectorPreferences import timber.log.Timber @@ -46,7 +46,7 @@ object FcmHelper { * @return the FCM token or null if not received from FCM */ fun getFcmToken(context: Context): String? { - return PreferenceManager.getDefaultSharedPreferences(context).getString(PREFS_KEY_FCM_TOKEN, null) + return DefaultSharedPreferences.getInstance(context).getString(PREFS_KEY_FCM_TOKEN, null) } /** @@ -58,7 +58,7 @@ object FcmHelper { */ fun storeFcmToken(context: Context, token: String?) { - PreferenceManager.getDefaultSharedPreferences(context).edit { + DefaultSharedPreferences.getInstance(context).edit { putString(PREFS_KEY_FCM_TOKEN, token) } } diff --git a/vector/src/main/java/im/vector/app/core/di/DefaultSharedPreferences.kt b/vector/src/main/java/im/vector/app/core/di/DefaultSharedPreferences.kt new file mode 100644 index 0000000000..745af3e16c --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/di/DefaultSharedPreferences.kt @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.core.di + +import android.content.Context +import android.content.SharedPreferences +import androidx.preference.PreferenceManager + +object DefaultSharedPreferences { + + @Volatile private var INSTANCE: SharedPreferences? = null + + fun getInstance(context: Context): SharedPreferences = + INSTANCE ?: synchronized(this) { + INSTANCE ?: PreferenceManager.getDefaultSharedPreferences(context).also { INSTANCE = it } + } +} diff --git a/vector/src/main/java/im/vector/app/core/ui/views/KeysBackupBanner.kt b/vector/src/main/java/im/vector/app/core/ui/views/KeysBackupBanner.kt index 14d9261204..f4890780b5 100755 --- a/vector/src/main/java/im/vector/app/core/ui/views/KeysBackupBanner.kt +++ b/vector/src/main/java/im/vector/app/core/ui/views/KeysBackupBanner.kt @@ -23,11 +23,11 @@ import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.edit import androidx.core.view.isVisible -import androidx.preference.PreferenceManager import butterknife.BindView import butterknife.ButterKnife import butterknife.OnClick import im.vector.app.R +import im.vector.app.core.di.DefaultSharedPreferences import timber.log.Timber /** @@ -57,7 +57,7 @@ class KeysBackupBanner @JvmOverloads constructor( init { setupView() - PreferenceManager.getDefaultSharedPreferences(context).edit { + DefaultSharedPreferences.getInstance(context).edit { putBoolean(BANNER_SETUP_DO_NOT_SHOW_AGAIN, false) putString(BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION, "") } @@ -105,17 +105,17 @@ class KeysBackupBanner @JvmOverloads constructor( state.let { when (it) { is State.Setup -> { - PreferenceManager.getDefaultSharedPreferences(context).edit { + DefaultSharedPreferences.getInstance(context).edit { putBoolean(BANNER_SETUP_DO_NOT_SHOW_AGAIN, true) } } is State.Recover -> { - PreferenceManager.getDefaultSharedPreferences(context).edit { + DefaultSharedPreferences.getInstance(context).edit { putString(BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION, it.version) } } is State.Update -> { - PreferenceManager.getDefaultSharedPreferences(context).edit { + DefaultSharedPreferences.getInstance(context).edit { putString(BANNER_UPDATE_DO_NOT_SHOW_FOR_VERSION, it.version) } } @@ -150,7 +150,7 @@ class KeysBackupBanner @JvmOverloads constructor( private fun renderSetup(nbOfKeys: Int) { if (nbOfKeys == 0 - || PreferenceManager.getDefaultSharedPreferences(context).getBoolean(BANNER_SETUP_DO_NOT_SHOW_AGAIN, false)) { + || DefaultSharedPreferences.getInstance(context).getBoolean(BANNER_SETUP_DO_NOT_SHOW_AGAIN, false)) { // Do not display the setup banner if there is no keys to backup, or if the user has already closed it isVisible = false } else { @@ -164,7 +164,7 @@ class KeysBackupBanner @JvmOverloads constructor( } private fun renderRecover(version: String) { - if (version == PreferenceManager.getDefaultSharedPreferences(context).getString(BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION, null)) { + if (version == DefaultSharedPreferences.getInstance(context).getString(BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION, null)) { isVisible = false } else { isVisible = true @@ -177,7 +177,7 @@ class KeysBackupBanner @JvmOverloads constructor( } private fun renderUpdate(version: String) { - if (version == PreferenceManager.getDefaultSharedPreferences(context).getString(BANNER_UPDATE_DO_NOT_SHOW_FOR_VERSION, null)) { + if (version == DefaultSharedPreferences.getInstance(context).getString(BANNER_UPDATE_DO_NOT_SHOW_FOR_VERSION, null)) { isVisible = false } else { isVisible = true @@ -258,7 +258,7 @@ class KeysBackupBanner @JvmOverloads constructor( * Inform the banner that a Recover has been done for this version, so do not show the Recover banner for this version */ fun onRecoverDoneForVersion(context: Context, version: String) { - PreferenceManager.getDefaultSharedPreferences(context).edit { + DefaultSharedPreferences.getInstance(context).edit { putString(BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION, version) } } diff --git a/vector/src/main/java/im/vector/app/core/utils/RingtoneUtils.kt b/vector/src/main/java/im/vector/app/core/utils/RingtoneUtils.kt index 82b8c3a51a..9b84ea7b2f 100644 --- a/vector/src/main/java/im/vector/app/core/utils/RingtoneUtils.kt +++ b/vector/src/main/java/im/vector/app/core/utils/RingtoneUtils.kt @@ -21,7 +21,7 @@ import android.media.Ringtone import android.media.RingtoneManager import android.net.Uri import androidx.core.content.edit -import androidx.preference.PreferenceManager +import im.vector.app.core.di.DefaultSharedPreferences import im.vector.app.features.settings.VectorPreferences /** @@ -40,7 +40,7 @@ import im.vector.app.features.settings.VectorPreferences * @see Ringtone */ fun getCallRingtoneUri(context: Context): Uri? { - val callRingtone: String? = PreferenceManager.getDefaultSharedPreferences(context) + val callRingtone: String? = DefaultSharedPreferences.getInstance(context) .getString(VectorPreferences.SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY, null) callRingtone?.let { @@ -94,7 +94,7 @@ fun getCallRingtoneName(context: Context): String? { * @see Ringtone */ fun setCallRingtoneUri(context: Context, ringtoneUri: Uri) { - PreferenceManager.getDefaultSharedPreferences(context) + DefaultSharedPreferences.getInstance(context) .edit { putString(VectorPreferences.SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY, ringtoneUri.toString()) } @@ -104,14 +104,14 @@ fun setCallRingtoneUri(context: Context, ringtoneUri: Uri) { * Set using Riot default ringtone */ fun useRiotDefaultRingtone(context: Context): Boolean { - return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(VectorPreferences.SETTINGS_CALL_RINGTONE_USE_RIOT_PREFERENCE_KEY, true) + return DefaultSharedPreferences.getInstance(context).getBoolean(VectorPreferences.SETTINGS_CALL_RINGTONE_USE_RIOT_PREFERENCE_KEY, true) } /** * Ask if default Riot ringtone has to be used */ fun setUseRiotDefaultRingtone(context: Context, useRiotDefault: Boolean) { - PreferenceManager.getDefaultSharedPreferences(context) + DefaultSharedPreferences.getInstance(context) .edit { putBoolean(VectorPreferences.SETTINGS_CALL_RINGTONE_USE_RIOT_PREFERENCE_KEY, useRiotDefault) } diff --git a/vector/src/main/java/im/vector/app/features/disclaimer/DisclaimerDialog.kt b/vector/src/main/java/im/vector/app/features/disclaimer/DisclaimerDialog.kt index b9568e0b62..c2cd2e11e3 100644 --- a/vector/src/main/java/im/vector/app/features/disclaimer/DisclaimerDialog.kt +++ b/vector/src/main/java/im/vector/app/features/disclaimer/DisclaimerDialog.kt @@ -20,8 +20,8 @@ import android.app.Activity import android.content.Context import androidx.appcompat.app.AlertDialog import androidx.core.content.edit -import androidx.preference.PreferenceManager import im.vector.app.R +import im.vector.app.core.di.DefaultSharedPreferences import im.vector.app.core.utils.openUrlInChromeCustomTab import im.vector.app.features.settings.VectorSettingsUrls @@ -31,7 +31,7 @@ private const val CURRENT_DISCLAIMER_VALUE = 2 private const val SHARED_PREF_KEY = "LAST_DISCLAIMER_VERSION_VALUE" fun showDisclaimerDialog(activity: Activity) { - val sharedPrefs = PreferenceManager.getDefaultSharedPreferences(activity) + val sharedPrefs = DefaultSharedPreferences.getInstance(activity) if (sharedPrefs.getInt(SHARED_PREF_KEY, 0) < CURRENT_DISCLAIMER_VALUE) { sharedPrefs.edit { @@ -52,7 +52,7 @@ fun showDisclaimerDialog(activity: Activity) { } fun doNotShowDisclaimerDialog(context: Context) { - val sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context) + val sharedPrefs = DefaultSharedPreferences.getInstance(context) sharedPrefs.edit { putInt(SHARED_PREF_KEY, CURRENT_DISCLAIMER_VALUE) diff --git a/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt b/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt index 683dea43b0..094fc4b3bb 100644 --- a/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt +++ b/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt @@ -18,8 +18,8 @@ package im.vector.app.features.homeserver import android.content.Context import androidx.core.content.edit -import androidx.preference.PreferenceManager import im.vector.app.R +import im.vector.app.core.di.DefaultSharedPreferences /** * Object to store and retrieve home and identity server urls @@ -38,7 +38,7 @@ object ServerUrlsRepository { * Save home and identity sever urls received by the Referrer receiver */ fun setDefaultUrlsFromReferrer(context: Context, homeServerUrl: String, identityServerUrl: String) { - PreferenceManager.getDefaultSharedPreferences(context) + DefaultSharedPreferences.getInstance(context) .edit { if (homeServerUrl.isNotEmpty()) { putString(DEFAULT_REFERRER_HOME_SERVER_URL_PREF, homeServerUrl) @@ -54,7 +54,7 @@ object ServerUrlsRepository { * Save home and identity sever urls entered by the user. May be custom or default value */ fun saveServerUrls(context: Context, homeServerUrl: String, identityServerUrl: String) { - PreferenceManager.getDefaultSharedPreferences(context) + DefaultSharedPreferences.getInstance(context) .edit { putString(HOME_SERVER_URL_PREF, homeServerUrl) putString(IDENTITY_SERVER_URL_PREF, identityServerUrl) @@ -65,7 +65,7 @@ object ServerUrlsRepository { * Return last used home server url, or the default one from referrer or the default one from resources */ fun getLastHomeServerUrl(context: Context): String { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) + val prefs = DefaultSharedPreferences.getInstance(context) return prefs.getString(HOME_SERVER_URL_PREF, prefs.getString(DEFAULT_REFERRER_HOME_SERVER_URL_PREF, diff --git a/vector/src/main/java/im/vector/app/features/rageshake/VectorUncaughtExceptionHandler.kt b/vector/src/main/java/im/vector/app/features/rageshake/VectorUncaughtExceptionHandler.kt index 53f10e5d54..6954b9c87b 100644 --- a/vector/src/main/java/im/vector/app/features/rageshake/VectorUncaughtExceptionHandler.kt +++ b/vector/src/main/java/im/vector/app/features/rageshake/VectorUncaughtExceptionHandler.kt @@ -19,7 +19,7 @@ package im.vector.app.features.rageshake import android.content.Context import android.os.Build import androidx.core.content.edit -import androidx.preference.PreferenceManager +import im.vector.app.core.di.DefaultSharedPreferences import im.vector.app.core.resources.VersionCodeProvider import im.vector.app.features.version.VersionProvider import org.matrix.android.sdk.api.Matrix @@ -61,7 +61,7 @@ class VectorUncaughtExceptionHandler @Inject constructor(private val bugReporter */ override fun uncaughtException(thread: Thread, throwable: Throwable) { Timber.v("Uncaught exception: $throwable") - PreferenceManager.getDefaultSharedPreferences(context).edit { + DefaultSharedPreferences.getInstance(context).edit { putBoolean(PREFS_CRASH_KEY, true) } val b = StringBuilder() @@ -115,7 +115,7 @@ class VectorUncaughtExceptionHandler @Inject constructor(private val bugReporter * @return true if the application crashed */ fun didAppCrash(context: Context): Boolean { - return PreferenceManager.getDefaultSharedPreferences(context) + return DefaultSharedPreferences.getInstance(context) .getBoolean(PREFS_CRASH_KEY, false) } @@ -123,7 +123,7 @@ class VectorUncaughtExceptionHandler @Inject constructor(private val bugReporter * Clear the crash status */ fun clearAppCrashStatus(context: Context) { - PreferenceManager.getDefaultSharedPreferences(context).edit { + DefaultSharedPreferences.getInstance(context).edit { remove(PREFS_CRASH_KEY) } } diff --git a/vector/src/main/java/im/vector/app/features/settings/FontScale.kt b/vector/src/main/java/im/vector/app/features/settings/FontScale.kt index 5fbb021e0a..ad678ec49d 100644 --- a/vector/src/main/java/im/vector/app/features/settings/FontScale.kt +++ b/vector/src/main/java/im/vector/app/features/settings/FontScale.kt @@ -19,8 +19,8 @@ package im.vector.app.features.settings import android.content.Context import androidx.annotation.StringRes import androidx.core.content.edit -import androidx.preference.PreferenceManager import im.vector.app.R +import im.vector.app.core.di.DefaultSharedPreferences /** * Object to manage the Font Scale choice of the user @@ -56,7 +56,7 @@ object FontScale { * @return the font scale value */ fun getFontScaleValue(context: Context): FontScaleValue { - val preferences = PreferenceManager.getDefaultSharedPreferences(context) + val preferences = DefaultSharedPreferences.getInstance(context) return if (APPLICATION_FONT_SCALE_KEY !in preferences) { val fontScale = context.resources.configuration.fontScale @@ -81,7 +81,7 @@ object FontScale { * @param fontScaleValue the font scale value to store */ private fun saveFontScaleValue(context: Context, fontScaleValue: FontScaleValue) { - PreferenceManager.getDefaultSharedPreferences(context) + DefaultSharedPreferences.getInstance(context) .edit { putString(APPLICATION_FONT_SCALE_KEY, fontScaleValue.preferenceValue) } } } diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorLocale.kt b/vector/src/main/java/im/vector/app/features/settings/VectorLocale.kt index b9d81ab005..cff4ca0cb9 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorLocale.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorLocale.kt @@ -19,9 +19,9 @@ package im.vector.app.features.settings import android.content.Context import android.content.res.Configuration import androidx.core.content.edit -import androidx.preference.PreferenceManager import im.vector.app.BuildConfig import im.vector.app.R +import im.vector.app.core.di.DefaultSharedPreferences import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import timber.log.Timber @@ -59,7 +59,7 @@ object VectorLocale { */ fun init(context: Context) { this.context = context - val preferences = PreferenceManager.getDefaultSharedPreferences(context) + val preferences = DefaultSharedPreferences.getInstance(context) if (preferences.contains(APPLICATION_LOCALE_LANGUAGE_KEY)) { applicationLocale = Locale(preferences.getString(APPLICATION_LOCALE_LANGUAGE_KEY, "")!!, @@ -85,7 +85,7 @@ object VectorLocale { fun saveApplicationLocale(locale: Locale) { applicationLocale = locale - PreferenceManager.getDefaultSharedPreferences(context).edit { + DefaultSharedPreferences.getInstance(context).edit { val language = locale.language if (language.isEmpty()) { remove(APPLICATION_LOCALE_LANGUAGE_KEY) diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt index 69f8540a1d..886395c1f7 100755 --- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt @@ -22,10 +22,10 @@ import android.media.RingtoneManager import android.net.Uri import android.provider.MediaStore import androidx.core.content.edit -import androidx.preference.PreferenceManager import com.squareup.seismic.ShakeDetector import im.vector.app.BuildConfig import im.vector.app.R +import im.vector.app.core.di.DefaultSharedPreferences import im.vector.app.features.homeserver.ServerUrlsRepository import im.vector.app.features.themes.ThemeUtils import org.matrix.android.sdk.api.extensions.tryThis @@ -227,7 +227,7 @@ class VectorPreferences @Inject constructor(private val context: Context) { ) } - private val defaultPrefs = PreferenceManager.getDefaultSharedPreferences(context) + private val defaultPrefs = DefaultSharedPreferences.getInstance(context) /** * Clear the preferences. diff --git a/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt b/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt index 69a385fc47..18faa07954 100644 --- a/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt +++ b/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt @@ -25,8 +25,8 @@ import androidx.annotation.AttrRes import androidx.annotation.ColorInt import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat -import androidx.preference.PreferenceManager import im.vector.app.R +import im.vector.app.core.di.DefaultSharedPreferences import timber.log.Timber import java.util.concurrent.atomic.AtomicReference @@ -73,8 +73,7 @@ object ThemeUtils { fun getApplicationTheme(context: Context): String { val currentTheme = this.currentTheme.get() return if (currentTheme == null) { - val themeFromPref = PreferenceManager - .getDefaultSharedPreferences(context) + val themeFromPref = DefaultSharedPreferences.getInstance(context) .getString(APPLICATION_THEME_KEY, THEME_LIGHT_VALUE) ?: THEME_LIGHT_VALUE this.currentTheme.set(themeFromPref) themeFromPref