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

Commit 475bb88d authored by Kyunglyul Hyun's avatar Kyunglyul Hyun Committed by Android (Google) Code Review
Browse files

Merge "Add missing tests for filtering routes"

parents f27990d7 54a4a1d5
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -23351,7 +23351,6 @@ package android.media {
    method @NonNull public java.util.List<java.lang.String> getAllowedPackages();
    method @NonNull public java.util.List<java.lang.String> getDeduplicationPackageOrder();
    method @NonNull public java.util.List<java.lang.String> getPreferredFeatures();
    method @NonNull public java.util.List<java.lang.String> getRequiredFeatures();
    method public boolean shouldPerformActiveScan();
    method public boolean shouldRemoveDuplicates();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
@@ -23365,7 +23364,6 @@ package android.media {
    method @NonNull public android.media.RouteDiscoveryPreference.Builder setAllowedPackages(@NonNull java.util.List<java.lang.String>);
    method @NonNull public android.media.RouteDiscoveryPreference.Builder setDeduplicationPackageOrder(@NonNull java.util.List<java.lang.String>);
    method @NonNull public android.media.RouteDiscoveryPreference.Builder setPreferredFeatures(@NonNull java.util.List<java.lang.String>);
    method @NonNull public android.media.RouteDiscoveryPreference.Builder setRequiredFeatures(@NonNull java.util.List<java.lang.String>);
    method @NonNull public android.media.RouteDiscoveryPreference.Builder setShouldPerformActiveScan(boolean);
  }
+3 −2
Original line number Diff line number Diff line
@@ -151,7 +151,7 @@ public final class MediaRoute2ProviderInfo implements Parcelable {
        }

        /**
         * Sets the unique id of the provider info.
         * Sets the package name and unique id of the provider info.
         * <p>
         * The unique id is automatically set by
         * {@link com.android.server.media.MediaRouterService} and used to identify providers.
@@ -160,7 +160,7 @@ public final class MediaRoute2ProviderInfo implements Parcelable {
         * @hide
         */
        @NonNull
        public Builder setUniqueId(@Nullable String uniqueId) {
        public Builder setUniqueId(@Nullable String packageName, @Nullable String uniqueId) {
            if (TextUtils.equals(mUniqueId, uniqueId)) {
                return this;
            }
@@ -169,6 +169,7 @@ public final class MediaRoute2ProviderInfo implements Parcelable {
            final ArrayMap<String, MediaRoute2Info> newRoutes = new ArrayMap<>();
            for (Map.Entry<String, MediaRoute2Info> entry : mRoutes.entrySet()) {
                MediaRoute2Info routeWithProviderId = new MediaRoute2Info.Builder(entry.getValue())
                        .setPackageName(packageName)
                        .setProviderId(mUniqueId)
                        .build();
                newRoutes.put(routeWithProviderId.getOriginalId(), routeWithProviderId);
+11 −17
Original line number Diff line number Diff line
@@ -478,13 +478,8 @@ public final class MediaRouter2 {
            if (mShouldUpdateRoutes) {
                mShouldUpdateRoutes = false;

                List<MediaRoute2Info> filteredRoutes = new ArrayList<>();
                for (MediaRoute2Info route : mRoutes.values()) {
                    if (route.hasAnyFeatures(mDiscoveryPreference.getPreferredFeatures())) {
                        filteredRoutes.add(route);
                    }
                }
                mFilteredRoutes = Collections.unmodifiableList(filteredRoutes);
                mFilteredRoutes = Collections.unmodifiableList(
                        filterRoutes(List.copyOf(mRoutes.values()), mDiscoveryPreference));
            }
        }
        return mFilteredRoutes;
@@ -1087,16 +1082,17 @@ public final class MediaRouter2 {

        List<MediaRoute2Info> filteredRoutes = new ArrayList<>();
        for (MediaRoute2Info route : getSortedRoutes(routes, discoveryPreference)) {
            if (!route.hasAllFeatures(discoveryPreference.getRequiredFeatures())
                    || !route.hasAnyFeatures(discoveryPreference.getPreferredFeatures())) {
            if (!route.hasAnyFeatures(discoveryPreference.getPreferredFeatures())) {
                continue;
            }
            if (!discoveryPreference.getAllowedPackages().isEmpty()
                    && !discoveryPreference.getAllowedPackages().contains(route.getPackageName())) {
                    && (route.getPackageName() == null
                    || !discoveryPreference.getAllowedPackages()
                            .contains(route.getPackageName()))) {
                continue;
            }
            if (discoveryPreference.shouldRemoveDuplicates()) {
                if (Collections.disjoint(deduplicationIdSet, route.getDeduplicationIds())) {
                if (!Collections.disjoint(deduplicationIdSet, route.getDeduplicationIds())) {
                    continue;
                }
                deduplicationIdSet.addAll(route.getDeduplicationIds());
@@ -2087,19 +2083,17 @@ public final class MediaRouter2 {
        }

        @Override
        public void onPreferredFeaturesChanged(@NonNull String packageName,
                @NonNull List<String> preferredFeatures) {
        public void onDiscoveryPreferenceChanged(@NonNull String packageName,
                @NonNull RouteDiscoveryPreference preference) {
            if (!TextUtils.equals(mClientPackageName, packageName)) {
                return;
            }

            synchronized (mLock) {
                mDiscoveryPreference = new RouteDiscoveryPreference.Builder(
                        preferredFeatures, true).build();
                mDiscoveryPreference = preference;
            }

            updateAllRoutesFromManager();
            notifyPreferredFeaturesChanged(preferredFeatures);
            notifyPreferredFeaturesChanged(preference.getPreferredFeatures());
        }

        @Override
+6 −6
Original line number Diff line number Diff line
@@ -254,7 +254,7 @@ public final class MediaRouter2Manager {
    @NonNull
    public List<MediaRoute2Info> getAvailableRoutes(@NonNull RoutingSessionInfo sessionInfo) {
        return getFilteredRoutes(sessionInfo, /*includeSelectedRoutes=*/true,
                null);
                /*additionalFilter=*/null);
    }

    /**
@@ -315,20 +315,20 @@ public final class MediaRouter2Manager {
                routes.add(route);
                continue;
            }
            if (!route.hasAllFeatures(discoveryPreference.getRequiredFeatures())
                    || !route.hasAnyFeatures(discoveryPreference.getPreferredFeatures())) {
            if (!route.hasAnyFeatures(discoveryPreference.getPreferredFeatures())) {
                continue;
            }
            if (!discoveryPreference.getAllowedPackages().isEmpty()
                    && !discoveryPreference.getAllowedPackages()
                    .contains(route.getPackageName())) {
                    && (route.getPackageName() == null
                    || !discoveryPreference.getAllowedPackages()
                    .contains(route.getPackageName()))) {
                continue;
            }
            if (additionalFilter != null && !additionalFilter.test(route)) {
                continue;
            }
            if (discoveryPreference.shouldRemoveDuplicates()) {
                if (Collections.disjoint(deduplicationIdSet, route.getDeduplicationIds())) {
                if (!Collections.disjoint(deduplicationIdSet, route.getDeduplicationIds())) {
                    continue;
                }
                deduplicationIdSet.addAll(route.getDeduplicationIds());
+13 −51
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
@@ -65,8 +64,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
    @NonNull
    private final List<String> mPreferredFeatures;
    @NonNull
    private final List<String> mRequiredFeatures;
    @NonNull
    private final List<String> mPackageOrder;
    @NonNull
    private final List<String> mAllowedPackages;
@@ -85,7 +82,6 @@ public final class RouteDiscoveryPreference implements Parcelable {

    RouteDiscoveryPreference(@NonNull Builder builder) {
        mPreferredFeatures = builder.mPreferredFeatures;
        mRequiredFeatures = builder.mRequiredFeatures;
        mPackageOrder = builder.mPackageOrder;
        mAllowedPackages = builder.mAllowedPackages;
        mShouldPerformActiveScan = builder.mActiveScan;
@@ -94,7 +90,6 @@ public final class RouteDiscoveryPreference implements Parcelable {

    RouteDiscoveryPreference(@NonNull Parcel in) {
        mPreferredFeatures = in.createStringArrayList();
        mRequiredFeatures = in.createStringArrayList();
        mPackageOrder = in.createStringArrayList();
        mAllowedPackages = in.createStringArrayList();
        mShouldPerformActiveScan = in.readBoolean();
@@ -109,29 +104,12 @@ public final class RouteDiscoveryPreference implements Parcelable {
     * {@link MediaRoute2Info#FEATURE_LIVE_AUDIO}, {@link MediaRoute2Info#FEATURE_LIVE_VIDEO},
     * or {@link MediaRoute2Info#FEATURE_REMOTE_PLAYBACK} or custom features defined by a provider.
     * </p>
     *
     * @see #getRequiredFeatures()
     */
    @NonNull
    public List<String> getPreferredFeatures() {
        return mPreferredFeatures;
    }

    /**
     * Gets the required features of routes that media router would like to discover.
     * <p>
     * Routes that have all the required features will be discovered.
     * They may include predefined features such as
     * {@link MediaRoute2Info#FEATURE_LIVE_AUDIO}, {@link MediaRoute2Info#FEATURE_LIVE_VIDEO},
     * or {@link MediaRoute2Info#FEATURE_REMOTE_PLAYBACK} or custom features defined by a provider.
     *
     * @see #getPreferredFeatures()
     */
    @NonNull
    public List<String> getRequiredFeatures() {
        return mRequiredFeatures;
    }

    /**
     * Gets the ordered list of package names used to remove duplicate routes.
     * <p>
@@ -193,7 +171,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeStringList(mPreferredFeatures);
        dest.writeStringList(mRequiredFeatures);
        dest.writeStringList(mPackageOrder);
        dest.writeStringList(mAllowedPackages);
        dest.writeBoolean(mShouldPerformActiveScan);
@@ -224,7 +201,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
        }
        RouteDiscoveryPreference other = (RouteDiscoveryPreference) o;
        return Objects.equals(mPreferredFeatures, other.mPreferredFeatures)
                && Objects.equals(mRequiredFeatures, other.mRequiredFeatures)
                && Objects.equals(mPackageOrder, other.mPackageOrder)
                && Objects.equals(mAllowedPackages, other.mAllowedPackages)
                && mShouldPerformActiveScan == other.mShouldPerformActiveScan;
@@ -232,7 +208,7 @@ public final class RouteDiscoveryPreference implements Parcelable {

    @Override
    public int hashCode() {
        return Objects.hash(mPreferredFeatures, mRequiredFeatures, mPackageOrder, mAllowedPackages,
        return Objects.hash(mPreferredFeatures, mPackageOrder, mAllowedPackages,
                mShouldPerformActiveScan);
    }

@@ -241,7 +217,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
     */
    public static final class Builder {
        List<String> mPreferredFeatures;
        List<String> mRequiredFeatures;
        List<String> mPackageOrder;
        List<String> mAllowedPackages;

@@ -253,7 +228,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
            Objects.requireNonNull(preferredFeatures, "preferredFeatures must not be null");
            mPreferredFeatures = preferredFeatures.stream().filter(str -> !TextUtils.isEmpty(str))
                    .collect(Collectors.toList());
            mRequiredFeatures = List.of();
            mPackageOrder = List.of();
            mAllowedPackages = List.of();
            mActiveScan = activeScan;
@@ -263,7 +237,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
            Objects.requireNonNull(preference, "preference must not be null");

            mPreferredFeatures = preference.getPreferredFeatures();
            mRequiredFeatures = preference.getRequiredFeatures();
            mPackageOrder = preference.getDeduplicationPackageOrder();
            mAllowedPackages = preference.getAllowedPackages();
            mActiveScan = preference.shouldPerformActiveScan();
@@ -271,14 +244,8 @@ public final class RouteDiscoveryPreference implements Parcelable {
        }

        /**
         * A constructor to combine multiple preferences into a single preference. The combined
         * preference will discover a superset of the union of the routes discoverable by each of
         * the individual preferences.
         * <p>
         * When routes need to be discovered for multiple preferences, the combined preference can
         * be used to query route providers once and obtain all routes of interest. The obtained
         * routes can then be filtered for each of the individual preferences. This is typically
         * more efficient than querying route providers with each of the individual preferences.
         * A constructor to combine multiple preferences into a single preference.
         * It ignores extras of preferences.
         *
         * @hide
         */
@@ -286,15 +253,21 @@ public final class RouteDiscoveryPreference implements Parcelable {
            Objects.requireNonNull(preferences, "preferences must not be null");

            Set<String> preferredFeatures = new HashSet<>();
            Set<String> allowedPackages = new HashSet<>();
            mPackageOrder = List.of();
            boolean activeScan = false;
            for (RouteDiscoveryPreference preference : preferences) {
                preferredFeatures.addAll(preference.mPreferredFeatures);

                allowedPackages.addAll(preference.mAllowedPackages);
                activeScan |= preference.mShouldPerformActiveScan;
                // Choose one of either
                if (mPackageOrder.isEmpty() && !preference.mPackageOrder.isEmpty()) {
                    mPackageOrder = List.copyOf(preference.mPackageOrder);
                }
            mPreferredFeatures = new ArrayList<>(preferredFeatures);
            mRequiredFeatures = List.of();
            mPackageOrder = List.of();
            mAllowedPackages = List.of();
            }
            mPreferredFeatures = List.copyOf(preferredFeatures);
            mAllowedPackages = List.copyOf(allowedPackages);
            mActiveScan = activeScan;
        }

@@ -315,17 +288,6 @@ public final class RouteDiscoveryPreference implements Parcelable {
            return this;
        }

        /**
         * Sets the required route features to discover.
         */
        @NonNull
        public Builder setRequiredFeatures(@NonNull List<String> requiredFeatures) {
            Objects.requireNonNull(requiredFeatures, "preferredFeatures must not be null");
            mRequiredFeatures = requiredFeatures.stream().filter(str -> !TextUtils.isEmpty(str))
                    .collect(Collectors.toList());
            return this;
        }

        /**
         * Sets the list of package names of providers that media router would like to discover.
         * <p>
Loading