Don't stop MediaProjection sessions without display
When device lock would otherwise stop MediaProjection.
Bug: 370108833
Test: atest MediaProjectionManagerServiceTest
Flag: android.companion.virtualdevice.flags.media_projection_keyguard_restrictions
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:21b5c2f81085826dba071f98bbe0068cd9839289)
Merged-In: Ic5179113180d3bb71d813aeed02ae2a302190965
Change-Id: Ic5179113180d3bb71d813aeed02ae2a302190965
diff --git a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
index 7511799..e0913cc 100644
--- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
+++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
@@ -237,7 +237,8 @@
void onKeyguardLockedStateChanged(boolean isKeyguardLocked) {
if (!isKeyguardLocked) return;
synchronized (mLock) {
- if (mProjectionGrant != null && !canCaptureKeyguard()) {
+ if (mProjectionGrant != null && !canCaptureKeyguard()
+ && mProjectionGrant.mVirtualDisplayId != INVALID_DISPLAY) {
Slog.d(TAG, "Content Recording: Stopped MediaProjection"
+ " due to keyguard lock");
mProjectionGrant.stop();
diff --git a/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java
index 2796270..a89350c 100644
--- a/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/media/projection/MediaProjectionManagerServiceTest.java
@@ -401,6 +401,23 @@
}
}
+ @EnableFlags(android.companion.virtualdevice.flags
+ .Flags.FLAG_MEDIA_PROJECTION_KEYGUARD_RESTRICTIONS)
+ @Test
+ public void testCreateProjection_keyguardLocked_noDisplayCreated()
+ throws NameNotFoundException {
+ MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions();
+ doReturn(true).when(mKeyguardManager).isKeyguardLocked();
+
+ doReturn(PackageManager.PERMISSION_DENIED).when(mPackageManager).checkPermission(
+ RECORD_SENSITIVE_CONTENT, projection.packageName);
+
+ projection.start(mIMediaProjectionCallback);
+
+ // The projection was started because it was allowed to capture the keyguard.
+ assertThat(mService.getActiveProjectionInfo()).isNotNull();
+ }
+
@Test
public void testCreateProjection_attemptReuse_noPriorProjectionGrant()
throws NameNotFoundException {
@@ -514,6 +531,7 @@
MediaProjectionManagerService.MediaProjection projection =
startProjectionPreconditions(service);
projection.start(mIMediaProjectionCallback);
+ projection.notifyVirtualDisplayCreated(10);
assertThat(service.getActiveProjectionInfo()).isNotNull();
@@ -536,6 +554,7 @@
MediaProjectionManagerService.MediaProjection projection =
startProjectionPreconditions(service);
projection.start(mIMediaProjectionCallback);
+ projection.notifyVirtualDisplayCreated(10);
assertThat(service.getActiveProjectionInfo()).isNotNull();