Create and attach additional Transition types to enter/exit transitions
This is so that different Enter/Exit logging reasons can be differentiated by the DestopModeLoggerTransitionObserver.
Create a TransitionSource enum which is shared with Launcher. Methods read TransitionSource passed to them and decide on which transitionType to choose when starting transitions.
**CUJ -> TransitionType -> Enter/ExitReason**
**Earlier**
Enter: Handle button -> MOVE_TO_DESKTOP -> APP_HANDLE_MENU_BUTTON
Enter: App icon(overview) -> MOVE_TO_DESKTOP -> APP_HANDLE_MENU_BUTTON
Enter: Keyboard shortcut -> MOVE_TO_DESKTOP -> APP_HANDLE_MENU_BUTTON
Exit: Drag to exit -> EXIT -> DRAG_TO_EXIT
Exit: Handle button -> EXIT -> DRAG_TO_EXIT
Exit: Keyboard shortcut -> EXIT -> DRAG_TO_EXIT
**Now**
Enter: Handle button -> APP_HANDLE_MENU_BUTTON -> APP_HANDLE_MENU_BUTTON
Enter: App icon(overview) ->APP_ICON_FROM_OVERVIEW->UNKOWN (fix later)
Enter: Keyboard shortcut -> KEYBOARD_SHORTCUT -> KEYBOARD_SHORTCUT
Enter: Adb Commands -> ADB_COMMANDS -> UNKNOWN (debugging CUJ only)
Exit: Drag to exit -> EXIT -> DRAG_TO_EXIT
Exit: Handle button -> APP_HANDLE_MENU_BUTTON-> APP_HANDLE_MENU_BUTTON
Exit: Keyboard shortcut -> KEYBOARD_SHORTCUT -> KEYBOARD_SHORTCUT
Flag: EXEMPT not a major feature/ user visible change
Test: Updated unit tests
Bug: b/326231756
Change-Id: I9cce7abe62106cd6b11a4f353c288214ea5ee1e7
diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp
index 89781fd..ef756c5 100644
--- a/libs/WindowManager/Shell/Android.bp
+++ b/libs/WindowManager/Shell/Android.bp
@@ -51,6 +51,7 @@
"src/com/android/wm/shell/common/split/SplitScreenConstants.java",
"src/com/android/wm/shell/common/TransactionPool.java",
"src/com/android/wm/shell/common/TriangleShape.java",
+ "src/com/android/wm/shell/common/desktopmode/*.kt",
"src/com/android/wm/shell/draganddrop/DragAndDropConstants.java",
"src/com/android/wm/shell/pip/PipContentOverlay.java",
"src/com/android/wm/shell/startingsurface/SplashScreenExitAnimationUtils.java",
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/desktopmode/DesktopModeTransitionSource.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/common/desktopmode/DesktopModeTransitionSource.aidl
new file mode 100644
index 0000000..c968e80
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/desktopmode/DesktopModeTransitionSource.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2024 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.common.desktopmode;
+
+parcelable DesktopModeTransitionSource;
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/desktopmode/DesktopModeTransitionSource.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/desktopmode/DesktopModeTransitionSource.kt
new file mode 100644
index 0000000..dbbf1786
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/desktopmode/DesktopModeTransitionSource.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2024 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.common.desktopmode
+
+import android.os.Parcel
+import android.os.Parcelable
+
+/** Transition source types for Desktop Mode. */
+enum class DesktopModeTransitionSource : Parcelable {
+ /** Transitions that originated as a consequence of task dragging. */
+ TASK_DRAG,
+ /** Transitions that originated from an app from Overview. */
+ APP_FROM_OVERVIEW,
+ /** Transitions that originated from app handle menu button */
+ APP_HANDLE_MENU_BUTTON,
+ /** Transitions that originated as a result of keyboard shortcuts. */
+ KEYBOARD_SHORTCUT,
+ /** Transitions with source unknown. */
+ UNKNOWN;
+
+ override fun describeContents(): Int {
+ return 0
+ }
+
+ override fun writeToParcel(dest: Parcel, flags: Int) {
+ dest.writeString(name)
+ }
+
+ companion object {
+ @JvmField
+ val CREATOR =
+ object : Parcelable.Creator<DesktopModeTransitionSource> {
+ override fun createFromParcel(parcel: Parcel): DesktopModeTransitionSource {
+ return parcel.readString()?.let { valueOf(it) } ?: UNKNOWN
+ }
+
+ override fun newArray(size: Int) = arrayOfNulls<DesktopModeTransitionSource>(size)
+ }
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMode.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMode.java
index df1b062..31c8f1e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMode.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMode.java
@@ -18,6 +18,7 @@
import android.graphics.Region;
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource;
import com.android.wm.shell.shared.annotations.ExternalThread;
import java.util.concurrent.Executor;
@@ -49,10 +50,10 @@
/** Called when requested to go to desktop mode from the current focused app. */
- void moveFocusedTaskToDesktop(int displayId);
+ void moveFocusedTaskToDesktop(int displayId, DesktopModeTransitionSource transitionSource);
/** Called when requested to go to fullscreen from the current focused desktop app. */
- void moveFocusedTaskToFullscreen(int displayId);
+ void moveFocusedTaskToFullscreen(int displayId, DesktopModeTransitionSource transitionSource);
/** Called when requested to go to split screen from the current focused desktop app. */
void moveFocusedTaskToStageSplit(int displayId, boolean leftOrTop);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserver.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserver.kt
index 5d8e340..075e3ae 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserver.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserver.kt
@@ -38,6 +38,12 @@
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.EnterReason
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ExitReason
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.TaskUpdate
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_HANDLE_MENU_BUTTON
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_KEYBOARD_SHORTCUT
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_TASK_DRAG
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_ENTER_DESKTOP_FROM_APP_FROM_OVERVIEW
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_ENTER_DESKTOP_FROM_APP_HANDLE_MENU_BUTTON
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_ENTER_DESKTOP_FROM_KEYBOARD_SHORTCUT
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.shared.DesktopModeStatus
import com.android.wm.shell.shared.TransitionUtil
@@ -304,11 +310,13 @@
/** Get [EnterReason] for this session enter */
private fun getEnterReason(transitionInfo: TransitionInfo): EnterReason {
- // TODO(b/326231756) - Add support for missing enter reasons
return when (transitionInfo.type) {
WindowManager.TRANSIT_WAKE -> EnterReason.SCREEN_ON
Transitions.TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP -> EnterReason.APP_HANDLE_DRAG
- Transitions.TRANSIT_MOVE_TO_DESKTOP -> EnterReason.APP_HANDLE_MENU_BUTTON
+ TRANSIT_ENTER_DESKTOP_FROM_APP_HANDLE_MENU_BUTTON -> EnterReason.APP_HANDLE_MENU_BUTTON
+ // TODO(b/344822506): Create and update EnterReason to APP_FROM_OVERVIEW
+ TRANSIT_ENTER_DESKTOP_FROM_APP_FROM_OVERVIEW -> EnterReason.UNKNOWN_ENTER
+ TRANSIT_ENTER_DESKTOP_FROM_KEYBOARD_SHORTCUT -> EnterReason.KEYBOARD_SHORTCUT_ENTER
WindowManager.TRANSIT_OPEN -> EnterReason.APP_FREEFORM_INTENT
else -> EnterReason.UNKNOWN_ENTER
}
@@ -316,11 +324,14 @@
/** Get [ExitReason] for this session exit */
private fun getExitReason(transitionInfo: TransitionInfo): ExitReason {
- // TODO(b/326231756) - Add support for missing exit reasons
return when {
transitionInfo.type == WindowManager.TRANSIT_SLEEP -> ExitReason.SCREEN_OFF
transitionInfo.type == WindowManager.TRANSIT_CLOSE -> ExitReason.TASK_FINISHED
- transitionInfo.type == Transitions.TRANSIT_EXIT_DESKTOP_MODE -> ExitReason.DRAG_TO_EXIT
+ transitionInfo.type == TRANSIT_EXIT_DESKTOP_MODE_TASK_DRAG -> ExitReason.DRAG_TO_EXIT
+ transitionInfo.type == TRANSIT_EXIT_DESKTOP_MODE_HANDLE_MENU_BUTTON ->
+ ExitReason.APP_HANDLE_MENU_BUTTON_EXIT
+ transitionInfo.type == TRANSIT_EXIT_DESKTOP_MODE_KEYBOARD_SHORTCUT ->
+ ExitReason.KEYBOARD_SHORTCUT_EXIT
transitionInfo.isRecentsTransition() -> ExitReason.RETURN_HOME_OR_OVERVIEW
else -> ExitReason.UNKNOWN_EXIT
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeShellCommandHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeShellCommandHandler.kt
index bc27f34..1a6ca0e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeShellCommandHandler.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeShellCommandHandler.kt
@@ -16,7 +16,7 @@
package com.android.wm.shell.desktopmode
-import android.window.WindowContainerTransaction
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource.UNKNOWN
import com.android.wm.shell.sysui.ShellCommandHandler
import java.io.PrintWriter
@@ -64,7 +64,7 @@
return false
}
- return controller.moveToDesktop(taskId, WindowContainerTransaction())
+ return controller.moveToDesktop(taskId, transitionSource = UNKNOWN)
}
private fun runMoveToNextDisplay(args: Array<String>, pw: PrintWriter): Boolean {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTransitionTypes.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTransitionTypes.kt
new file mode 100644
index 0000000..b24bd10
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTransitionTypes.kt
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2024 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.view.WindowManager.TransitionType
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource
+import com.android.wm.shell.transition.Transitions.TRANSIT_DESKTOP_MODE_TYPES
+
+/**
+ * Contains desktop mode [TransitionType]s (extended from [TRANSIT_DESKTOP_MODE_TYPES]) and helper
+ * methods.
+ */
+object DesktopModeTransitionTypes {
+
+ const val TRANSIT_ENTER_DESKTOP_FROM_APP_HANDLE_MENU_BUTTON = TRANSIT_DESKTOP_MODE_TYPES + 1
+ const val TRANSIT_ENTER_DESKTOP_FROM_APP_FROM_OVERVIEW = TRANSIT_DESKTOP_MODE_TYPES + 2
+ const val TRANSIT_ENTER_DESKTOP_FROM_KEYBOARD_SHORTCUT = TRANSIT_DESKTOP_MODE_TYPES + 3
+ const val TRANSIT_ENTER_DESKTOP_FROM_UNKNOWN = TRANSIT_DESKTOP_MODE_TYPES + 4
+ const val TRANSIT_EXIT_DESKTOP_MODE_TASK_DRAG = TRANSIT_DESKTOP_MODE_TYPES + 5
+ const val TRANSIT_EXIT_DESKTOP_MODE_HANDLE_MENU_BUTTON = TRANSIT_DESKTOP_MODE_TYPES + 6
+ const val TRANSIT_EXIT_DESKTOP_MODE_KEYBOARD_SHORTCUT = TRANSIT_DESKTOP_MODE_TYPES + 7
+ const val TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN = TRANSIT_DESKTOP_MODE_TYPES + 8
+
+ /** Return whether the [TransitionType] corresponds to a transition to enter desktop mode. */
+ @JvmStatic
+ fun @receiver:TransitionType Int.isEnterDesktopModeTransition(): Boolean {
+ return this in
+ listOf(
+ TRANSIT_ENTER_DESKTOP_FROM_APP_HANDLE_MENU_BUTTON,
+ TRANSIT_ENTER_DESKTOP_FROM_APP_FROM_OVERVIEW,
+ TRANSIT_ENTER_DESKTOP_FROM_KEYBOARD_SHORTCUT,
+ TRANSIT_ENTER_DESKTOP_FROM_UNKNOWN
+ )
+ }
+
+ /**
+ * Returns corresponding desktop mode enter [TransitionType] for a
+ * [DesktopModeTransitionSource].
+ */
+ @JvmStatic
+ @TransitionType
+ fun DesktopModeTransitionSource.getEnterTransitionType(): Int {
+ return when (this) {
+ DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON ->
+ TRANSIT_ENTER_DESKTOP_FROM_APP_HANDLE_MENU_BUTTON
+ DesktopModeTransitionSource.APP_FROM_OVERVIEW ->
+ TRANSIT_ENTER_DESKTOP_FROM_APP_FROM_OVERVIEW
+ DesktopModeTransitionSource.KEYBOARD_SHORTCUT ->
+ TRANSIT_ENTER_DESKTOP_FROM_KEYBOARD_SHORTCUT
+ else -> TRANSIT_ENTER_DESKTOP_FROM_UNKNOWN
+ }
+ }
+
+ /** Return whether the [TransitionType] corresponds to a transition to exit desktop mode. */
+ @JvmStatic
+ fun @receiver:TransitionType Int.isExitDesktopModeTransition(): Boolean {
+ return this in
+ listOf(
+ TRANSIT_EXIT_DESKTOP_MODE_TASK_DRAG,
+ TRANSIT_EXIT_DESKTOP_MODE_HANDLE_MENU_BUTTON,
+ TRANSIT_EXIT_DESKTOP_MODE_KEYBOARD_SHORTCUT,
+ TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN
+ )
+ }
+
+ /**
+ * Returns corresponding desktop mode exit [TransitionType] for a [DesktopModeTransitionSource].
+ */
+ @JvmStatic
+ @TransitionType
+ fun DesktopModeTransitionSource.getExitTransitionType(): Int {
+ return when (this) {
+ DesktopModeTransitionSource.TASK_DRAG -> TRANSIT_EXIT_DESKTOP_MODE_TASK_DRAG
+ DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON ->
+ TRANSIT_EXIT_DESKTOP_MODE_HANDLE_MENU_BUTTON
+ DesktopModeTransitionSource.KEYBOARD_SHORTCUT ->
+ TRANSIT_EXIT_DESKTOP_MODE_KEYBOARD_SHORTCUT
+ else -> TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN
+ }
+ }
+}
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 c9c6bcb..94931fe 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
@@ -63,6 +63,7 @@
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.common.SingleInstanceRemoteListener
import com.android.wm.shell.common.SyncTransactionQueue
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource
import com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT
import com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT
import com.android.wm.shell.compatui.isSingleTopActivityTranslucent
@@ -253,7 +254,7 @@
}
/** Enter desktop by using the focused task in given `displayId` */
- fun moveFocusedTaskToDesktop(displayId: Int) {
+ fun moveFocusedTaskToDesktop(displayId: Int, transitionSource: DesktopModeTransitionSource) {
val allFocusedTasks =
shellTaskOrganizer.getRunningTasks(displayId).filter { taskInfo ->
taskInfo.isFocused &&
@@ -272,11 +273,11 @@
} else {
allFocusedTasks[0]
}
- moveToDesktop(splitFocusedTask)
+ moveToDesktop(splitFocusedTask, transitionSource = transitionSource)
}
1 -> {
// Fullscreen case where we move the current focused task.
- moveToDesktop(allFocusedTasks[0].taskId)
+ moveToDesktop(allFocusedTasks[0].taskId, transitionSource = transitionSource)
}
else -> {
KtProtoLog.w(
@@ -293,17 +294,20 @@
/** Move a task with given `taskId` to desktop */
fun moveToDesktop(
taskId: Int,
- wct: WindowContainerTransaction = WindowContainerTransaction()
+ wct: WindowContainerTransaction = WindowContainerTransaction(),
+ transitionSource: DesktopModeTransitionSource,
): Boolean {
shellTaskOrganizer.getRunningTaskInfo(taskId)?.let {
- moveToDesktop(it, wct)
- } ?: moveToDesktopFromNonRunningTask(taskId, wct)
+ moveToDesktop(it, wct, transitionSource)
+ }
+ ?: moveToDesktopFromNonRunningTask(taskId, wct, transitionSource)
return true
}
private fun moveToDesktopFromNonRunningTask(
taskId: Int,
- wct: WindowContainerTransaction
+ wct: WindowContainerTransaction,
+ transitionSource: DesktopModeTransitionSource,
): Boolean {
recentTasksController?.findTaskInBackground(taskId)?.let {
KtProtoLog.v(
@@ -316,10 +320,11 @@
bringDesktopAppsToFrontBeforeShowingNewTask(DEFAULT_DISPLAY, wct, taskId)
addMoveToDesktopChangesNonRunningTask(wct, taskId)
// TODO(343149901): Add DPI changes for task launch
- val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct)
+ val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
addPendingMinimizeTransition(transition, taskToMinimize)
return true
- } ?: return false
+ }
+ ?: return false
}
private fun addMoveToDesktopChangesNonRunningTask(
@@ -331,12 +336,11 @@
wct.startTask(taskId, options.toBundle())
}
- /**
- * Move a task to desktop
- */
+ /** Move a task to desktop */
fun moveToDesktop(
task: RunningTaskInfo,
- wct: WindowContainerTransaction = WindowContainerTransaction()
+ wct: WindowContainerTransaction = WindowContainerTransaction(),
+ transitionSource: DesktopModeTransitionSource,
) {
if (Flags.enableDesktopWindowingModalsPolicy() && isSingleTopActivityTranslucent(task)) {
KtProtoLog.w(
@@ -358,7 +362,7 @@
addMoveToDesktopChanges(wct, task)
if (Transitions.ENABLE_SHELL_TRANSITIONS) {
- val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct)
+ val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
addPendingMinimizeTransition(transition, taskToMinimize)
} else {
shellTaskOrganizer.applyTransaction(wct)
@@ -433,16 +437,16 @@
}
/** Move a task with given `taskId` to fullscreen */
- fun moveToFullscreen(taskId: Int) {
+ fun moveToFullscreen(taskId: Int, transitionSource: DesktopModeTransitionSource) {
shellTaskOrganizer.getRunningTaskInfo(taskId)?.let { task ->
- moveToFullscreenWithAnimation(task, task.positionInParent)
+ moveToFullscreenWithAnimation(task, task.positionInParent, transitionSource)
}
}
/** Enter fullscreen by moving the focused freeform task in given `displayId` to fullscreen. */
- fun enterFullscreen(displayId: Int) {
+ fun enterFullscreen(displayId: Int, transitionSource: DesktopModeTransitionSource) {
getFocusedFreeformTask(displayId)?.let {
- moveToFullscreenWithAnimation(it, it.positionInParent)
+ moveToFullscreenWithAnimation(it, it.positionInParent, transitionSource)
}
}
@@ -491,7 +495,11 @@
)
}
- private fun moveToFullscreenWithAnimation(task: RunningTaskInfo, position: Point) {
+ private fun moveToFullscreenWithAnimation(
+ task: RunningTaskInfo,
+ position: Point,
+ transitionSource: DesktopModeTransitionSource
+ ) {
KtProtoLog.v(
WM_SHELL_DESKTOP_MODE,
"DesktopTasksController: moveToFullscreen with animation taskId=%d",
@@ -502,7 +510,7 @@
if (Transitions.ENABLE_SHELL_TRANSITIONS) {
exitDesktopTaskTransitionHandler.startTransition(
- Transitions.TRANSIT_EXIT_DESKTOP_MODE,
+ transitionSource,
wct,
position,
mOnAnimationFinishedCallback
@@ -932,7 +940,8 @@
request.type == TRANSIT_TO_BACK &&
request.triggerTask?.let { task ->
desktopModeTaskRepository.isOnlyActiveTask(task.taskId)
- } ?: false
+ }
+ ?: false
}
private fun handleFreeformTaskLaunch(
@@ -1220,7 +1229,11 @@
)
when (indicatorType) {
DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR -> {
- moveToFullscreenWithAnimation(taskInfo, position)
+ moveToFullscreenWithAnimation(
+ taskInfo,
+ position,
+ DesktopModeTransitionSource.TASK_DRAG
+ )
}
DesktopModeVisualIndicator.IndicatorType.TO_SPLIT_LEFT_INDICATOR -> {
releaseVisualIndicator()
@@ -1392,12 +1405,22 @@
}
}
- override fun moveFocusedTaskToDesktop(displayId: Int) {
- mainExecutor.execute { this@DesktopTasksController.moveFocusedTaskToDesktop(displayId) }
+ override fun moveFocusedTaskToDesktop(
+ displayId: Int,
+ transitionSource: DesktopModeTransitionSource
+ ) {
+ mainExecutor.execute {
+ this@DesktopTasksController.moveFocusedTaskToDesktop(displayId, transitionSource)
+ }
}
- override fun moveFocusedTaskToFullscreen(displayId: Int) {
- mainExecutor.execute { this@DesktopTasksController.enterFullscreen(displayId) }
+ override fun moveFocusedTaskToFullscreen(
+ displayId: Int,
+ transitionSource: DesktopModeTransitionSource
+ ) {
+ mainExecutor.execute {
+ this@DesktopTasksController.enterFullscreen(displayId, transitionSource)
+ }
}
override fun moveFocusedTaskToStageSplit(displayId: Int, leftOrTop: Boolean) {
@@ -1502,9 +1525,9 @@
}
}
- override fun moveToDesktop(taskId: Int) {
+ override fun moveToDesktop(taskId: Int, transitionSource: DesktopModeTransitionSource) {
ExecutorUtils.executeRemoteCallWithTaskPermission(controller, "moveToDesktop") { c ->
- c.moveToDesktop(taskId)
+ c.moveToDesktop(taskId, transitionSource = transitionSource)
}
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java
index 526cf4d..e5b624f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java
@@ -18,7 +18,8 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
-import static com.android.wm.shell.transition.Transitions.TRANSIT_MOVE_TO_DESKTOP;
+import static com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.getEnterTransitionType;
+import static com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.isEnterDesktopModeTransition;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -30,6 +31,7 @@
import android.util.Slog;
import android.view.SurfaceControl;
import android.view.WindowManager;
+import android.view.WindowManager.TransitionType;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
import android.window.WindowContainerTransaction;
@@ -37,6 +39,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener;
@@ -82,8 +85,12 @@
* @param wct WindowContainerTransaction for transition
* @return the token representing the started transition
*/
- public IBinder moveToDesktop(@NonNull WindowContainerTransaction wct) {
- final IBinder token = mTransitions.startTransition(TRANSIT_MOVE_TO_DESKTOP, wct, this);
+ public IBinder moveToDesktop(
+ @NonNull WindowContainerTransaction wct,
+ DesktopModeTransitionSource transitionSource
+ ) {
+ final IBinder token = mTransitions.startTransition(getEnterTransitionType(transitionSource),
+ wct, this);
mPendingTransitionTokens.add(token);
return token;
}
@@ -117,7 +124,7 @@
private boolean startChangeTransition(
@NonNull IBinder transition,
- @WindowManager.TransitionType int type,
+ @TransitionType int type,
@NonNull TransitionInfo.Change change,
@NonNull SurfaceControl.Transaction startT,
@NonNull SurfaceControl.Transaction finishT,
@@ -127,7 +134,7 @@
}
final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
- if (type == TRANSIT_MOVE_TO_DESKTOP
+ if (isEnterDesktopModeTransition(type)
&& taskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM) {
return animateMoveToDesktop(change, startT, finishCallback);
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java
index 9f9e256..891f75c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java
@@ -18,6 +18,9 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.getExitTransitionType;
+import static com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.isExitDesktopModeTransition;
+
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
@@ -30,6 +33,7 @@
import android.util.DisplayMetrics;
import android.view.SurfaceControl;
import android.view.WindowManager;
+import android.view.WindowManager.TransitionType;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
import android.window.WindowContainerTransaction;
@@ -38,6 +42,7 @@
import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource;
import com.android.wm.shell.transition.Transitions;
import java.util.ArrayList;
@@ -52,6 +57,7 @@
*/
public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionHandler {
private static final int FULLSCREEN_ANIMATION_DURATION = 336;
+
private final Context mContext;
private final Transitions mTransitions;
private final List<IBinder> mPendingTransitionTokens = new ArrayList<>();
@@ -77,17 +83,18 @@
/**
* Starts Transition of a given type
*
- * @param type Transition type
+ * @param transitionSource DesktopModeTransitionSource for transition
* @param wct WindowContainerTransaction for transition
* @param position Position of the task when transition is started
* @param onAnimationEndCallback to be called after animation
*/
- public void startTransition(@WindowManager.TransitionType int type,
+ public void startTransition(@NonNull DesktopModeTransitionSource transitionSource,
@NonNull WindowContainerTransaction wct, Point position,
Consumer<SurfaceControl.Transaction> onAnimationEndCallback) {
mPosition = position;
mOnAnimationFinishedCallback = onAnimationEndCallback;
- final IBinder token = mTransitions.startTransition(type, wct, this);
+ final IBinder token = mTransitions.startTransition(getExitTransitionType(transitionSource),
+ wct, this);
mPendingTransitionTokens.add(token);
}
@@ -121,7 +128,7 @@
@VisibleForTesting
boolean startChangeTransition(
@NonNull IBinder transition,
- @WindowManager.TransitionType int type,
+ @TransitionType int type,
@NonNull TransitionInfo.Change change,
@NonNull SurfaceControl.Transaction startT,
@NonNull SurfaceControl.Transaction finishT,
@@ -130,7 +137,7 @@
return false;
}
final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
- if (type == Transitions.TRANSIT_EXIT_DESKTOP_MODE
+ if (isExitDesktopModeTransition(type)
&& taskInfo.getWindowingMode() == WINDOWING_MODE_FULLSCREEN) {
// This Transition animates a task to fullscreen after being dragged to status bar
final Resources resources = mContext.getResources();
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 c36f8de..a7ec203 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
@@ -18,6 +18,7 @@
import android.app.ActivityManager.RunningTaskInfo;
import android.window.RemoteTransition;
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource;
import com.android.wm.shell.desktopmode.IDesktopTaskListener;
/**
@@ -47,5 +48,5 @@
oneway void setTaskListener(IDesktopTaskListener listener);
/** Move a task with given `taskId` to desktop */
- void moveToDesktop(int taskId);
+ void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource);
}
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
index 6ade81c..65fda97 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
@@ -166,9 +166,6 @@
public static final int TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP =
WindowManager.TRANSIT_FIRST_CUSTOM + 11;
- /** Transition type to fullscreen from desktop mode. */
- public static final int TRANSIT_EXIT_DESKTOP_MODE = WindowManager.TRANSIT_FIRST_CUSTOM + 12;
-
/** Transition type to cancel the drag to desktop mode. */
public static final int TRANSIT_DESKTOP_MODE_CANCEL_DRAG_TO_DESKTOP =
WindowManager.TRANSIT_FIRST_CUSTOM + 13;
@@ -177,9 +174,6 @@
public static final int TRANSIT_DESKTOP_MODE_TOGGLE_RESIZE =
WindowManager.TRANSIT_FIRST_CUSTOM + 14;
- /** Transition to animate task to desktop. */
- public static final int TRANSIT_MOVE_TO_DESKTOP = WindowManager.TRANSIT_FIRST_CUSTOM + 15;
-
/** Transition to resize PiP task. */
public static final int TRANSIT_RESIZE_PIP = TRANSIT_FIRST_CUSTOM + 16;
@@ -190,6 +184,10 @@
// TRANSIT_FIRST_CUSTOM + 17
TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_DRAG_RESIZE;
+ /** Transition type for desktop mode transitions. */
+ public static final int TRANSIT_DESKTOP_MODE_TYPES =
+ WindowManager.TRANSIT_FIRST_CUSTOM + 100;
+
private final ShellTaskOrganizer mOrganizer;
private final Context mContext;
private final ShellExecutor mMainExecutor;
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 37cdbb4..d452428 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
@@ -83,6 +83,7 @@
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource;
import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition;
import com.android.wm.shell.desktopmode.DesktopModeVisualIndicator;
import com.android.wm.shell.desktopmode.DesktopTasksController;
@@ -447,7 +448,8 @@
// App sometimes draws before the insets from WindowDecoration#relayout have
// been added, so they must be added here
mWindowDecorByTaskId.get(mTaskId).addCaptionInset(wct);
- mDesktopTasksController.moveToDesktop(mTaskId, wct);
+ mDesktopTasksController.moveToDesktop(mTaskId, wct,
+ DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON);
decoration.closeHandleMenu();
} else if (id == R.id.fullscreen_button) {
decoration.closeHandleMenu();
@@ -455,7 +457,8 @@
mSplitScreenController.moveTaskToFullscreen(mTaskId,
SplitScreenController.EXIT_REASON_DESKTOP_MODE);
} else {
- mDesktopTasksController.moveToFullscreen(mTaskId);
+ mDesktopTasksController.moveToFullscreen(mTaskId,
+ DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON);
}
} else if (id == R.id.split_screen_button) {
decoration.closeHandleMenu();
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserverTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserverTest.kt
index 2a2483d..7122181 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserverTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserverTest.kt
@@ -22,7 +22,6 @@
import android.os.IBinder
import android.testing.AndroidTestingRunner
import android.view.SurfaceControl
-import android.view.WindowManager.TRANSIT_CHANGE
import android.view.WindowManager.TRANSIT_CLOSE
import android.view.WindowManager.TRANSIT_FLAG_IS_RECENTS
import android.view.WindowManager.TRANSIT_NONE
@@ -41,6 +40,14 @@
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.EnterReason
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ExitReason
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_HANDLE_MENU_BUTTON
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_KEYBOARD_SHORTCUT
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_TASK_DRAG
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_ENTER_DESKTOP_FROM_APP_FROM_OVERVIEW
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_ENTER_DESKTOP_FROM_APP_HANDLE_MENU_BUTTON
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_ENTER_DESKTOP_FROM_KEYBOARD_SHORTCUT
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_ENTER_DESKTOP_FROM_UNKNOWN
import com.android.wm.shell.shared.DesktopModeStatus
import com.android.wm.shell.sysui.ShellInit
import com.android.wm.shell.transition.TransitionInfoBuilder
@@ -60,6 +67,7 @@
import org.mockito.kotlin.never
import org.mockito.kotlin.same
import org.mockito.kotlin.times
+import org.mockito.kotlin.verifyZeroInteractions
/**
* Test class for {@link DesktopModeLoggerTransitionObserver}
@@ -72,18 +80,16 @@
@JvmField
@Rule
- val extendedMockitoRule = ExtendedMockitoRule.Builder(this)
+ val extendedMockitoRule =
+ ExtendedMockitoRule.Builder(this)
.mockStatic(DesktopModeEventLogger::class.java)
- .mockStatic(DesktopModeStatus::class.java).build()!!
+ .mockStatic(DesktopModeStatus::class.java)
+ .build()!!
- @Mock
- lateinit var testExecutor: ShellExecutor
- @Mock
- private lateinit var mockShellInit: ShellInit
- @Mock
- private lateinit var transitions: Transitions
- @Mock
- private lateinit var context: Context
+ @Mock lateinit var testExecutor: ShellExecutor
+ @Mock private lateinit var mockShellInit: ShellInit
+ @Mock private lateinit var transitions: Transitions
+ @Mock private lateinit var context: Context
private lateinit var transitionObserver: DesktopModeLoggerTransitionObserver
private lateinit var shellInit: ShellInit
@@ -91,17 +97,21 @@
@Before
fun setup() {
- doReturn(true).`when`{ DesktopModeStatus.canEnterDesktopMode(any()) }
+ doReturn(true).`when` { DesktopModeStatus.canEnterDesktopMode(any()) }
shellInit = Mockito.spy(ShellInit(testExecutor))
desktopModeEventLogger = mock(DesktopModeEventLogger::class.java)
- transitionObserver = DesktopModeLoggerTransitionObserver(
- context, mockShellInit, transitions, desktopModeEventLogger)
+ transitionObserver =
+ DesktopModeLoggerTransitionObserver(
+ context,
+ mockShellInit,
+ transitions,
+ desktopModeEventLogger
+ )
if (Transitions.ENABLE_SHELL_TRANSITIONS) {
- val initRunnableCaptor = ArgumentCaptor.forClass(
- Runnable::class.java)
- verify(mockShellInit).addInitCallback(initRunnableCaptor.capture(),
- same(transitionObserver))
+ val initRunnableCaptor = ArgumentCaptor.forClass(Runnable::class.java)
+ verify(mockShellInit)
+ .addInitCallback(initRunnableCaptor.capture(), same(transitionObserver))
initRunnableCaptor.value.run()
} else {
transitionObserver.onInit()
@@ -110,13 +120,11 @@
@Test
fun testRegistersObserverAtInit() {
- verify(transitions)
- .registerObserver(same(
- transitionObserver))
+ verify(transitions).registerObserver(same(transitionObserver))
}
@Test
- fun taskCreated_notFreeformWindow_doesNotLogSessionEnterOrTaskAdded() {
+ fun transitOpen_notFreeformWindow_doesNotLogTaskAddedOrSessionEnter() {
val change = createChange(TRANSIT_OPEN, createTaskInfo(1, WINDOWING_MODE_FULLSCREEN))
val transitionInfo = TransitionInfoBuilder(TRANSIT_OPEN, 0).addChange(change).build()
@@ -127,7 +135,7 @@
}
@Test
- fun taskCreated_FreeformWindowOpen_logSessionEnterAndTaskAdded() {
+ fun transitOpen_logTaskAddedAndEnterReasonAppFreeformIntent() {
val change = createChange(TRANSIT_OPEN, createTaskInfo(1, WINDOWING_MODE_FREEFORM))
val transitionInfo = TransitionInfoBuilder(TRANSIT_OPEN, 0).addChange(change).build()
@@ -135,76 +143,119 @@
val sessionId = transitionObserver.getLoggerSessionId()
assertThat(sessionId).isNotNull()
- verify(desktopModeEventLogger, times(1)).logSessionEnter(eq(sessionId!!),
- eq(EnterReason.APP_FREEFORM_INTENT))
+ verify(desktopModeEventLogger, times(1))
+ .logSessionEnter(eq(sessionId!!), eq(EnterReason.APP_FREEFORM_INTENT))
verify(desktopModeEventLogger, times(1)).logTaskAdded(eq(sessionId), any())
+ verifyZeroInteractions(desktopModeEventLogger)
}
@Test
- fun taskChanged_taskMovedToDesktopByDrag_logSessionEnterAndTaskAdded() {
+ fun transitEndDragToDesktop_logTaskAddedAndEnterReasonAppHandleDrag() {
val change = createChange(TRANSIT_TO_FRONT, createTaskInfo(1, WINDOWING_MODE_FREEFORM))
// task change is finalised when drag ends
- val transitionInfo = TransitionInfoBuilder(
- Transitions.TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP, 0).addChange(change).build()
+ val transitionInfo =
+ TransitionInfoBuilder(Transitions.TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP, 0)
+ .addChange(change)
+ .build()
callOnTransitionReady(transitionInfo)
val sessionId = transitionObserver.getLoggerSessionId()
assertThat(sessionId).isNotNull()
- verify(desktopModeEventLogger, times(1)).logSessionEnter(eq(sessionId!!),
- eq(EnterReason.APP_HANDLE_DRAG))
+ verify(desktopModeEventLogger, times(1))
+ .logSessionEnter(eq(sessionId!!), eq(EnterReason.APP_HANDLE_DRAG))
verify(desktopModeEventLogger, times(1)).logTaskAdded(eq(sessionId), any())
+ verifyZeroInteractions(desktopModeEventLogger)
}
@Test
- fun taskChanged_taskMovedToDesktopByButtonTap_logSessionEnterAndTaskAdded() {
+ fun transitEnterDesktopByButtonTap_logTaskAddedAndEnterReasonButtonTap() {
val change = createChange(TRANSIT_TO_FRONT, createTaskInfo(1, WINDOWING_MODE_FREEFORM))
- val transitionInfo = TransitionInfoBuilder(Transitions.TRANSIT_MOVE_TO_DESKTOP, 0)
- .addChange(change).build()
+ val transitionInfo =
+ TransitionInfoBuilder(TRANSIT_ENTER_DESKTOP_FROM_APP_HANDLE_MENU_BUTTON, 0)
+ .addChange(change)
+ .build()
callOnTransitionReady(transitionInfo)
val sessionId = transitionObserver.getLoggerSessionId()
assertThat(sessionId).isNotNull()
- verify(desktopModeEventLogger, times(1)).logSessionEnter(eq(sessionId!!),
- eq(EnterReason.APP_HANDLE_MENU_BUTTON))
+ verify(desktopModeEventLogger, times(1))
+ .logSessionEnter(eq(sessionId!!), eq(EnterReason.APP_HANDLE_MENU_BUTTON))
verify(desktopModeEventLogger, times(1)).logTaskAdded(eq(sessionId), any())
+ verifyZeroInteractions(desktopModeEventLogger)
}
@Test
- fun taskChanged_existingFreeformTaskMadeVisible_logSessionEnterAndTaskAdded() {
- val taskInfo = createTaskInfo(1, WINDOWING_MODE_FREEFORM)
- taskInfo.isVisibleRequested = true
- val change = createChange(TRANSIT_CHANGE, taskInfo)
- val transitionInfo = TransitionInfoBuilder(Transitions.TRANSIT_MOVE_TO_DESKTOP, 0)
- .addChange(change).build()
-
- callOnTransitionReady(transitionInfo)
- val sessionId = transitionObserver.getLoggerSessionId()
-
- assertThat(sessionId).isNotNull()
- verify(desktopModeEventLogger, times(1)).logSessionEnter(eq(sessionId!!),
- eq(EnterReason.APP_HANDLE_MENU_BUTTON))
- verify(desktopModeEventLogger, times(1)).logTaskAdded(eq(sessionId), any())
- }
-
- @Test
- fun taskToFront_screenWake_logSessionStartedAndTaskAdded() {
+ // TODO(b/344822506): Update test when we add enter reason for app from overview
+ fun transitEnterDesktopFromAppFromOverview_logTaskAddedAndEnterReasonUnknown() {
val change = createChange(TRANSIT_TO_FRONT, createTaskInfo(1, WINDOWING_MODE_FREEFORM))
- val transitionInfo = TransitionInfoBuilder(TRANSIT_WAKE, 0)
- .addChange(change).build()
+ val transitionInfo =
+ TransitionInfoBuilder(TRANSIT_ENTER_DESKTOP_FROM_APP_FROM_OVERVIEW, 0)
+ .addChange(change)
+ .build()
callOnTransitionReady(transitionInfo)
val sessionId = transitionObserver.getLoggerSessionId()
assertThat(sessionId).isNotNull()
- verify(desktopModeEventLogger, times(1)).logSessionEnter(eq(sessionId!!),
- eq(EnterReason.SCREEN_ON))
+ verify(desktopModeEventLogger, times(1))
+ .logSessionEnter(eq(sessionId!!), eq(EnterReason.UNKNOWN_ENTER))
verify(desktopModeEventLogger, times(1)).logTaskAdded(eq(sessionId), any())
+ verifyZeroInteractions(desktopModeEventLogger)
}
@Test
- fun freeformTaskVisible_screenTurnOff_logSessionExitAndTaskRemoved_sessionIdNull() {
+ fun transitEnterDesktopFromKeyboardShortcut_logTaskAddedAndEnterReasonKeyboardShortcut() {
+ val change = createChange(TRANSIT_TO_FRONT, createTaskInfo(1, WINDOWING_MODE_FREEFORM))
+ val transitionInfo =
+ TransitionInfoBuilder(TRANSIT_ENTER_DESKTOP_FROM_KEYBOARD_SHORTCUT, 0)
+ .addChange(change)
+ .build()
+
+ callOnTransitionReady(transitionInfo)
+ val sessionId = transitionObserver.getLoggerSessionId()
+
+ assertThat(sessionId).isNotNull()
+ verify(desktopModeEventLogger, times(1))
+ .logSessionEnter(eq(sessionId!!), eq(EnterReason.KEYBOARD_SHORTCUT_ENTER))
+ verify(desktopModeEventLogger, times(1)).logTaskAdded(eq(sessionId), any())
+ verifyZeroInteractions(desktopModeEventLogger)
+ }
+
+ @Test
+ fun transitEnterDesktopFromUnknown_logTaskAddedAndEnterReasonUnknown() {
+ val change = createChange(TRANSIT_TO_FRONT, createTaskInfo(1, WINDOWING_MODE_FREEFORM))
+ val transitionInfo =
+ TransitionInfoBuilder(TRANSIT_ENTER_DESKTOP_FROM_UNKNOWN, 0).addChange(change).build()
+
+ callOnTransitionReady(transitionInfo)
+ val sessionId = transitionObserver.getLoggerSessionId()
+
+ assertThat(sessionId).isNotNull()
+ verify(desktopModeEventLogger, times(1))
+ .logSessionEnter(eq(sessionId!!), eq(EnterReason.UNKNOWN_ENTER))
+ verify(desktopModeEventLogger, times(1)).logTaskAdded(eq(sessionId), any())
+ verifyZeroInteractions(desktopModeEventLogger)
+ }
+
+ @Test
+ fun transitWake_logTaskAddedAndEnterReasonScreenOn() {
+ val change = createChange(TRANSIT_TO_FRONT, createTaskInfo(1, WINDOWING_MODE_FREEFORM))
+ val transitionInfo = TransitionInfoBuilder(TRANSIT_WAKE, 0).addChange(change).build()
+
+ callOnTransitionReady(transitionInfo)
+ val sessionId = transitionObserver.getLoggerSessionId()
+
+ assertThat(sessionId).isNotNull()
+ verify(desktopModeEventLogger, times(1))
+ .logSessionEnter(eq(sessionId!!), eq(EnterReason.SCREEN_ON))
+ verify(desktopModeEventLogger, times(1)).logTaskAdded(eq(sessionId), any())
+ verifyZeroInteractions(desktopModeEventLogger)
+ }
+
+ @Test
+ fun transitSleep_logTaskAddedAndExitReasonScreenOff_sessionIdNull() {
val sessionId = 1
// add a freeform task
transitionObserver.addTaskInfosToCachedMap(createTaskInfo(1, WINDOWING_MODE_FREEFORM))
@@ -214,13 +265,14 @@
callOnTransitionReady(transitionInfo)
verify(desktopModeEventLogger, times(1)).logTaskRemoved(eq(sessionId), any())
- verify(desktopModeEventLogger, times(1)).logSessionExit(eq(sessionId),
- eq(ExitReason.SCREEN_OFF))
+ verify(desktopModeEventLogger, times(1))
+ .logSessionExit(eq(sessionId), eq(ExitReason.SCREEN_OFF))
+ verifyZeroInteractions(desktopModeEventLogger)
assertThat(transitionObserver.getLoggerSessionId()).isNull()
}
@Test
- fun freeformTaskVisible_exitDesktopUsingDrag_logSessionExitAndTaskRemoved_sessionIdNull() {
+ fun transitExitDesktopTaskDrag_logTaskRemovedAndExitReasonDragToExit_sessionIdNull() {
val sessionId = 1
// add a freeform task
transitionObserver.addTaskInfosToCachedMap(createTaskInfo(1, WINDOWING_MODE_FREEFORM))
@@ -228,18 +280,83 @@
// window mode changing from FREEFORM to FULLSCREEN
val change = createChange(TRANSIT_TO_FRONT, createTaskInfo(1, WINDOWING_MODE_FULLSCREEN))
- val transitionInfo = TransitionInfoBuilder(Transitions.TRANSIT_EXIT_DESKTOP_MODE)
- .addChange(change).build()
+ val transitionInfo =
+ TransitionInfoBuilder(TRANSIT_EXIT_DESKTOP_MODE_TASK_DRAG).addChange(change).build()
callOnTransitionReady(transitionInfo)
verify(desktopModeEventLogger, times(1)).logTaskRemoved(eq(sessionId), any())
- verify(desktopModeEventLogger, times(1)).logSessionExit(eq(sessionId),
- eq(ExitReason.DRAG_TO_EXIT))
+ verify(desktopModeEventLogger, times(1))
+ .logSessionExit(eq(sessionId), eq(ExitReason.DRAG_TO_EXIT))
+ verifyZeroInteractions(desktopModeEventLogger)
assertThat(transitionObserver.getLoggerSessionId()).isNull()
}
@Test
- fun freeformTaskVisible_exitDesktopBySwipeUp_logSessionExitAndTaskRemoved_sessionIdNull() {
+ fun transitExitDesktopAppHandleButton_logTaskRemovedAndExitReasonButton_sessionIdNull() {
+ val sessionId = 1
+ // add a freeform task
+ transitionObserver.addTaskInfosToCachedMap(createTaskInfo(1, WINDOWING_MODE_FREEFORM))
+ transitionObserver.setLoggerSessionId(sessionId)
+
+ // window mode changing from FREEFORM to FULLSCREEN
+ val change = createChange(TRANSIT_TO_FRONT, createTaskInfo(1, WINDOWING_MODE_FULLSCREEN))
+ val transitionInfo =
+ TransitionInfoBuilder(TRANSIT_EXIT_DESKTOP_MODE_HANDLE_MENU_BUTTON)
+ .addChange(change)
+ .build()
+ callOnTransitionReady(transitionInfo)
+
+ verify(desktopModeEventLogger, times(1)).logTaskRemoved(eq(sessionId), any())
+ verify(desktopModeEventLogger, times(1))
+ .logSessionExit(eq(sessionId), eq(ExitReason.APP_HANDLE_MENU_BUTTON_EXIT))
+ verifyZeroInteractions(desktopModeEventLogger)
+ assertThat(transitionObserver.getLoggerSessionId()).isNull()
+ }
+
+ @Test
+ fun transitExitDesktopUsingKeyboard_logTaskRemovedAndExitReasonKeyboard_sessionIdNull() {
+ val sessionId = 1
+ // add a freeform task
+ transitionObserver.addTaskInfosToCachedMap(createTaskInfo(1, WINDOWING_MODE_FREEFORM))
+ transitionObserver.setLoggerSessionId(sessionId)
+
+ // window mode changing from FREEFORM to FULLSCREEN
+ val change = createChange(TRANSIT_TO_FRONT, createTaskInfo(1, WINDOWING_MODE_FULLSCREEN))
+ val transitionInfo =
+ TransitionInfoBuilder(TRANSIT_EXIT_DESKTOP_MODE_KEYBOARD_SHORTCUT)
+ .addChange(change)
+ .build()
+ callOnTransitionReady(transitionInfo)
+
+ verify(desktopModeEventLogger, times(1)).logTaskRemoved(eq(sessionId), any())
+ verify(desktopModeEventLogger, times(1))
+ .logSessionExit(eq(sessionId), eq(ExitReason.KEYBOARD_SHORTCUT_EXIT))
+ verifyZeroInteractions(desktopModeEventLogger)
+ assertThat(transitionObserver.getLoggerSessionId()).isNull()
+ }
+
+ @Test
+ fun transitExitDesktopUnknown_logTaskRemovedAndExitReasonUnknown_sessionIdNull() {
+ val sessionId = 1
+ // add a freeform task
+ transitionObserver.addTaskInfosToCachedMap(createTaskInfo(1, WINDOWING_MODE_FREEFORM))
+ transitionObserver.setLoggerSessionId(sessionId)
+
+ // window mode changing from FREEFORM to FULLSCREEN
+ val change = createChange(TRANSIT_TO_FRONT, createTaskInfo(1, WINDOWING_MODE_FULLSCREEN))
+ val transitionInfo =
+ TransitionInfoBuilder(TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN).addChange(change).build()
+ callOnTransitionReady(transitionInfo)
+
+ verify(desktopModeEventLogger, times(1)).logTaskRemoved(eq(sessionId), any())
+ verify(desktopModeEventLogger, times(1))
+ .logSessionExit(eq(sessionId), eq(ExitReason.UNKNOWN_EXIT))
+ verifyZeroInteractions(desktopModeEventLogger)
+ assertThat(transitionObserver.getLoggerSessionId()).isNull()
+ }
+
+ @Test
+ fun transitToFrontWithFlagRecents_logTaskRemovedAndExitReasonOverview_sessionIdNull() {
val sessionId = 1
// add a freeform task
transitionObserver.addTaskInfosToCachedMap(createTaskInfo(1, WINDOWING_MODE_FREEFORM))
@@ -247,18 +364,21 @@
// recents transition
val change = createChange(TRANSIT_TO_BACK, createTaskInfo(1, WINDOWING_MODE_FREEFORM))
- val transitionInfo = TransitionInfoBuilder(TRANSIT_TO_FRONT, TRANSIT_FLAG_IS_RECENTS)
- .addChange(change).build()
+ val transitionInfo =
+ TransitionInfoBuilder(TRANSIT_TO_FRONT, TRANSIT_FLAG_IS_RECENTS)
+ .addChange(change)
+ .build()
callOnTransitionReady(transitionInfo)
verify(desktopModeEventLogger, times(1)).logTaskRemoved(eq(sessionId), any())
- verify(desktopModeEventLogger, times(1)).logSessionExit(eq(sessionId),
- eq(ExitReason.RETURN_HOME_OR_OVERVIEW))
+ verify(desktopModeEventLogger, times(1))
+ .logSessionExit(eq(sessionId), eq(ExitReason.RETURN_HOME_OR_OVERVIEW))
+ verifyZeroInteractions(desktopModeEventLogger)
assertThat(transitionObserver.getLoggerSessionId()).isNull()
}
@Test
- fun freeformTaskVisible_taskFinished_logSessionExitAndTaskRemoved_sessionIdNull() {
+ fun transitClose_logTaskRemovedAndExitReasonTaskFinished_sessionIdNull() {
val sessionId = 1
// add a freeform task
transitionObserver.addTaskInfosToCachedMap(createTaskInfo(1, WINDOWING_MODE_FREEFORM))
@@ -270,8 +390,9 @@
callOnTransitionReady(transitionInfo)
verify(desktopModeEventLogger, times(1)).logTaskRemoved(eq(sessionId), any())
- verify(desktopModeEventLogger, times(1)).logSessionExit(eq(sessionId),
- eq(ExitReason.TASK_FINISHED))
+ verify(desktopModeEventLogger, times(1))
+ .logSessionExit(eq(sessionId), eq(ExitReason.TASK_FINISHED))
+ verifyZeroInteractions(desktopModeEventLogger)
assertThat(transitionObserver.getLoggerSessionId()).isNull()
}
@@ -285,12 +406,13 @@
// recents transition sent freeform window to back
val change = createChange(TRANSIT_TO_BACK, createTaskInfo(1, WINDOWING_MODE_FREEFORM))
val transitionInfo1 =
- TransitionInfoBuilder(TRANSIT_TO_FRONT, TRANSIT_FLAG_IS_RECENTS).addChange(change)
- .build()
+ TransitionInfoBuilder(TRANSIT_TO_FRONT, TRANSIT_FLAG_IS_RECENTS)
+ .addChange(change)
+ .build()
callOnTransitionReady(transitionInfo1)
verify(desktopModeEventLogger, times(1)).logTaskRemoved(eq(sessionId), any())
- verify(desktopModeEventLogger, times(1)).logSessionExit(eq(sessionId),
- eq(ExitReason.RETURN_HOME_OR_OVERVIEW))
+ verify(desktopModeEventLogger, times(1))
+ .logSessionExit(eq(sessionId), eq(ExitReason.RETURN_HOME_OR_OVERVIEW))
assertThat(transitionObserver.getLoggerSessionId()).isNull()
val transitionInfo2 = TransitionInfoBuilder(TRANSIT_NONE).build()
@@ -333,15 +455,11 @@
verify(desktopModeEventLogger, never()).logSessionExit(any(), any())
}
- /**
- * Simulate calling the onTransitionReady() method
- */
+ /** Simulate calling the onTransitionReady() method */
private fun callOnTransitionReady(transitionInfo: TransitionInfo) {
val transition = mock(IBinder::class.java)
- val startT = mock(
- SurfaceControl.Transaction::class.java)
- val finishT = mock(
- SurfaceControl.Transaction::class.java)
+ val startT = mock(SurfaceControl.Transaction::class.java)
+ val finishT = mock(SurfaceControl.Transaction::class.java)
transitionObserver.onTransitionReady(transition, transitionInfo, startT, finishT)
}
@@ -356,13 +474,14 @@
}
fun createChange(mode: Int, taskInfo: ActivityManager.RunningTaskInfo): Change {
- val change = Change(
- WindowContainerToken(mock(
- IWindowContainerToken::class.java)),
- mock(SurfaceControl::class.java))
+ val change =
+ Change(
+ WindowContainerToken(mock(IWindowContainerToken::class.java)),
+ mock(SurfaceControl::class.java)
+ )
change.mode = mode
change.taskInfo = taskInfo
return change
}
}
-}
\ No newline at end of file
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTransitionTypesTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTransitionTypesTest.kt
new file mode 100644
index 0000000..518c00d
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTransitionTypesTest.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2024 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.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource.APP_FROM_OVERVIEW
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource.KEYBOARD_SHORTCUT
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource.TASK_DRAG
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource.UNKNOWN
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_HANDLE_MENU_BUTTON
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_KEYBOARD_SHORTCUT
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_TASK_DRAG
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_ENTER_DESKTOP_FROM_APP_FROM_OVERVIEW
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_ENTER_DESKTOP_FROM_APP_HANDLE_MENU_BUTTON
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_ENTER_DESKTOP_FROM_KEYBOARD_SHORTCUT
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_ENTER_DESKTOP_FROM_UNKNOWN
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.getEnterTransitionType
+import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.getExitTransitionType
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Test class for [DesktopModeTransitionTypes]
+ *
+ * Usage: atest WMShellUnitTests:DesktopModeTransitionTypesTest
+ */
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class DesktopModeTransitionTypesTest {
+
+ @Test
+ fun testGetEnterTransitionType() {
+ assertThat(UNKNOWN.getEnterTransitionType()).isEqualTo(TRANSIT_ENTER_DESKTOP_FROM_UNKNOWN)
+ assertThat(APP_HANDLE_MENU_BUTTON.getEnterTransitionType())
+ .isEqualTo(TRANSIT_ENTER_DESKTOP_FROM_APP_HANDLE_MENU_BUTTON)
+ assertThat(APP_FROM_OVERVIEW.getEnterTransitionType())
+ .isEqualTo(TRANSIT_ENTER_DESKTOP_FROM_APP_FROM_OVERVIEW)
+ assertThat(TASK_DRAG.getEnterTransitionType())
+ .isEqualTo(TRANSIT_ENTER_DESKTOP_FROM_UNKNOWN)
+ assertThat(KEYBOARD_SHORTCUT.getEnterTransitionType())
+ .isEqualTo(TRANSIT_ENTER_DESKTOP_FROM_KEYBOARD_SHORTCUT)
+ }
+
+ @Test
+ fun testGetExitTransitionType() {
+ assertThat(UNKNOWN.getExitTransitionType()).isEqualTo(TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN)
+ assertThat(APP_HANDLE_MENU_BUTTON.getExitTransitionType())
+ .isEqualTo(TRANSIT_EXIT_DESKTOP_MODE_HANDLE_MENU_BUTTON)
+ assertThat(APP_FROM_OVERVIEW.getExitTransitionType())
+ .isEqualTo(TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN)
+ assertThat(TASK_DRAG.getExitTransitionType()).isEqualTo(TRANSIT_EXIT_DESKTOP_MODE_TASK_DRAG)
+ assertThat(KEYBOARD_SHORTCUT.getExitTransitionType())
+ .isEqualTo(TRANSIT_EXIT_DESKTOP_MODE_KEYBOARD_SHORTCUT)
+ }
+}
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 d7a3be8..ae05bf5 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
@@ -76,6 +76,7 @@
import com.android.wm.shell.common.MultiInstanceHelper
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.common.SyncTransactionQueue
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource.UNKNOWN
import com.android.wm.shell.common.split.SplitScreenConstants
import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createFreeformTask
import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createFullscreenTask
@@ -94,7 +95,6 @@
import com.android.wm.shell.transition.TestRemoteTransition
import com.android.wm.shell.transition.Transitions
import com.android.wm.shell.transition.Transitions.ENABLE_SHELL_TRANSITIONS
-import com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_DESKTOP_MODE
import com.android.wm.shell.transition.Transitions.TransitionHandler
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
@@ -197,7 +197,7 @@
whenever(shellTaskOrganizer.getRunningTasks(anyInt())).thenAnswer { runningTasks }
whenever(transitions.startTransition(anyInt(), any(), isNull())).thenAnswer { Binder() }
- whenever(enterDesktopTransitionHandler.moveToDesktop(any())).thenAnswer { Binder() }
+ whenever(enterDesktopTransitionHandler.moveToDesktop(any(), any())).thenAnswer { Binder() }
whenever(displayController.getDisplayLayout(anyInt())).thenReturn(displayLayout)
whenever(displayLayout.getStableBounds(any())).thenAnswer { i ->
(i.arguments.first() as Rect).set(STABLE_BOUNDS)
@@ -488,7 +488,7 @@
val task = setUpFullscreenTask()
setUpLandscapeDisplay()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(findBoundsChange(wct, task)).isEqualTo(DEFAULT_LANDSCAPE_BOUNDS)
}
@@ -500,7 +500,7 @@
val task = setUpFullscreenTask(screenOrientation = SCREEN_ORIENTATION_LANDSCAPE)
setUpLandscapeDisplay()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(findBoundsChange(wct, task)).isEqualTo(DEFAULT_LANDSCAPE_BOUNDS)
}
@@ -513,7 +513,7 @@
setUpFullscreenTask(screenOrientation = SCREEN_ORIENTATION_PORTRAIT, shouldLetterbox = true)
setUpLandscapeDisplay()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(findBoundsChange(wct, task)).isEqualTo(RESIZABLE_PORTRAIT_BOUNDS)
}
@@ -526,7 +526,7 @@
setUpFullscreenTask(isResizable = false, screenOrientation = SCREEN_ORIENTATION_LANDSCAPE)
setUpLandscapeDisplay()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(findBoundsChange(wct, task)).isEqualTo(DEFAULT_LANDSCAPE_BOUNDS)
}
@@ -542,7 +542,7 @@
shouldLetterbox = true)
setUpLandscapeDisplay()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(findBoundsChange(wct, task)).isEqualTo(UNRESIZABLE_PORTRAIT_BOUNDS)
}
@@ -554,7 +554,7 @@
val task = setUpFullscreenTask(deviceOrientation = ORIENTATION_PORTRAIT)
setUpPortraitDisplay()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(findBoundsChange(wct, task)).isEqualTo(DEFAULT_PORTRAIT_BOUNDS)
}
@@ -569,7 +569,7 @@
screenOrientation = SCREEN_ORIENTATION_PORTRAIT)
setUpPortraitDisplay()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(findBoundsChange(wct, task)).isEqualTo(DEFAULT_PORTRAIT_BOUNDS)
}
@@ -585,7 +585,7 @@
shouldLetterbox = true)
setUpPortraitDisplay()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(findBoundsChange(wct, task)).isEqualTo(RESIZABLE_LANDSCAPE_BOUNDS)
}
@@ -601,7 +601,7 @@
screenOrientation = SCREEN_ORIENTATION_PORTRAIT)
setUpPortraitDisplay()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(findBoundsChange(wct, task)).isEqualTo(DEFAULT_PORTRAIT_BOUNDS)
}
@@ -618,7 +618,7 @@
shouldLetterbox = true)
setUpPortraitDisplay()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(findBoundsChange(wct, task)).isEqualTo(UNRESIZABLE_LANDSCAPE_BOUNDS)
}
@@ -628,7 +628,7 @@
val task = setUpFullscreenTask()
val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!!
tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
}
@@ -638,7 +638,7 @@
val task = setUpFullscreenTask()
val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!!
tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FREEFORM
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode)
.isEqualTo(WINDOWING_MODE_UNDEFINED)
@@ -646,7 +646,7 @@
@Test
fun moveToDesktop_nonExistentTask_doesNothing() {
- controller.moveToDesktop(999)
+ controller.moveToDesktop(999, transitionSource = UNKNOWN)
verifyWCTNotExecuted()
}
@@ -658,7 +658,7 @@
whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task)
- controller.moveToDesktop(task.taskId)
+ controller.moveToDesktop(task.taskId, transitionSource = UNKNOWN)
with(getLatestMoveToDesktopWct()) {
assertLaunchTaskAt(0, task.taskId, WINDOWING_MODE_FREEFORM)
}
@@ -673,7 +673,7 @@
numActivities = 1
}
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
verifyWCTNotExecuted()
}
@@ -684,7 +684,7 @@
// Simulate non compatible device
doReturn(false).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
verifyWCTNotExecuted()
}
@@ -698,7 +698,7 @@
// Simulate enforce device restrictions system property overridden to false
whenever(DesktopModeStatus.enforceDeviceRestrictions()).thenReturn(false)
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
@@ -708,7 +708,7 @@
fun moveToDesktop_deviceSupported_taskIsMovedToDesktop() {
val task = setUpFullscreenTask()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
@@ -722,7 +722,7 @@
val fullscreenTask = setUpFullscreenTask()
markTaskHidden(freeformTask)
- controller.moveToDesktop(fullscreenTask)
+ controller.moveToDesktop(fullscreenTask, transitionSource = UNKNOWN)
with(getLatestMoveToDesktopWct()) {
// Operations should include home task, freeform task
@@ -740,7 +740,7 @@
val fullscreenTask = setUpFullscreenTask()
markTaskHidden(freeformTask)
- controller.moveToDesktop(fullscreenTask)
+ controller.moveToDesktop(fullscreenTask, transitionSource = UNKNOWN)
with(getLatestMoveToDesktopWct()) {
// Operations should include wallpaper intent, freeform task, fullscreen task
@@ -764,7 +764,7 @@
val freeformTaskSecond = setUpFreeformTask(displayId = SECOND_DISPLAY)
markTaskHidden(freeformTaskSecond)
- controller.moveToDesktop(fullscreenTaskDefault)
+ controller.moveToDesktop(fullscreenTaskDefault, transitionSource = UNKNOWN)
with(getLatestMoveToDesktopWct()) {
// Check that hierarchy operations do not include tasks from second display
@@ -777,7 +777,7 @@
@Test
fun moveToDesktop_splitTaskExitsSplit() {
val task = setUpSplitScreenTask()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
verify(splitScreenController)
@@ -787,7 +787,7 @@
@Test
fun moveToDesktop_fullscreenTaskDoesNotExitSplit() {
val task = setUpFullscreenTask()
- controller.moveToDesktop(task)
+ controller.moveToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
verify(splitScreenController, never())
@@ -801,7 +801,7 @@
val freeformTasks = (1..taskLimit).map { _ -> setUpFreeformTask() }
val newTask = setUpFullscreenTask()
- controller.moveToDesktop(newTask)
+ controller.moveToDesktop(newTask, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(wct.hierarchyOps.size).isEqualTo(taskLimit + 1) // visible tasks + home
@@ -817,7 +817,7 @@
val task = setUpFreeformTask()
val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!!
tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN
- controller.moveToFullscreen(task.taskId)
+ controller.moveToFullscreen(task.taskId, transitionSource = UNKNOWN)
val wct = getLatestExitDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode)
.isEqualTo(WINDOWING_MODE_UNDEFINED)
@@ -828,7 +828,7 @@
val task = setUpFreeformTask()
val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!!
tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FREEFORM
- controller.moveToFullscreen(task.taskId)
+ controller.moveToFullscreen(task.taskId, transitionSource = UNKNOWN)
val wct = getLatestExitDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode)
.isEqualTo(WINDOWING_MODE_FULLSCREEN)
@@ -836,7 +836,7 @@
@Test
fun moveToFullscreen_nonExistentTask_doesNothing() {
- controller.moveToFullscreen(999)
+ controller.moveToFullscreen(999, transitionSource = UNKNOWN)
verifyWCTNotExecuted()
}
@@ -845,7 +845,7 @@
val taskDefaultDisplay = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
val taskSecondDisplay = setUpFreeformTask(displayId = SECOND_DISPLAY)
- controller.moveToFullscreen(taskDefaultDisplay.taskId)
+ controller.moveToFullscreen(taskDefaultDisplay.taskId, transitionSource = UNKNOWN)
with(getLatestExitDesktopWct()) {
assertThat(changes.keys).contains(taskDefaultDisplay.token.asBinder())
@@ -1282,7 +1282,7 @@
task2.isFocused = false
task3.isFocused = false
- controller.moveFocusedTaskToDesktop(DEFAULT_DISPLAY)
+ controller.moveFocusedTaskToDesktop(DEFAULT_DISPLAY, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(wct.changes[task1.token.asBinder()]?.windowingMode)
@@ -1303,7 +1303,7 @@
task4.parentTaskId = task1.taskId
- controller.moveFocusedTaskToDesktop(DEFAULT_DISPLAY)
+ controller.moveFocusedTaskToDesktop(DEFAULT_DISPLAY, transitionSource = UNKNOWN)
val wct = getLatestMoveToDesktopWct()
assertThat(wct.changes[task4.token.asBinder()]?.windowingMode)
@@ -1322,7 +1322,7 @@
task2.isFocused = true
task3.isFocused = false
- controller.enterFullscreen(DEFAULT_DISPLAY)
+ controller.enterFullscreen(DEFAULT_DISPLAY, transitionSource = UNKNOWN)
val wct = getLatestExitDesktopWct()
assertThat(wct.changes[task2.token.asBinder()]?.windowingMode)
@@ -1751,7 +1751,7 @@
private fun getLatestMoveToDesktopWct(): WindowContainerTransaction {
val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java)
if (ENABLE_SHELL_TRANSITIONS) {
- verify(enterDesktopTransitionHandler).moveToDesktop(arg.capture())
+ verify(enterDesktopTransitionHandler).moveToDesktop(arg.capture(), any())
} else {
verify(shellTaskOrganizer).applyTransaction(arg.capture())
}
@@ -1772,8 +1772,7 @@
private fun getLatestExitDesktopWct(): WindowContainerTransaction {
val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java)
if (ENABLE_SHELL_TRANSITIONS) {
- verify(exitDesktopTransitionHandler)
- .startTransition(eq(TRANSIT_EXIT_DESKTOP_MODE), arg.capture(), any(), any())
+ verify(exitDesktopTransitionHandler).startTransition(any(), arg.capture(), any(), any())
} else {
verify(shellTaskOrganizer).applyTransaction(arg.capture())
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java
index 0d0a08c..b2467e9 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java
@@ -21,6 +21,8 @@
import static androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread;
+import static com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN;
+
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -45,6 +47,7 @@
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.common.ShellExecutor;
+import com.android.wm.shell.common.desktopmode.DesktopModeTransitionSource;
import com.android.wm.shell.transition.Transitions;
import org.junit.Before;
@@ -97,18 +100,18 @@
@Test
public void testTransitExitDesktopModeAnimation() throws Throwable {
- final int transitionType = Transitions.TRANSIT_EXIT_DESKTOP_MODE;
+ final int transitionType = TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN;
final int taskId = 1;
WindowContainerTransaction wct = new WindowContainerTransaction();
doReturn(mToken).when(mTransitions)
.startTransition(transitionType, wct, mExitDesktopTaskTransitionHandler);
- mExitDesktopTaskTransitionHandler.startTransition(transitionType, wct, mPoint,
- null);
+ mExitDesktopTaskTransitionHandler.startTransition(DesktopModeTransitionSource.UNKNOWN,
+ wct, mPoint, null);
TransitionInfo.Change change =
createChange(WindowManager.TRANSIT_CHANGE, taskId, WINDOWING_MODE_FULLSCREEN);
- TransitionInfo info = createTransitionInfo(Transitions.TRANSIT_EXIT_DESKTOP_MODE, change);
+ TransitionInfo info = createTransitionInfo(TRANSIT_EXIT_DESKTOP_MODE_UNKNOWN, change);
ArrayList<Exception> exceptions = new ArrayList<>();
runOnUiThread(() -> {
try {