diff options
| author | 2023-06-06 10:33:34 +0000 | |
|---|---|---|
| committer | 2023-06-06 10:33:34 +0000 | |
| commit | fb1f31f8adfa9ac01cb920c277b4857a74965a57 (patch) | |
| tree | b1b03206104f51aa95ca06988d220621eb0867a6 | |
| parent | 75d5eab5b604e29088ee6b46ae28b2bd6548d587 (diff) | |
| parent | 347eed39fc6abc39258c026695de0c2de1432f72 (diff) | |
Merge "[Partial Screensharing] Support enterprise policy" into udc-dev
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 |