summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vinay Joglekar <vinayjoglekar@google.com> 2025-01-22 13:32:46 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-22 13:32:46 -0800
commitd9d05f15daf483f68a3c409469904f8b4bd09eeb (patch)
tree44b3860e18980ed0fcdf23922cf3a50bebcc39fe
parentc10e83ebbd8c2df54056ecac88f1d43c4bbc457a (diff)
parent4f76a63657e267edcec602e46c620b64365c87a5 (diff)
Merge "Define and send callback to notify overview that transition to desktop from overview menu is complete." into main
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java13
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt28
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl4
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IMoveToDesktopCallback.aidl22
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/OverviewToDesktopTransitionObserver.kt57
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java2
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt3
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/OverviewToDesktopTransitionObserverTest.kt61
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt3
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