diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml
index 88d8d07029..9df6d16446 100644
--- a/lawnchair/res/values/strings.xml
+++ b/lawnchair/res/values/strings.xml
@@ -72,4 +72,5 @@
For all non-Adaptive icons.
Support & PR
Double-Tap to Sleep
+ Show At a Glance Widget
diff --git a/lawnchair/src/app/lawnchair/LawnchairApp.kt b/lawnchair/src/app/lawnchair/LawnchairApp.kt
index 3c664f43aa..f44fcc1d8b 100644
--- a/lawnchair/src/app/lawnchair/LawnchairApp.kt
+++ b/lawnchair/src/app/lawnchair/LawnchairApp.kt
@@ -36,6 +36,7 @@ class LawnchairApp : Application() {
val TAG = "LawnchairApp"
fun onLauncherAppStateCreated() {
+ sApplication = this
registerActivityLifecycleCallbacks(activityHandler)
}
@@ -117,6 +118,19 @@ class LawnchairApp : Application() {
}
return true
}
+
+ companion object {
+ @JvmStatic
+ fun getContext(): Context? {
+ return LawnchairApp.getApplication()?.applicationContext
+ }
+
+ private var sApplication: Application? = null
+
+ fun getApplication(): Application? {
+ return sApplication
+ }
+ }
}
val Context.lawnchairApp get() = applicationContext as LawnchairApp
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/HomeScreenPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/HomeScreenPreferences.kt
index 6918f72db4..5c186a9494 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/HomeScreenPreferences.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/HomeScreenPreferences.kt
@@ -47,6 +47,10 @@ fun HomeScreenPreferences() {
label = stringResource(id = R.string.auto_add_shortcuts_label),
showDivider = true
)
+ SwitchPreference(
+ prefs.smartSpaceEnable.getAdapter(),
+ label = stringResource(id = R.string.smart_space_enable),
+ )
SwitchPreference(
prefs.workspaceDt2s.getAdapter(),
label = stringResource(id = R.string.workspace_dt2s),
diff --git a/lawnchair/src/app/lawnchair/util/preferences/PreferenceManager.kt b/lawnchair/src/app/lawnchair/util/preferences/PreferenceManager.kt
index d97d41bffc..b42781a76f 100644
--- a/lawnchair/src/app/lawnchair/util/preferences/PreferenceManager.kt
+++ b/lawnchair/src/app/lawnchair/util/preferences/PreferenceManager.kt
@@ -56,6 +56,7 @@ class PreferenceManager private constructor(context: Context) : BasePreferenceMa
val allAppsIconSizeFactor = FloatPref("pref_allAppsIconSizeFactor", 1F, scheduleRestart)
val allAppsTextSizeFactor = FloatPref("pref_allAppsTextSizeFactor", 1F, scheduleRestart)
val allAppsColumns = IdpIntPref("pref_allAppsColumns", { numAllAppsColumns }, reloadGrid)
+ val smartSpaceEnable = BoolPref("pref_smartSpaceEnable", true, scheduleRestart)
// TODO: Add the ability to manually delete empty pages.
val allowEmptyPages = BoolPref("pref_allowEmptyPages", false)
diff --git a/robolectric_tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java b/robolectric_tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java
index 8e00dcb854..c0d5017000 100644
--- a/robolectric_tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java
+++ b/robolectric_tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java
@@ -223,7 +223,7 @@ public class GridSizeMigrationTaskTest {
@Test
public void testWorkspace_first_row_blocked() throws Exception {
- if (!FeatureFlags.QSB_ON_FIRST_SCREEN) {
+ if (!FeatureFlags.topQsbOnFirstScreenEnabled()) {
return;
}
// The first screen has one item on the 4th column which needs moving, as the first row
@@ -251,7 +251,7 @@ public class GridSizeMigrationTaskTest {
@Test
public void testWorkspace_items_moved_to_empty_first_row() throws Exception {
- if (!FeatureFlags.QSB_ON_FIRST_SCREEN) {
+ if (!FeatureFlags.topQsbOnFirstScreenEnabled()) {
return;
}
// Items will get moved to the next screen to keep the first screen empty.
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 438b920465..233c00ce25 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -2040,11 +2040,11 @@ public class Launcher extends StatefulActivity implements Launche
@Override
public void bindScreens(IntArray orderedScreenIds) {
// Make sure the first screen is always at the start.
- if (FeatureFlags.QSB_ON_FIRST_SCREEN &&
+ if (FeatureFlags.topQsbOnFirstScreenEnabled(this) &&
orderedScreenIds.indexOf(Workspace.FIRST_SCREEN_ID) != 0) {
orderedScreenIds.removeValue(Workspace.FIRST_SCREEN_ID);
orderedScreenIds.add(0, Workspace.FIRST_SCREEN_ID);
- } else if (!FeatureFlags.QSB_ON_FIRST_SCREEN && orderedScreenIds.isEmpty()) {
+ } else if (!FeatureFlags.topQsbOnFirstScreenEnabled(this) && orderedScreenIds.isEmpty()) {
// If there are no screens, we need to have an empty screen
mWorkspace.addExtraEmptyScreen();
}
@@ -2060,7 +2060,7 @@ public class Launcher extends StatefulActivity implements Launche
int count = orderedScreenIds.size();
for (int i = 0; i < count; i++) {
int screenId = orderedScreenIds.get(i);
- if (!FeatureFlags.QSB_ON_FIRST_SCREEN || screenId != Workspace.FIRST_SCREEN_ID) {
+ if (!FeatureFlags.topQsbOnFirstScreenEnabled(this) || screenId != Workspace.FIRST_SCREEN_ID) {
// No need to bind the first screen, as its always bound.
mWorkspace.insertNewWorkspaceScreenBeforeEmptyScreen(screenId);
}
diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java
index 19a314ffe2..41cca1b235 100644
--- a/src/com/android/launcher3/LauncherProvider.java
+++ b/src/com/android/launcher3/LauncherProvider.java
@@ -848,7 +848,7 @@ public class LauncherProvider extends ContentProvider {
convertShortcutsToLauncherActivities(db);
case 26:
// QSB was moved to the grid. Clear the first row on screen 0.
- if (FeatureFlags.QSB_ON_FIRST_SCREEN &&
+ if (FeatureFlags.topQsbOnFirstScreenEnabled(mContext) &&
!LauncherDbUtils.prepareScreenZeroToHostQsb(mContext, db)) {
break;
}
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 7841bb66e5..a1fb057b62 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -513,7 +513,7 @@ public class Workspace extends PagedView
* @param qsb an existing qsb to recycle or null.
*/
public void bindAndInitFirstWorkspaceScreen(View qsb) {
- if (!FeatureFlags.QSB_ON_FIRST_SCREEN) {
+ if (!FeatureFlags.topQsbOnFirstScreenEnabled(getContext())) {
return;
}
// Add the first page
@@ -777,7 +777,7 @@ public class Workspace extends PagedView
int id = mWorkspaceScreens.keyAt(i);
CellLayout cl = mWorkspaceScreens.valueAt(i);
// FIRST_SCREEN_ID can never be removed.
- if ((!FeatureFlags.QSB_ON_FIRST_SCREEN || id > FIRST_SCREEN_ID)
+ if ((!FeatureFlags.topQsbOnFirstScreenEnabled(getContext()) || id > FIRST_SCREEN_ID)
&& cl.getShortcutsAndWidgets().getChildCount() == 0) {
removeScreens.add(id);
}
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index 88a9abaf8d..bdf337a20e 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -26,6 +26,9 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
+import app.lawnchair.LawnchairApp;
+import app.lawnchair.util.preferences.PreferenceManager;
+
/**
* Defines a set of flags used to control various launcher behaviors.
*
@@ -52,7 +55,10 @@ public final class FeatureFlags {
* Enable moving the QSB on the 0th screen of the workspace. This is not a configuration feature
* and should be modified at a project level.
*/
- public static final boolean QSB_ON_FIRST_SCREEN = true;
+ public static boolean topQsbOnFirstScreenEnabled(Context context) {
+ PreferenceManager prefs = PreferenceManager.getInstance(context);
+ return prefs.getSmartSpaceEnable().get();
+ }
/**
* Feature flag to handle define config changes dynamically instead of killing the process.
@@ -60,7 +66,7 @@ public final class FeatureFlags {
*
* To add a new flag that can be toggled through the flags UI:
*
- * Declare a new ToggleableFlag below. Give it a unique key (e.g. "QSB_ON_FIRST_SCREEN"),
+ * Declare a new ToggleableFlag below. Give it a unique key (e.g. "PROMISE_APPS_IN_ALL_APPS"),
* and set a default value for the flag. This will be the default value on Debug builds.
*/
// When enabled the promise icon is visible in all apps while installation an app.
diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
index cd541e0b78..466db44fcc 100644
--- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
+++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
@@ -503,7 +503,7 @@ public class LauncherPreviewRenderer {
}
// Add first page QSB
- if (FeatureFlags.QSB_ON_FIRST_SCREEN) {
+ if (FeatureFlags.topQsbOnFirstScreenEnabled(mContext)) {
View qsb = mHomeElementInflater.inflate(
R.layout.search_container_workspace, mWorkspace, false);
CellLayout.LayoutParams lp =
diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java
index 9bef84718b..72a2792533 100644
--- a/src/com/android/launcher3/model/BgDataModel.java
+++ b/src/com/android/launcher3/model/BgDataModel.java
@@ -58,6 +58,8 @@ import java.util.Map;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
+import app.lawnchair.LawnchairApp;
+
/**
* All the data stored in-memory and managed by the LauncherModel
*/
@@ -141,7 +143,7 @@ public class BgDataModel {
screenSet.add(item.screenId);
}
}
- if (FeatureFlags.QSB_ON_FIRST_SCREEN || screenSet.isEmpty()) {
+ if (FeatureFlags.topQsbOnFirstScreenEnabled(LawnchairApp.getContext()) || screenSet.isEmpty()) {
screenSet.add(Workspace.FIRST_SCREEN_ID);
}
return screenSet.getArray();
diff --git a/src/com/android/launcher3/model/GridSizeMigrationTask.java b/src/com/android/launcher3/model/GridSizeMigrationTask.java
index e8a52bdd54..cb1f334574 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationTask.java
+++ b/src/com/android/launcher3/model/GridSizeMigrationTask.java
@@ -46,6 +46,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
+import app.lawnchair.LawnchairApp;
+
/**
* This class takes care of shrinking the workspace (by maximum of one row and one column), as a
* result of restoring from a larger device or device density change.
@@ -260,7 +262,7 @@ public class GridSizeMigrationTask {
*/
protected void migrateScreen(int screenId) {
// If we are migrating the first screen, do not touch the first row.
- int startY = (FeatureFlags.QSB_ON_FIRST_SCREEN && screenId == Workspace.FIRST_SCREEN_ID)
+ int startY = (FeatureFlags.topQsbOnFirstScreenEnabled(LawnchairApp.getContext()) && screenId == Workspace.FIRST_SCREEN_ID)
? 1 : 0;
ArrayList items = loadWorkspaceEntries(screenId);
diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java
index 165d1eab6b..13b26c499d 100644
--- a/src/com/android/launcher3/model/LoaderCursor.java
+++ b/src/com/android/launcher3/model/LoaderCursor.java
@@ -58,6 +58,8 @@ import com.android.launcher3.util.IntSparseArrayMap;
import java.net.URISyntaxException;
import java.security.InvalidParameterException;
+import app.lawnchair.LawnchairApp;
+
/**
* Extension of {@link Cursor} with utility methods for workspace loading.
*/
@@ -445,7 +447,7 @@ public class LoaderCursor extends CursorWrapper {
if (item.screenId == Workspace.FIRST_SCREEN_ID) {
// Mark the first row as occupied (if the feature is enabled)
// in order to account for the QSB.
- screen.markCells(0, 0, countX + 1, 1, FeatureFlags.QSB_ON_FIRST_SCREEN);
+ screen.markCells(0, 0, countX + 1, 1, FeatureFlags.topQsbOnFirstScreenEnabled(LawnchairApp.getContext()));
}
occupied.put(item.screenId, screen);
}
diff --git a/src/com/android/launcher3/provider/ImportDataTask.java b/src/com/android/launcher3/provider/ImportDataTask.java
index a5462a6c34..820dbfd230 100644
--- a/src/com/android/launcher3/provider/ImportDataTask.java
+++ b/src/com/android/launcher3/provider/ImportDataTask.java
@@ -104,7 +104,7 @@ public class ImportDataTask {
.getSerialNumberForUser(Process.myUserHandle()));
boolean createEmptyRowOnFirstScreen;
- if (FeatureFlags.QSB_ON_FIRST_SCREEN) {
+ if (FeatureFlags.topQsbOnFirstScreenEnabled(mContext)) {
try (Cursor c = mContext.getContentResolver().query(mOtherFavoritesUri, null,
// get items on the first row of the first screen (min screen id)
"profileId = ? AND container = -100 AND cellY = 0 AND screen = " +
diff --git a/src/com/android/launcher3/qsb/QsbContainerView.java b/src/com/android/launcher3/qsb/QsbContainerView.java
index e0a1725d61..322f8e69af 100644
--- a/src/com/android/launcher3/qsb/QsbContainerView.java
+++ b/src/com/android/launcher3/qsb/QsbContainerView.java
@@ -289,7 +289,7 @@ public class QsbContainerView extends FrameLayout {
}
public boolean isQsbEnabled() {
- return FeatureFlags.QSB_ON_FIRST_SCREEN;
+ return FeatureFlags.topQsbOnFirstScreenEnabled(getContext());
}
protected Bundle createBindOptions() {