Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +3 −2 Original line number Diff line number Diff line Loading @@ -984,11 +984,12 @@ public abstract class WMShellModule { @Provides static Optional<TaskChangeListener> provideDesktopTaskChangeListener( @DynamicOverride DesktopUserRepositories desktopUserRepositories, DesktopState desktopState) { DesktopState desktopState, ShellController shellController) { if (ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS.isTrue() && desktopState.canEnterDesktopMode()) { return Optional.of(new DesktopTaskChangeListener( desktopUserRepositories, desktopState)); desktopUserRepositories, desktopState, shellController)); } return Optional.empty(); } Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt +104 −19 Original line number Diff line number Diff line Loading @@ -17,25 +17,38 @@ package com.android.wm.shell.desktopmode import android.app.ActivityManager.RunningTaskInfo import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM import android.window.DesktopExperienceFlags import android.window.DesktopModeFlags import com.android.internal.protolog.ProtoLog import com.android.wm.shell.freeform.TaskChangeListener import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import com.android.wm.shell.shared.desktopmode.DesktopState import com.android.wm.shell.sysui.ShellController /** Manages tasks handling specific to Android Desktop Mode. */ class DesktopTaskChangeListener( private val desktopUserRepositories: DesktopUserRepositories, private val desktopState: DesktopState, private val shellController: ShellController, ) : TaskChangeListener { override fun onTaskOpening(taskInfo: RunningTaskInfo) { logD("onTaskOpening for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) val desktopRepository: DesktopRepository = desktopUserRepositories.getProfile(taskInfo.userId) if (!isFreeformTask(taskInfo) && desktopRepository.isActiveTask(taskInfo.taskId)) { val isFreeformTask = taskInfo.isFreeform val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId) logD( "onTaskOpening for taskId=%d, displayId=%d userId=%s currentUserId=%d " + "parentTaskId=%b isFreeform=%b isActive=%b", taskInfo.taskId, taskInfo.displayId, taskInfo.userId, shellController.currentUserId, taskInfo.parentTaskId, isFreeformTask, isActiveTask, ) if (!isFreeformTask && isActiveTask) { desktopRepository.removeTask(taskInfo.taskId) return } Loading @@ -43,14 +56,20 @@ class DesktopTaskChangeListener( !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) && DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue ) { logD( "onTaskOpening for taskId=%d, displayId=%d - desktop not supported", taskInfo.taskId, taskInfo.displayId, ) return } if (isFreeformTask(taskInfo) && !desktopRepository.isActiveTask(taskInfo.taskId)) { if (isFreeformTask && !isActiveTask) { // TODO: b/420917959 - Remove this once LaunchParams respects activity options set for // [DesktopWallpaperActivity] launch which should always be in fullscreen. if (DesktopWallpaperActivity.isWallpaperTask(taskInfo)) { logE( "Trying to add freeform DesktopWallpaperActivity to DesktopRepository, returning early instead" "Trying to add freeform DesktopWallpaperActivity to DesktopRepository, " + "returning early instead" ) return } Loading @@ -64,15 +83,32 @@ class DesktopTaskChangeListener( } override fun onTaskChanging(taskInfo: RunningTaskInfo) { logD("onTaskChanging for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) if ( !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) && DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue ) { logD( "onTaskChanging for taskId=%d, displayId=%d - desktop not supported", taskInfo.taskId, taskInfo.displayId, ) return } val desktopRepository: DesktopRepository = desktopUserRepositories.getProfile(taskInfo.userId) val isFreeformTask = taskInfo.isFreeform val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId) logD( "onTaskChanging for taskId=%d, displayId=%d userId=%s currentUserId=%d " + "parentTaskId=%b isFreeform=%b isActive=%b", taskInfo.taskId, taskInfo.displayId, taskInfo.userId, shellController.currentUserId, taskInfo.parentTaskId, isFreeformTask, isActiveTask, ) // TODO: b/394281403 - with multiple desks, it's possible to have a non-freeform task // inside a desk, so this should be decoupled from windowing mode. // Also, changes in/out of desks are handled by the [DesksTransitionObserver], which has Loading @@ -82,14 +118,15 @@ class DesktopTaskChangeListener( // Case 1: When the task change is from a task in the desktop repository which is now // fullscreen, // remove the task from the desktop repository since it is no longer a freeform task. if (!isFreeformTask(taskInfo) && desktopRepository.isActiveTask(taskInfo.taskId)) { if (!isFreeformTask && isActiveTask) { desktopRepository.removeTask(taskInfo.taskId) } else if (isFreeformTask(taskInfo)) { } else if (isFreeformTask) { // TODO: b/420917959 - Remove this once LaunchParams respects activity options set for // [DesktopWallpaperActivity] launch which should always be in fullscreen. if (DesktopWallpaperActivity.isWallpaperTask(taskInfo)) { logE( "Trying to add freeform DesktopWallpaperActivity to DesktopRepository, returning early instead" "Trying to add freeform DesktopWallpaperActivity to DesktopRepository, " + "returning early instead" ) return } Loading Loading @@ -119,21 +156,38 @@ class DesktopTaskChangeListener( } override fun onTaskMovingToFront(taskInfo: RunningTaskInfo) { logD("onTaskMovingToFront for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) if ( !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) && DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue ) { logD( "onTaskMovingToFront for taskId=%d, displayId=%d - desktop not supported", taskInfo.taskId, taskInfo.displayId, ) return } val desktopRepository: DesktopRepository = desktopUserRepositories.getProfile(taskInfo.userId) val isFreeformTask = taskInfo.isFreeform val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId) logD( "onTaskMovingToFront for taskId=%d, displayId=%d userId=%s currentUserId=%d " + "parentTaskId=%b isFreeform=%b isActive=%b", taskInfo.taskId, taskInfo.displayId, taskInfo.userId, shellController.currentUserId, taskInfo.parentTaskId, isFreeformTask, isActiveTask, ) // When the task change is from a task in the desktop repository which is now fullscreen, // remove the task from the desktop repository since it is no longer a freeform task. if (!isFreeformTask(taskInfo) && desktopRepository.isActiveTask(taskInfo.taskId)) { if (!isFreeformTask && isActiveTask) { desktopRepository.removeTask(taskInfo.taskId) } if (isFreeformTask(taskInfo)) { if (isFreeformTask) { // TODO: b/420917959 - Remove this once LaunchParams respects activity options set for // [DesktopWallpaperActivity] launch which should always be in fullscreen. if (DesktopWallpaperActivity.isWallpaperTask(taskInfo)) { Loading @@ -154,16 +208,33 @@ class DesktopTaskChangeListener( } override fun onTaskMovingToBack(taskInfo: RunningTaskInfo) { logD("onTaskMovingToBack for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) if ( !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) && DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue ) { logD( "onTaskMovingToBack for taskId=%d, displayId=%d - desktop not supported", taskInfo.taskId, taskInfo.displayId, ) return } val desktopRepository: DesktopRepository = desktopUserRepositories.getProfile(taskInfo.userId) if (!desktopRepository.isActiveTask(taskInfo.taskId)) return val isFreeformTask = taskInfo.isFreeform val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId) logD( "onTaskMovingToBack for taskId=%d, displayId=%d userId=%s currentUserId=%d " + "parentTaskId=%b isFreeform=%b isActive=%b", taskInfo.taskId, taskInfo.displayId, taskInfo.userId, shellController.currentUserId, taskInfo.parentTaskId, isFreeformTask, isActiveTask, ) if (!isActiveTask) return desktopRepository.updateTask( taskInfo.displayId, taskInfo.taskId, Loading @@ -173,16 +244,33 @@ class DesktopTaskChangeListener( } override fun onTaskClosing(taskInfo: RunningTaskInfo) { logD("onTaskClosing for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) if ( !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) && DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue ) { logD( "onTaskClosing for taskId=%d, displayId=%d - desktop not supported", taskInfo.taskId, taskInfo.displayId, ) return } val desktopRepository: DesktopRepository = desktopUserRepositories.getProfile(taskInfo.userId) if (!desktopRepository.isActiveTask(taskInfo.taskId)) return val isFreeformTask = taskInfo.isFreeform val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId) logD( "onTaskClosing for taskId=%d, displayId=%d userId=%s currentUserId=%d " + "parentTaskId=%b isFreeform=%b isActive=%b", taskInfo.taskId, taskInfo.displayId, taskInfo.userId, shellController.currentUserId, taskInfo.parentTaskId, isFreeformTask, isActiveTask, ) if (!isActiveTask) return val isMinimized = desktopRepository.isMinimizedTask(taskInfo.taskId) // TODO: b/370038902 - Handle Activity#finishAndRemoveTask. Loading @@ -207,9 +295,6 @@ class DesktopTaskChangeListener( } } private fun isFreeformTask(taskInfo: RunningTaskInfo): Boolean = taskInfo.windowingMode == WINDOWING_MODE_FREEFORM private fun logD(msg: String, vararg arguments: Any?) { ProtoLog.d(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListenerTest.kt +4 −1 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import com.android.wm.shell.TestRunningTaskInfoBuilder import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFreeformTask import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFullscreenTask import com.android.wm.shell.shared.desktopmode.FakeDesktopState import com.android.wm.shell.sysui.ShellController import org.junit.Before import org.junit.Test import org.junit.runner.RunWith Loading @@ -55,6 +56,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { private lateinit var desktopTaskChangeListener: DesktopTaskChangeListener private val desktopUserRepositories = mock<DesktopUserRepositories>() private val shellController = mock<ShellController>() private val desktopRepository = mock<DesktopRepository>() private val desktopState = FakeDesktopState().apply { Loading @@ -64,7 +66,8 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { @Before fun setUp() { desktopTaskChangeListener = DesktopTaskChangeListener(desktopUserRepositories, desktopState) desktopTaskChangeListener = DesktopTaskChangeListener(desktopUserRepositories, desktopState, shellController) whenever(desktopUserRepositories.current).thenReturn(desktopRepository) whenever(desktopUserRepositories.getProfile(anyInt())).thenReturn(desktopRepository) Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +3 −2 Original line number Diff line number Diff line Loading @@ -984,11 +984,12 @@ public abstract class WMShellModule { @Provides static Optional<TaskChangeListener> provideDesktopTaskChangeListener( @DynamicOverride DesktopUserRepositories desktopUserRepositories, DesktopState desktopState) { DesktopState desktopState, ShellController shellController) { if (ENABLE_WINDOWING_TRANSITION_HANDLERS_OBSERVERS.isTrue() && desktopState.canEnterDesktopMode()) { return Optional.of(new DesktopTaskChangeListener( desktopUserRepositories, desktopState)); desktopUserRepositories, desktopState, shellController)); } return Optional.empty(); } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt +104 −19 Original line number Diff line number Diff line Loading @@ -17,25 +17,38 @@ package com.android.wm.shell.desktopmode import android.app.ActivityManager.RunningTaskInfo import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM import android.window.DesktopExperienceFlags import android.window.DesktopModeFlags import com.android.internal.protolog.ProtoLog import com.android.wm.shell.freeform.TaskChangeListener import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import com.android.wm.shell.shared.desktopmode.DesktopState import com.android.wm.shell.sysui.ShellController /** Manages tasks handling specific to Android Desktop Mode. */ class DesktopTaskChangeListener( private val desktopUserRepositories: DesktopUserRepositories, private val desktopState: DesktopState, private val shellController: ShellController, ) : TaskChangeListener { override fun onTaskOpening(taskInfo: RunningTaskInfo) { logD("onTaskOpening for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) val desktopRepository: DesktopRepository = desktopUserRepositories.getProfile(taskInfo.userId) if (!isFreeformTask(taskInfo) && desktopRepository.isActiveTask(taskInfo.taskId)) { val isFreeformTask = taskInfo.isFreeform val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId) logD( "onTaskOpening for taskId=%d, displayId=%d userId=%s currentUserId=%d " + "parentTaskId=%b isFreeform=%b isActive=%b", taskInfo.taskId, taskInfo.displayId, taskInfo.userId, shellController.currentUserId, taskInfo.parentTaskId, isFreeformTask, isActiveTask, ) if (!isFreeformTask && isActiveTask) { desktopRepository.removeTask(taskInfo.taskId) return } Loading @@ -43,14 +56,20 @@ class DesktopTaskChangeListener( !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) && DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue ) { logD( "onTaskOpening for taskId=%d, displayId=%d - desktop not supported", taskInfo.taskId, taskInfo.displayId, ) return } if (isFreeformTask(taskInfo) && !desktopRepository.isActiveTask(taskInfo.taskId)) { if (isFreeformTask && !isActiveTask) { // TODO: b/420917959 - Remove this once LaunchParams respects activity options set for // [DesktopWallpaperActivity] launch which should always be in fullscreen. if (DesktopWallpaperActivity.isWallpaperTask(taskInfo)) { logE( "Trying to add freeform DesktopWallpaperActivity to DesktopRepository, returning early instead" "Trying to add freeform DesktopWallpaperActivity to DesktopRepository, " + "returning early instead" ) return } Loading @@ -64,15 +83,32 @@ class DesktopTaskChangeListener( } override fun onTaskChanging(taskInfo: RunningTaskInfo) { logD("onTaskChanging for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) if ( !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) && DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue ) { logD( "onTaskChanging for taskId=%d, displayId=%d - desktop not supported", taskInfo.taskId, taskInfo.displayId, ) return } val desktopRepository: DesktopRepository = desktopUserRepositories.getProfile(taskInfo.userId) val isFreeformTask = taskInfo.isFreeform val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId) logD( "onTaskChanging for taskId=%d, displayId=%d userId=%s currentUserId=%d " + "parentTaskId=%b isFreeform=%b isActive=%b", taskInfo.taskId, taskInfo.displayId, taskInfo.userId, shellController.currentUserId, taskInfo.parentTaskId, isFreeformTask, isActiveTask, ) // TODO: b/394281403 - with multiple desks, it's possible to have a non-freeform task // inside a desk, so this should be decoupled from windowing mode. // Also, changes in/out of desks are handled by the [DesksTransitionObserver], which has Loading @@ -82,14 +118,15 @@ class DesktopTaskChangeListener( // Case 1: When the task change is from a task in the desktop repository which is now // fullscreen, // remove the task from the desktop repository since it is no longer a freeform task. if (!isFreeformTask(taskInfo) && desktopRepository.isActiveTask(taskInfo.taskId)) { if (!isFreeformTask && isActiveTask) { desktopRepository.removeTask(taskInfo.taskId) } else if (isFreeformTask(taskInfo)) { } else if (isFreeformTask) { // TODO: b/420917959 - Remove this once LaunchParams respects activity options set for // [DesktopWallpaperActivity] launch which should always be in fullscreen. if (DesktopWallpaperActivity.isWallpaperTask(taskInfo)) { logE( "Trying to add freeform DesktopWallpaperActivity to DesktopRepository, returning early instead" "Trying to add freeform DesktopWallpaperActivity to DesktopRepository, " + "returning early instead" ) return } Loading Loading @@ -119,21 +156,38 @@ class DesktopTaskChangeListener( } override fun onTaskMovingToFront(taskInfo: RunningTaskInfo) { logD("onTaskMovingToFront for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) if ( !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) && DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue ) { logD( "onTaskMovingToFront for taskId=%d, displayId=%d - desktop not supported", taskInfo.taskId, taskInfo.displayId, ) return } val desktopRepository: DesktopRepository = desktopUserRepositories.getProfile(taskInfo.userId) val isFreeformTask = taskInfo.isFreeform val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId) logD( "onTaskMovingToFront for taskId=%d, displayId=%d userId=%s currentUserId=%d " + "parentTaskId=%b isFreeform=%b isActive=%b", taskInfo.taskId, taskInfo.displayId, taskInfo.userId, shellController.currentUserId, taskInfo.parentTaskId, isFreeformTask, isActiveTask, ) // When the task change is from a task in the desktop repository which is now fullscreen, // remove the task from the desktop repository since it is no longer a freeform task. if (!isFreeformTask(taskInfo) && desktopRepository.isActiveTask(taskInfo.taskId)) { if (!isFreeformTask && isActiveTask) { desktopRepository.removeTask(taskInfo.taskId) } if (isFreeformTask(taskInfo)) { if (isFreeformTask) { // TODO: b/420917959 - Remove this once LaunchParams respects activity options set for // [DesktopWallpaperActivity] launch which should always be in fullscreen. if (DesktopWallpaperActivity.isWallpaperTask(taskInfo)) { Loading @@ -154,16 +208,33 @@ class DesktopTaskChangeListener( } override fun onTaskMovingToBack(taskInfo: RunningTaskInfo) { logD("onTaskMovingToBack for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) if ( !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) && DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue ) { logD( "onTaskMovingToBack for taskId=%d, displayId=%d - desktop not supported", taskInfo.taskId, taskInfo.displayId, ) return } val desktopRepository: DesktopRepository = desktopUserRepositories.getProfile(taskInfo.userId) if (!desktopRepository.isActiveTask(taskInfo.taskId)) return val isFreeformTask = taskInfo.isFreeform val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId) logD( "onTaskMovingToBack for taskId=%d, displayId=%d userId=%s currentUserId=%d " + "parentTaskId=%b isFreeform=%b isActive=%b", taskInfo.taskId, taskInfo.displayId, taskInfo.userId, shellController.currentUserId, taskInfo.parentTaskId, isFreeformTask, isActiveTask, ) if (!isActiveTask) return desktopRepository.updateTask( taskInfo.displayId, taskInfo.taskId, Loading @@ -173,16 +244,33 @@ class DesktopTaskChangeListener( } override fun onTaskClosing(taskInfo: RunningTaskInfo) { logD("onTaskClosing for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) if ( !desktopState.isDesktopModeSupportedOnDisplay(taskInfo.displayId) && DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue ) { logD( "onTaskClosing for taskId=%d, displayId=%d - desktop not supported", taskInfo.taskId, taskInfo.displayId, ) return } val desktopRepository: DesktopRepository = desktopUserRepositories.getProfile(taskInfo.userId) if (!desktopRepository.isActiveTask(taskInfo.taskId)) return val isFreeformTask = taskInfo.isFreeform val isActiveTask = desktopRepository.isActiveTask(taskInfo.taskId) logD( "onTaskClosing for taskId=%d, displayId=%d userId=%s currentUserId=%d " + "parentTaskId=%b isFreeform=%b isActive=%b", taskInfo.taskId, taskInfo.displayId, taskInfo.userId, shellController.currentUserId, taskInfo.parentTaskId, isFreeformTask, isActiveTask, ) if (!isActiveTask) return val isMinimized = desktopRepository.isMinimizedTask(taskInfo.taskId) // TODO: b/370038902 - Handle Activity#finishAndRemoveTask. Loading @@ -207,9 +295,6 @@ class DesktopTaskChangeListener( } } private fun isFreeformTask(taskInfo: RunningTaskInfo): Boolean = taskInfo.windowingMode == WINDOWING_MODE_FREEFORM private fun logD(msg: String, vararg arguments: Any?) { ProtoLog.d(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListenerTest.kt +4 −1 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import com.android.wm.shell.TestRunningTaskInfoBuilder import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFreeformTask import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFullscreenTask import com.android.wm.shell.shared.desktopmode.FakeDesktopState import com.android.wm.shell.sysui.ShellController import org.junit.Before import org.junit.Test import org.junit.runner.RunWith Loading @@ -55,6 +56,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { private lateinit var desktopTaskChangeListener: DesktopTaskChangeListener private val desktopUserRepositories = mock<DesktopUserRepositories>() private val shellController = mock<ShellController>() private val desktopRepository = mock<DesktopRepository>() private val desktopState = FakeDesktopState().apply { Loading @@ -64,7 +66,8 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { @Before fun setUp() { desktopTaskChangeListener = DesktopTaskChangeListener(desktopUserRepositories, desktopState) desktopTaskChangeListener = DesktopTaskChangeListener(desktopUserRepositories, desktopState, shellController) whenever(desktopUserRepositories.current).thenReturn(desktopRepository) whenever(desktopUserRepositories.getProfile(anyInt())).thenReturn(desktopRepository) Loading