From 2e1b4f1b3984099428a7ee6ee1e1c8fe98e30aff Mon Sep 17 00:00:00 2001 From: Patryk Michalik Date: Thu, 11 Mar 2021 18:59:14 +0100 Subject: [PATCH] Add option to allow empty home screen pages --- lawnchair/res/values/strings.xml | 1 + .../ui/preferences/HomeScreenPreferences.kt | 5 ++++ .../ui/preferences/PreferenceInteractor.kt | 2 ++ .../compose/ui/preferences/Preferences.kt | 6 +++++ .../sharedprefs/LawnchairPreferences.kt | 10 ++++++++ .../lawnchair/sharedprefs/PrefManager.kt | 1 + src/com/android/launcher3/Workspace.java | 23 +++++++++++++++++++ 7 files changed, 48 insertions(+) diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml index c99e0fe780..73bee3f262 100644 --- a/lawnchair/res/values/strings.xml +++ b/lawnchair/res/values/strings.xml @@ -32,4 +32,5 @@ Icons Icon Size Label Size + Allow Empty Pages diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/HomeScreenPreferences.kt b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/HomeScreenPreferences.kt index d76d43af80..f7e1aa2f11 100644 --- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/HomeScreenPreferences.kt +++ b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/HomeScreenPreferences.kt @@ -14,6 +14,11 @@ fun HomeScreenPreferences(interactor: PreferenceInteractor) { onCheckedChange = { interactor.setAddIconToHome(it) }, label = stringResource(id = R.string.auto_add_shortcuts_label) ) + SwitchPreference( + checked = interactor.allowEmptyPages.value, + onCheckedChange = { interactor.setAllowEmptyPages(it) }, + label = stringResource(id = R.string.allow_empty_pages_label) + ) } PreferenceGroup(heading = stringResource(id = R.string.grid), showDivider = true) { SliderPreference( diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceInteractor.kt b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceInteractor.kt index ff5633a8c9..3349569c35 100644 --- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceInteractor.kt +++ b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/PreferenceInteractor.kt @@ -17,6 +17,7 @@ interface PreferenceInteractor { val allAppsIconSizeFactor: State val allAppsTextSizeFactor: State val allAppsColumns: State + val allowEmptyPages: State fun setIconPackPackage(iconPackPackage: String) fun setAllowRotation(allowRotation: Boolean) @@ -32,6 +33,7 @@ interface PreferenceInteractor { fun setAllAppsIconSizeFactor(allAppsIconSizeFactor: Float) fun setAllAppsTextSizeFactor(allAppsTextSizeFactor: Float) fun setAllAppsColumns(allAppsColumns: Float) + fun setAllowEmptyPages(allowEmptyPages: Boolean) fun getIconPacks(): MutableMap } \ No newline at end of file diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/Preferences.kt b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/Preferences.kt index 7fad0c05cd..1736cb1a09 100644 --- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/Preferences.kt +++ b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/preferences/Preferences.kt @@ -40,6 +40,7 @@ class PreferenceViewModel(application: Application) : AndroidViewModel(applicati override val allAppsIconSizeFactor: MutableState = mutableStateOf(pm.allAppsIconSizeFactor) override val allAppsTextSizeFactor: MutableState = mutableStateOf(pm.allAppsTextSizeFactor) override val allAppsColumns: MutableState = mutableStateOf(pm.allAppsColumns) + override val allowEmptyPages: MutableState = mutableStateOf(pm.allowEmptyPages) override fun setIconPackPackage(iconPackPackage: String) { pm.iconPackPackage = iconPackPackage @@ -111,6 +112,11 @@ class PreferenceViewModel(application: Application) : AndroidViewModel(applicati this.allAppsColumns.value = allAppsColumns } + override fun setAllowEmptyPages(allowEmptyPages: Boolean) { + pm.allowEmptyPages = allowEmptyPages + this.allowEmptyPages.value = allowEmptyPages + } + override fun getIconPacks(): MutableMap { val pm = getApplication().packageManager val iconPacks: MutableMap = HashMap() diff --git a/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/LawnchairPreferences.kt b/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/LawnchairPreferences.kt index fb5f9d2475..2a6a7b2285 100644 --- a/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/LawnchairPreferences.kt +++ b/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/LawnchairPreferences.kt @@ -6,6 +6,10 @@ import com.android.launcher3.LauncherAppState import com.android.launcher3.Utilities class LawnchairPreferences(val context: Context) { + /** + * TODO: Fix grid and empty page preferences not taking effect until Lawnchair is restarted. + * `forceReload` doesn’t appear to help in this respect. + */ val listener: SharedPreferences.OnSharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { _: SharedPreferences?, key: String? -> when (key) { @@ -41,6 +45,8 @@ class LawnchairPreferences(val context: Context) { @kotlin.jvm.JvmField var FOLDER_ROWS: String = "pref_folderRows" + // TODO: Fix the four following preferences not taking effect. + @kotlin.jvm.JvmField var ICON_SIZE_FACTOR: String = "pref_iconSizeFactor" @@ -56,6 +62,10 @@ class LawnchairPreferences(val context: Context) { @kotlin.jvm.JvmField var WRAP_ADAPTIVE_ICONS: String = "prefs_wrapAdaptive" + // TODO: Add the ability to manually delete empty pages. + @kotlin.jvm.JvmField + var ALLOW_EMPTY_PAGES: String = "pref_allowEmptyPages" + fun getInstance(context: Context?): SharedPreferences? = when { context == null -> null INSTANCE == null -> Utilities.getPrefs(context) diff --git a/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/PrefManager.kt b/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/PrefManager.kt index e1d12a04c3..103a359b33 100644 --- a/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/PrefManager.kt +++ b/lawnchair/src/ch/deletescape/lawnchair/sharedprefs/PrefManager.kt @@ -21,4 +21,5 @@ class PrefManager(context: Context) { var allAppsIconSizeFactor by FloatPrefDelegate(lp.ALL_APPS_ICON_SIZE_FACTOR, 1F) var allAppsTextSizeFactor by FloatPrefDelegate(lp.ALL_APPS_TEXT_SIZE_FACTOR, 1F) var allAppsColumns by FloatPrefDelegate(lp.ALL_APPS_COLUMNS, 5F) + var allowEmptyPages by BoolPrefDelegate(lp.ALLOW_EMPTY_PAGES, false) } \ No newline at end of file diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index a6283ff253..d96f5db605 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -42,6 +42,7 @@ import android.app.WallpaperManager; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; +import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Point; @@ -117,6 +118,8 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.function.Predicate; +import ch.deletescape.lawnchair.sharedprefs.LawnchairPreferences; + /** * The workspace is a wide area with a wallpaper and a finite number of pages. * Each page contains a number of icons, folders or widgets the user can @@ -255,6 +258,9 @@ public class Workspace extends PagedView private final StatsLogManager mStatsLogManager; + // Lawnchair: Create boolean to indicate if empty pages are allowed. + Boolean emptyScreensAllowed; + /** * Used to inflate the Workspace from XML. * @@ -288,6 +294,12 @@ public class Workspace extends PagedView setMotionEventSplittingEnabled(true); setOnTouchListener(new WorkspaceTouchListener(mLauncher, this)); mStatsLogManager = StatsLogManager.newInstance(context); + + // Lawnchair: Get instance of `SharedPreferences`, assign value to `emptyScreensAllowed`. + SharedPreferences prefs = LawnchairPreferences.Companion.getInstance(getContext()); + if (prefs != null) { + emptyScreensAllowed = prefs.getBoolean(LawnchairPreferences.ALLOW_EMPTY_PAGES, false); + } } @Override @@ -621,6 +633,12 @@ public class Workspace extends PagedView } if (hasExtraEmptyScreen() || mScreenOrder.size() == 0) return; + + // Lawnchair: Stop execution if empty pages are allowed. + if (emptyScreensAllowed) { + return; + } + int finalScreenId = mScreenOrder.get(mScreenOrder.size() - 1); CellLayout finalScreen = mWorkspaceScreens.get(finalScreenId); @@ -741,6 +759,11 @@ public class Workspace extends PagedView return; } + // Lawnchair: Stop execution if empty pages are allowed. + if (emptyScreensAllowed) { + return; + } + if (isPageInTransition()) { mStripScreensOnPageStopMoving = true; return;