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

Commit df1db278 authored by Kyunglyul Hyun's avatar Kyunglyul Hyun Committed by Automerger Merge Worker
Browse files

Merge "Correct SystemMediaRoute2Provider#requestCreateSession" into rvc-dev am: 61b20fd6

Change-Id: I277420bad329f82a8c2ed2a626550a5abea5f58c
parents 15168fb6 61b20fd6
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -519,6 +519,7 @@ public abstract class MediaRoute2ProviderService extends Service {
                    requestCreateSession));
        }

        //TODO: Ignore requests with unknown session ID.
        @Override
        public void selectRoute(long requestId, String sessionId, String routeId) {
            if (!checkCallerisSystem()) {
+2 −1
Original line number Diff line number Diff line
@@ -604,7 +604,8 @@ public final class MediaRouter2 {

        RoutingController oldController = getCurrentController();
        if (!oldController.releaseInternal(
                /* shouldReleaseSession= */ true, /* shouldNotifyStop= */ false)) {
                /* shouldReleaseSession= */ matchingRequest != null,
                /* shouldNotifyStop= */ false)) {
            // Could not release the controller since it was just released by other thread.
            oldController = getSystemController();
        }
+1 −2
Original line number Diff line number Diff line
@@ -314,7 +314,6 @@ public final class MediaRouter2Manager {

        //TODO: Ignore unknown route.
        if (sessionInfo.getTransferableRoutes().contains(route.getId())) {
            //TODO: callbacks must be called after this.
            transferToRoute(sessionInfo, route);
            return;
        }
@@ -340,7 +339,6 @@ public final class MediaRouter2Manager {
            } catch (RemoteException ex) {
                Log.e(TAG, "Unable to select media route", ex);
            }
            releaseSession(sessionInfo);
        }
    }

@@ -489,6 +487,7 @@ public final class MediaRouter2Manager {
            notifyTransferFailed(matchingRequest.mOldSessionInfo, requestedRoute);
            return;
        }
        releaseSession(matchingRequest.mOldSessionInfo);
        notifyTransferred(matchingRequest.mOldSessionInfo, sessionInfo);
    }

+9 −2
Original line number Diff line number Diff line
@@ -1574,8 +1574,15 @@ class MediaRouter2ServiceImpl {
            }

            // Succeeded
            if (sessionInfo.isSystemSession()
                    && !matchingRequest.mRouterRecord.mHasModifyAudioRoutingPermission) {
                notifySessionCreatedToRouter(matchingRequest.mRouterRecord,
                        toOriginalRequestId(uniqueRequestId),
                        mSystemProvider.getDefaultSessionInfo());
            } else {
                notifySessionCreatedToRouter(matchingRequest.mRouterRecord,
                        toOriginalRequestId(uniqueRequestId), sessionInfo);
            }
            mSessionToRouterMap.put(sessionInfo.getId(), routerRecord);
        }

+53 −2
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.media.IAudioRoutesObserver;
import android.media.IAudioService;
import android.media.MediaRoute2Info;
import android.media.MediaRoute2ProviderInfo;
import android.media.MediaRoute2ProviderService;
import android.media.RouteDiscoveryPreference;
import android.media.RoutingSessionInfo;
import android.os.Bundle;
@@ -47,6 +48,7 @@ import android.text.TextUtils;
import android.util.Log;

import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;

import java.util.Objects;

@@ -80,6 +82,10 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
    RoutingSessionInfo mDefaultSessionInfo;
    final AudioRoutesInfo mCurAudioRoutesInfo = new AudioRoutesInfo();

    private final Object mRequestLock = new Object();
    @GuardedBy("mRequestLock")
    private volatile SessionCreationRequest mPendingSessionCreationRequest;

    final IAudioRoutesObserver.Stub mAudioRoutesObserver = new IAudioRoutesObserver.Stub() {
        @Override
        public void dispatchAudioRoutesChanged(final AudioRoutesInfo newRoutes) {
@@ -135,10 +141,27 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
    @Override
    public void requestCreateSession(long requestId, String packageName, String routeId,
            Bundle sessionHints) {
        // Assume a router without MODIFY_AUDIO_ROUTING permission can't request with
        // a route ID different from the default route ID. The service should've filtered.
        if (TextUtils.equals(routeId, DEFAULT_ROUTE_ID)) {
            mCallback.onSessionCreated(this, requestId, mDefaultSessionInfo);
            return;
        }
        if (TextUtils.equals(routeId, mSelectedRouteId)) {
            mCallback.onSessionCreated(this, requestId, mSessionInfos.get(0));
            return;
        }

        synchronized (mRequestLock) {
            // Handle the previous request as a failure if exists.
            if (mPendingSessionCreationRequest != null) {
                mCallback.onRequestFailed(this, mPendingSessionCreationRequest.mRequestId,
                        MediaRoute2ProviderService.REASON_UNKNOWN_ERROR);
            }
            mPendingSessionCreationRequest = new SessionCreationRequest(requestId, routeId);
        }

        transferToRoute(requestId, SYSTEM_SESSION_ID, routeId);
        mCallback.onSessionCreated(this, requestId, mSessionInfos.get(0));
        //TODO: We should call after the session info is changed.
    }

    @Override
@@ -280,6 +303,24 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
            }

            RoutingSessionInfo newSessionInfo = builder.setProviderId(mUniqueId).build();

            if (mPendingSessionCreationRequest != null) {
                SessionCreationRequest sessionCreationRequest;
                synchronized (mRequestLock) {
                    sessionCreationRequest = mPendingSessionCreationRequest;
                    mPendingSessionCreationRequest = null;
                }
                if (sessionCreationRequest != null) {
                    if (TextUtils.equals(mSelectedRouteId, sessionCreationRequest.mRouteId)) {
                        mCallback.onSessionCreated(this,
                                sessionCreationRequest.mRequestId, newSessionInfo);
                    } else {
                        mCallback.onRequestFailed(this, sessionCreationRequest.mRequestId,
                                MediaRoute2ProviderService.REASON_UNKNOWN_ERROR);
                    }
                }
            }

            if (Objects.equals(oldSessionInfo, newSessionInfo)) {
                return false;
            } else {
@@ -310,6 +351,16 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
        mCallback.onSessionUpdated(this, sessionInfo);
    }

    private static class SessionCreationRequest {
        final long mRequestId;
        final String mRouteId;

        SessionCreationRequest(long requestId, String routeId) {
            this.mRequestId = requestId;
            this.mRouteId = routeId;
        }
    }

    private class VolumeChangeReceiver extends BroadcastReceiver {
        // This will be called in the main thread.
        @Override