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

Commit fc6ad8d8 authored by Hyundo Moon's avatar Hyundo Moon Committed by Android (Google) Code Review
Browse files

Merge "Add MediaRouter2#requestSelectRoute and related logics"

parents b6dab8f8 4140fee0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ import android.media.IMediaRoute2ProviderClient;
 */
oneway interface IMediaRoute2Provider {
    void setClient(IMediaRoute2ProviderClient client);
    void selectRoute(String packageName, String id);
    void requestSelectRoute(String packageName, String id, int seq);
    void unselectRoute(String packageName, String id);
    void notifyControlRequestSent(String id, in Intent request);
    void requestSetVolume(String id, int volume);
+2 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package android.media;

import android.media.MediaRoute2Info;
import android.os.Bundle;

/**
 * @hide
@@ -26,4 +27,5 @@ oneway interface IMediaRouter2Client {
    void notifyRoutesAdded(in List<MediaRoute2Info> routes);
    void notifyRoutesRemoved(in List<MediaRoute2Info> routes);
    void notifyRoutesChanged(in List<MediaRoute2Info> routes);
    void notifyRouteSelected(in MediaRoute2Info route, int reason, in Bundle controlHints);
}
+1 −1
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ interface IMediaRouterService {
     * @param client the client that changes it's selected route
     * @param route the route to be selected
     */
    void selectRoute2(IMediaRouter2Client client, in @nullable MediaRoute2Info route);
    void requestSelectRoute2(IMediaRouter2Client client, in @nullable MediaRoute2Info route);
    void setControlCategories2(IMediaRouter2Client client, in List<String> categories);

    void registerManager(IMediaRouter2Manager manager, String packageName);
+3 −1
Original line number Diff line number Diff line
@@ -128,7 +128,9 @@ public abstract class MediaRoute2ProviderService extends Service {
        }

        @Override
        public void selectRoute(String packageName, String id) {
        public void requestSelectRoute(String packageName, String id, int seq) {
            // TODO: When introducing MediaRoute2ProviderService#sendConnectionHints(),
            // use the sequence number here properly.
            mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onSelectRoute,
                    MediaRoute2ProviderService.this, packageName, id));
        }
+46 −12
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.text.TextUtils;
import android.util.Log;

import com.android.internal.annotations.GuardedBy;
@@ -103,6 +104,8 @@ public class MediaRouter2 {

    private MediaRoute2Info mSelectedRoute;
    @GuardedBy("sLock")
    private MediaRoute2Info mSelectingRoute;
    @GuardedBy("sLock")
    private Client mClient;

    final Handler mHandler;
@@ -250,24 +253,28 @@ public class MediaRouter2 {
    }

    /**
     * Selects the specified route.
     * Request to select the specified route. When the route is selected,
     * {@link Callback#onRouteSelected(MediaRoute2Info, int, Bundle)} will be called.
     *
     * @param route the route to select
     */
    //TODO: add a parameter for category (e.g. mirroring/casting)
    public void selectRoute(@NonNull MediaRoute2Info route) {
    public void requestSelectRoute(@NonNull MediaRoute2Info route) {
        Objects.requireNonNull(route, "route must not be null");

        Client client;
        synchronized (sLock) {
            mSelectedRoute = route;
            if (mSelectingRoute == route) {
                Log.w(TAG, "The route selection request is already sent.");
                return;
            }
            mSelectingRoute = route;
            client = mClient;
        }
        if (client != null) {
            try {
                mMediaRouterService.selectRoute2(client, route);
                mMediaRouterService.requestSelectRoute2(client, route);
            } catch (RemoteException ex) {
                Log.e(TAG, "Unable to select route.", ex);
                Log.e(TAG, "Unable to request to select route.", ex);
            }
        }
    }
@@ -443,6 +450,22 @@ public class MediaRouter2 {
        }
    }

    void selectRouteOnHandler(MediaRoute2Info route, int reason, Bundle controlHints) {
        synchronized (sLock) {
            if (reason == SELECT_REASON_USER_SELECTED) {
                if (mSelectingRoute == null
                        || !TextUtils.equals(mSelectingRoute.getUniqueId(), route.getUniqueId())) {
                    Log.w(TAG, "Ignoring invalid or outdated notifyRouteSelected call. "
                            + "selectingRoute=" + mSelectingRoute + " route=" + route);
                    return;
                }
            }
            mSelectingRoute = null;
        }
        mSelectedRoute = route;
        notifyRouteSelected(route, reason, controlHints);
    }

    private void refreshFilteredRoutes() {
        List<MediaRoute2Info> filteredRoutes = new ArrayList<>();

@@ -475,12 +498,17 @@ public class MediaRouter2 {
        }
    }

    private void notifyRouteSelected(MediaRoute2Info route, int reason, Bundle controlHints) {
        for (CallbackRecord record: mCallbackRecords) {
            record.mExecutor.execute(
                    () -> record.mCallback.onRouteSelected(route, reason, controlHints));
        }
    }

    /**
     * Interface for receiving events about media routing changes.
     */
    public static class Callback {
        //TODO: clean up these callbacks

        /**
         * Called when routes are added.
         * @param routes the list of routes that have been added. It's never empty.
@@ -505,12 +533,11 @@ public class MediaRouter2 {
         */
        public void onRoutesChanged(@NonNull List<MediaRoute2Info> routes) {}

        // TODO: Make this callback be called when we add requestSelectRoute().
        /**
         * Called when a route is selected. Exactly one route can be selected at a time.
         * @param route the selected route.
         * @param reason the reason why the route is selected.
         * @param connectionHints An optional bundle of provider-specific arguments which may be
         * @param controlHints An optional bundle of provider-specific arguments which may be
         *                     used to control the selected route. Can be empty.
         * @see #SELECT_REASON_UNKNOWN
         * @see #SELECT_REASON_USER_SELECTED
@@ -518,7 +545,7 @@ public class MediaRouter2 {
         * @see #getSelectedRoute()
         */
        public void onRouteSelected(@NonNull MediaRoute2Info route, @SelectReason int reason,
                @NonNull Bundle connectionHints) {}
                @NonNull Bundle controlHints) {}
    }

    final class CallbackRecord {
@@ -560,5 +587,12 @@ public class MediaRouter2 {
            mHandler.sendMessage(obtainMessage(MediaRouter2::changeRoutesOnHandler,
                    MediaRouter2.this, routes));
        }

        @Override
        public void notifyRouteSelected(MediaRoute2Info route, int reason,
                Bundle controlHints) {
            mHandler.sendMessage(obtainMessage(MediaRouter2::selectRouteOnHandler,
                    MediaRouter2.this, route, reason, controlHints));
        }
    }
}
Loading