diff options
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt | 214 | ||||
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/NewRootTaskInfo.kt | 117 |
2 files changed, 209 insertions, 122 deletions
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt index 587da2d5d677..b051df21389e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt @@ -18,11 +18,6 @@ package com.android.systemui.screenshot import android.app.ActivityTaskManager.RootTaskInfo import android.app.IActivityTaskManager -import android.app.WindowConfiguration.ACTIVITY_TYPE_HOME -import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD -import android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED -import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN -import android.app.WindowConfiguration.WINDOWING_MODE_PINNED import android.content.ComponentName import android.content.Context import android.graphics.Rect @@ -31,6 +26,12 @@ import android.os.UserManager import android.testing.AndroidTestingRunner import com.android.systemui.SysuiTestCase import com.android.systemui.screenshot.ScreenshotPolicy.DisplayContentInfo +import com.android.systemui.screenshot.policy.ActivityType.Home +import com.android.systemui.screenshot.policy.ActivityType.Undefined +import com.android.systemui.screenshot.policy.WindowingMode.FullScreen +import com.android.systemui.screenshot.policy.WindowingMode.PictureInPicture +import com.android.systemui.screenshot.policy.newChildTask +import com.android.systemui.screenshot.policy.newRootTaskInfo import com.android.systemui.settings.FakeDisplayTracker import com.android.systemui.util.mockito.mock import com.google.common.truth.Truth.assertThat @@ -58,20 +59,19 @@ class ScreenshotPolicyImplTest : SysuiTestCase() { ), Rect(0, 0, 1080, 2400), UserHandle.of(MANAGED_PROFILE_USER), - 65)) + 65 + ) + ) } @Test fun findPrimaryContent_ignoresPipTask() = runBlocking { - val policy = fakeTasksPolicyImpl( - mContext, - shadeExpanded = false, - tasks = listOf( - pipTask, - fullScreenWorkProfileTask, - launcherTask, - emptyTask) - ) + val policy = + fakeTasksPolicyImpl( + mContext, + shadeExpanded = false, + tasks = listOf(pipTask, fullScreenWorkProfileTask, launcherTask, emptyTask) + ) val info = policy.findPrimaryContent(DISPLAY_ID) assertThat(info).isEqualTo(fullScreenWorkProfileTask.toDisplayContentInfo()) @@ -79,14 +79,12 @@ class ScreenshotPolicyImplTest : SysuiTestCase() { @Test fun findPrimaryContent_shadeExpanded_ignoresTopTask() = runBlocking { - val policy = fakeTasksPolicyImpl( - mContext, - shadeExpanded = true, - tasks = listOf( - fullScreenWorkProfileTask, - launcherTask, - emptyTask) - ) + val policy = + fakeTasksPolicyImpl( + mContext, + shadeExpanded = true, + tasks = listOf(fullScreenWorkProfileTask, launcherTask, emptyTask) + ) val info = policy.findPrimaryContent(DISPLAY_ID) assertThat(info).isEqualTo(policy.systemUiContent) @@ -94,11 +92,7 @@ class ScreenshotPolicyImplTest : SysuiTestCase() { @Test fun findPrimaryContent_emptyTaskList() = runBlocking { - val policy = fakeTasksPolicyImpl( - mContext, - shadeExpanded = false, - tasks = listOf() - ) + val policy = fakeTasksPolicyImpl(mContext, shadeExpanded = false, tasks = listOf()) val info = policy.findPrimaryContent(DISPLAY_ID) assertThat(info).isEqualTo(policy.systemUiContent) @@ -106,14 +100,12 @@ class ScreenshotPolicyImplTest : SysuiTestCase() { @Test fun findPrimaryContent_workProfileNotOnTop() = runBlocking { - val policy = fakeTasksPolicyImpl( - mContext, - shadeExpanded = false, - tasks = listOf( - launcherTask, - fullScreenWorkProfileTask, - emptyTask) - ) + val policy = + fakeTasksPolicyImpl( + mContext, + shadeExpanded = false, + tasks = listOf(launcherTask, fullScreenWorkProfileTask, emptyTask) + ) val info = policy.findPrimaryContent(DISPLAY_ID) assertThat(info).isEqualTo(launcherTask.toDisplayContentInfo()) @@ -129,102 +121,80 @@ class ScreenshotPolicyImplTest : SysuiTestCase() { val dispatcher = Dispatchers.Unconfined val displayTracker = FakeDisplayTracker(context) - return object : ScreenshotPolicyImpl(context, userManager, atmService, dispatcher, - displayTracker) { + return object : + ScreenshotPolicyImpl(context, userManager, atmService, dispatcher, displayTracker) { override suspend fun isManagedProfile(userId: Int) = (userId == MANAGED_PROFILE_USER) override suspend fun getAllRootTaskInfosOnDisplay(displayId: Int) = tasks override suspend fun isNotificationShadeExpanded() = shadeExpanded } } - private val pipTask = RootTaskInfo().apply { - configuration.windowConfiguration.apply { - windowingMode = WINDOWING_MODE_PINNED - setBounds(Rect(628, 1885, 1038, 2295)) - activityType = ACTIVITY_TYPE_STANDARD + private val pipTask = + newRootTaskInfo( + taskId = 66, + userId = PRIMARY_USER, + displayId = DISPLAY_ID, + bounds = Rect(628, 1885, 1038, 2295), + windowingMode = PictureInPicture, + topActivity = ComponentName.unflattenFromString(YOUTUBE_PIP_ACTIVITY), + ) { + listOf(newChildTask(taskId = 66, userId = 0, name = YOUTUBE_HOME_ACTIVITY)) } - displayId = DISPLAY_ID - userId = PRIMARY_USER - taskId = 66 - visible = true - isVisible = true - isRunning = true - numActivities = 1 - topActivity = ComponentName( - "com.google.android.youtube", - "com.google.android.apps.youtube.app.watchwhile.WatchWhileActivity" - ) - childTaskIds = intArrayOf(66) - childTaskNames = arrayOf("com.google.android.youtube/" + - "com.google.android.youtube.app.honeycomb.Shell\$HomeActivity") - childTaskUserIds = intArrayOf(0) - childTaskBounds = arrayOf(Rect(628, 1885, 1038, 2295)) - } - private val fullScreenWorkProfileTask = RootTaskInfo().apply { - configuration.windowConfiguration.apply { - windowingMode = WINDOWING_MODE_FULLSCREEN - setBounds(Rect(0, 0, 1080, 2400)) - activityType = ACTIVITY_TYPE_STANDARD + private val fullScreenWorkProfileTask = + newRootTaskInfo( + taskId = 65, + userId = MANAGED_PROFILE_USER, + displayId = DISPLAY_ID, + bounds = Rect(0, 0, 1080, 2400), + windowingMode = FullScreen, + topActivity = ComponentName.unflattenFromString(FILES_HOME_ACTIVITY), + ) { + listOf( + newChildTask(taskId = 65, userId = MANAGED_PROFILE_USER, name = FILES_HOME_ACTIVITY) + ) } - displayId = DISPLAY_ID - userId = MANAGED_PROFILE_USER - taskId = 65 - visible = true - isVisible = true - isRunning = true - numActivities = 1 - topActivity = ComponentName( - "com.google.android.apps.nbu.files", - "com.google.android.apps.nbu.files.home.HomeActivity" - ) - childTaskIds = intArrayOf(65) - childTaskNames = arrayOf("com.google.android.apps.nbu.files/" + - "com.google.android.apps.nbu.files.home.HomeActivity") - childTaskUserIds = intArrayOf(MANAGED_PROFILE_USER) - childTaskBounds = arrayOf(Rect(0, 0, 1080, 2400)) - } - - private val launcherTask = RootTaskInfo().apply { - configuration.windowConfiguration.apply { - windowingMode = WINDOWING_MODE_FULLSCREEN - setBounds(Rect(0, 0, 1080, 2400)) - activityType = ACTIVITY_TYPE_HOME + private val launcherTask = + newRootTaskInfo( + taskId = 1, + userId = PRIMARY_USER, + displayId = DISPLAY_ID, + activityType = Home, + windowingMode = FullScreen, + bounds = Rect(0, 0, 1080, 2400), + topActivity = ComponentName.unflattenFromString(LAUNCHER_ACTIVITY), + ) { + listOf(newChildTask(taskId = 1, userId = 0, name = LAUNCHER_ACTIVITY)) } - displayId = DISPLAY_ID - taskId = 1 - userId = PRIMARY_USER - visible = true - isVisible = true - isRunning = true - numActivities = 1 - topActivity = ComponentName( - "com.google.android.apps.nexuslauncher", - "com.google.android.apps.nexuslauncher.NexusLauncherActivity", - ) - childTaskIds = intArrayOf(1) - childTaskNames = arrayOf("com.google.android.apps.nexuslauncher/" + - "com.google.android.apps.nexuslauncher.NexusLauncherActivity") - childTaskUserIds = intArrayOf(0) - childTaskBounds = arrayOf(Rect(0, 0, 1080, 2400)) - } - private val emptyTask = RootTaskInfo().apply { - configuration.windowConfiguration.apply { - windowingMode = WINDOWING_MODE_FULLSCREEN - setBounds(Rect(0, 0, 1080, 2400)) - activityType = ACTIVITY_TYPE_UNDEFINED + private val emptyTask = + newRootTaskInfo( + taskId = 2, + userId = PRIMARY_USER, + displayId = DISPLAY_ID, + visible = false, + running = false, + numActivities = 0, + activityType = Undefined, + bounds = Rect(0, 0, 1080, 2400), + ) { + listOf( + newChildTask(taskId = 3, name = ""), + newChildTask(taskId = 4, name = ""), + ) } - displayId = DISPLAY_ID - taskId = 2 - userId = PRIMARY_USER - visible = false - isVisible = false - isRunning = false - numActivities = 0 - childTaskIds = intArrayOf(3, 4) - childTaskNames = arrayOf("", "") - childTaskUserIds = intArrayOf(0, 0) - childTaskBounds = arrayOf(Rect(0, 0, 1080, 2400), Rect(0, 2400, 1080, 4800)) - } } + +const val YOUTUBE_HOME_ACTIVITY = + "com.google.android.youtube/" + "com.google.android.youtube.app.honeycomb.Shell\$HomeActivity" + +const val FILES_HOME_ACTIVITY = + "com.google.android.apps.nbu.files/" + "com.google.android.apps.nbu.files.home.HomeActivity" + +const val YOUTUBE_PIP_ACTIVITY = + "com.google.android.youtube/" + + "com.google.android.apps.youtube.app.watchwhile.WatchWhileActivity" + +const val LAUNCHER_ACTIVITY = + "com.google.android.apps.nexuslauncher/" + + "com.google.android.apps.nexuslauncher.NexusLauncherActivity" diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/NewRootTaskInfo.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/NewRootTaskInfo.kt new file mode 100644 index 000000000000..6c35b233ffec --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/NewRootTaskInfo.kt @@ -0,0 +1,117 @@ +/* + * 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.systemui.screenshot.policy + +import android.app.ActivityTaskManager.RootTaskInfo +import android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT +import android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM +import android.app.WindowConfiguration.ACTIVITY_TYPE_HOME +import android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS +import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD +import android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED +import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM +import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN +import android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW +import android.app.WindowConfiguration.WINDOWING_MODE_PINNED +import android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED +import android.content.ComponentName +import android.graphics.Rect +import android.os.UserHandle +import android.view.Display +import com.android.systemui.screenshot.data.model.ChildTaskModel +import com.android.systemui.screenshot.policy.ActivityType.Standard +import com.android.systemui.screenshot.policy.WindowingMode.FullScreen + +/** An enum mapping to [android.app.WindowConfiguration] constants via [toInt]. */ +enum class ActivityType(private val intValue: Int) { + Undefined(ACTIVITY_TYPE_UNDEFINED), + Standard(ACTIVITY_TYPE_STANDARD), + Home(ACTIVITY_TYPE_HOME), + Recents(ACTIVITY_TYPE_RECENTS), + Assistant(ACTIVITY_TYPE_ASSISTANT), + Dream(ACTIVITY_TYPE_DREAM); + + /** Returns the [android.app.WindowConfiguration] int constant for the type. */ + fun toInt() = intValue +} + +/** An enum mapping to [android.app.WindowConfiguration] constants via [toInt]. */ +enum class WindowingMode(private val intValue: Int) { + Undefined(WINDOWING_MODE_UNDEFINED), + FullScreen(WINDOWING_MODE_FULLSCREEN), + PictureInPicture(WINDOWING_MODE_PINNED), + Freeform(WINDOWING_MODE_FREEFORM), + MultiWindow(WINDOWING_MODE_MULTI_WINDOW); + + /** Returns the [android.app.WindowConfiguration] int constant for the mode. */ + fun toInt() = intValue +} + +/** + * Constructs a child task for a [RootTaskInfo], copying [RootTaskInfo.bounds] and + * [RootTaskInfo.userId] from the parent by default. + */ +fun RootTaskInfo.newChildTask( + taskId: Int, + name: String, + bounds: Rect? = null, + userId: Int? = null +): ChildTaskModel { + return ChildTaskModel(taskId, name, bounds ?: this.bounds, userId ?: this.userId) +} + +/** Constructs a new [RootTaskInfo]. */ +fun newRootTaskInfo( + taskId: Int, + userId: Int = UserHandle.USER_SYSTEM, + displayId: Int = Display.DEFAULT_DISPLAY, + visible: Boolean = true, + running: Boolean = true, + activityType: ActivityType = Standard, + windowingMode: WindowingMode = FullScreen, + bounds: Rect? = null, + topActivity: ComponentName? = null, + topActivityType: ActivityType = Standard, + numActivities: Int? = null, + childTaskListBuilder: RootTaskInfo.() -> List<ChildTaskModel>, +): RootTaskInfo { + return RootTaskInfo().apply { + configuration.windowConfiguration.apply { + setWindowingMode(windowingMode.toInt()) + setActivityType(activityType.toInt()) + setBounds(bounds) + } + this.bounds = bounds + this.displayId = displayId + this.userId = userId + this.taskId = taskId + this.visible = visible + this.isVisible = visible + this.isRunning = running + this.topActivity = topActivity + this.topActivityType = topActivityType.toInt() + // NOTE: topActivityInfo is _not_ populated by this code + + val childTasks = childTaskListBuilder(this) + this.numActivities = numActivities ?: childTasks.size + + childTaskNames = childTasks.map { it.name }.toTypedArray() + childTaskIds = childTasks.map { it.id }.toIntArray() + childTaskBounds = childTasks.map { it.bounds }.toTypedArray() + childTaskUserIds = childTasks.map { it.userId }.toIntArray() + } +} |