From 9affffe0ffec93887bd28b2f75c934593b5771a4 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Thu, 6 May 2021 13:18:21 +0530 Subject: [PATCH] Add option to hide At a Glance widget (#2141) Co-authored-by: Patryk Michalik --- lawnchair/res/values/strings.xml | 1 + lawnchair/src/app/lawnchair/LawnchairApp.kt | 14 ++++++++++++++ .../ui/preferences/HomeScreenPreferences.kt | 4 ++++ .../util/preferences/PreferenceManager.kt | 1 + .../launcher3/model/GridSizeMigrationTaskTest.java | 4 ++-- src/com/android/launcher3/Launcher.java | 6 +++--- src/com/android/launcher3/LauncherProvider.java | 2 +- src/com/android/launcher3/Workspace.java | 4 ++-- src/com/android/launcher3/config/FeatureFlags.java | 10 ++++++++-- .../graphics/LauncherPreviewRenderer.java | 2 +- src/com/android/launcher3/model/BgDataModel.java | 4 +++- .../launcher3/model/GridSizeMigrationTask.java | 4 +++- src/com/android/launcher3/model/LoaderCursor.java | 4 +++- .../android/launcher3/provider/ImportDataTask.java | 2 +- .../android/launcher3/qsb/QsbContainerView.java | 2 +- 15 files changed, 48 insertions(+), 16 deletions(-) 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() {