Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5390debd authored by Antony Sargent's avatar Antony Sargent
Browse files

Add a new overload of setVisibilityRestricted

This new version allows the caller to specify whether the route can
also be seen by packages holding privileged routing permissions in
addition to the list of explicit package names.

Bug: 426044649
Flag: com.android.media.flags.enable_route_visibility_control_api
Test: atest MediaRoute2InfoTest
Change-Id: Ie1b7ff7ed3897ebf86f037c30667aed6dff6d1f2
parent fe4c8b76
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -25326,6 +25326,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);
+53 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;

/**
@@ -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;

@@ -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);
    }
@@ -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++) {
@@ -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.
@@ -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);
    }
@@ -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;
    }
@@ -1112,6 +1130,7 @@ public final class MediaRoute2Info implements Parcelable {
                mProviderId,
                mIsVisibilityRestricted,
                mAllowedPackages,
                mAlsoAllowPrivilegedPackages,
                mRequiredPermissions,
                mSuitabilityStatus);
    }
@@ -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("),(", "(", ")")))
@@ -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]));
@@ -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;

@@ -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;
        }
@@ -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;
        }
@@ -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;
        }

+5 −2
Original line number Diff line number Diff line
@@ -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);
                }
            }
@@ -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);
                }
            }