diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index 2008129de1..4dbf4e3655 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -19,6 +19,7 @@ import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.CLEAR_ALL_BUTTON; +import static com.android.launcher3.LauncherState.EDIT_MODE; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.LauncherState.OVERVIEW_MODAL_TASK; @@ -133,7 +134,8 @@ public class LauncherRecentsView extends RecentsView final int pendingAddWidgetId = requestArgs.getWidgetId(); - Runnable exitSpringLoaded = new Runnable() { - @Override - public void run() { - mStateManager.goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); - } - }; + Runnable exitSpringLoaded = MULTI_SELECT_EDIT_MODE.get() ? null + : () -> mStateManager.goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); if (requestCode == REQUEST_BIND_APPWIDGET) { // This is called only if the user did not previously have permissions to bind widgets @@ -1040,10 +1038,9 @@ public class Launcher extends StatefulActivity final AppWidgetHostView layout = mAppWidgetHolder.createView(this, appWidgetId, requestArgs.getWidgetHandler().getProviderInfo(this)); boundWidget = layout; - onCompleteRunnable = new Runnable() { - @Override - public void run() { - completeAddAppWidget(appWidgetId, requestArgs, layout, null); + onCompleteRunnable = () -> { + completeAddAppWidget(appWidgetId, requestArgs, layout, null); + if (!isInState(EDIT_MODE)) { mStateManager.goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); } }; @@ -1178,7 +1175,7 @@ public class Launcher extends StatefulActivity } addActivityFlags(ACTIVITY_STATE_TRANSITION_ACTIVE); - if (state == SPRING_LOADED) { + if (state == SPRING_LOADED || state == EDIT_MODE) { // Prevent any Un/InstallShortcutReceivers from updating the db while we are // not on homescreen ItemInstallQueue.INSTANCE.get(this).pauseModelPush(FLAG_DRAG_AND_DROP); @@ -1532,7 +1529,8 @@ public class Launcher extends StatefulActivity mStateManager.addStateListener(new StateManager.StateListener() { @Override public void onStateTransitionComplete(LauncherState finalState) { - if (mPrevLauncherState == SPRING_LOADED && finalState == NORMAL) { + if ((mPrevLauncherState == SPRING_LOADED || mPrevLauncherState == EDIT_MODE) + && finalState == NORMAL) { AppWidgetResizeFrame.showForWidget(launcherHostView, cellLayout); mStateManager.removeStateListener(this); } @@ -1900,13 +1898,9 @@ public class Launcher extends StatefulActivity REQUEST_CREATE_APPWIDGET)) { // If the configuration flow was not started, add the widget - Runnable onComplete = new Runnable() { - @Override - public void run() { - // Exit spring loaded mode if necessary after adding the widget - mStateManager.goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); - } - }; + // Exit spring loaded mode if necessary after adding the widget + Runnable onComplete = MULTI_SELECT_EDIT_MODE.get() ? null + : () -> mStateManager.goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); completeAddAppWidget(appWidgetId, info, boundWidget, addFlowHandler.getProviderInfo(this)); mWorkspace.removeExtraEmptyScreenDelayed(delay, false, onComplete); diff --git a/src/com/android/launcher3/LauncherState.java b/src/com/android/launcher3/LauncherState.java index b8d13ed488..8b124dc847 100644 --- a/src/com/android/launcher3/LauncherState.java +++ b/src/com/android/launcher3/LauncherState.java @@ -21,6 +21,7 @@ import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW; import static com.android.launcher3.testing.shared.TestProtocol.ALL_APPS_STATE_ORDINAL; import static com.android.launcher3.testing.shared.TestProtocol.BACKGROUND_APP_STATE_ORDINAL; +import static com.android.launcher3.testing.shared.TestProtocol.EDIT_MODE_STATE_ORDINAL; import static com.android.launcher3.testing.shared.TestProtocol.HINT_STATE_ORDINAL; import static com.android.launcher3.testing.shared.TestProtocol.HINT_STATE_TWO_BUTTON_ORDINAL; import static com.android.launcher3.testing.shared.TestProtocol.NORMAL_STATE_ORDINAL; @@ -38,6 +39,7 @@ import androidx.annotation.FloatRange; import com.android.launcher3.statemanager.BaseState; import com.android.launcher3.statemanager.StateManager; +import com.android.launcher3.states.EditModeState; import com.android.launcher3.states.HintState; import com.android.launcher3.states.SpringLoadedState; import com.android.launcher3.testing.shared.TestProtocol; @@ -103,7 +105,7 @@ public abstract class LauncherState implements BaseState { } }; - private static final LauncherState[] sAllStates = new LauncherState[10]; + private static final LauncherState[] sAllStates = new LauncherState[11]; /** * TODO: Create a separate class for NORMAL state. @@ -123,6 +125,7 @@ public abstract class LauncherState implements BaseState { */ public static final LauncherState SPRING_LOADED = new SpringLoadedState( SPRING_LOADED_STATE_ORDINAL); + public static final LauncherState EDIT_MODE = new EditModeState(EDIT_MODE_STATE_ORDINAL); public static final LauncherState ALL_APPS = new AllAppsState(ALL_APPS_STATE_ORDINAL); public static final LauncherState HINT_STATE = new HintState(HINT_STATE_ORDINAL); public static final LauncherState HINT_STATE_TWO_BUTTON = new HintState( @@ -328,7 +331,9 @@ public abstract class LauncherState implements BaseState { * Gets the translation provider for workspace pages. */ public PageTranslationProvider getWorkspacePageTranslationProvider(Launcher launcher) { - if (this != SPRING_LOADED || !launcher.getDeviceProfile().isTwoPanels) { + if (this != SPRING_LOADED + || this != EDIT_MODE + || !launcher.getDeviceProfile().isTwoPanels) { return DEFAULT_PAGE_TRANSLATION_PROVIDER; } final float quarterPageSpacing = launcher.getWorkspace().getPageSpacing() / 4f; @@ -343,6 +348,16 @@ public abstract class LauncherState implements BaseState { }; } + /** + * Called when leaving this LauncherState + * @param launcher - Launcher instance + * @param toState - New LauncherState that is being entered + */ + public void onLeavingState(Launcher launcher, LauncherState toState) { + // no-op + // override to handle when leaving current LauncherState + } + @Override public LauncherState getHistoryForState(LauncherState previousState) { // No history is supported diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 2fa1a57666..73bb828317 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -19,6 +19,7 @@ package com.android.launcher3; import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; import static com.android.launcher3.LauncherState.ALL_APPS; +import static com.android.launcher3.LauncherState.EDIT_MODE; import static com.android.launcher3.LauncherState.FLAG_MULTI_PAGE; import static com.android.launcher3.LauncherState.FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED; import static com.android.launcher3.LauncherState.FLAG_WORKSPACE_INACCESSIBLE; @@ -494,8 +495,9 @@ public class Workspace extends PagedView } } - // Always enter the spring loaded mode - mLauncher.getStateManager().goToState(SPRING_LOADED); + if (!mLauncher.isInState(EDIT_MODE)) { + mLauncher.getStateManager().goToState(SPRING_LOADED); + } mStatsLogManager.logger().withItemInfo(dragObject.dragInfo) .withInstanceId(dragObject.logInstanceId) .log(LauncherEvent.LAUNCHER_ITEM_DRAG_STARTED); @@ -1432,7 +1434,8 @@ public class Workspace extends PagedView } private boolean workspaceInScrollableState() { - return mLauncher.isInState(SPRING_LOADED) || !workspaceInModalState(); + return mLauncher.isInState(SPRING_LOADED) || mLauncher.isInState(EDIT_MODE) + || !workspaceInModalState(); } /** @@ -1526,6 +1529,7 @@ public class Workspace extends PagedView @Override public void setState(LauncherState toState) { onStartStateTransition(); + mLauncher.getStateManager().getState().onLeavingState(mLauncher, toState); mStateTransitionAnimation.setState(toState); onEndStateTransition(); } @@ -1537,6 +1541,7 @@ public class Workspace extends PagedView public void setStateWithAnimation( LauncherState toState, StateAnimationConfig config, PendingAnimation animation) { StateTransitionListener listener = new StateTransitionListener(); + mLauncher.getStateManager().getState().onLeavingState(mLauncher, toState); mStateTransitionAnimation.setStateWithAnimation(toState, config, animation); // Invalidate the pages now, so that we have the visible pages before the @@ -1999,7 +2004,9 @@ public class Workspace extends PagedView distance, false, d) || addToExistingFolderIfNecessary(cell, dropTargetLayout, mTargetCell, distance, d, false)) { - mLauncher.getStateManager().goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); + if (!mLauncher.isInState(EDIT_MODE)) { + mLauncher.getStateManager().goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); + } return; } @@ -2128,14 +2135,19 @@ public class Workspace extends PagedView // spring-loaded mode so the page meets the icon where it was picked up. final RunnableList callbackList = new RunnableList(); final Runnable onCompleteCallback = onCompleteRunnable; + LauncherState currentState = mLauncher.getStateManager().getState(); mLauncher.getDragController().animateDragViewToOriginalPosition( /* onComplete= */ callbackList::executeAllAndDestroy, cell, - SPRING_LOADED.getTransitionDuration(mLauncher, true /* isToState */)); - mLauncher.getStateManager().goToState(NORMAL, /* delay= */ 0, - onCompleteCallback == null - ? null - : forSuccessCallback( - () -> callbackList.add(onCompleteCallback))); + currentState.getTransitionDuration(mLauncher, true /* isToState */)); + if (!mLauncher.isInState(EDIT_MODE)) { + mLauncher.getStateManager().goToState(NORMAL, /* delay= */ 0, + onCompleteCallback == null + ? null + : forSuccessCallback( + () -> callbackList.add(onCompleteCallback))); + } else if (onCompleteCallback != null) { + forSuccessCallback(() -> callbackList.add(onCompleteCallback)); + } mLauncher.getDropTargetBar().onDragEnd(); parent.onDropChild(cell); return; @@ -2159,8 +2171,12 @@ public class Workspace extends PagedView } parent.onDropChild(cell); - mLauncher.getStateManager().goToState(NORMAL, SPRING_LOADED_EXIT_DELAY, - onCompleteRunnable == null ? null : forSuccessCallback(onCompleteRunnable)); + if (!mLauncher.isInState(EDIT_MODE)) { + mLauncher.getStateManager().goToState(NORMAL, SPRING_LOADED_EXIT_DELAY, + onCompleteRunnable == null ? null : forSuccessCallback(onCompleteRunnable)); + } else if (onCompleteRunnable != null) { + forSuccessCallback(onCompleteRunnable); + } mStatsLogManager.logger().withItemInfo(d.dragInfo).withInstanceId(d.logInstanceId) .log(LauncherEvent.LAUNCHER_ITEM_DROP_COMPLETED); } @@ -2734,7 +2750,8 @@ public class Workspace extends PagedView final int screenId = getIdForScreen(cellLayout); if (!mLauncher.isHotseatLayout(cellLayout) && screenId != getScreenIdForPageIndex(mCurrentPage) - && !mLauncher.isInState(SPRING_LOADED)) { + && !mLauncher.isInState(SPRING_LOADED) + && !mLauncher.isInState(EDIT_MODE)) { snapToPage(getPageIndexForScreenId(screenId)); } @@ -2812,7 +2829,6 @@ public class Workspace extends PagedView } else { // This is for other drag/drop cases, like dragging from All Apps mLauncher.getStateManager().goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); - View view; switch (info.itemType) { diff --git a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java index 55ab7f1cd0..565d7da9e5 100644 --- a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java +++ b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java @@ -59,6 +59,7 @@ import com.android.launcher3.anim.PropertySetter; import com.android.launcher3.anim.SpringAnimationBuilder; import com.android.launcher3.graphics.Scrim; import com.android.launcher3.graphics.SysUiScrim; +import com.android.launcher3.states.EditModeState; import com.android.launcher3.states.SpringLoadedState; import com.android.launcher3.states.StateAnimationConfig; import com.android.launcher3.util.DynamicResource; @@ -212,8 +213,8 @@ public class WorkspaceStateTransitionAnimation { PageAlphaProvider pageAlphaProvider, PropertySetter propertySetter, StateAnimationConfig config) { float pageAlpha = pageAlphaProvider.getPageAlpha(childIndex); - float springLoadedProgress = (state instanceof SpringLoadedState) ? 1.0f : 0f; - + float springLoadedProgress = + (state instanceof SpringLoadedState || state instanceof EditModeState) ? 1f : 0f; propertySetter.setFloat(cl, CellLayout.SPRING_LOADED_PROGRESS, springLoadedProgress, ZOOM_OUT); Interpolator fadeInterpolator = config.getInterpolator(ANIM_WORKSPACE_FADE, diff --git a/src/com/android/launcher3/dragndrop/LauncherDragController.java b/src/com/android/launcher3/dragndrop/LauncherDragController.java index aaa5b1ace7..da6f446725 100644 --- a/src/com/android/launcher3/dragndrop/LauncherDragController.java +++ b/src/com/android/launcher3/dragndrop/LauncherDragController.java @@ -17,6 +17,7 @@ package com.android.launcher3.dragndrop; import static com.android.launcher3.AbstractFloatingView.TYPE_DISCOVERY_BOUNCE; import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; +import static com.android.launcher3.LauncherState.EDIT_MODE; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; @@ -157,7 +158,9 @@ public class LauncherDragController extends DragController { @Override protected void exitDrag() { - mActivity.getStateManager().goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); + if (!mActivity.isInState(EDIT_MODE)) { + mActivity.getStateManager().goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); + } } @Override diff --git a/src/com/android/launcher3/dragndrop/LauncherDragView.java b/src/com/android/launcher3/dragndrop/LauncherDragView.java index cc68e2e3e4..4c43865c63 100644 --- a/src/com/android/launcher3/dragndrop/LauncherDragView.java +++ b/src/com/android/launcher3/dragndrop/LauncherDragView.java @@ -57,7 +57,8 @@ public class LauncherDragView extends DragView @Override public void onStateTransitionComplete(LauncherState finalState) { setVisibility((finalState == LauncherState.NORMAL - || finalState == LauncherState.SPRING_LOADED) ? VISIBLE : INVISIBLE); + || finalState == LauncherState.SPRING_LOADED + || finalState == LauncherState.EDIT_MODE) ? VISIBLE : INVISIBLE); } @Override diff --git a/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java b/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java index dd74125573..7bdec1cfde 100644 --- a/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java +++ b/src/com/android/launcher3/dragndrop/PinShortcutRequestActivityInfo.java @@ -16,6 +16,11 @@ package com.android.launcher3.dragndrop; +import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; +import static com.android.launcher3.LauncherState.EDIT_MODE; +import static com.android.launcher3.LauncherState.SPRING_LOADED; +import static com.android.launcher3.config.FeatureFlags.MULTI_SELECT_EDIT_MODE; + import android.annotation.TargetApi; import android.app.Activity; import android.content.ComponentName; @@ -29,10 +34,8 @@ import android.os.Build; import android.os.Process; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings; -import com.android.launcher3.LauncherState; import com.android.launcher3.R; import com.android.launcher3.icons.IconCache; import com.android.launcher3.model.data.WorkspaceItemInfo; @@ -90,11 +93,11 @@ public class PinShortcutRequestActivityInfo extends ShortcutConfigActivityInfo { @Override public WorkspaceItemInfo createWorkspaceItemInfo() { + long transitionDuration = (MULTI_SELECT_EDIT_MODE.get() ? EDIT_MODE : SPRING_LOADED) + .getTransitionDuration(Launcher.getLauncher(mContext), true /* isToState */); // Total duration for the drop animation to complete. long duration = mContext.getResources().getInteger(R.integer.config_dropAnimMaxDuration) + - LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY + - LauncherState.SPRING_LOADED.getTransitionDuration(Launcher.getLauncher(mContext), - true /* isToState */); + SPRING_LOADED_EXIT_DELAY + transitionDuration; // Delay the actual accept() call until the drop animation is complete. return PinRequestHelper.createWorkspaceItemFromPinItemRequest( mContext, mRequestSupplier.get(), duration); diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index 3c31b7a7c9..642451d8aa 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -19,6 +19,7 @@ package com.android.launcher3.folder; import static android.text.TextUtils.isEmpty; import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; +import static com.android.launcher3.LauncherState.EDIT_MODE; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.compat.AccessibilityManagerCompat.sendCustomAccessibilityEvent; import static com.android.launcher3.config.FeatureFlags.ALWAYS_USE_HARDWARE_OPTIMIZATION_FOR_FOLDER_ANIMATIONS; @@ -1339,7 +1340,10 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo mLauncherDelegate.getModelWriter()); } - launcher.getStateManager().goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); + if (!launcher.isInState(EDIT_MODE)) { + launcher.getStateManager().goToState(NORMAL, SPRING_LOADED_EXIT_DELAY); + } + if (d.stateAnnouncer != null) { d.stateAnnouncer.completeAction(R.string.item_moved); } diff --git a/src/com/android/launcher3/keyboard/KeyboardDragAndDropView.java b/src/com/android/launcher3/keyboard/KeyboardDragAndDropView.java index a6c897f169..408a5a04a7 100644 --- a/src/com/android/launcher3/keyboard/KeyboardDragAndDropView.java +++ b/src/com/android/launcher3/keyboard/KeyboardDragAndDropView.java @@ -17,6 +17,7 @@ package com.android.launcher3.keyboard; import static android.app.Activity.DEFAULT_KEYS_SEARCH_LOCAL; +import static com.android.launcher3.LauncherState.EDIT_MODE; import static com.android.launcher3.LauncherState.SPRING_LOADED; import android.app.Activity; @@ -114,7 +115,7 @@ public class KeyboardDragAndDropView extends AbstractFloatingView @Override public void onStateTransitionStart(LauncherState toState) { - if (toState != SPRING_LOADED) { + if (toState != SPRING_LOADED && toState != EDIT_MODE) { close(false); } } diff --git a/src/com/android/launcher3/states/EditModeState.kt b/src/com/android/launcher3/states/EditModeState.kt new file mode 100644 index 0000000000..aafaaa07fa --- /dev/null +++ b/src/com/android/launcher3/states/EditModeState.kt @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.states + +import android.content.Context +import com.android.launcher3.Launcher +import com.android.launcher3.LauncherState +import com.android.launcher3.logging.StatsLogManager +import com.android.launcher3.views.ActivityContext + +/** Definition for Edit Mode state used for home gardening multi-select */ +class EditModeState(id: Int) : LauncherState(id, StatsLogManager.LAUNCHER_STATE_HOME, STATE_FLAGS) { + + companion object { + private val STATE_FLAGS = + (FLAG_MULTI_PAGE or + FLAG_WORKSPACE_INACCESSIBLE or + FLAG_DISABLE_RESTORE or + FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED or + FLAG_WORKSPACE_HAS_BACKGROUNDS) + } + + override fun getTransitionDuration(context: T, isToState: Boolean): Int where + T : Context?, + T : ActivityContext? { + return 150 + } + + override fun getDepthUnchecked(context: T): Float where T : Context?, T : ActivityContext? { + return 0.5f + } + + override fun getWorkspaceScaleAndTranslation(launcher: Launcher): ScaleAndTranslation { + val scale = launcher.deviceProfile.getWorkspaceSpringLoadScale(launcher) + return ScaleAndTranslation(scale, 0f, 0f) + } + + override fun getHotseatScaleAndTranslation(launcher: Launcher): ScaleAndTranslation { + val scale = launcher.deviceProfile.getWorkspaceSpringLoadScale(launcher) + return ScaleAndTranslation(scale, 0f, 0f) + } + + override fun getWorkspaceBackgroundAlpha(launcher: Launcher): Float { + return 0.2f + } + + override fun onLeavingState(launcher: Launcher?, toState: LauncherState?) { + // cleanup any changes to workspace + } +} diff --git a/src/com/android/launcher3/touch/ItemLongClickListener.java b/src/com/android/launcher3/touch/ItemLongClickListener.java index 7db7b0da5c..9cba19d7ed 100644 --- a/src/com/android/launcher3/touch/ItemLongClickListener.java +++ b/src/com/android/launcher3/touch/ItemLongClickListener.java @@ -19,6 +19,7 @@ import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; import static com.android.launcher3.LauncherState.ALL_APPS; +import static com.android.launcher3.LauncherState.EDIT_MODE; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ALLAPPS_ITEM_LONG_PRESSED; @@ -58,7 +59,11 @@ public class ItemLongClickListener { } Launcher launcher = Launcher.getLauncher(v.getContext()); if (!canStartDrag(launcher)) return false; - if (!launcher.isInState(NORMAL) && !launcher.isInState(OVERVIEW)) return false; + if (!launcher.isInState(NORMAL) + && !launcher.isInState(OVERVIEW) + && !launcher.isInState(EDIT_MODE)) { + return false; + } if (!(v.getTag() instanceof ItemInfo)) return false; launcher.setWaitingForResult(null); diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java index ba6165f8d2..4641e31b08 100644 --- a/src/com/android/launcher3/views/OptionsPopupView.java +++ b/src/com/android/launcher3/views/OptionsPopupView.java @@ -17,6 +17,7 @@ package com.android.launcher3.views; import static androidx.core.content.ContextCompat.getColorStateList; +import static com.android.launcher3.LauncherState.EDIT_MODE; import static com.android.launcher3.config.FeatureFlags.ENABLE_MATERIAL_U_POPUP; import static com.android.launcher3.config.FeatureFlags.MULTI_SELECT_EDIT_MODE; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.IGNORE; @@ -222,6 +223,8 @@ public class OptionsPopupView extends ArrowPopup } private static boolean enterHomeGardening(View view) { + Launcher launcher = Launcher.getLauncher(view.getContext()); + launcher.getStateManager().goToState(EDIT_MODE); return true; } diff --git a/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java b/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java index 601b07e771..2b67cdde80 100644 --- a/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java +++ b/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java @@ -36,6 +36,7 @@ public final class TestProtocol { public static final int HINT_STATE_ORDINAL = 7; public static final int HINT_STATE_TWO_BUTTON_ORDINAL = 8; public static final int OVERVIEW_SPLIT_SELECT_ORDINAL = 9; + public static final int EDIT_MODE_STATE_ORDINAL = 10; public static final String TAPL_EVENTS_TAG = "TaplEvents"; public static final String SEQUENCE_MAIN = "Main"; public static final String SEQUENCE_TIS = "TIS"; @@ -63,6 +64,8 @@ public final class TestProtocol { return "Hint2Button"; case OVERVIEW_SPLIT_SELECT_ORDINAL: return "OverviewSplitSelect"; + case EDIT_MODE_STATE_ORDINAL: + return "EditMode"; default: return "Unknown"; }