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;