diff options
| author | 2025-01-22 13:32:46 -0800 | |
|---|---|---|
| committer | 2025-01-22 13:32:46 -0800 | |
| commit | d9d05f15daf483f68a3c409469904f8b4bd09eeb (patch) | |
| tree | 44b3860e18980ed0fcdf23922cf3a50bebcc39fe | |
| parent | c10e83ebbd8c2df54056ecac88f1d43c4bbc457a (diff) | |
| parent | 4f76a63657e267edcec602e46c620b64365c87a5 (diff) | |
Merge "Define and send callback to notify overview that transition to desktop from overview menu is complete." into main
9 files changed, 186 insertions, 7 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 67e345365d26..fdfaa90ac8b9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -95,6 +95,7 @@ import com.android.wm.shell.desktopmode.DesktopUserRepositories; import com.android.wm.shell.desktopmode.DragToDesktopTransitionHandler; import com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler; import com.android.wm.shell.desktopmode.ExitDesktopTaskTransitionHandler; +import com.android.wm.shell.desktopmode.OverviewToDesktopTransitionObserver; import com.android.wm.shell.desktopmode.ReturnToDragStartAnimator; import com.android.wm.shell.desktopmode.SpringDragToDesktopTransitionHandler; import com.android.wm.shell.desktopmode.ToggleResizeDesktopTaskTransitionHandler; @@ -739,7 +740,8 @@ public abstract class WMShellModule { DesktopModeUiEventLogger desktopModeUiEventLogger, DesktopTilingDecorViewModel desktopTilingDecorViewModel, DesktopWallpaperActivityTokenProvider desktopWallpaperActivityTokenProvider, - Optional<BubbleController> bubbleController) { + Optional<BubbleController> bubbleController, + OverviewToDesktopTransitionObserver overviewToDesktopTransitionObserver) { return new DesktopTasksController( context, shellInit, @@ -772,7 +774,8 @@ public abstract class WMShellModule { desktopModeUiEventLogger, desktopTilingDecorViewModel, desktopWallpaperActivityTokenProvider, - bubbleController); + bubbleController, + overviewToDesktopTransitionObserver); } @WMSingleton @@ -1397,4 +1400,10 @@ public abstract class WMShellModule { return new Object(); } + @WMSingleton + @Provides + static OverviewToDesktopTransitionObserver provideOverviewToDesktopTransitionObserver( + Transitions transitions, ShellInit shellInit) { + return new OverviewToDesktopTransitionObserver(transitions, shellInit); + } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 2b4b27046ac3..3ae553596631 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -179,6 +179,7 @@ class DesktopTasksController( private val desktopTilingDecorViewModel: DesktopTilingDecorViewModel, private val desktopWallpaperActivityTokenProvider: DesktopWallpaperActivityTokenProvider, private val bubbleController: Optional<BubbleController>, + private val overviewToDesktopTransitionObserver: OverviewToDesktopTransitionObserver, ) : RemoteCallable<DesktopTasksController>, Transitions.TransitionHandler, @@ -415,17 +416,25 @@ class DesktopTasksController( } /** Moves task to desktop mode if task is running, else launches it in desktop mode. */ + @JvmOverloads fun moveTaskToDesktop( taskId: Int, wct: WindowContainerTransaction = WindowContainerTransaction(), transitionSource: DesktopModeTransitionSource, remoteTransition: RemoteTransition? = null, + callback: IMoveToDesktopCallback? = null, ): Boolean { val runningTask = shellTaskOrganizer.getRunningTaskInfo(taskId) if (runningTask == null) { - return moveBackgroundTaskToDesktop(taskId, wct, transitionSource, remoteTransition) + return moveBackgroundTaskToDesktop( + taskId, + wct, + transitionSource, + remoteTransition, + callback, + ) } - moveRunningTaskToDesktop(runningTask, wct, transitionSource, remoteTransition) + moveRunningTaskToDesktop(runningTask, wct, transitionSource, remoteTransition, callback) return true } @@ -434,6 +443,7 @@ class DesktopTasksController( wct: WindowContainerTransaction, transitionSource: DesktopModeTransitionSource, remoteTransition: RemoteTransition? = null, + callback: IMoveToDesktopCallback? = null, ): Boolean { if (recentTasksController?.findTaskInBackground(taskId) == null) { logW("moveBackgroundTaskToDesktop taskId=%d not found", taskId) @@ -466,6 +476,7 @@ class DesktopTasksController( } else { // TODO(343149901): Add DPI changes for task launch transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) + invokeCallbackToOverview(transition, callback) } desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted( FREEFORM_ANIMATION_DURATION @@ -483,6 +494,7 @@ class DesktopTasksController( wct: WindowContainerTransaction = WindowContainerTransaction(), transitionSource: DesktopModeTransitionSource, remoteTransition: RemoteTransition? = null, + callback: IMoveToDesktopCallback? = null, ) { if ( DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue() && @@ -514,6 +526,7 @@ class DesktopTasksController( remoteTransitionHandler.setTransition(transition) } else { transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) + invokeCallbackToOverview(transition, callback) } desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted( FREEFORM_ANIMATION_DURATION @@ -524,6 +537,15 @@ class DesktopTasksController( exitResult.asExit()?.runOnTransitionStart?.invoke(transition) } + private fun invokeCallbackToOverview(transition: IBinder, callback: IMoveToDesktopCallback?) { + // TODO: b/333524374 - Remove this later. + // This is a temporary implementation for adding CUJ end and + // should be removed when animation is moved to launcher through remote transition. + if (callback != null) { + overviewToDesktopTransitionObserver.addPendingOverviewTransition(transition, callback) + } + } + /** * The first part of the animated drag to desktop transition. This is followed with a call to * [finalizeDragToDesktop] or [cancelDragToDesktop]. @@ -3023,12 +3045,14 @@ class DesktopTasksController( taskId: Int, transitionSource: DesktopModeTransitionSource, remoteTransition: RemoteTransition?, + callback: IMoveToDesktopCallback?, ) { executeRemoteCallWithTaskPermission(controller, "moveTaskToDesktop") { c -> c.moveTaskToDesktop( taskId, transitionSource = transitionSource, remoteTransition = remoteTransition, + callback = callback, ) } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl index ae4c2773215b..a135e4462150 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl @@ -23,6 +23,7 @@ import android.window.RemoteTransition; import com.android.wm.shell.desktopmode.IDesktopTaskListener; import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource; import com.android.wm.shell.shared.desktopmode.DesktopTaskToFrontReason; +import com.android.wm.shell.desktopmode.IMoveToDesktopCallback; /** * Interface that is exposed to remote callers to manipulate desktop mode features. @@ -58,7 +59,8 @@ interface IDesktopMode { /** Move a task with given `taskId` to desktop */ void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource, - in @nullable RemoteTransition remoteTransition); + in @nullable RemoteTransition remoteTransition, + in @nullable IMoveToDesktopCallback callback); /** Remove desktop on the given display */ oneway void removeDesktop(int displayId); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IMoveToDesktopCallback.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IMoveToDesktopCallback.aidl new file mode 100644 index 000000000000..6342528f9cc7 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IMoveToDesktopCallback.aidl @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2025 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.wm.shell.desktopmode; + +interface IMoveToDesktopCallback { + + void onTaskMovedToDesktop(); +}
\ No newline at end of file diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/OverviewToDesktopTransitionObserver.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/OverviewToDesktopTransitionObserver.kt new file mode 100644 index 000000000000..873f98389723 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/OverviewToDesktopTransitionObserver.kt @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2025 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.wm.shell.desktopmode + +import android.os.IBinder +import android.os.RemoteException +import android.util.Slog +import com.android.wm.shell.sysui.ShellInit +import com.android.wm.shell.transition.Transitions + +/** Callback to Launcher overview to notify that add to desktop from overview menu is completed. */ +class OverviewToDesktopTransitionObserver( + private val transitions: Transitions, + shellInit: ShellInit, +) : Transitions.TransitionObserver { + + private val transitionToCallback = mutableMapOf<IBinder?, IMoveToDesktopCallback?>() + + init { + shellInit.addInitCallback(::onInit, this) + } + + fun onInit() { + transitions.registerObserver(this) + } + + override fun onTransitionFinished(transition: IBinder, aborted: Boolean) { + try { + transitionToCallback[transition]?.onTaskMovedToDesktop() + transitionToCallback.clear() + } catch (e: RemoteException) { + Slog.e(TAG, "onTransitionFinished: Error calling onTaskMovedToDesktop", e) + } + } + + fun addPendingOverviewTransition(transition: IBinder?, callback: IMoveToDesktopCallback?) { + transitionToCallback += transition to callback + } + + companion object { + const val TAG = "OverviewToDesktopTransitionObserver" + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index 51b0291cab91..fad1c9f848ea 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -751,7 +751,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, // been added, so they must be added here decoration.addCaptionInset(wct); mDesktopTasksController.moveTaskToDesktop(taskId, wct, source, - /* remoteTransition= */ null); + /* remoteTransition= */ null, /* moveToDesktopCallback */ null); decoration.closeHandleMenu(); if (source == DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON) { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index db19017ef87a..fffaab36c9ad 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -245,6 +245,8 @@ class DesktopTasksControllerTest : ShellTestCase() { @Mock private lateinit var desktopWallpaperActivityTokenProvider: DesktopWallpaperActivityTokenProvider + @Mock + private lateinit var overviewToDesktopTransitionObserver: OverviewToDesktopTransitionObserver private lateinit var controller: DesktopTasksController private lateinit var shellInit: ShellInit @@ -392,6 +394,7 @@ class DesktopTasksControllerTest : ShellTestCase() { desktopTilingDecorViewModel, desktopWallpaperActivityTokenProvider, Optional.of(bubbleController), + overviewToDesktopTransitionObserver, ) @After diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/OverviewToDesktopTransitionObserverTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/OverviewToDesktopTransitionObserverTest.kt new file mode 100644 index 000000000000..490c42f980e3 --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/OverviewToDesktopTransitionObserverTest.kt @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2025 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.wm.shell.desktopmode + +import android.os.Binder +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.wm.shell.ShellTestCase +import com.android.wm.shell.common.ShellExecutor +import com.android.wm.shell.sysui.ShellInit +import com.android.wm.shell.transition.Transitions +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.spy +import org.mockito.Mockito.verify +import org.mockito.kotlin.mock + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class OverviewToDesktopTransitionObserverTest : ShellTestCase() { + + @Mock private lateinit var transitions: Transitions + + @Mock private lateinit var moveToDesktopCallback: IMoveToDesktopCallback + + private val testExecutor = mock<ShellExecutor>() + private lateinit var shellInit: ShellInit + private lateinit var transitionObserver: OverviewToDesktopTransitionObserver + private val token = Binder() + + @Before + fun setup() { + shellInit = spy(ShellInit(testExecutor)) + transitionObserver = OverviewToDesktopTransitionObserver(transitions, shellInit) + } + + @Test + fun moveToDesktop_onTransitionEnd_invokesCallback() { + transitionObserver.addPendingOverviewTransition(token, moveToDesktopCallback) + + transitionObserver.onTransitionFinished(token, false) + + verify(moveToDesktopCallback).onTaskMovedToDesktop() + } +} diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt index b4791642663a..baccbee0893d 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt @@ -642,6 +642,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest eq(decor.mTaskInfo.taskId), any(), eq(DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON), + anyOrNull(), anyOrNull() ) } @@ -875,7 +876,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest ) verify(mockDesktopTasksController, times(1)) - .moveTaskToDesktop(any(), any(), any(), anyOrNull()) + .moveTaskToDesktop(any(), any(), any(), anyOrNull(), anyOrNull()) } @Test |