summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Santiago Seifert <aquilescanta@google.com> 2024-07-19 17:43:01 +0000
committer Santiago Seifert <aquilescanta@google.com> 2024-07-23 21:49:19 +0000
commit49da9beb0e986210c5f6912dbd35618b92305c9d (patch)
tree315da8cf16993cec7f12a28c9554f2746fe40d1a
parentf7e317a64580cf20a7ccd52a6ce5c9ed9b7b4bd9 (diff)
Allow screenOffScan to holders of MEDIA_CONTENT_CONTROL
Before this change, only holders of MEDIA_ROUTING_CONTROL are allowed to perform screen off scans. But MEDIA_ROUTING_CONTROL is an appopp permission that's not available to privileged apps via pre-granting. MEDIA_CONTENT_CONTROL is a privileged permission that's pre-grantable. Bug: b/352401364 Test: atest CtsMediaBetterTogetherTestCases CtsMediaHostTestCases Flag: com.android.media.flags.enable_full_scan_with_media_content_control Change-Id: I1118bf56a03977ddcfdf37c21f14f532ff3ad0d5
-rw-r--r--media/java/android/media/MediaRouter2.java15
-rw-r--r--media/java/android/media/flags/media_better_together.aconfig10
-rw-r--r--services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java20
-rw-r--r--services/core/java/com/android/server/media/MediaRouterService.java6
4 files changed, 47 insertions, 4 deletions
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index 0667bfda7596..1930c3d8b9b7 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -107,7 +107,8 @@ public final class MediaRouter2 {
* #SCANNING_STATE_WHILE_INTERACTIVE}.
*
* <p>Routers requesting unrestricted scanning must hold {@link
- * Manifest.permission#MEDIA_ROUTING_CONTROL}.
+ * Manifest.permission#MEDIA_ROUTING_CONTROL} or {@link
+ * Manifest.permission#MEDIA_CONTENT_CONTROL}.
*
* @hide
*/
@@ -522,11 +523,16 @@ public final class MediaRouter2 {
*
* <p>{@code scanRequest} specifies relevant scanning options, like whether the system should
* scan with the screen off. Screen off scanning requires {@link
- * Manifest.permission#MEDIA_ROUTING_CONTROL}
+ * Manifest.permission#MEDIA_ROUTING_CONTROL} or {@link
+ * Manifest.permission#MEDIA_CONTENT_CONTROL}.
*
* <p>Proxy routers use the registered {@link RouteDiscoveryPreference} of their target routers.
*
* @return A unique {@link ScanToken} that identifies the scan request.
+ * @throws SecurityException If a {@link ScanRequest} with {@link
+ * ScanRequest.Builder#setScreenOffScan} true is passed, while not holding {@link
+ * Manifest.permission#MEDIA_ROUTING_CONTROL} or {@link
+ * Manifest.permission#MEDIA_CONTENT_CONTROL}.
*/
@FlaggedApi(FLAG_ENABLE_SCREEN_OFF_SCANNING)
@NonNull
@@ -1745,8 +1751,9 @@ public final class MediaRouter2 {
/**
* Sets whether the app is requesting to scan even while the screen is off, bypassing
- * default scanning restrictions. Only companion apps holding {@link
- * Manifest.permission#MEDIA_ROUTING_CONTROL} should set this to {@code true}.
+ * default scanning restrictions. Only apps holding {@link
+ * Manifest.permission#MEDIA_ROUTING_CONTROL} or {@link
+ * Manifest.permission#MEDIA_CONTENT_CONTROL} should set this to {@code true}.
*
* @see #requestScan(ScanRequest)
*/
diff --git a/media/java/android/media/flags/media_better_together.aconfig b/media/java/android/media/flags/media_better_together.aconfig
index 91c4f118658a..7c41f968a03b 100644
--- a/media/java/android/media/flags/media_better_together.aconfig
+++ b/media/java/android/media/flags/media_better_together.aconfig
@@ -134,3 +134,13 @@ flag {
purpose: PURPOSE_BUGFIX
}
}
+
+flag {
+ name: "enable_full_scan_with_media_content_control"
+ namespace: "media_better_together"
+ description: "Allows holders of the MEDIA_CONTENT_CONTROL permission to scan for routes while not in the foreground."
+ bug: "352401364"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index 9acf0301ce42..1070f2f8faf1 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -328,6 +328,12 @@ class MediaRouter2ServiceImpl {
}
}
+ @RequiresPermission(
+ anyOf = {
+ Manifest.permission.MEDIA_ROUTING_CONTROL,
+ Manifest.permission.MEDIA_CONTENT_CONTROL
+ },
+ conditional = true)
public void updateScanningState(
@NonNull IMediaRouter2 router, @ScanningState int scanningState) {
Objects.requireNonNull(router, "router must not be null");
@@ -1216,6 +1222,12 @@ class MediaRouter2ServiceImpl {
disposeUserIfNeededLocked(userRecord); // since router removed from user
}
+ @RequiresPermission(
+ anyOf = {
+ Manifest.permission.MEDIA_ROUTING_CONTROL,
+ Manifest.permission.MEDIA_CONTENT_CONTROL
+ },
+ conditional = true)
@GuardedBy("mLock")
private void updateScanningStateLocked(
@NonNull IMediaRouter2 router, @ScanningState int scanningState) {
@@ -1226,7 +1238,11 @@ class MediaRouter2ServiceImpl {
return;
}
+ boolean enableScanViaMediaContentControl =
+ Flags.enableFullScanWithMediaContentControl()
+ && routerRecord.mHasMediaContentControlPermission;
if (scanningState == SCANNING_STATE_SCANNING_FULL
+ && !enableScanViaMediaContentControl
&& !routerRecord.mHasMediaRoutingControl) {
throw new SecurityException("Screen off scan requires MEDIA_ROUTING_CONTROL");
}
@@ -1679,7 +1695,11 @@ class MediaRouter2ServiceImpl {
return;
}
+ boolean enableScanViaMediaContentControl =
+ Flags.enableFullScanWithMediaContentControl()
+ && managerRecord.mHasMediaContentControl;
if (!managerRecord.mHasMediaRoutingControl
+ && !enableScanViaMediaContentControl
&& scanningState == SCANNING_STATE_SCANNING_FULL) {
throw new SecurityException("Screen off scan requires MEDIA_ROUTING_CONTROL");
}
diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java
index 1188a0764051..363b8e4228b0 100644
--- a/services/core/java/com/android/server/media/MediaRouterService.java
+++ b/services/core/java/com/android/server/media/MediaRouterService.java
@@ -443,6 +443,12 @@ public final class MediaRouterService extends IMediaRouterService.Stub
// Binder call
@Override
+ @RequiresPermission(
+ anyOf = {
+ Manifest.permission.MEDIA_ROUTING_CONTROL,
+ Manifest.permission.MEDIA_CONTENT_CONTROL
+ },
+ conditional = true)
public void updateScanningStateWithRouter2(
IMediaRouter2 router, @ScanningState int scanningState) {
mService2.updateScanningState(router, scanningState);