Revert "Revert "Migrate IDP_GRID_NAME usage to LauncherPrefs""
This reverts commit df11959779ca08a48308d9e390eb5b3fdb4bbf35.
Bug: 269569568
Test: In follow-up CL, everything works on device and manual and unit tests
verified original bug from this CL is not present.
Change-Id: I125bbbfd6442cd3fa1e88c9109de536b88981dc6
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index 604c1b8..2fb0fa6 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -16,6 +16,7 @@
package com.android.launcher3;
+import static com.android.launcher3.LauncherPrefs.GRID_NAME;
import static com.android.launcher3.Utilities.dpiFromPx;
import static com.android.launcher3.config.FeatureFlags.ENABLE_DEVICE_PROFILE_LOGGING;
import static com.android.launcher3.config.FeatureFlags.ENABLE_TWO_PANEL_HOME;
@@ -93,8 +94,6 @@
public static final int TYPE_MULTI_DISPLAY = 1;
public static final int TYPE_TABLET = 2;
- private static final String KEY_IDP_GRID_NAME = "idp_grid_name";
-
private static final float ICON_SIZE_DEFINED_IN_APP_DP = 48;
// Constants that affects the interpolation curve between statically defined device profile
@@ -207,8 +206,7 @@
String gridName = getCurrentGridName(context);
String newGridName = initGrid(context, gridName);
if (!newGridName.equals(gridName)) {
- LauncherPrefs.getPrefs(context).edit().putString(KEY_IDP_GRID_NAME, newGridName)
- .apply();
+ LauncherPrefs.get(context).put(GRID_NAME, newGridName);
}
new DeviceGridState(this).writeToPrefs(context);
@@ -316,7 +314,7 @@
}
public static String getCurrentGridName(Context context) {
- return LauncherPrefs.getPrefs(context).getString(KEY_IDP_GRID_NAME, null);
+ return LauncherPrefs.get(context).get(GRID_NAME);
}
private String initGrid(Context context, String gridName) {
@@ -458,9 +456,8 @@
public void setCurrentGrid(Context context, String gridName) {
- Context appContext = context.getApplicationContext();
- LauncherPrefs.getPrefs(appContext).edit().putString(KEY_IDP_GRID_NAME, gridName).apply();
- MAIN_EXECUTOR.execute(() -> onConfigChanged(appContext));
+ LauncherPrefs.get(context).put(GRID_NAME, gridName);
+ MAIN_EXECUTOR.execute(() -> onConfigChanged(context.getApplicationContext()));
}
private Object[] toModelState() {
diff --git a/src/com/android/launcher3/LauncherPrefs.kt b/src/com/android/launcher3/LauncherPrefs.kt
index 2e07e30..befaa64 100644
--- a/src/com/android/launcher3/LauncherPrefs.kt
+++ b/src/com/android/launcher3/LauncherPrefs.kt
@@ -4,6 +4,8 @@
import android.content.SharedPreferences
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import androidx.annotation.VisibleForTesting
+import com.android.launcher3.LauncherFiles.DEVICE_PREFERENCES_KEY
+import com.android.launcher3.LauncherFiles.SHARED_PREFERENCES_KEY
import com.android.launcher3.allapps.WorkProfileManager
import com.android.launcher3.model.DeviceGridState
import com.android.launcher3.pm.InstallSessionHelper
@@ -20,11 +22,10 @@
class LauncherPrefs(private val context: Context) {
/** Wrapper around `getInner` for a `ContextualItem` */
- fun <T : Any> get(item: ContextualItem<T>): T =
- getInner(item, item.defaultValueFromContext(context))
+ fun <T> get(item: ContextualItem<T>): T = getInner(item, item.defaultValueFromContext(context))
/** Wrapper around `getInner` for an `Item` */
- fun <T : Any> get(item: ConstantItem<T>): T = getInner(item, item.defaultValue)
+ fun <T> get(item: ConstantItem<T>): T = getInner(item, item.defaultValue)
/**
* Retrieves the value for an [Item] from [SharedPreferences]. It handles method typing via the
@@ -32,11 +33,11 @@
* `String`, `Boolean`, `Float`, `Int`, `Long`, or `Set<String>`.
*/
@Suppress("IMPLICIT_CAST_TO_ANY", "UNCHECKED_CAST")
- private fun <T : Any> getInner(item: Item, default: T): T {
+ private fun <T> getInner(item: Item, default: T): T {
val sp = context.getSharedPreferences(item.sharedPrefFile, Context.MODE_PRIVATE)
- return when (default::class.java) {
- String::class.java -> sp.getString(item.sharedPrefKey, default as String)
+ return when (item.type) {
+ String::class.java -> sp.getString(item.sharedPrefKey, default as? String)
Boolean::class.java,
java.lang.Boolean::class.java -> sp.getBoolean(item.sharedPrefKey, default as Boolean)
Int::class.java,
@@ -45,11 +46,10 @@
java.lang.Float::class.java -> sp.getFloat(item.sharedPrefKey, default as Float)
Long::class.java,
java.lang.Long::class.java -> sp.getLong(item.sharedPrefKey, default as Long)
- Set::class.java -> sp.getStringSet(item.sharedPrefKey, default as Set<String>)
+ Set::class.java -> sp.getStringSet(item.sharedPrefKey, default as? Set<String>)
else ->
throw IllegalArgumentException(
- "item type: ${default::class.java}" +
- " is not compatible with sharedPref methods"
+ "item type: ${item.type}" + " is not compatible with sharedPref methods"
)
}
as T
@@ -224,39 +224,36 @@
backedUpItem(RestoreDbTask.RESTORED_DEVICE_TYPE, InvariantDeviceProfile.TYPE_PHONE)
@JvmField val APP_WIDGET_IDS = backedUpItem(RestoreDbTask.APPWIDGET_IDS, "")
@JvmField val OLD_APP_WIDGET_IDS = backedUpItem(RestoreDbTask.APPWIDGET_OLD_IDS, "")
+ @JvmField val GRID_NAME = ConstantItem("idp_grid_name", true, null, String::class.java)
@JvmField
val ALLOW_ROTATION =
- backedUpItem(RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY) {
+ backedUpItem(RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY, Boolean::class.java) {
RotationHelper.getAllowRotationDefaultValue(DisplayController.INSTANCE.get(it).info)
}
@VisibleForTesting
@JvmStatic
fun <T> backedUpItem(sharedPrefKey: String, defaultValue: T): ConstantItem<T> =
- ConstantItem(sharedPrefKey, LauncherFiles.SHARED_PREFERENCES_KEY, defaultValue)
+ ConstantItem(sharedPrefKey, true, defaultValue)
@JvmStatic
fun <T> backedUpItem(
sharedPrefKey: String,
+ type: Class<out T>,
defaultValueFromContext: (c: Context) -> T
- ): ContextualItem<T> =
- ContextualItem(
- sharedPrefKey,
- LauncherFiles.SHARED_PREFERENCES_KEY,
- defaultValueFromContext
- )
+ ): ContextualItem<T> = ContextualItem(sharedPrefKey, true, defaultValueFromContext, type)
@VisibleForTesting
@JvmStatic
fun <T> nonRestorableItem(sharedPrefKey: String, defaultValue: T): ConstantItem<T> =
- ConstantItem(sharedPrefKey, LauncherFiles.DEVICE_PREFERENCES_KEY, defaultValue)
+ ConstantItem(sharedPrefKey, false, defaultValue)
@Deprecated("Don't use shared preferences directly. Use other LauncherPref methods.")
@JvmStatic
fun getPrefs(context: Context): SharedPreferences {
// Use application context for shared preferences, so we use single cached instance
return context.applicationContext.getSharedPreferences(
- LauncherFiles.SHARED_PREFERENCES_KEY,
+ SHARED_PREFERENCES_KEY,
Context.MODE_PRIVATE
)
}
@@ -266,7 +263,7 @@
fun getDevicePrefs(context: Context): SharedPreferences {
// Use application context for shared preferences, so we use a single cached instance
return context.applicationContext.getSharedPreferences(
- LauncherFiles.DEVICE_PREFERENCES_KEY,
+ DEVICE_PREFERENCES_KEY,
Context.MODE_PRIVATE
)
}
@@ -275,21 +272,26 @@
abstract class Item {
abstract val sharedPrefKey: String
- abstract val sharedPrefFile: String
+ abstract val isBackedUp: Boolean
+ abstract val type: Class<*>
+ val sharedPrefFile: String = if (isBackedUp) SHARED_PREFERENCES_KEY else DEVICE_PREFERENCES_KEY
fun <T> to(value: T): Pair<Item, T> = Pair(this, value)
}
data class ConstantItem<T>(
override val sharedPrefKey: String,
- override val sharedPrefFile: String,
- val defaultValue: T
+ override val isBackedUp: Boolean,
+ val defaultValue: T,
+ // The default value can be null. If so, the type needs to be explicitly stated, or else NPE
+ override val type: Class<out T> = defaultValue!!::class.java
) : Item()
data class ContextualItem<T>(
override val sharedPrefKey: String,
- override val sharedPrefFile: String,
- private val defaultSupplier: (c: Context) -> T
+ override val isBackedUp: Boolean,
+ private val defaultSupplier: (c: Context) -> T,
+ override val type: Class<out T>
) : Item() {
private var default: T? = null