From f4e7e5aaf493f9aeb07dbd4c11e64a9372948a3f Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Mon, 6 Feb 2023 18:02:50 -0800 Subject: [PATCH] Add overview taskbar split support for 3P launcher * Created b/268120202 to track other states of split selection that are unhandled on 3P launchers Test: Able to initiate split in overview with 3P launcher Fixes: 264576761 Change-Id: I0311fe83380bf914fa79956b2565b61cc5eab916 --- .../taskbar/FallbackTaskbarUIController.java | 11 +++ .../TaskbarLauncherStateController.java | 11 +-- .../android/launcher3/taskbar/Utilities.java | 14 ++++ .../FallbackTaskbarUIControllerTest.kt | 83 +++++++++++++++++++ .../launcher3/taskbar/TaskbarBaseTestCase.kt | 4 +- 5 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 quickstep/tests/src/com/android/launcher3/taskbar/FallbackTaskbarUIControllerTest.kt diff --git a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java index 474dc3d338..6d778efbd7 100644 --- a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java @@ -44,6 +44,17 @@ public class FallbackTaskbarUIController extends TaskbarUIController { getRecentsView().setTaskLaunchListener(toState == RecentsState.DEFAULT ? (() -> animateToRecentsState(RecentsState.BACKGROUND_APP)) : null); } + + @Override + public void onStateTransitionComplete(RecentsState finalState) { + boolean finalStateDefault = finalState == RecentsState.DEFAULT; + // TODO(b/268120202) Taskbar shows up on 3P home, currently we don't go to + // overview from 3P home. Either implement that or it'll change w/ contextual? + boolean disallowLongClick = finalState == RecentsState.OVERVIEW_SPLIT_SELECT; + Utilities.setOverviewDragState(mControllers, + finalStateDefault /*disallowGlobalDrag*/, disallowLongClick, + finalStateDefault /*allowInitialSplitSelection*/); + } }; public FallbackTaskbarUIController(RecentsActivity recentsActivity) { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java index 178482e07f..80cdbe98cb 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -119,14 +119,11 @@ import java.util.StringJoiner; mLauncherState = finalState; updateStateForFlag(FLAG_TRANSITION_STATE_RUNNING, false); applyState(); - boolean disallowGlobalDrag = finalState instanceof OverviewState; + boolean finalStateOverview = finalState instanceof OverviewState; boolean disallowLongClick = finalState == LauncherState.OVERVIEW_SPLIT_SELECT; - mControllers.taskbarDragController.setDisallowGlobalDrag(disallowGlobalDrag); - mControllers.taskbarDragController.setDisallowLongClick(disallowLongClick); - mControllers.taskbarAllAppsController.setDisallowGlobalDrag(disallowGlobalDrag); - mControllers.taskbarAllAppsController.setDisallowLongClick(disallowLongClick); - mControllers.taskbarPopupController.setAllowInitialSplitSelection( - disallowGlobalDrag); + com.android.launcher3.taskbar.Utilities.setOverviewDragState( + mControllers, finalStateOverview /*disallowGlobalDrag*/, + disallowLongClick, finalStateOverview /*allowInitialSplitSelection*/); } }; diff --git a/quickstep/src/com/android/launcher3/taskbar/Utilities.java b/quickstep/src/com/android/launcher3/taskbar/Utilities.java index fda6453e7d..a2b3c967df 100644 --- a/quickstep/src/com/android/launcher3/taskbar/Utilities.java +++ b/quickstep/src/com/android/launcher3/taskbar/Utilities.java @@ -30,4 +30,18 @@ public final class Utilities { str.add(flagName); } } + + /** + * Sets drag, long-click, and split selection behavior on 1P and 3P launchers with Taskbar + */ + static void setOverviewDragState(TaskbarControllers controllers, + boolean disallowGlobalDrag, boolean disallowLongClick, + boolean allowInitialSplitSelection) { + controllers.taskbarDragController.setDisallowGlobalDrag(disallowGlobalDrag); + controllers.taskbarDragController.setDisallowLongClick(disallowLongClick); + controllers.taskbarAllAppsController.setDisallowGlobalDrag(disallowGlobalDrag); + controllers.taskbarAllAppsController.setDisallowLongClick(disallowLongClick); + controllers.taskbarPopupController.setAllowInitialSplitSelection( + allowInitialSplitSelection); + } } diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/FallbackTaskbarUIControllerTest.kt b/quickstep/tests/src/com/android/launcher3/taskbar/FallbackTaskbarUIControllerTest.kt new file mode 100644 index 0000000000..5a53d38f8d --- /dev/null +++ b/quickstep/tests/src/com/android/launcher3/taskbar/FallbackTaskbarUIControllerTest.kt @@ -0,0 +1,83 @@ +/* + * 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.taskbar + +import androidx.test.runner.AndroidJUnit4 +import com.android.launcher3.statemanager.StateManager +import com.android.quickstep.RecentsActivity +import com.android.quickstep.fallback.RecentsState +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Mock +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations.initMocks +import org.mockito.Mockito.`when` as whenever + +@RunWith(AndroidJUnit4::class) +class FallbackTaskbarUIControllerTest : TaskbarBaseTestCase() { + + lateinit var fallbackTaskbarUIController: FallbackTaskbarUIController + lateinit var stateListener: StateManager.StateListener + + @Mock + lateinit var recentsActivity: RecentsActivity + @Mock + lateinit var stateManager: StateManager + + @Before + override fun setup() { + super.setup() + whenever(recentsActivity.stateManager).thenReturn(stateManager) + fallbackTaskbarUIController = FallbackTaskbarUIController(recentsActivity) + + // Capture registered state listener to send events to in our tests + val captor = ArgumentCaptor.forClass(StateManager.StateListener::class.java) + fallbackTaskbarUIController.init(taskbarControllers) + verify(stateManager).addStateListener(captor.capture()) + stateListener = captor.value as StateManager.StateListener + } + + @Test + fun stateTransitionComplete_stateDefault() { + stateListener.onStateTransitionComplete(RecentsState.DEFAULT) + // verify dragging disabled + verify(taskbarDragController, times(1)).setDisallowGlobalDrag(true) + verify(taskbarAllAppsController, times(1)).setDisallowGlobalDrag(true) + // verify long click enabled + verify(taskbarDragController, times(1)).setDisallowLongClick(false) + verify(taskbarAllAppsController, times(1)).setDisallowLongClick(false) + // verify split selection enabled + verify(taskbarPopupController, times(1)).setAllowInitialSplitSelection(true) + } + + @Test + fun stateTransitionComplete_stateSplitSelect() { + stateListener.onStateTransitionComplete(RecentsState.OVERVIEW_SPLIT_SELECT) + // verify dragging disabled + verify(taskbarDragController, times(1)).setDisallowGlobalDrag(false) + verify(taskbarAllAppsController, times(1)).setDisallowGlobalDrag(false) + // verify long click enabled + verify(taskbarDragController, times(1)).setDisallowLongClick(true) + verify(taskbarAllAppsController, times(1)).setDisallowLongClick(true) + // verify split selection enabled + verify(taskbarPopupController, times(1)).setAllowInitialSplitSelection(false) + } +} \ No newline at end of file diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt index 8a78d8cb2d..c5e0398cdc 100644 --- a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt +++ b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt @@ -53,7 +53,7 @@ abstract class TaskbarBaseTestCase { @Mock lateinit var taskbarOverlayController: TaskbarOverlayController @Mock lateinit var taskbarEduTooltipController: TaskbarEduTooltipController - lateinit var mTaskbarControllers: TaskbarControllers + lateinit var taskbarControllers: TaskbarControllers @Before open fun setup() { @@ -65,7 +65,7 @@ abstract class TaskbarBaseTestCase { * includes that method to allow mocking it. */ MockitoAnnotations.initMocks(this) - mTaskbarControllers = + taskbarControllers = TaskbarControllers( taskbarActivityContext, taskbarDragController,