Loading core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -25357,6 +25357,7 @@ package android.media { method @NonNull public android.media.MediaRoute2Info.Builder setType(int); method @NonNull public android.media.MediaRoute2Info.Builder setVisibilityPublic(); method @NonNull public android.media.MediaRoute2Info.Builder setVisibilityRestricted(@NonNull java.util.Set<java.lang.String>); method @FlaggedApi("com.android.media.flags.enable_route_visibility_control_api") @NonNull public android.media.MediaRoute2Info.Builder setVisibilityRestricted(@NonNull java.util.Set<java.lang.String>, boolean); method @NonNull public android.media.MediaRoute2Info.Builder setVolume(int); method @NonNull public android.media.MediaRoute2Info.Builder setVolumeHandling(int); method @NonNull public android.media.MediaRoute2Info.Builder setVolumeMax(int); media/java/android/media/MediaRoute2Info.java +53 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.annotation.TestApi; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.os.Parcel; Loading @@ -40,6 +41,7 @@ import android.os.Parcelable; import android.text.TextUtils; import com.android.internal.util.Preconditions; import com.android.media.flags.Flags; import java.io.PrintWriter; import java.lang.annotation.Retention; Loading @@ -50,6 +52,7 @@ import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.concurrent.Executor; import java.util.stream.Collectors; /** Loading Loading @@ -642,6 +645,7 @@ public final class MediaRoute2Info implements Parcelable { private final String mProviderId; private final boolean mIsVisibilityRestricted; private final Set<String> mAllowedPackages; private final boolean mAlsoAllowPrivilegedPackages; private final List<Set<String>> mRequiredPermissions; @SuitabilityStatus private final int mSuitabilityStatus; Loading @@ -666,6 +670,7 @@ public final class MediaRoute2Info implements Parcelable { mProviderId = builder.mProviderId; mIsVisibilityRestricted = builder.mIsVisibilityRestricted; mAllowedPackages = builder.mAllowedPackages; mAlsoAllowPrivilegedPackages = builder.mAlsoAllowPrivilegedPackages; mSuitabilityStatus = builder.mSuitabilityStatus; mRequiredPermissions = List.copyOf(builder.mRequiredPermissions); } Loading @@ -692,6 +697,7 @@ public final class MediaRoute2Info implements Parcelable { mProviderId = in.readString(); mIsVisibilityRestricted = in.readBoolean(); mAllowedPackages = Set.of(in.createString8Array()); mAlsoAllowPrivilegedPackages = in.readBoolean(); ArrayList<Set<String>> requiredPermissions = new ArrayList<>(); int numRequiredPermissionSets = in.readInt(); for (int i = 0; i < numRequiredPermissionSets; i++) { Loading Loading @@ -967,6 +973,16 @@ public final class MediaRoute2Info implements Parcelable { || mAllowedPackages.contains(packageName); } /** * @hide */ public boolean isVisibleTo(@NonNull String packageName, boolean callerIsPrivileged) { // TODO(b/426044649) - see the comment above on the mAlsoAllowPrivilegedPackages member // variable when removing the enableRouteVisibilityControlApi flag. return isVisibleTo(packageName) || (Flags.enableRouteVisibilityControlApi() && callerIsPrivileged && mAlsoAllowPrivilegedPackages); } /** * @return a list of permission sets - all the permissions in at least one of these sets must be * held to see this route. Loading Loading @@ -1047,6 +1063,7 @@ public final class MediaRoute2Info implements Parcelable { pw.println(indent + "mProviderId=" + mProviderId); pw.println(indent + "mIsVisibilityRestricted=" + mIsVisibilityRestricted); pw.println(indent + "mAllowedPackages=" + mAllowedPackages); pw.println(indent + "mAlsoAllowPrivilegedPackages=" + mAlsoAllowPrivilegedPackages); pw.println(indent + "mSuitabilityStatus=" + mSuitabilityStatus); pw.println(indent + "mRequiredPermissions=" + mRequiredPermissions); } Loading Loading @@ -1085,6 +1102,7 @@ public final class MediaRoute2Info implements Parcelable { && Objects.equals(mProviderId, other.mProviderId) && (mIsVisibilityRestricted == other.mIsVisibilityRestricted) && Objects.equals(mAllowedPackages, other.mAllowedPackages) && mAlsoAllowPrivilegedPackages == other.mAlsoAllowPrivilegedPackages && Objects.equals(mRequiredPermissions, other.mRequiredPermissions) && mSuitabilityStatus == other.mSuitabilityStatus; } Loading Loading @@ -1112,6 +1130,7 @@ public final class MediaRoute2Info implements Parcelable { mProviderId, mIsVisibilityRestricted, mAllowedPackages, mAlsoAllowPrivilegedPackages, mRequiredPermissions, mSuitabilityStatus); } Loading Loading @@ -1153,6 +1172,8 @@ public final class MediaRoute2Info implements Parcelable { .append(mIsVisibilityRestricted) .append(", allowedPackages=") .append(String.join(",", mAllowedPackages)) .append(", alsoAllowPrivilegedPackages=") .append(mAlsoAllowPrivilegedPackages) .append(", mRequiredPermissions=") .append(mRequiredPermissions.stream().map(set -> String.join(",", set)).collect( Collectors.joining("),(", "(", ")"))) Loading Loading @@ -1189,6 +1210,7 @@ public final class MediaRoute2Info implements Parcelable { dest.writeString(mProviderId); dest.writeBoolean(mIsVisibilityRestricted); dest.writeString8Array(mAllowedPackages.toArray(new String[0])); dest.writeBoolean(mAlsoAllowPrivilegedPackages); dest.writeInt(mRequiredPermissions.size()); for (Set<String> permissionSet : mRequiredPermissions) { dest.writeString8Array(permissionSet.toArray(new String[0])); Loading Loading @@ -1341,6 +1363,12 @@ public final class MediaRoute2Info implements Parcelable { private String mProviderId; private boolean mIsVisibilityRestricted; private Set<String> mAllowedPackages; // TODO(b/426044649) - when cleaning up the FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API flag, // coalesce the mIsVisibilityRestricted and mAlsoAllowPrivilegedPackages booleans into an // IntDef with the following 3 states: // VISIBILITY_PUBLIC, VISIBILITY_RESTRICTED_TO_ALLOWLIST, and // VISIBILITY_RESTRICTED_TO_ALLOWLIST_AND_PRIVILEGED private boolean mAlsoAllowPrivilegedPackages; private List<Set<String>> mRequiredPermissions; @SuitabilityStatus private int mSuitabilityStatus; Loading Loading @@ -1416,6 +1444,7 @@ public final class MediaRoute2Info implements Parcelable { mProviderId = routeInfo.mProviderId; mIsVisibilityRestricted = routeInfo.mIsVisibilityRestricted; mAllowedPackages = routeInfo.mAllowedPackages; mAlsoAllowPrivilegedPackages = routeInfo.mAlsoAllowPrivilegedPackages; mSuitabilityStatus = routeInfo.mSuitabilityStatus; mRequiredPermissions = routeInfo.mRequiredPermissions; } Loading Loading @@ -1651,6 +1680,7 @@ public final class MediaRoute2Info implements Parcelable { public Builder setVisibilityPublic() { mIsVisibilityRestricted = false; mAllowedPackages = Set.of(); mAlsoAllowPrivilegedPackages = false; mRequiredPermissions = List.of(); return this; } Loading @@ -1672,6 +1702,29 @@ public final class MediaRoute2Info implements Parcelable { public Builder setVisibilityRestricted(@NonNull Set<String> allowedPackages) { mIsVisibilityRestricted = true; mAllowedPackages = Set.copyOf(allowedPackages); mAlsoAllowPrivilegedPackages = false; return this; } /** * Sets the visibility of this route to restricted. * * @param allowedPackages set of package names which are allowed to see this route. * @param alsoAllowPrivileged whether packages not explicitly listed in allowedPackages, but * holding {@link MediaRouter2#getInstance(Context, String, Executor, Runnable) * privileged routing permissions}, can also see this route. */ @NonNull // No getter, as we don't want to leak information about other installed packages. @SuppressLint("MissingGetterMatchingBuilder") @FlaggedApi(FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API) public Builder setVisibilityRestricted(@NonNull Set<String> allowedPackages, boolean alsoAllowPrivileged) { // TODO(b/426044649) - when cleaning up the FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API // flag, make the other version of setVisibilityRestricted call through to this one. mIsVisibilityRestricted = true; mAllowedPackages = Set.copyOf(allowedPackages); mAlsoAllowPrivilegedPackages = alsoAllowPrivileged; return this; } Loading services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +5 −2 Original line number Diff line number Diff line Loading @@ -2731,7 +2731,9 @@ class MediaRouter2ServiceImpl { private List<MediaRoute2Info> getVisibleRoutes(@NonNull List<MediaRoute2Info> routes) { List<MediaRoute2Info> filteredRoutes = new ArrayList<>(); for (MediaRoute2Info route : routes) { if (route.isVisibleTo(mPackageName) && hasPermissionsToSeeRoute(route)) { if (route.isVisibleTo(mPackageName, mHasMediaRoutingControl || mHasMediaContentControlPermission) && hasPermissionsToSeeRoute(route)) { filteredRoutes.add(route); } } Loading Loading @@ -2927,7 +2929,8 @@ class MediaRouter2ServiceImpl { } List<MediaRoute2Info> filteredRoutes = new ArrayList<>(); for (MediaRoute2Info route : routes) { if (route.isVisibleTo(mTargetPackageName)) { if (route.isVisibleTo(mTargetPackageName, mHasMediaRoutingControl || mHasMediaContentControl)) { filteredRoutes.add(route); } } Loading Loading
core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -25357,6 +25357,7 @@ package android.media { method @NonNull public android.media.MediaRoute2Info.Builder setType(int); method @NonNull public android.media.MediaRoute2Info.Builder setVisibilityPublic(); method @NonNull public android.media.MediaRoute2Info.Builder setVisibilityRestricted(@NonNull java.util.Set<java.lang.String>); method @FlaggedApi("com.android.media.flags.enable_route_visibility_control_api") @NonNull public android.media.MediaRoute2Info.Builder setVisibilityRestricted(@NonNull java.util.Set<java.lang.String>, boolean); method @NonNull public android.media.MediaRoute2Info.Builder setVolume(int); method @NonNull public android.media.MediaRoute2Info.Builder setVolumeHandling(int); method @NonNull public android.media.MediaRoute2Info.Builder setVolumeMax(int);
media/java/android/media/MediaRoute2Info.java +53 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.annotation.TestApi; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.os.Parcel; Loading @@ -40,6 +41,7 @@ import android.os.Parcelable; import android.text.TextUtils; import com.android.internal.util.Preconditions; import com.android.media.flags.Flags; import java.io.PrintWriter; import java.lang.annotation.Retention; Loading @@ -50,6 +52,7 @@ import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.concurrent.Executor; import java.util.stream.Collectors; /** Loading Loading @@ -642,6 +645,7 @@ public final class MediaRoute2Info implements Parcelable { private final String mProviderId; private final boolean mIsVisibilityRestricted; private final Set<String> mAllowedPackages; private final boolean mAlsoAllowPrivilegedPackages; private final List<Set<String>> mRequiredPermissions; @SuitabilityStatus private final int mSuitabilityStatus; Loading @@ -666,6 +670,7 @@ public final class MediaRoute2Info implements Parcelable { mProviderId = builder.mProviderId; mIsVisibilityRestricted = builder.mIsVisibilityRestricted; mAllowedPackages = builder.mAllowedPackages; mAlsoAllowPrivilegedPackages = builder.mAlsoAllowPrivilegedPackages; mSuitabilityStatus = builder.mSuitabilityStatus; mRequiredPermissions = List.copyOf(builder.mRequiredPermissions); } Loading @@ -692,6 +697,7 @@ public final class MediaRoute2Info implements Parcelable { mProviderId = in.readString(); mIsVisibilityRestricted = in.readBoolean(); mAllowedPackages = Set.of(in.createString8Array()); mAlsoAllowPrivilegedPackages = in.readBoolean(); ArrayList<Set<String>> requiredPermissions = new ArrayList<>(); int numRequiredPermissionSets = in.readInt(); for (int i = 0; i < numRequiredPermissionSets; i++) { Loading Loading @@ -967,6 +973,16 @@ public final class MediaRoute2Info implements Parcelable { || mAllowedPackages.contains(packageName); } /** * @hide */ public boolean isVisibleTo(@NonNull String packageName, boolean callerIsPrivileged) { // TODO(b/426044649) - see the comment above on the mAlsoAllowPrivilegedPackages member // variable when removing the enableRouteVisibilityControlApi flag. return isVisibleTo(packageName) || (Flags.enableRouteVisibilityControlApi() && callerIsPrivileged && mAlsoAllowPrivilegedPackages); } /** * @return a list of permission sets - all the permissions in at least one of these sets must be * held to see this route. Loading Loading @@ -1047,6 +1063,7 @@ public final class MediaRoute2Info implements Parcelable { pw.println(indent + "mProviderId=" + mProviderId); pw.println(indent + "mIsVisibilityRestricted=" + mIsVisibilityRestricted); pw.println(indent + "mAllowedPackages=" + mAllowedPackages); pw.println(indent + "mAlsoAllowPrivilegedPackages=" + mAlsoAllowPrivilegedPackages); pw.println(indent + "mSuitabilityStatus=" + mSuitabilityStatus); pw.println(indent + "mRequiredPermissions=" + mRequiredPermissions); } Loading Loading @@ -1085,6 +1102,7 @@ public final class MediaRoute2Info implements Parcelable { && Objects.equals(mProviderId, other.mProviderId) && (mIsVisibilityRestricted == other.mIsVisibilityRestricted) && Objects.equals(mAllowedPackages, other.mAllowedPackages) && mAlsoAllowPrivilegedPackages == other.mAlsoAllowPrivilegedPackages && Objects.equals(mRequiredPermissions, other.mRequiredPermissions) && mSuitabilityStatus == other.mSuitabilityStatus; } Loading Loading @@ -1112,6 +1130,7 @@ public final class MediaRoute2Info implements Parcelable { mProviderId, mIsVisibilityRestricted, mAllowedPackages, mAlsoAllowPrivilegedPackages, mRequiredPermissions, mSuitabilityStatus); } Loading Loading @@ -1153,6 +1172,8 @@ public final class MediaRoute2Info implements Parcelable { .append(mIsVisibilityRestricted) .append(", allowedPackages=") .append(String.join(",", mAllowedPackages)) .append(", alsoAllowPrivilegedPackages=") .append(mAlsoAllowPrivilegedPackages) .append(", mRequiredPermissions=") .append(mRequiredPermissions.stream().map(set -> String.join(",", set)).collect( Collectors.joining("),(", "(", ")"))) Loading Loading @@ -1189,6 +1210,7 @@ public final class MediaRoute2Info implements Parcelable { dest.writeString(mProviderId); dest.writeBoolean(mIsVisibilityRestricted); dest.writeString8Array(mAllowedPackages.toArray(new String[0])); dest.writeBoolean(mAlsoAllowPrivilegedPackages); dest.writeInt(mRequiredPermissions.size()); for (Set<String> permissionSet : mRequiredPermissions) { dest.writeString8Array(permissionSet.toArray(new String[0])); Loading Loading @@ -1341,6 +1363,12 @@ public final class MediaRoute2Info implements Parcelable { private String mProviderId; private boolean mIsVisibilityRestricted; private Set<String> mAllowedPackages; // TODO(b/426044649) - when cleaning up the FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API flag, // coalesce the mIsVisibilityRestricted and mAlsoAllowPrivilegedPackages booleans into an // IntDef with the following 3 states: // VISIBILITY_PUBLIC, VISIBILITY_RESTRICTED_TO_ALLOWLIST, and // VISIBILITY_RESTRICTED_TO_ALLOWLIST_AND_PRIVILEGED private boolean mAlsoAllowPrivilegedPackages; private List<Set<String>> mRequiredPermissions; @SuitabilityStatus private int mSuitabilityStatus; Loading Loading @@ -1416,6 +1444,7 @@ public final class MediaRoute2Info implements Parcelable { mProviderId = routeInfo.mProviderId; mIsVisibilityRestricted = routeInfo.mIsVisibilityRestricted; mAllowedPackages = routeInfo.mAllowedPackages; mAlsoAllowPrivilegedPackages = routeInfo.mAlsoAllowPrivilegedPackages; mSuitabilityStatus = routeInfo.mSuitabilityStatus; mRequiredPermissions = routeInfo.mRequiredPermissions; } Loading Loading @@ -1651,6 +1680,7 @@ public final class MediaRoute2Info implements Parcelable { public Builder setVisibilityPublic() { mIsVisibilityRestricted = false; mAllowedPackages = Set.of(); mAlsoAllowPrivilegedPackages = false; mRequiredPermissions = List.of(); return this; } Loading @@ -1672,6 +1702,29 @@ public final class MediaRoute2Info implements Parcelable { public Builder setVisibilityRestricted(@NonNull Set<String> allowedPackages) { mIsVisibilityRestricted = true; mAllowedPackages = Set.copyOf(allowedPackages); mAlsoAllowPrivilegedPackages = false; return this; } /** * Sets the visibility of this route to restricted. * * @param allowedPackages set of package names which are allowed to see this route. * @param alsoAllowPrivileged whether packages not explicitly listed in allowedPackages, but * holding {@link MediaRouter2#getInstance(Context, String, Executor, Runnable) * privileged routing permissions}, can also see this route. */ @NonNull // No getter, as we don't want to leak information about other installed packages. @SuppressLint("MissingGetterMatchingBuilder") @FlaggedApi(FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API) public Builder setVisibilityRestricted(@NonNull Set<String> allowedPackages, boolean alsoAllowPrivileged) { // TODO(b/426044649) - when cleaning up the FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API // flag, make the other version of setVisibilityRestricted call through to this one. mIsVisibilityRestricted = true; mAllowedPackages = Set.copyOf(allowedPackages); mAlsoAllowPrivilegedPackages = alsoAllowPrivileged; return this; } Loading
services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +5 −2 Original line number Diff line number Diff line Loading @@ -2731,7 +2731,9 @@ class MediaRouter2ServiceImpl { private List<MediaRoute2Info> getVisibleRoutes(@NonNull List<MediaRoute2Info> routes) { List<MediaRoute2Info> filteredRoutes = new ArrayList<>(); for (MediaRoute2Info route : routes) { if (route.isVisibleTo(mPackageName) && hasPermissionsToSeeRoute(route)) { if (route.isVisibleTo(mPackageName, mHasMediaRoutingControl || mHasMediaContentControlPermission) && hasPermissionsToSeeRoute(route)) { filteredRoutes.add(route); } } Loading Loading @@ -2927,7 +2929,8 @@ class MediaRouter2ServiceImpl { } List<MediaRoute2Info> filteredRoutes = new ArrayList<>(); for (MediaRoute2Info route : routes) { if (route.isVisibleTo(mTargetPackageName)) { if (route.isVisibleTo(mTargetPackageName, mHasMediaRoutingControl || mHasMediaContentControl)) { filteredRoutes.add(route); } } Loading