diff --git a/lawnchair/res/values/config.xml b/lawnchair/res/values/config.xml
index 5f0770db50..c0efb83751 100644
--- a/lawnchair/res/values/config.xml
+++ b/lawnchair/res/values/config.xml
@@ -22,6 +22,8 @@
app.lawnchair.LauncherActivityCachingLogic
app.lawnchair.LawnchairProcessInitializer
app.lawnchair.overview.TaskOverlayFactoryImpl
+ com.android.wallpaper
+ com.android.wallpaper
true
diff --git a/lawnchair/src/app/lawnchair/DeviceProfileOverrides.kt b/lawnchair/src/app/lawnchair/DeviceProfileOverrides.kt
index 3d297108fb..4c745a8190 100644
--- a/lawnchair/src/app/lawnchair/DeviceProfileOverrides.kt
+++ b/lawnchair/src/app/lawnchair/DeviceProfileOverrides.kt
@@ -15,6 +15,38 @@ class DeviceProfileOverrides(context: Context) {
private val prefs = PreferenceManager.getInstance(context)
private val preferenceManager2 = PreferenceManager2.getInstance(context)
+ private val predefinedGrids = InvariantDeviceProfile.parseAllGridOptions(context)
+ .map { option ->
+ val gridInfo = DBGridInfo(
+ numHotseatColumns = option.numHotseatIcons,
+ numRows = option.numRows,
+ numColumns = option.numColumns
+ )
+ gridInfo to option.name
+ }
+
+ fun getGridInfo() = DBGridInfo(prefs)
+
+ fun getGridInfo(gridName: String) = predefinedGrids
+ .first { it.second == gridName }
+ .first
+
+ fun getGridName(gridInfo: DBGridInfo): String {
+ val match = predefinedGrids
+ .firstOrNull { it.first.numRows >= gridInfo.numRows && it.first.numColumns >= gridInfo.numColumns }
+ ?: predefinedGrids.last()
+ return match.second
+ }
+
+ fun getCurrentGridName() = getGridName(getGridInfo())
+
+ fun setCurrentGrid(gridName: String) {
+ val gridInfo = getGridInfo(gridName)
+ prefs.workspaceRows.set(gridInfo.numRows)
+ prefs.workspaceColumns.set(gridInfo.numColumns)
+ prefs.hotseatColumns.set(gridInfo.numHotseatColumns)
+ }
+
fun getOverrides(defaultGrid: InvariantDeviceProfile.GridOption) =
Options(
prefs = prefs,
@@ -22,10 +54,21 @@ class DeviceProfileOverrides(context: Context) {
defaultGrid = defaultGrid,
)
- data class Options(
+ data class DBGridInfo(
var numHotseatColumns: Int,
var numRows: Int,
var numColumns: Int,
+ ) {
+ val dbFile get() = "launcher_${numRows}_${numColumns}_${numHotseatColumns}.db"
+
+ constructor(prefs: PreferenceManager) : this(
+ numHotseatColumns = prefs.hotseatColumns.get(),
+ numRows = prefs.workspaceRows.get(),
+ numColumns = prefs.workspaceColumns.get(),
+ )
+ }
+
+ data class Options(
var numAllAppsColumns: Int,
var numFolderRows: Int,
var numFolderColumns: Int,
@@ -40,16 +83,11 @@ class DeviceProfileOverrides(context: Context) {
var enableTaskbarOnPhone: Boolean,
) {
- val dbFile get() = "launcher_${numRows}_${numColumns}_${numHotseatColumns}.db"
-
constructor(
prefs: PreferenceManager,
prefs2: PreferenceManager2,
defaultGrid: InvariantDeviceProfile.GridOption,
) : this(
- numHotseatColumns = prefs.hotseatColumns.get(defaultGrid),
- numRows = prefs.workspaceRows.get(defaultGrid),
- numColumns = prefs.workspaceColumns.get(defaultGrid),
numAllAppsColumns = prefs2.drawerColumns.firstBlocking(gridOption = defaultGrid),
numFolderRows = prefs.folderRows.get(defaultGrid),
numFolderColumns = prefs2.folderColumns.firstBlocking(gridOption = defaultGrid),
diff --git a/lawnchair/src/app/lawnchair/preferences/BasePreferenceManager.kt b/lawnchair/src/app/lawnchair/preferences/BasePreferenceManager.kt
index 87e04d21d4..734fa77c4d 100644
--- a/lawnchair/src/app/lawnchair/preferences/BasePreferenceManager.kt
+++ b/lawnchair/src/app/lawnchair/preferences/BasePreferenceManager.kt
@@ -58,11 +58,11 @@ abstract class BasePreferenceManager(private val context: Context) : SharedPrefe
inBatchMode = value > 0
}
- init {
- if (!sp.contains("version")) {
- sp.edit {
- putInt("version", 1)
- }
+ fun migratePrefs(currentVersion: Int, block: (oldVersion: Int) -> Unit) {
+ val oldVersion = sp.getInt("version", 9999)
+ block(oldVersion)
+ sp.edit {
+ putInt("version", currentVersion)
}
}
diff --git a/lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt b/lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt
index ff9b873667..ae19a53e27 100644
--- a/lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt
+++ b/lawnchair/src/app/lawnchair/preferences/PreferenceManager.kt
@@ -40,9 +40,9 @@ class PreferenceManager private constructor(private val context: Context) : Base
val allowRotation = BoolPref("pref_allowRotation", false)
val wrapAdaptiveIcons = BoolPref("prefs_wrapAdaptive", false, reloadIcons)
val addIconToHome = BoolPref("pref_add_icon_to_home", true)
- val hotseatColumns = IdpIntPref("pref_hotseatColumns", { numHotseatIcons }, reloadGrid)
- val workspaceColumns = IdpIntPref("pref_workspaceColumns", { numColumns })
- val workspaceRows = IdpIntPref("pref_workspaceRows", { numRows })
+ val hotseatColumns = IntPref("pref_hotseatColumns", 4, reloadGrid)
+ val workspaceColumns = IntPref("pref_workspaceColumns", 4)
+ val workspaceRows = IntPref("pref_workspaceRows", 5)
val folderRows = IdpIntPref("pref_folderRows", { numFolderRows }, reloadGrid)
val drawerOpacity = FloatPref("pref_drawerOpacity", 1F, recreate)
@@ -86,9 +86,21 @@ class PreferenceManager private constructor(private val context: Context) : Base
init {
sp.registerOnSharedPreferenceChangeListener(this)
+ migratePrefs(CURRENT_VERSION) { oldVersion ->
+ if (oldVersion < 2) {
+ listOf(hotseatColumns, workspaceColumns, workspaceRows)
+ .forEach {
+ if (it.get() == -1) {
+ it.set(it.defaultValue)
+ }
+ }
+ }
+ }
}
companion object {
+ private const val CURRENT_VERSION = 2
+
@JvmField
val INSTANCE = MainThreadInitializedObject(::PreferenceManager)
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/GridOverridesPreview.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/GridOverridesPreview.kt
index ca7cbf5a05..c40c315af9 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/components/GridOverridesPreview.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/components/GridOverridesPreview.kt
@@ -9,13 +9,12 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import app.lawnchair.DeviceProfileOverrides
import app.lawnchair.preferences.preferenceManager
-import app.lawnchair.preferences2.preferenceManager2
import com.android.launcher3.InvariantDeviceProfile
@Composable
fun GridOverridesPreview(
modifier: Modifier = Modifier,
- updateGridOptions: DeviceProfileOverrides.Options.() -> Unit
+ updateGridOptions: DeviceProfileOverrides.DBGridInfo.() -> Unit
) {
DummyLauncherBox(modifier = modifier) {
WallpaperPreview(modifier = Modifier.fillMaxSize())
@@ -27,15 +26,13 @@ fun GridOverridesPreview(
}
@Composable
-fun createPreviewIdp(updateGridOptions: DeviceProfileOverrides.Options.() -> Unit): InvariantDeviceProfile {
+fun createPreviewIdp(updateGridOptions: DeviceProfileOverrides.DBGridInfo.() -> Unit): InvariantDeviceProfile {
val context = LocalContext.current
val prefs = preferenceManager()
- val preferenceManager2 = preferenceManager2()
- val defaultGrid = invariantDeviceProfile().closestProfile
val newIdp by remember {
derivedStateOf {
- val options = DeviceProfileOverrides.Options(prefs, preferenceManager2, defaultGrid)
+ val options = DeviceProfileOverrides.DBGridInfo(prefs)
updateGridOptions(options)
InvariantDeviceProfile(context, options)
}
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index 117dc61f09..1a753fbff7 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -202,23 +202,12 @@ public class InvariantDeviceProfile {
* This constructor should NOT have any monitors by design.
*/
public InvariantDeviceProfile(Context context, String gridName) {
- String newName = initGrid(context, gridName);
- if (newName == null || !newName.equals(gridName)) {
- throw new IllegalArgumentException("Unknown grid name");
- }
+ this(context, DeviceProfileOverrides.INSTANCE.get(context).getGridInfo(gridName));
}
- public InvariantDeviceProfile(Context context, DeviceProfileOverrides.Options overrideOptions) {
- // Get the display info based on default display and interpolate it to existing display
- Info defaultInfo = DisplayController.INSTANCE.get(context).getInfo();
- @DeviceType int defaultDeviceType = getDeviceType(defaultInfo);
-
- String gridName = getCurrentGridName(context);
- ArrayList allOptions =
- getPredefinedDeviceProfiles(context, gridName, defaultDeviceType, false);
- DisplayOption displayOption =
- invDistWeightedInterpolate(defaultInfo, allOptions, defaultDeviceType);
- initGrid(context, defaultInfo, displayOption, defaultDeviceType, overrideOptions);
+ public InvariantDeviceProfile(Context context, DeviceProfileOverrides.DBGridInfo dbGridInfo) {
+ String gridName = DeviceProfileOverrides.INSTANCE.get(context).getGridName(dbGridInfo);
+ initGrid(context, gridName, dbGridInfo);
}
/**
@@ -299,11 +288,16 @@ public class InvariantDeviceProfile {
}
public static String getCurrentGridName(Context context) {
- return Utilities.isGridOptionsEnabled(context)
- ? Utilities.getPrefs(context).getString(KEY_IDP_GRID_NAME, null) : null;
+ return DeviceProfileOverrides.INSTANCE.get(context).getCurrentGridName();
}
private String initGrid(Context context, String gridName) {
+ DeviceProfileOverrides.DBGridInfo dbGridInfo = DeviceProfileOverrides.INSTANCE.get(context)
+ .getGridInfo();
+ return initGrid(context, gridName, dbGridInfo);
+ }
+
+ private String initGrid(Context context, String gridName, DeviceProfileOverrides.DBGridInfo dbGridInfo) {
Info displayInfo = DisplayController.INSTANCE.get(context).getInfo();
@DeviceType int deviceType = getDeviceType(displayInfo);
@@ -312,25 +306,26 @@ public class InvariantDeviceProfile {
RestoreDbTask.isPending(context));
DisplayOption displayOption =
invDistWeightedInterpolate(displayInfo, allOptions, deviceType);
- initGrid(context, displayInfo, displayOption, deviceType);
+ initGrid(context, displayInfo, displayOption, deviceType, dbGridInfo);
return displayOption.grid.name;
}
- private void initGrid(
- Context context, Info displayInfo, DisplayOption displayOption,
+ private void initGrid(Context context, Info displayInfo, DisplayOption displayOption,
@DeviceType int deviceType) {
- DeviceProfileOverrides.Options overrideOptions = DeviceProfileOverrides.INSTANCE.get(context)
- .getOverrides(displayOption.grid);
- initGrid(context, displayInfo, displayOption, deviceType, overrideOptions);
+ DeviceProfileOverrides.DBGridInfo dbGridInfo = DeviceProfileOverrides.INSTANCE.get(context)
+ .getGridInfo();
+ initGrid(context, displayInfo, displayOption, deviceType, dbGridInfo);
}
private void initGrid(Context context, Info displayInfo, DisplayOption displayOption,
- @DeviceType int deviceType, DeviceProfileOverrides.Options overrideOptions) {
+ @DeviceType int deviceType, DeviceProfileOverrides.DBGridInfo dbGridInfo) {
+ DeviceProfileOverrides.Options overrideOptions = DeviceProfileOverrides.INSTANCE.get(context)
+ .getOverrides(displayOption.grid);
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
closestProfile = displayOption.grid;
- numRows = overrideOptions.getNumRows();
- numColumns = overrideOptions.getNumColumns();
- dbFile = overrideOptions.getDbFile();
+ numRows = dbGridInfo.getNumRows();
+ numColumns = dbGridInfo.getNumColumns();
+ dbFile = dbGridInfo.getDbFile();
defaultLayoutId = closestProfile.defaultLayoutId;
demoModeLayoutId = closestProfile.demoModeLayoutId;
numFolderRows = closestProfile.numFolderRows;
@@ -351,8 +346,8 @@ public class InvariantDeviceProfile {
horizontalMargin = displayOption.horizontalMargin;
- numShownHotseatIcons = overrideOptions.getNumHotseatColumns();
- numDatabaseHotseatIcons = overrideOptions.getNumHotseatColumns();
+ numShownHotseatIcons = dbGridInfo.getNumHotseatColumns();
+ numDatabaseHotseatIcons = dbGridInfo.getNumHotseatColumns();
numAllAppsColumns = closestProfile.numAllAppsColumns;
numDatabaseAllAppsColumns = deviceType == TYPE_MULTI_DISPLAY
@@ -414,8 +409,8 @@ public class InvariantDeviceProfile {
public void setCurrentGrid(Context context, String gridName) {
+ DeviceProfileOverrides.INSTANCE.get(context).setCurrentGrid(gridName);
Context appContext = context.getApplicationContext();
- Utilities.getPrefs(appContext).edit().putString(KEY_IDP_GRID_NAME, gridName).apply();
MAIN_EXECUTOR.execute(() -> onConfigChanged(appContext));
}
@@ -501,7 +496,9 @@ public class InvariantDeviceProfile {
/**
* @return all the grid options that can be shown on the device
*/
- public List parseAllGridOptions(Context context) {
+ public static List parseAllGridOptions(Context context) {
+ Info defaultInfo = DisplayController.INSTANCE.get(context).getInfo();
+ @DeviceType int deviceType = getDeviceType(defaultInfo);
List result = new ArrayList<>();
try (XmlResourceParser parser = context.getResources().getXml(R.xml.device_profiles)) {
diff --git a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java
index fc8d855801..6e94ebdedf 100644
--- a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java
+++ b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java
@@ -83,7 +83,7 @@ public class GridCustomizationsProvider extends ContentProvider {
MatrixCursor cursor = new MatrixCursor(new String[] {
KEY_NAME, KEY_ROWS, KEY_COLS, KEY_PREVIEW_COUNT, KEY_IS_DEFAULT});
InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(getContext());
- for (GridOption gridOption : idp.parseAllGridOptions(getContext())) {
+ for (GridOption gridOption : InvariantDeviceProfile.parseAllGridOptions(getContext())) {
cursor.newRow()
.add(KEY_NAME, gridOption.name)
.add(KEY_ROWS, gridOption.numRows)
@@ -128,7 +128,7 @@ public class GridCustomizationsProvider extends ContentProvider {
InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(getContext());
// Verify that this is a valid grid option
GridOption match = null;
- for (GridOption option : idp.parseAllGridOptions(getContext())) {
+ for (GridOption option : InvariantDeviceProfile.parseAllGridOptions(getContext())) {
if (option.name.equals(gridName)) {
match = option;
break;