diff options
2 files changed, 42 insertions, 1 deletions
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 803b125cbabc..621c090d37b8 100644 --- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java +++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java @@ -702,7 +702,7 @@ public final class MediaProjectionManagerService extends SystemService } } - private final class BinderService extends IMediaProjectionManager.Stub { + final class BinderService extends IMediaProjectionManager.Stub { BinderService(Context context) { super(PermissionEnforcer.fromContext(context)); @@ -891,6 +891,13 @@ public final class MediaProjectionManagerService extends SystemService @Override public void requestConsentForInvalidProjection(@NonNull IMediaProjection projection) { requestConsentForInvalidProjection_enforcePermission(); + + if (android.companion.virtualdevice.flags.Flags.mediaProjectionKeyguardRestrictions() + && mKeyguardManager.isKeyguardLocked()) { + Slog.v(TAG, "Reusing token: Won't request consent while the keyguard is locked"); + return; + } + synchronized (mLock) { if (!isCurrentProjection(projection)) { Slog.v(TAG, "Reusing token: Won't request consent again for a token that " 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 316b5faf2a68..689b241f0faa 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 @@ -39,6 +39,7 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -364,6 +365,39 @@ public class MediaProjectionManagerServiceTest { @EnableFlags(android.companion.virtualdevice.flags .Flags.FLAG_MEDIA_PROJECTION_KEYGUARD_RESTRICTIONS) @Test + public void testReuseProjection_keyguardNotLocked_startConsentDialog() + throws NameNotFoundException { + MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions(); + projection.start(mIMediaProjectionCallback); + + doNothing().when(mContext).startActivityAsUser(any(), any()); + doReturn(false).when(mKeyguardManager).isKeyguardLocked(); + + MediaProjectionManagerService.BinderService mediaProjectionBinderService = + mService.new BinderService(mContext); + mediaProjectionBinderService.requestConsentForInvalidProjection(projection); + + verify(mContext).startActivityAsUser(any(), any()); + } + + @EnableFlags(android.companion.virtualdevice.flags + .Flags.FLAG_MEDIA_PROJECTION_KEYGUARD_RESTRICTIONS) + @Test + public void testReuseProjection_keyguardLocked_noConsentDialog() throws NameNotFoundException { + MediaProjectionManagerService.MediaProjection projection = startProjectionPreconditions(); + projection.start(mIMediaProjectionCallback); + + doReturn(true).when(mKeyguardManager).isKeyguardLocked(); + MediaProjectionManagerService.BinderService mediaProjectionBinderService = + mService.new BinderService(mContext); + mediaProjectionBinderService.requestConsentForInvalidProjection(projection); + + verify(mContext, never()).startActivityAsUser(any(), any()); + } + + @EnableFlags(android.companion.virtualdevice.flags + .Flags.FLAG_MEDIA_PROJECTION_KEYGUARD_RESTRICTIONS) + @Test public void testKeyguardLocked_stopsActiveProjection() throws Exception { MediaProjectionManagerService service = new MediaProjectionManagerService(mContext, mMediaProjectionMetricsLoggerInjector); |