Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +5 −2 Original line number Diff line number Diff line Loading @@ -914,12 +914,15 @@ public abstract class WMShellModule { Context context, Transitions transitions, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, @DynamicOverride DesktopUserRepositories desktopUserRepositories, InteractionJankMonitor interactionJankMonitor) { return ENABLE_DESKTOP_WINDOWING_ENTER_TRANSITIONS_BUGFIX.isTrue() ? new SpringDragToDesktopTransitionHandler( context, transitions, rootTaskDisplayAreaOrganizer, interactionJankMonitor) context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories, interactionJankMonitor) : new DefaultDragToDesktopTransitionHandler( context, transitions, rootTaskDisplayAreaOrganizer, interactionJankMonitor); context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories, interactionJankMonitor); } @WMSingleton Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopUserRepositories.kt +5 −0 Original line number Diff line number Diff line Loading @@ -90,6 +90,11 @@ class DesktopUserRepositories( return desktopRepoByUserId.getOrCreate(profileId) } fun getUserIdForProfile(profileId: Int): Int { if (userIdToProfileIdsMap[userId]?.contains(profileId) == true) return userId else return profileId } /** Dumps [DesktopRepository] for each user. */ fun dump(pw: PrintWriter, prefix: String) { desktopRepoByUserId.forEach { key, value -> Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt +11 −3 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ sealed class DragToDesktopTransitionHandler( private val context: Context, private val transitions: Transitions, private val taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, private val desktopUserRepositories: DesktopUserRepositories, protected val interactionJankMonitor: InteractionJankMonitor, protected val transactionSupplier: Supplier<SurfaceControl.Transaction>, ) : TransitionHandler { Loading Loading @@ -127,15 +128,18 @@ sealed class DragToDesktopTransitionHandler( pendingIntentCreatorBackgroundActivityStartMode = ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED } val taskUser = UserHandle.of(taskInfo.userId) // If we are launching home for a profile of a user, just use the [userId] of that user // instead of the [profileId] to create the context. val userToLaunchWith = UserHandle.of(desktopUserRepositories.getUserIdForProfile(taskInfo.userId)) val pendingIntent = PendingIntent.getActivityAsUser( context.createContextAsUser(taskUser, /* flags= */ 0), context.createContextAsUser(userToLaunchWith, /* flags= */ 0), /* requestCode= */ 0, launchHomeIntent, FLAG_MUTABLE or FLAG_ALLOW_UNSAFE_IMPLICIT_INTENT or FILL_IN_COMPONENT, options.toBundle(), taskUser, userToLaunchWith, ) val wct = WindowContainerTransaction() // The app that is being dragged into desktop mode might cause new transitions, make this Loading Loading @@ -881,6 +885,7 @@ constructor( context: Context, transitions: Transitions, taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, desktopUserRepositories: DesktopUserRepositories, interactionJankMonitor: InteractionJankMonitor, transactionSupplier: Supplier<SurfaceControl.Transaction> = Supplier { SurfaceControl.Transaction() Loading @@ -890,6 +895,7 @@ constructor( context, transitions, taskDisplayAreaOrganizer, desktopUserRepositories, interactionJankMonitor, transactionSupplier, ) { Loading Loading @@ -917,6 +923,7 @@ constructor( context: Context, transitions: Transitions, taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, desktopUserRepositories: DesktopUserRepositories, interactionJankMonitor: InteractionJankMonitor, transactionSupplier: Supplier<SurfaceControl.Transaction> = Supplier { SurfaceControl.Transaction() Loading @@ -926,6 +933,7 @@ constructor( context, transitions, taskDisplayAreaOrganizer, desktopUserRepositories, interactionJankMonitor, transactionSupplier, ) { Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopUserRepositoriesTest.kt +18 −0 Original line number Diff line number Diff line Loading @@ -123,8 +123,26 @@ class DesktopUserRepositoriesTest : ShellTestCase() { assertThat(desktopRepository.userId).isEqualTo(PROFILE_ID_2) } @Test @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_HSUM) fun getUserForProfile_flagEnabled_returnsUserIdForProfile() { userRepositories.onUserChanged(USER_ID_2, mock()) val profiles: MutableList<UserInfo> = mutableListOf( UserInfo(USER_ID_2, "User profile", 0), UserInfo(PROFILE_ID_1, "Work profile", 0), ) userRepositories.onUserProfilesChanged(profiles) val userIdForProfile = userRepositories.getUserIdForProfile(PROFILE_ID_1) assertThat(userIdForProfile).isEqualTo(USER_ID_2) } private companion object { const val USER_ID_1 = 7 const val USER_ID_2 = 8 const val PROFILE_ID_1 = 4 const val PROFILE_ID_2 = 5 } } libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt +22 −12 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { @Mock private lateinit var mockInteractionJankMonitor: InteractionJankMonitor @Mock private lateinit var draggedTaskLeash: SurfaceControl @Mock private lateinit var homeTaskLeash: SurfaceControl @Mock private lateinit var desktopUserRepositories: DesktopUserRepositories private val transactionSupplier = Supplier { mock<SurfaceControl.Transaction>() } Loading @@ -84,6 +85,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { context, transitions, taskDisplayAreaOrganizer, desktopUserRepositories, mockInteractionJankMonitor, transactionSupplier, ) Loading @@ -93,6 +95,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { context, transitions, taskDisplayAreaOrganizer, desktopUserRepositories, mockInteractionJankMonitor, transactionSupplier, ) Loading Loading @@ -484,8 +487,13 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { val mergedFinishTransaction = mock<SurfaceControl.Transaction>() val finishCallback = mock<Transitions.TransitionFinishCallback>() val task = createTask() val startTransition = startDrag( springHandler, task, finishTransaction = playingFinishTransaction, homeChange = null) val startTransition = startDrag( springHandler, task, finishTransaction = playingFinishTransaction, homeChange = null, ) springHandler.onTaskResizeAnimationListener = mock() springHandler.mergeAnimation( Loading Loading @@ -723,7 +731,8 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { private fun createTransitionInfo( type: Int, draggedTask: RunningTaskInfo, homeChange: TransitionInfo.Change? = createHomeChange()) = homeChange: TransitionInfo.Change? = createHomeChange(), ) = TransitionInfo(type, /* flags= */ 0).apply { homeChange?.let { addChange(it) } addChange( // Dragged Task. Loading @@ -741,7 +750,8 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { ) } private fun createHomeChange() = TransitionInfo.Change(mock(), homeTaskLeash).apply { private fun createHomeChange() = TransitionInfo.Change(mock(), homeTaskLeash).apply { parent = null taskInfo = TestRunningTaskInfoBuilder().setActivityType(ACTIVITY_TYPE_HOME).build() flags = flags or FLAG_IS_WALLPAPER Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +5 −2 Original line number Diff line number Diff line Loading @@ -914,12 +914,15 @@ public abstract class WMShellModule { Context context, Transitions transitions, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, @DynamicOverride DesktopUserRepositories desktopUserRepositories, InteractionJankMonitor interactionJankMonitor) { return ENABLE_DESKTOP_WINDOWING_ENTER_TRANSITIONS_BUGFIX.isTrue() ? new SpringDragToDesktopTransitionHandler( context, transitions, rootTaskDisplayAreaOrganizer, interactionJankMonitor) context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories, interactionJankMonitor) : new DefaultDragToDesktopTransitionHandler( context, transitions, rootTaskDisplayAreaOrganizer, interactionJankMonitor); context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories, interactionJankMonitor); } @WMSingleton Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopUserRepositories.kt +5 −0 Original line number Diff line number Diff line Loading @@ -90,6 +90,11 @@ class DesktopUserRepositories( return desktopRepoByUserId.getOrCreate(profileId) } fun getUserIdForProfile(profileId: Int): Int { if (userIdToProfileIdsMap[userId]?.contains(profileId) == true) return userId else return profileId } /** Dumps [DesktopRepository] for each user. */ fun dump(pw: PrintWriter, prefix: String) { desktopRepoByUserId.forEach { key, value -> Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt +11 −3 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ sealed class DragToDesktopTransitionHandler( private val context: Context, private val transitions: Transitions, private val taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, private val desktopUserRepositories: DesktopUserRepositories, protected val interactionJankMonitor: InteractionJankMonitor, protected val transactionSupplier: Supplier<SurfaceControl.Transaction>, ) : TransitionHandler { Loading Loading @@ -127,15 +128,18 @@ sealed class DragToDesktopTransitionHandler( pendingIntentCreatorBackgroundActivityStartMode = ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED } val taskUser = UserHandle.of(taskInfo.userId) // If we are launching home for a profile of a user, just use the [userId] of that user // instead of the [profileId] to create the context. val userToLaunchWith = UserHandle.of(desktopUserRepositories.getUserIdForProfile(taskInfo.userId)) val pendingIntent = PendingIntent.getActivityAsUser( context.createContextAsUser(taskUser, /* flags= */ 0), context.createContextAsUser(userToLaunchWith, /* flags= */ 0), /* requestCode= */ 0, launchHomeIntent, FLAG_MUTABLE or FLAG_ALLOW_UNSAFE_IMPLICIT_INTENT or FILL_IN_COMPONENT, options.toBundle(), taskUser, userToLaunchWith, ) val wct = WindowContainerTransaction() // The app that is being dragged into desktop mode might cause new transitions, make this Loading Loading @@ -881,6 +885,7 @@ constructor( context: Context, transitions: Transitions, taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, desktopUserRepositories: DesktopUserRepositories, interactionJankMonitor: InteractionJankMonitor, transactionSupplier: Supplier<SurfaceControl.Transaction> = Supplier { SurfaceControl.Transaction() Loading @@ -890,6 +895,7 @@ constructor( context, transitions, taskDisplayAreaOrganizer, desktopUserRepositories, interactionJankMonitor, transactionSupplier, ) { Loading Loading @@ -917,6 +923,7 @@ constructor( context: Context, transitions: Transitions, taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer, desktopUserRepositories: DesktopUserRepositories, interactionJankMonitor: InteractionJankMonitor, transactionSupplier: Supplier<SurfaceControl.Transaction> = Supplier { SurfaceControl.Transaction() Loading @@ -926,6 +933,7 @@ constructor( context, transitions, taskDisplayAreaOrganizer, desktopUserRepositories, interactionJankMonitor, transactionSupplier, ) { Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopUserRepositoriesTest.kt +18 −0 Original line number Diff line number Diff line Loading @@ -123,8 +123,26 @@ class DesktopUserRepositoriesTest : ShellTestCase() { assertThat(desktopRepository.userId).isEqualTo(PROFILE_ID_2) } @Test @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_HSUM) fun getUserForProfile_flagEnabled_returnsUserIdForProfile() { userRepositories.onUserChanged(USER_ID_2, mock()) val profiles: MutableList<UserInfo> = mutableListOf( UserInfo(USER_ID_2, "User profile", 0), UserInfo(PROFILE_ID_1, "Work profile", 0), ) userRepositories.onUserProfilesChanged(profiles) val userIdForProfile = userRepositories.getUserIdForProfile(PROFILE_ID_1) assertThat(userIdForProfile).isEqualTo(USER_ID_2) } private companion object { const val USER_ID_1 = 7 const val USER_ID_2 = 8 const val PROFILE_ID_1 = 4 const val PROFILE_ID_2 = 5 } }
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt +22 −12 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { @Mock private lateinit var mockInteractionJankMonitor: InteractionJankMonitor @Mock private lateinit var draggedTaskLeash: SurfaceControl @Mock private lateinit var homeTaskLeash: SurfaceControl @Mock private lateinit var desktopUserRepositories: DesktopUserRepositories private val transactionSupplier = Supplier { mock<SurfaceControl.Transaction>() } Loading @@ -84,6 +85,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { context, transitions, taskDisplayAreaOrganizer, desktopUserRepositories, mockInteractionJankMonitor, transactionSupplier, ) Loading @@ -93,6 +95,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { context, transitions, taskDisplayAreaOrganizer, desktopUserRepositories, mockInteractionJankMonitor, transactionSupplier, ) Loading Loading @@ -484,8 +487,13 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { val mergedFinishTransaction = mock<SurfaceControl.Transaction>() val finishCallback = mock<Transitions.TransitionFinishCallback>() val task = createTask() val startTransition = startDrag( springHandler, task, finishTransaction = playingFinishTransaction, homeChange = null) val startTransition = startDrag( springHandler, task, finishTransaction = playingFinishTransaction, homeChange = null, ) springHandler.onTaskResizeAnimationListener = mock() springHandler.mergeAnimation( Loading Loading @@ -723,7 +731,8 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { private fun createTransitionInfo( type: Int, draggedTask: RunningTaskInfo, homeChange: TransitionInfo.Change? = createHomeChange()) = homeChange: TransitionInfo.Change? = createHomeChange(), ) = TransitionInfo(type, /* flags= */ 0).apply { homeChange?.let { addChange(it) } addChange( // Dragged Task. Loading @@ -741,7 +750,8 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { ) } private fun createHomeChange() = TransitionInfo.Change(mock(), homeTaskLeash).apply { private fun createHomeChange() = TransitionInfo.Change(mock(), homeTaskLeash).apply { parent = null taskInfo = TestRunningTaskInfoBuilder().setActivityType(ACTIVITY_TYPE_HOME).build() flags = flags or FLAG_IS_WALLPAPER Loading