Loading go/src/com/android/launcher3/model/LauncherBinder.java +4 −0 Original line number Diff line number Diff line Loading @@ -38,4 +38,8 @@ public class LauncherBinder extends BaseLauncherBinder { @Override public void bindWidgets() { } @Override public void bindSmartspaceWidget() { } } src/com/android/launcher3/Launcher.java +45 −6 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static com.android.launcher3.AbstractFloatingView.TYPE_ICON_SURFACE; import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE; import static com.android.launcher3.AbstractFloatingView.TYPE_SNACKBAR; import static com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType; import static com.android.launcher3.BuildConfig.APPLICATION_ID; import static com.android.launcher3.LauncherAnimUtils.HOTSEAT_SCALE_PROPERTY_FACTORY; import static com.android.launcher3.LauncherAnimUtils.SCALE_INDEX_WIDGET_TRANSITION; import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; Loading @@ -43,9 +44,12 @@ import static com.android.launcher3.LauncherState.NO_OFFSET; import static com.android.launcher3.LauncherState.NO_SCALE; import static com.android.launcher3.LauncherState.SPRING_LOADED; import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.WorkspaceLayoutManager.FIRST_SCREEN_ID; import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.getSupportedActions; import static com.android.launcher3.config.FeatureFlags.FOLDABLE_SINGLE_PAGE; import static com.android.launcher3.config.FeatureFlags.MULTI_SELECT_EDIT_MODE; import static com.android.launcher3.config.FeatureFlags.SHOW_DOT_PAGINATION; import static com.android.launcher3.config.FeatureFlags.shouldShowFirstPageWidget; import static com.android.launcher3.logging.StatsLogManager.EventEnum; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_BACKGROUND; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME; Loading Loading @@ -2177,11 +2181,14 @@ public class Launcher extends StatefulActivity<LauncherState> public void bindScreens(IntArray orderedScreenIds) { mWorkspace.mPageIndicator.setAreScreensBinding(true); int firstScreenPosition = 0; if (FeatureFlags.QSB_ON_FIRST_SCREEN && orderedScreenIds.indexOf(Workspace.FIRST_SCREEN_ID) != firstScreenPosition) { orderedScreenIds.removeValue(Workspace.FIRST_SCREEN_ID); orderedScreenIds.add(firstScreenPosition, Workspace.FIRST_SCREEN_ID); } else if (!FeatureFlags.QSB_ON_FIRST_SCREEN && orderedScreenIds.isEmpty()) { if ((FeatureFlags.QSB_ON_FIRST_SCREEN && !shouldShowFirstPageWidget()) && orderedScreenIds.indexOf(FIRST_SCREEN_ID) != firstScreenPosition) { orderedScreenIds.removeValue(FIRST_SCREEN_ID); orderedScreenIds.add(firstScreenPosition, FIRST_SCREEN_ID); } else if ((!FeatureFlags.QSB_ON_FIRST_SCREEN || shouldShowFirstPageWidget()) && orderedScreenIds.isEmpty()) { // If there are no screens, we need to have an empty screen mWorkspace.addExtraEmptyScreens(); } Loading Loading @@ -2229,7 +2236,9 @@ public class Launcher extends StatefulActivity<LauncherState> 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.QSB_ON_FIRST_SCREEN && !shouldShowFirstPageWidget() && screenId == FIRST_SCREEN_ID) { // No need to bind the first screen, as its always bound. continue; } Loading Loading @@ -2929,6 +2938,36 @@ public class Launcher extends StatefulActivity<LauncherState> mPopupDataProvider.setAllWidgets(allWidgets); } @Override public void bindSmartspaceWidget() { CellLayout cl = mWorkspace.getScreenWithId(FIRST_SCREEN_ID); int spanX = InvariantDeviceProfile.INSTANCE.get(this).numSearchContainerColumns; if (cl != null) { for (int col = 0; col < spanX; col++) { if (cl.isOccupied(col, 0)) { return; } } } else { return; } WidgetsListBaseEntry widgetsListBaseEntry = getPopupDataProvider() .getAllWidgets().stream().filter( item -> item.mPkgItem.packageName.equals( APPLICATION_ID)) .findFirst() .orElse(null); if (widgetsListBaseEntry != null) { LauncherAppWidgetProviderInfo launcherAppWidgetProviderInfo = widgetsListBaseEntry.mWidgets.get(0).widgetInfo; PendingAddWidgetInfo info = new PendingAddWidgetInfo(launcherAppWidgetProviderInfo, CONTAINER_DESKTOP); addPendingItem(info, info.container, FIRST_SCREEN_ID, new int[]{0, 0}, info.spanX, info.spanY); } } @Override public void bindStringCache(StringCache cache) { mStringCache = cache; Loading src/com/android/launcher3/LauncherPrefs.kt +5 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.util.Log import androidx.annotation.VisibleForTesting import com.android.launcher3.BuildConfig.WIDGET_ON_FIRST_SCREEN import com.android.launcher3.LauncherFiles.DEVICE_PREFERENCES_KEY import com.android.launcher3.LauncherFiles.SHARED_PREFERENCES_KEY import com.android.launcher3.allapps.WorkProfileManager Loading Loading @@ -278,6 +279,7 @@ class LauncherPrefs(private val encryptedContext: Context) { @JvmStatic fun get(context: Context): LauncherPrefs = INSTANCE.get(context) const val TASKBAR_PINNING_KEY = "TASKBAR_PINNING_KEY" const val SHOULD_SHOW_SMARTSPACE_KEY = "SHOULD_SHOW_SMARTSPACE_KEY" @JvmField val ICON_STATE = nonRestorableItem(LauncherAppState.KEY_ICON_STATE, "", true) @JvmField val ALL_APPS_OVERVIEW_THRESHOLD = Loading @@ -292,6 +294,9 @@ class LauncherPrefs(private val encryptedContext: Context) { @JvmField val DEVICE_TYPE = backedUpItem(DeviceGridState.KEY_DEVICE_TYPE, InvariantDeviceProfile.TYPE_PHONE, true) @JvmField val SHOULD_SHOW_SMARTSPACE = backedUpItem("SHOULD_SHOW_SMARTSPACE_KEY", WIDGET_ON_FIRST_SCREEN, true) @JvmField val DB_FILE = backedUpItem(DeviceGridState.KEY_DB_FILE, "", true) @JvmField val RESTORE_DEVICE = Loading src/com/android/launcher3/Workspace.java +6 −2 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import static com.android.launcher3.LauncherState.SPRING_LOADED; import static com.android.launcher3.MotionEventsUtils.isTrackpadMultiFingerSwipe; import static com.android.launcher3.anim.AnimatorListeners.forSuccessCallback; import static com.android.launcher3.config.FeatureFlags.FOLDABLE_SINGLE_PAGE; import static com.android.launcher3.config.FeatureFlags.shouldShowFirstPageWidget; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SWIPELEFT; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SWIPERIGHT; Loading Loading @@ -594,7 +595,8 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T> * Initializes and binds the first page */ public void bindAndInitFirstWorkspaceScreen() { if (!FeatureFlags.QSB_ON_FIRST_SCREEN) { if (!FeatureFlags.QSB_ON_FIRST_SCREEN || shouldShowFirstPageWidget()) { return; } Loading Loading @@ -1012,7 +1014,9 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T> 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.QSB_ON_FIRST_SCREEN || shouldShowFirstPageWidget()) || id > FIRST_SCREEN_ID) && cl.getShortcutsAndWidgets().getChildCount() == 0) { removeScreens.add(id); } Loading src/com/android/launcher3/config/FeatureFlags.java +5 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.launcher3.config; import static com.android.launcher3.BuildConfig.WIDGET_ON_FIRST_SCREEN; import static com.android.launcher3.config.FeatureFlags.FlagState.DISABLED; import static com.android.launcher3.config.FeatureFlags.FlagState.ENABLED; import static com.android.launcher3.config.FeatureFlags.FlagState.TEAMFOOD; Loading Loading @@ -165,6 +166,10 @@ public final class FeatureFlags { public static final BooleanFlag SMARTSPACE_AS_A_WIDGET = getDebugFlag(299181941, "SMARTSPACE_AS_A_WIDGET", DISABLED, "Enable SmartSpace as a widget"); public static boolean shouldShowFirstPageWidget() { return SMARTSPACE_AS_A_WIDGET.get() && WIDGET_ON_FIRST_SCREEN; } // TODO(Block 10): Clean up flags public static final BooleanFlag ENABLE_BACK_SWIPE_LAUNCHER_ANIMATION = getDebugFlag(270614790, "ENABLE_BACK_SWIPE_LAUNCHER_ANIMATION", DISABLED, Loading Loading
go/src/com/android/launcher3/model/LauncherBinder.java +4 −0 Original line number Diff line number Diff line Loading @@ -38,4 +38,8 @@ public class LauncherBinder extends BaseLauncherBinder { @Override public void bindWidgets() { } @Override public void bindSmartspaceWidget() { } }
src/com/android/launcher3/Launcher.java +45 −6 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static com.android.launcher3.AbstractFloatingView.TYPE_ICON_SURFACE; import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE; import static com.android.launcher3.AbstractFloatingView.TYPE_SNACKBAR; import static com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType; import static com.android.launcher3.BuildConfig.APPLICATION_ID; import static com.android.launcher3.LauncherAnimUtils.HOTSEAT_SCALE_PROPERTY_FACTORY; import static com.android.launcher3.LauncherAnimUtils.SCALE_INDEX_WIDGET_TRANSITION; import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; Loading @@ -43,9 +44,12 @@ import static com.android.launcher3.LauncherState.NO_OFFSET; import static com.android.launcher3.LauncherState.NO_SCALE; import static com.android.launcher3.LauncherState.SPRING_LOADED; import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.WorkspaceLayoutManager.FIRST_SCREEN_ID; import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.getSupportedActions; import static com.android.launcher3.config.FeatureFlags.FOLDABLE_SINGLE_PAGE; import static com.android.launcher3.config.FeatureFlags.MULTI_SELECT_EDIT_MODE; import static com.android.launcher3.config.FeatureFlags.SHOW_DOT_PAGINATION; import static com.android.launcher3.config.FeatureFlags.shouldShowFirstPageWidget; import static com.android.launcher3.logging.StatsLogManager.EventEnum; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_BACKGROUND; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME; Loading Loading @@ -2177,11 +2181,14 @@ public class Launcher extends StatefulActivity<LauncherState> public void bindScreens(IntArray orderedScreenIds) { mWorkspace.mPageIndicator.setAreScreensBinding(true); int firstScreenPosition = 0; if (FeatureFlags.QSB_ON_FIRST_SCREEN && orderedScreenIds.indexOf(Workspace.FIRST_SCREEN_ID) != firstScreenPosition) { orderedScreenIds.removeValue(Workspace.FIRST_SCREEN_ID); orderedScreenIds.add(firstScreenPosition, Workspace.FIRST_SCREEN_ID); } else if (!FeatureFlags.QSB_ON_FIRST_SCREEN && orderedScreenIds.isEmpty()) { if ((FeatureFlags.QSB_ON_FIRST_SCREEN && !shouldShowFirstPageWidget()) && orderedScreenIds.indexOf(FIRST_SCREEN_ID) != firstScreenPosition) { orderedScreenIds.removeValue(FIRST_SCREEN_ID); orderedScreenIds.add(firstScreenPosition, FIRST_SCREEN_ID); } else if ((!FeatureFlags.QSB_ON_FIRST_SCREEN || shouldShowFirstPageWidget()) && orderedScreenIds.isEmpty()) { // If there are no screens, we need to have an empty screen mWorkspace.addExtraEmptyScreens(); } Loading Loading @@ -2229,7 +2236,9 @@ public class Launcher extends StatefulActivity<LauncherState> 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.QSB_ON_FIRST_SCREEN && !shouldShowFirstPageWidget() && screenId == FIRST_SCREEN_ID) { // No need to bind the first screen, as its always bound. continue; } Loading Loading @@ -2929,6 +2938,36 @@ public class Launcher extends StatefulActivity<LauncherState> mPopupDataProvider.setAllWidgets(allWidgets); } @Override public void bindSmartspaceWidget() { CellLayout cl = mWorkspace.getScreenWithId(FIRST_SCREEN_ID); int spanX = InvariantDeviceProfile.INSTANCE.get(this).numSearchContainerColumns; if (cl != null) { for (int col = 0; col < spanX; col++) { if (cl.isOccupied(col, 0)) { return; } } } else { return; } WidgetsListBaseEntry widgetsListBaseEntry = getPopupDataProvider() .getAllWidgets().stream().filter( item -> item.mPkgItem.packageName.equals( APPLICATION_ID)) .findFirst() .orElse(null); if (widgetsListBaseEntry != null) { LauncherAppWidgetProviderInfo launcherAppWidgetProviderInfo = widgetsListBaseEntry.mWidgets.get(0).widgetInfo; PendingAddWidgetInfo info = new PendingAddWidgetInfo(launcherAppWidgetProviderInfo, CONTAINER_DESKTOP); addPendingItem(info, info.container, FIRST_SCREEN_ID, new int[]{0, 0}, info.spanX, info.spanY); } } @Override public void bindStringCache(StringCache cache) { mStringCache = cache; Loading
src/com/android/launcher3/LauncherPrefs.kt +5 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.util.Log import androidx.annotation.VisibleForTesting import com.android.launcher3.BuildConfig.WIDGET_ON_FIRST_SCREEN import com.android.launcher3.LauncherFiles.DEVICE_PREFERENCES_KEY import com.android.launcher3.LauncherFiles.SHARED_PREFERENCES_KEY import com.android.launcher3.allapps.WorkProfileManager Loading Loading @@ -278,6 +279,7 @@ class LauncherPrefs(private val encryptedContext: Context) { @JvmStatic fun get(context: Context): LauncherPrefs = INSTANCE.get(context) const val TASKBAR_PINNING_KEY = "TASKBAR_PINNING_KEY" const val SHOULD_SHOW_SMARTSPACE_KEY = "SHOULD_SHOW_SMARTSPACE_KEY" @JvmField val ICON_STATE = nonRestorableItem(LauncherAppState.KEY_ICON_STATE, "", true) @JvmField val ALL_APPS_OVERVIEW_THRESHOLD = Loading @@ -292,6 +294,9 @@ class LauncherPrefs(private val encryptedContext: Context) { @JvmField val DEVICE_TYPE = backedUpItem(DeviceGridState.KEY_DEVICE_TYPE, InvariantDeviceProfile.TYPE_PHONE, true) @JvmField val SHOULD_SHOW_SMARTSPACE = backedUpItem("SHOULD_SHOW_SMARTSPACE_KEY", WIDGET_ON_FIRST_SCREEN, true) @JvmField val DB_FILE = backedUpItem(DeviceGridState.KEY_DB_FILE, "", true) @JvmField val RESTORE_DEVICE = Loading
src/com/android/launcher3/Workspace.java +6 −2 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import static com.android.launcher3.LauncherState.SPRING_LOADED; import static com.android.launcher3.MotionEventsUtils.isTrackpadMultiFingerSwipe; import static com.android.launcher3.anim.AnimatorListeners.forSuccessCallback; import static com.android.launcher3.config.FeatureFlags.FOLDABLE_SINGLE_PAGE; import static com.android.launcher3.config.FeatureFlags.shouldShowFirstPageWidget; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SWIPELEFT; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SWIPERIGHT; Loading Loading @@ -594,7 +595,8 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T> * Initializes and binds the first page */ public void bindAndInitFirstWorkspaceScreen() { if (!FeatureFlags.QSB_ON_FIRST_SCREEN) { if (!FeatureFlags.QSB_ON_FIRST_SCREEN || shouldShowFirstPageWidget()) { return; } Loading Loading @@ -1012,7 +1014,9 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T> 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.QSB_ON_FIRST_SCREEN || shouldShowFirstPageWidget()) || id > FIRST_SCREEN_ID) && cl.getShortcutsAndWidgets().getChildCount() == 0) { removeScreens.add(id); } Loading
src/com/android/launcher3/config/FeatureFlags.java +5 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.launcher3.config; import static com.android.launcher3.BuildConfig.WIDGET_ON_FIRST_SCREEN; import static com.android.launcher3.config.FeatureFlags.FlagState.DISABLED; import static com.android.launcher3.config.FeatureFlags.FlagState.ENABLED; import static com.android.launcher3.config.FeatureFlags.FlagState.TEAMFOOD; Loading Loading @@ -165,6 +166,10 @@ public final class FeatureFlags { public static final BooleanFlag SMARTSPACE_AS_A_WIDGET = getDebugFlag(299181941, "SMARTSPACE_AS_A_WIDGET", DISABLED, "Enable SmartSpace as a widget"); public static boolean shouldShowFirstPageWidget() { return SMARTSPACE_AS_A_WIDGET.get() && WIDGET_ON_FIRST_SCREEN; } // TODO(Block 10): Clean up flags public static final BooleanFlag ENABLE_BACK_SWIPE_LAUNCHER_ANIMATION = getDebugFlag(270614790, "ENABLE_BACK_SWIPE_LAUNCHER_ANIMATION", DISABLED, Loading