From e8ac3e23ff4e5b695ce7f48fb045175ad6ed18ea Mon Sep 17 00:00:00 2001 From: Suphon Thanakornpakapong Date: Thu, 19 May 2022 11:43:18 +0700 Subject: [PATCH] Adapt grid dimensions to device profiles --- lawnchair/res/values/config.xml | 2 + .../app/lawnchair/DeviceProfileOverrides.kt | 50 ++++++++++++++-- .../preferences/BasePreferenceManager.kt | 10 ++-- .../preferences/PreferenceManager.kt | 18 +++++- .../components/GridOverridesPreview.kt | 9 +-- .../launcher3/InvariantDeviceProfile.java | 59 +++++++++---------- .../graphics/GridCustomizationsProvider.java | 4 +- 7 files changed, 99 insertions(+), 53 deletions(-) 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;