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

Commit 60cc7b15 authored by Iván Budnik's avatar Iván Budnik
Browse files

Add RouteListingPreference getter and listener to MediaRouter2

This change enables MediaRouter2 instances to get updates for any
RouteListingPreference changes in the target app. The CL also exposes a
new getter for currently set RouteListingPreference.

Test: atest CtsMediaBetterTogetherTestCases
Bug: 192657812
Change-Id: I0dd292850600602eb972b701e64c944ea01c4a17
parent 112ecb8f
Loading
Loading
Loading
Loading
+121 −1
Original line number Diff line number Diff line
@@ -88,6 +88,8 @@ public final class MediaRouter2 {

    private final CopyOnWriteArrayList<RouteCallbackRecord> mRouteCallbackRecords =
            new CopyOnWriteArrayList<>();
    private final CopyOnWriteArrayList<RouteListingPreferenceCallbackRecord>
            mListingPreferenceCallbackRecords = new CopyOnWriteArrayList<>();
    private final CopyOnWriteArrayList<TransferCallbackRecord> mTransferCallbackRecords =
            new CopyOnWriteArrayList<>();
    private final CopyOnWriteArrayList<ControllerCallbackRecord> mControllerCallbackRecords =
@@ -383,6 +385,43 @@ public final class MediaRouter2 {
        mImpl.unregisterRouteCallback();
    }

    /**
     * Registers callback to be invoked when the {@link RouteListingPreference} of the target
     * router changes.
     *
     * <p>Calls using a previously registered callback will overwrite the callback record.
     *
     * @see #setRouteListingPreference(RouteListingPreference)
     * @hide
     */
    public void registerRouteListingPreferenceCallback(
            @NonNull @CallbackExecutor Executor executor,
            @NonNull RouteListingPreferenceCallback routeListingPreferenceCallback) {
        Objects.requireNonNull(executor, "executor must not be null");
        Objects.requireNonNull(routeListingPreferenceCallback, "callback must not be null");

        RouteListingPreferenceCallbackRecord record =
                new RouteListingPreferenceCallbackRecord(executor, routeListingPreferenceCallback);

        mListingPreferenceCallbackRecords.remove(record);
        mListingPreferenceCallbackRecords.add(record);
    }

    /**
     * Unregisters the given callback to not receive {@link RouteListingPreference} change events.
     *
     * @hide
     */
    public void unregisterRouteListingPreferenceCallback(
            @NonNull RouteListingPreferenceCallback callback) {
        Objects.requireNonNull(callback, "callback must not be null");

        if (!mListingPreferenceCallbackRecords.remove(
                new RouteListingPreferenceCallbackRecord(/* executor */ null, callback))) {
            Log.w(TAG, "unregisterRouteListingPreferenceCallback: Ignoring an unknown callback");
        }
    }

    /**
     * Shows the system output switcher dialog.
     *
@@ -453,6 +492,20 @@ public final class MediaRouter2 {
            } catch (RemoteException ex) {
                ex.rethrowFromSystemServer();
            }
            notifyRouteListingPreferenceUpdated(routeListingPreference);
        }
    }

    /**
     * Returns the current {@link RouteListingPreference} of the target router.
     *
     * @see #setRouteListingPreference(RouteListingPreference)
     * @hide
     */
    @Nullable
    public RouteListingPreference getRouteListingPreference() {
        synchronized (mLock) {
            return mRouteListingPreference;
        }
    }

@@ -1078,6 +1131,15 @@ public final class MediaRouter2 {
        }
    }

    private void notifyRouteListingPreferenceUpdated(@Nullable RouteListingPreference preference) {
        for (RouteListingPreferenceCallbackRecord record : mListingPreferenceCallbackRecords) {
            record.mExecutor.execute(
                    () ->
                            record.mRouteListingPreferenceCallback.onRouteListingPreferenceChanged(
                                    preference));
        }
    }

    private void notifyTransfer(RoutingController oldController, RoutingController newController) {
        for (TransferCallbackRecord record : mTransferCallbackRecords) {
            record.mExecutor.execute(
@@ -1161,6 +1223,12 @@ public final class MediaRouter2 {
        public void onPreferredFeaturesChanged(@NonNull List<String> preferredFeatures) {}
    }

    /** @hide */
    public abstract static class RouteListingPreferenceCallback {
        /** @hide */
        public void onRouteListingPreferenceChanged(@Nullable RouteListingPreference preference) {}
    }

    /** Callback for receiving events on media transfer. */
    public abstract static class TransferCallback {
        /**
@@ -1699,6 +1767,35 @@ public final class MediaRouter2 {
        }
    }

    private static final class RouteListingPreferenceCallbackRecord {
        public final Executor mExecutor;
        public final RouteListingPreferenceCallback mRouteListingPreferenceCallback;

        /* package */ RouteListingPreferenceCallbackRecord(
                @NonNull Executor executor,
                @NonNull RouteListingPreferenceCallback routeListingPreferenceCallback) {
            mExecutor = executor;
            mRouteListingPreferenceCallback = routeListingPreferenceCallback;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (!(obj instanceof RouteListingPreferenceCallbackRecord)) {
                return false;
            }
            return mRouteListingPreferenceCallback
                    == ((RouteListingPreferenceCallbackRecord) obj).mRouteListingPreferenceCallback;
        }

        @Override
        public int hashCode() {
            return mRouteListingPreferenceCallback.hashCode();
        }
    }

    static final class TransferCallbackRecord {
        public final Executor mExecutor;
        public final TransferCallback mTransferCallback;
@@ -2564,6 +2661,24 @@ public final class MediaRouter2 {
            notifyPreferredFeaturesChanged(preference.getPreferredFeatures());
        }

        private void onRouteListingPreferenceChangedOnHandler(
                @NonNull String packageName,
                @Nullable RouteListingPreference routeListingPreference) {
            if (!TextUtils.equals(getClientPackageName(), packageName)) {
                return;
            }

            synchronized (mLock) {
                if (Objects.equals(mRouteListingPreference, routeListingPreference)) {
                    return;
                }

                mRouteListingPreference = routeListingPreference;
            }

            notifyRouteListingPreferenceUpdated(routeListingPreference);
        }

        private void onRoutesUpdatedOnHandler(@NonNull List<MediaRoute2Info> routes) {
            synchronized (mLock) {
                mRoutes.clear();
@@ -2635,7 +2750,12 @@ public final class MediaRouter2 {
            @Override
            public void notifyRouteListingPreferenceChange(
                    String packageName, RouteListingPreference routeListingPreference) {
                // TODO(b/281067101): Add callback and getter for RouteListingPreference.
                mHandler.sendMessage(
                        obtainMessage(
                                ProxyMediaRouter2Impl::onRouteListingPreferenceChangedOnHandler,
                                ProxyMediaRouter2Impl.this,
                                packageName,
                                routeListingPreference));
            }

            @Override