diff options
| -rw-r--r-- | core/api/current.txt | 3 | ||||
| -rw-r--r-- | media/java/android/media/MediaRoute2Info.java | 51 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java | 21 | 
3 files changed, 58 insertions, 17 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 0fe8717e8954..098bd2ebcc58 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -24921,7 +24921,7 @@ package android.media {      method @Nullable public android.net.Uri getIconUri();      method @NonNull public String getId();      method @NonNull public CharSequence getName(); -    method @FlaggedApi("com.android.media.flags.enable_route_visibility_control_api") @NonNull public java.util.Set<java.lang.String> getRequiredPermissions(); +    method @FlaggedApi("com.android.media.flags.enable_route_visibility_control_api") @NonNull public java.util.List<java.util.Set<java.lang.String>> getRequiredPermissions();      method @FlaggedApi("com.android.media.flags.enable_built_in_speaker_route_suitability_statuses") public int getSuitabilityStatus();      method @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") public int getSupportedRoutingTypes();      method public int getType(); @@ -24991,6 +24991,7 @@ package android.media {      method @NonNull public android.media.MediaRoute2Info.Builder setExtras(@Nullable android.os.Bundle);      method @NonNull public android.media.MediaRoute2Info.Builder setIconUri(@Nullable android.net.Uri);      method @FlaggedApi("com.android.media.flags.enable_route_visibility_control_api") @NonNull public android.media.MediaRoute2Info.Builder setRequiredPermissions(@NonNull java.util.Set<java.lang.String>); +    method @FlaggedApi("com.android.media.flags.enable_route_visibility_control_api") @NonNull public android.media.MediaRoute2Info.Builder setRequiredPermissions(@NonNull java.util.List<java.util.Set<java.lang.String>>);      method @FlaggedApi("com.android.media.flags.enable_built_in_speaker_route_suitability_statuses") @NonNull public android.media.MediaRoute2Info.Builder setSuitabilityStatus(int);      method @FlaggedApi("com.android.media.flags.enable_mirroring_in_media_router_2") @NonNull public android.media.MediaRoute2Info.Builder setSupportedRoutingTypes(int);      method @NonNull public android.media.MediaRoute2Info.Builder setType(int); diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java index 54f172c05b69..a3ad340f6ef4 100644 --- a/media/java/android/media/MediaRoute2Info.java +++ b/media/java/android/media/MediaRoute2Info.java @@ -49,6 +49,7 @@ import java.util.List;  import java.util.Locale;  import java.util.Objects;  import java.util.Set; +import java.util.stream.Collectors;  /**   * Describes the properties of a route. @@ -640,7 +641,7 @@ public final class MediaRoute2Info implements Parcelable {      private final String mProviderId;      private final boolean mIsVisibilityRestricted;      private final Set<String> mAllowedPackages; -    private final Set<String> mRequiredPermissions; +    private final List<Set<String>> mRequiredPermissions;      @SuitabilityStatus private final int mSuitabilityStatus;      MediaRoute2Info(@NonNull Builder builder) { @@ -665,7 +666,7 @@ public final class MediaRoute2Info implements Parcelable {          mIsVisibilityRestricted = builder.mIsVisibilityRestricted;          mAllowedPackages = builder.mAllowedPackages;          mSuitabilityStatus = builder.mSuitabilityStatus; -        mRequiredPermissions = Set.copyOf(builder.mRequiredPermissions); +        mRequiredPermissions = List.copyOf(builder.mRequiredPermissions);      }      MediaRoute2Info(@NonNull Parcel in) { @@ -690,7 +691,12 @@ public final class MediaRoute2Info implements Parcelable {          mProviderId = in.readString();          mIsVisibilityRestricted = in.readBoolean();          mAllowedPackages = Set.of(in.createString8Array()); -        mRequiredPermissions = Set.of(in.createString8Array()); +        ArrayList<Set<String>> requiredPermissions = new ArrayList<>(); +        int numRequiredPermissionSets = in.readInt(); +        for (int i = 0; i < numRequiredPermissionSets; i++) { +            requiredPermissions.add(Set.of(in.createString8Array())); +        } +        mRequiredPermissions = List.copyOf(requiredPermissions); // Use copyOf to make it immutable.          mSuitabilityStatus = in.readInt();      } @@ -934,11 +940,12 @@ public final class MediaRoute2Info implements Parcelable {      }      /** -     * @return the set of permissions which must be held to see this route +     * @return a list of permission sets - all the permissions in at least one of these sets must be +     * held to see this route.       */      @NonNull      @FlaggedApi(FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API) -    public Set<String> getRequiredPermissions() { +    public List<Set<String>> getRequiredPermissions() {          return mRequiredPermissions;      } @@ -1119,7 +1126,8 @@ public final class MediaRoute2Info implements Parcelable {                  .append(", allowedPackages=")                  .append(String.join(",", mAllowedPackages))                  .append(", mRequiredPermissions=") -                .append(String.join(",", mRequiredPermissions)) +                .append(mRequiredPermissions.stream().map(set -> String.join(",", set)).collect( +                                Collectors.joining("),(", "(", ")")))                  .append(", suitabilityStatus=")                  .append(mSuitabilityStatus)                  .append(" }") @@ -1153,7 +1161,10 @@ public final class MediaRoute2Info implements Parcelable {          dest.writeString(mProviderId);          dest.writeBoolean(mIsVisibilityRestricted);          dest.writeString8Array(mAllowedPackages.toArray(new String[0])); -        dest.writeString8Array(mRequiredPermissions.toArray(new String[0])); +        dest.writeInt(mRequiredPermissions.size()); +        for (Set<String> permissionSet : mRequiredPermissions) { +            dest.writeString8Array(permissionSet.toArray(new String[0])); +        }          dest.writeInt(mSuitabilityStatus);      } @@ -1302,7 +1313,7 @@ public final class MediaRoute2Info implements Parcelable {          private String mProviderId;          private boolean mIsVisibilityRestricted;          private Set<String> mAllowedPackages; -        private Set<String> mRequiredPermissions; +        private List<Set<String>> mRequiredPermissions;          @SuitabilityStatus private int mSuitabilityStatus;          /** @@ -1328,7 +1339,7 @@ public final class MediaRoute2Info implements Parcelable {              mDeduplicationIds = Set.of();              mAllowedPackages = Set.of();              mSuitabilityStatus = SUITABILITY_STATUS_SUITABLE_FOR_DEFAULT_TRANSFER; -            mRequiredPermissions = Set.of(); +            mRequiredPermissions = List.of();          }          /** @@ -1610,7 +1621,7 @@ public final class MediaRoute2Info implements Parcelable {          public Builder setVisibilityPublic() {              mIsVisibilityRestricted = false;              mAllowedPackages = Set.of(); -            mRequiredPermissions = Set.of(); +            mRequiredPermissions = List.of();              return this;          } @@ -1637,13 +1648,31 @@ public final class MediaRoute2Info implements Parcelable {          /**           * Limits the visibility of this route to holders of a set of permissions.           * +         * <p>Calls to this method override any previous calls of +         * {@link #setRequiredPermissions(Set)} or {@link #setRequiredPermissions(List)}. +         *           * @param requiredPermissions the list of all permissions which must be held in order to           *                            see this route.           */          @NonNull          @FlaggedApi(FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API)          public Builder setRequiredPermissions(@NonNull Set<String> requiredPermissions) { -            mRequiredPermissions = Set.copyOf(requiredPermissions); +            return setRequiredPermissions(List.of(requiredPermissions)); +        } + +        /** +         * Limits the visibility of this route to holders of one of a set of permissions. +         * +         * <p>Calls to this method override any previous calls of +         * {@link #setRequiredPermissions(Set)} or {@link #setRequiredPermissions(List)}. +         * +         * @param requiresOneOf a list of Sets of permissions. Holding all permissions in at least +         *                      one of the Sets is required for the route to be visible. +         */ +        @NonNull +        @FlaggedApi(FLAG_ENABLE_ROUTE_VISIBILITY_CONTROL_API) +        public Builder setRequiredPermissions(@NonNull List<Set<String>> requiresOneOf) { +            mRequiredPermissions = List.copyOf(requiresOneOf);              return this;          } diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index ab68ed3e73c6..abc067d4aa9c 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -2347,13 +2347,24 @@ class MediaRouter2ServiceImpl {              if (!Flags.enableRouteVisibilityControlApi()) {                  return true;              } -            for (String permission : route.getRequiredPermissions()) { -                if (mContext.checkPermission(permission, mPid, mUid) -                        != PackageManager.PERMISSION_GRANTED) { -                    return false; +            List<Set<String>> permissionSets = route.getRequiredPermissions(); +            if (permissionSets.isEmpty()) { +                return true; +            } +            for (Set<String> permissionSet : permissionSets) { +                boolean hasAllInSet = true; +                for (String permission : permissionSet) { +                    if (mContext.checkPermission(permission, mPid, mUid) +                            != PackageManager.PERMISSION_GRANTED) { +                        hasAllInSet = false; +                        break; +                    } +                } +                if (hasAllInSet) { +                    return true;                  }              } -            return true; +            return false;          }      }  |