summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yalan Yiue <yyalan@google.com> 2023-06-06 10:33:34 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-06-06 10:33:34 +0000
commitfb1f31f8adfa9ac01cb920c277b4857a74965a57 (patch)
treeb1b03206104f51aa95ca06988d220621eb0867a6
parent75d5eab5b604e29088ee6b46ae28b2bd6548d587 (diff)
parent347eed39fc6abc39258c026695de0c2de1432f72 (diff)
Merge "[Partial Screensharing] Support enterprise policy" into udc-dev
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt14
-rw-r--r--packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorController.kt16
-rw-r--r--packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDevicePolicyResolver.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt80
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDevicePolicyResolverTest.kt45
5 files changed, 50 insertions, 107 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt
index c41f82b4ddd1..8d3c6d5d4947 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaProjectionAppSelectorActivity.kt
@@ -38,8 +38,6 @@ import com.android.internal.app.ResolverListController
import com.android.internal.app.chooser.NotSelectableTargetInfo
import com.android.internal.app.chooser.TargetInfo
import com.android.systemui.R
-import com.android.systemui.flags.FeatureFlags
-import com.android.systemui.flags.Flags
import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorComponent
import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorController
import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorResultHandler
@@ -53,7 +51,6 @@ import javax.inject.Inject
class MediaProjectionAppSelectorActivity(
private val componentFactory: MediaProjectionAppSelectorComponent.Factory,
private val activityLauncher: AsyncActivityLauncher,
- private val featureFlags: FeatureFlags,
/** This is used to override the dependency in a screenshot test */
@VisibleForTesting
private val listControllerFactory: ((userHandle: UserHandle) -> ResolverListController)?
@@ -62,9 +59,8 @@ class MediaProjectionAppSelectorActivity(
@Inject
constructor(
componentFactory: MediaProjectionAppSelectorComponent.Factory,
- activityLauncher: AsyncActivityLauncher,
- featureFlags: FeatureFlags
- ) : this(componentFactory, activityLauncher, featureFlags, listControllerFactory = null)
+ activityLauncher: AsyncActivityLauncher
+ ) : this(componentFactory, activityLauncher, listControllerFactory = null)
private lateinit var configurationController: ConfigurationController
private lateinit var controller: MediaProjectionAppSelectorController
@@ -108,11 +104,7 @@ class MediaProjectionAppSelectorActivity(
override fun appliedThemeResId(): Int = R.style.Theme_SystemUI_MediaProjectionAppSelector
override fun createBlockerEmptyStateProvider(): EmptyStateProvider =
- if (featureFlags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING_ENTERPRISE_POLICIES)) {
- component.emptyStateProvider
- } else {
- object : EmptyStateProvider {}
- }
+ component.emptyStateProvider
override fun createListController(userHandle: UserHandle): ResolverListController =
listControllerFactory?.invoke(userHandle) ?: super.createListController(userHandle)
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorController.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorController.kt
index 1d8fe729494d..e61650fbb163 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorController.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorController.kt
@@ -18,9 +18,9 @@ package com.android.systemui.mediaprojection.appselector
import android.content.ComponentName
import android.os.UserHandle
-import com.android.systemui.flags.FeatureFlags
import com.android.systemui.mediaprojection.appselector.data.RecentTask
import com.android.systemui.mediaprojection.appselector.data.RecentTaskListProvider
+import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDevicePolicyResolver
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancel
@@ -32,7 +32,7 @@ class MediaProjectionAppSelectorController
constructor(
private val recentTaskListProvider: RecentTaskListProvider,
private val view: MediaProjectionAppSelectorView,
- private val flags: FeatureFlags,
+ private val devicePolicyResolver: ScreenCaptureDevicePolicyResolver,
@HostUserHandle private val hostUserHandle: UserHandle,
@MediaProjectionAppSelector private val scope: CoroutineScope,
@MediaProjectionAppSelector private val appSelectorComponentName: ComponentName,
@@ -54,11 +54,13 @@ constructor(
scope.cancel()
}
- /**
- * Removes all recent tasks that are different from the profile of the host app to avoid any
- * cross-profile sharing
- */
- private fun List<RecentTask>.filterDevicePolicyRestrictedTasks(): List<RecentTask> = this
+ /** Removes all recent tasks that should be blocked according to the policy */
+ private fun List<RecentTask>.filterDevicePolicyRestrictedTasks(): List<RecentTask> = filter {
+ devicePolicyResolver.isScreenCaptureAllowed(
+ targetAppUserHandle = UserHandle.of(it.userId),
+ hostAppUserHandle = hostUserHandle
+ )
+ }
private fun List<RecentTask>.filterAppSelector(): List<RecentTask> = filter {
// Only take tasks that is not the app selector
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDevicePolicyResolver.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDevicePolicyResolver.kt
index 6bd33e7e5c97..b11a244b2e3e 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDevicePolicyResolver.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDevicePolicyResolver.kt
@@ -47,7 +47,7 @@ constructor(
return false
}
- if (!hostAppUserHandle.isWorkProfile() && personalProfileScreenCaptureDisabled) {
+ if (personalProfileScreenCaptureDisabled) {
// Disable screen capturing as personal apps should not capture the screen
return false
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt
index f1bbd8434b40..f25cd24dfcb0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt
@@ -5,14 +5,15 @@ import android.os.UserHandle
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.flags.FeatureFlags
-import com.android.systemui.flags.Flags
import com.android.systemui.mediaprojection.appselector.data.RecentTask
import com.android.systemui.mediaprojection.appselector.data.RecentTaskListProvider
+import com.android.systemui.mediaprojection.devicepolicy.ScreenCaptureDevicePolicyResolver
+import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
+import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.verify
@@ -27,23 +28,28 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
private val callerPackageName = "com.test.caller"
private val callerComponentName = ComponentName(callerPackageName, "Caller")
- private val hostUserHandle = UserHandle.of(123)
- private val otherUserHandle = UserHandle.of(456)
+ private val personalUserHandle = UserHandle.of(123)
+ private val workUserHandle = UserHandle.of(456)
private val view: MediaProjectionAppSelectorView = mock()
- private val featureFlags: FeatureFlags = mock()
+ private val policyResolver: ScreenCaptureDevicePolicyResolver = mock()
private val controller =
MediaProjectionAppSelectorController(
taskListProvider,
view,
- featureFlags,
- hostUserHandle,
+ policyResolver,
+ personalUserHandle,
scope,
appSelectorComponentName,
callerPackageName
)
+ @Before
+ fun setup() {
+ givenCaptureAllowed(isAllow = true)
+ }
+
@Test
fun initNoRecentTasks_bindsEmptyList() {
taskListProvider.tasks = emptyList()
@@ -132,73 +138,57 @@ class MediaProjectionAppSelectorControllerTest : SysuiTestCase() {
}
@Test
- fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesDisabled_bindsAllTasks() {
- givenEnterprisePoliciesFeatureFlag(enabled = false)
-
+ fun initRecentTasksWithAppSelectorTasks_withEnterprisePolicies_bindsAllTasks() {
val tasks =
listOf(
- createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
- createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
- createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
- createRecentTask(taskId = 4, userId = otherUserHandle.identifier),
- createRecentTask(taskId = 5, userId = hostUserHandle.identifier),
+ createRecentTask(taskId = 1, userId = personalUserHandle.identifier),
+ createRecentTask(taskId = 2, userId = workUserHandle.identifier),
+ createRecentTask(taskId = 3, userId = personalUserHandle.identifier),
+ createRecentTask(taskId = 4, userId = workUserHandle.identifier),
+ createRecentTask(taskId = 5, userId = personalUserHandle.identifier),
)
taskListProvider.tasks = tasks
controller.init()
- // TODO (b/263950746): Cross-profile filtering is removed for now. This should be brought
- // back with the future fix
verify(view)
.bind(
listOf(
- createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
- createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
- createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
- createRecentTask(taskId = 4, userId = otherUserHandle.identifier),
- createRecentTask(taskId = 5, userId = hostUserHandle.identifier),
+ createRecentTask(taskId = 1, userId = personalUserHandle.identifier),
+ createRecentTask(taskId = 2, userId = workUserHandle.identifier),
+ createRecentTask(taskId = 3, userId = personalUserHandle.identifier),
+ createRecentTask(taskId = 4, userId = workUserHandle.identifier),
+ createRecentTask(taskId = 5, userId = personalUserHandle.identifier),
)
)
}
@Test
- fun initRecentTasksWithAppSelectorTasks_enterprisePoliciesEnabled_bindsAllTasks() {
- givenEnterprisePoliciesFeatureFlag(enabled = true)
-
+ fun initRecentTasksWithAppSelectorTasks_withEnterprisePolicies_blocksAllTasks() {
val tasks =
listOf(
- createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
- createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
- createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
- createRecentTask(taskId = 4, userId = otherUserHandle.identifier),
- createRecentTask(taskId = 5, userId = hostUserHandle.identifier),
+ createRecentTask(taskId = 1, userId = personalUserHandle.identifier),
+ createRecentTask(taskId = 2, userId = workUserHandle.identifier),
+ createRecentTask(taskId = 3, userId = personalUserHandle.identifier),
+ createRecentTask(taskId = 4, userId = workUserHandle.identifier),
+ createRecentTask(taskId = 5, userId = personalUserHandle.identifier),
)
taskListProvider.tasks = tasks
+ givenCaptureAllowed(isAllow = false)
controller.init()
- // TODO(b/233348916) should filter depending on the policies
- verify(view)
- .bind(
- listOf(
- createRecentTask(taskId = 1, userId = hostUserHandle.identifier),
- createRecentTask(taskId = 2, userId = otherUserHandle.identifier),
- createRecentTask(taskId = 3, userId = hostUserHandle.identifier),
- createRecentTask(taskId = 4, userId = otherUserHandle.identifier),
- createRecentTask(taskId = 5, userId = hostUserHandle.identifier),
- )
- )
+ verify(view).bind(emptyList())
}
- private fun givenEnterprisePoliciesFeatureFlag(enabled: Boolean) {
- whenever(featureFlags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING_ENTERPRISE_POLICIES))
- .thenReturn(enabled)
+ private fun givenCaptureAllowed(isAllow: Boolean) {
+ whenever(policyResolver.isScreenCaptureAllowed(any(), any())).thenReturn(isAllow)
}
private fun createRecentTask(
taskId: Int,
topActivityComponent: ComponentName? = null,
- userId: Int = hostUserHandle.identifier
+ userId: Int = personalUserHandle.identifier
): RecentTask {
return RecentTask(
taskId = taskId,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDevicePolicyResolverTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDevicePolicyResolverTest.kt
index e8b6f9bd3478..c63efa1ba38a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDevicePolicyResolverTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/devicepolicy/ScreenCaptureDevicePolicyResolverTest.kt
@@ -406,28 +406,6 @@ class IsAllowedScreenCaptureDevicePolicyResolverTest(
isHostInWorkProfile = true,
isTargetInWorkProfile = true,
personalScreenCaptureDisabled = true,
- workScreenCaptureDisabled = false,
- disallowShareIntoManagedProfile = false
- ),
- expectedScreenCaptureAllowed = true,
- ),
- IsScreenCaptureAllowedTestCase(
- given =
- Preconditions(
- isHostInWorkProfile = true,
- isTargetInWorkProfile = true,
- personalScreenCaptureDisabled = true,
- workScreenCaptureDisabled = false,
- disallowShareIntoManagedProfile = true
- ),
- expectedScreenCaptureAllowed = true,
- ),
- IsScreenCaptureAllowedTestCase(
- given =
- Preconditions(
- isHostInWorkProfile = true,
- isTargetInWorkProfile = true,
- personalScreenCaptureDisabled = true,
workScreenCaptureDisabled = true,
disallowShareIntoManagedProfile = false
),
@@ -626,26 +604,6 @@ class IsCompletelyNotAllowedScreenCaptureDevicePolicyResolverTest(
Preconditions(
isHostInWorkProfile = true,
personalScreenCaptureDisabled = true,
- workScreenCaptureDisabled = false,
- disallowShareIntoManagedProfile = false
- ),
- expectedScreenCaptureCompletelyDisabled = false,
- ),
- IsScreenCaptureCompletelyDisabledTestCase(
- given =
- Preconditions(
- isHostInWorkProfile = true,
- personalScreenCaptureDisabled = true,
- workScreenCaptureDisabled = false,
- disallowShareIntoManagedProfile = true
- ),
- expectedScreenCaptureCompletelyDisabled = false,
- ),
- IsScreenCaptureCompletelyDisabledTestCase(
- given =
- Preconditions(
- isHostInWorkProfile = true,
- personalScreenCaptureDisabled = true,
workScreenCaptureDisabled = true,
disallowShareIntoManagedProfile = false
),
@@ -686,7 +644,8 @@ class IsCompletelyNotAllowedScreenCaptureDevicePolicyResolverTest(
"personal screen capture disabled = ${given.personalScreenCaptureDisabled}, " +
"work screen capture disabled = ${given.workScreenCaptureDisabled}, " +
"disallow share into managed profile = ${given.disallowShareIntoManagedProfile}, " +
- "expected screen capture completely disabled = $expectedScreenCaptureCompletelyDisabled"
+ "expected screen capture completely disabled = " +
+ "$expectedScreenCaptureCompletelyDisabled"
}
@Test