diff options
5 files changed, 41 insertions, 188 deletions
diff --git a/media/java/android/media/IMediaRouterService.aidl b/media/java/android/media/IMediaRouterService.aidl index 81a7ee28c425..d803f04839b1 100644 --- a/media/java/android/media/IMediaRouterService.aidl +++ b/media/java/android/media/IMediaRouterService.aidl @@ -40,7 +40,6 @@ interface IMediaRouterService { void setSelectedRoute(IMediaRouterClient client, String routeId, boolean explicit); void requestSetVolume(IMediaRouterClient client, String routeId, int volume); void requestUpdateVolume(IMediaRouterClient client, String routeId, int direction); - void setControlCategories(IMediaRouterClient client, in List<String> categories); // Methods for media router 2 List<MediaRoute2Info> getSystemRoutes(); @@ -56,7 +55,7 @@ interface IMediaRouterService { * @param route the route to be selected */ void requestSelectRoute2(IMediaRouter2Client client, in @nullable MediaRoute2Info route); - void setControlCategories2(IMediaRouter2Client client, in List<String> categories); + void setControlCategories(IMediaRouter2Client client, in List<String> categories); void registerManager(IMediaRouter2Manager manager, String packageName); void unregisterManager(IMediaRouter2Manager manager); diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index 7b15d9554534..d72231f40dcf 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -49,8 +49,6 @@ import android.view.Display; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Objects; @@ -84,7 +82,6 @@ public class MediaRouter { final ArrayList<RouteInfo> mRoutes = new ArrayList<RouteInfo>(); final ArrayList<RouteCategory> mCategories = new ArrayList<RouteCategory>(); - List<String> mControlCategories = Collections.emptyList(); final RouteCategory mSystemCategory; @@ -361,18 +358,6 @@ public class MediaRouter { return mDisplayService.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION); } - public void setControlCategories(Collection<String> controlCategories) { - List<String> newControlCategories = new ArrayList<>(controlCategories); - mControlCategories = newControlCategories; - if (mClient != null) { - try { - mMediaRouterService.setControlCategories(mClient, newControlCategories); - } catch (RemoteException ex) { - Log.e(TAG, "Unable to set control categories.", ex); - } - } - } - private void updatePresentationDisplays(int changedDisplayId) { final int count = mRoutes.size(); for (int i = 0; i < count; i++) { @@ -421,7 +406,6 @@ public class MediaRouter { try { Client client = new Client(); mMediaRouterService.registerClientAsUser(client, mPackageName, userId); - mMediaRouterService.setControlCategories(client, mControlCategories); mClient = client; } catch (RemoteException ex) { Log.e(TAG, "Unable to register media router client.", ex); @@ -1318,20 +1302,6 @@ public class MediaRouter { sStatic.rebindAsUser(userId); } - //TODO: remove this and Client1Record in MediaRouter2ServiceImpl. - /** - * Sets the control categories of the application. - * Routes that support at least one of the given control categories only exists and are handled - * by the media router. - * - * @hide - */ - public void setControlCategories(@NonNull Collection<String> controlCategories) { - Objects.requireNonNull(controlCategories, "control categories must not be null"); - - sStatic.setControlCategories(controlCategories); - } - static void updateRoute(final RouteInfo info) { dispatchRouteChanged(info); } diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java index 35cb066f9790..3e6f4c01873c 100644 --- a/media/java/android/media/MediaRouter2.java +++ b/media/java/android/media/MediaRouter2.java @@ -114,7 +114,7 @@ public class MediaRouter2 { @GuardedBy("sLock") private MediaRoute2Info mSelectingRoute; @GuardedBy("sLock") - private Client mClient; + private Client2 mClient; final Handler mHandler; volatile List<MediaRoute2Info> mFilteredRoutes = Collections.emptyList(); @@ -196,10 +196,10 @@ public class MediaRouter2 { synchronized (sLock) { if (mClient == null) { - Client client = new Client(); + Client2 client = new Client2(); try { mMediaRouterService.registerClient2(client, mPackageName); - mMediaRouterService.setControlCategories2(client, mControlCategories); + mMediaRouterService.setControlCategories(client, mControlCategories); mClient = client; } catch (RemoteException ex) { Log.e(TAG, "Unable to register media router.", ex); @@ -288,7 +288,7 @@ public class MediaRouter2 { public void requestSelectRoute(@NonNull MediaRoute2Info route) { Objects.requireNonNull(route, "route must not be null"); - Client client; + Client2 client; synchronized (sLock) { if (mSelectingRoute == route) { Log.w(TAG, "The route selection request is already sent."); @@ -318,7 +318,7 @@ public class MediaRouter2 { Objects.requireNonNull(route, "route must not be null"); Objects.requireNonNull(request, "request must not be null"); - Client client; + Client2 client; synchronized (sLock) { client = mClient; } @@ -342,7 +342,7 @@ public class MediaRouter2 { public void requestSetVolume(@NonNull MediaRoute2Info route, int volume) { Objects.requireNonNull(route, "route must not be null"); - Client client; + Client2 client; synchronized (sLock) { client = mClient; } @@ -366,7 +366,7 @@ public class MediaRouter2 { public void requestUpdateVolume(@NonNull MediaRoute2Info route, int delta) { Objects.requireNonNull(route, "route must not be null"); - Client client; + Client2 client; synchronized (sLock) { client = mClient; } @@ -398,13 +398,13 @@ public class MediaRouter2 { List<MediaRoute2Info> filteredRoutes = new ArrayList<>(); mControlCategories = newControlCategories; - Client client; + Client2 client; synchronized (sLock) { client = mClient; } if (client != null) { try { - mMediaRouterService.setControlCategories2(client, mControlCategories); + mMediaRouterService.setControlCategories(client, mControlCategories); } catch (RemoteException ex) { Log.e(TAG, "Unable to set control categories.", ex); } @@ -600,7 +600,7 @@ public class MediaRouter2 { } } - class Client extends IMediaRouter2Client.Stub { + class Client2 extends IMediaRouter2Client.Stub { @Override public void notifyRestoreRoute() throws RemoteException {} diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index 2c478dff4679..9fcee50d7037 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -26,7 +26,6 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.media.IMediaRouter2Client; import android.media.IMediaRouter2Manager; -import android.media.IMediaRouterClient; import android.media.MediaRoute2Info; import android.media.MediaRoute2ProviderInfo; import android.media.MediaRouter2; @@ -71,7 +70,7 @@ class MediaRouter2ServiceImpl { @GuardedBy("mLock") private final SparseArray<UserRecord> mUserRecords = new SparseArray<>(); @GuardedBy("mLock") - private final ArrayMap<IBinder, ClientRecord> mAllClientRecords = new ArrayMap<>(); + private final ArrayMap<IBinder, Client2Record> mAllClientRecords = new ArrayMap<>(); @GuardedBy("mLock") private final ArrayMap<IBinder, ManagerRecord> mAllManagerRecords = new ArrayMap<>(); @GuardedBy("mLock") @@ -183,29 +182,14 @@ class MediaRouter2ServiceImpl { } } - //TODO: What would happen if a media app used MediaRouter and MediaRouter2 simultaneously? - public void setControlCategories(@NonNull IMediaRouterClient client, - @Nullable List<String> categories) { - Objects.requireNonNull(client, "client must not be null"); - final long token = Binder.clearCallingIdentity(); - try { - synchronized (mLock) { - ClientRecord clientRecord = mAllClientRecords.get(client.asBinder()); - setControlCategoriesLocked(clientRecord, categories); - } - } finally { - Binder.restoreCallingIdentity(token); - } - } - - public void setControlCategories2(@NonNull IMediaRouter2Client client, + public void setControlCategories(@NonNull IMediaRouter2Client client, @Nullable List<String> categories) { Objects.requireNonNull(client, "client must not be null"); final long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { - ClientRecord clientRecord = mAllClientRecords.get(client.asBinder()); + Client2Record clientRecord = mAllClientRecords.get(client.asBinder()); setControlCategoriesLocked(clientRecord, categories); } } finally { @@ -295,37 +279,6 @@ class MediaRouter2ServiceImpl { } } - - public void registerClient(@NonNull IMediaRouterClient client, @NonNull String packageName) { - Objects.requireNonNull(client, "client must not be null"); - - final int uid = Binder.getCallingUid(); - final int pid = Binder.getCallingPid(); - final int userId = UserHandle.getUserId(uid); - - final long token = Binder.clearCallingIdentity(); - try { - synchronized (mLock) { - registerClient1Locked(client, packageName, userId); - } - } finally { - Binder.restoreCallingIdentity(token); - } - } - - public void unregisterClient(@NonNull IMediaRouterClient client) { - Objects.requireNonNull(client, "client must not be null"); - - final long token = Binder.clearCallingIdentity(); - try { - synchronized (mLock) { - unregisterClient1Locked(client); - } - } finally { - Binder.restoreCallingIdentity(token); - } - } - //TODO: Review this is handling multi-user properly. void switchUser() { synchronized (mLock) { @@ -389,7 +342,7 @@ class MediaRouter2ServiceImpl { } private void unregisterClient2Locked(IMediaRouter2Client client, boolean died) { - Client2Record clientRecord = (Client2Record) mAllClientRecords.remove(client.asBinder()); + Client2Record clientRecord = mAllClientRecords.remove(client.asBinder()); if (clientRecord != null) { UserRecord userRecord = clientRecord.mUserRecord; userRecord.mClientRecords.remove(clientRecord); @@ -399,7 +352,7 @@ class MediaRouter2ServiceImpl { } } - private void requestSelectRoute2Locked(ClientRecord clientRecord, boolean selectedByManager, + private void requestSelectRoute2Locked(Client2Record clientRecord, boolean selectedByManager, MediaRoute2Info route) { if (clientRecord != null) { MediaRoute2Info oldRoute = clientRecord.mSelectedRoute; @@ -435,7 +388,7 @@ class MediaRouter2ServiceImpl { } } - private void setControlCategoriesLocked(ClientRecord clientRecord, List<String> categories) { + private void setControlCategoriesLocked(Client2Record clientRecord, List<String> categories) { if (clientRecord != null) { clientRecord.mControlCategories = categories; @@ -448,7 +401,7 @@ class MediaRouter2ServiceImpl { private void sendControlRequestLocked(IMediaRouter2Client client, MediaRoute2Info route, Intent request) { final IBinder binder = client.asBinder(); - ClientRecord clientRecord = mAllClientRecords.get(binder); + Client2Record clientRecord = mAllClientRecords.get(binder); if (clientRecord != null) { clientRecord.mUserRecord.mHandler.sendMessage( @@ -460,7 +413,7 @@ class MediaRouter2ServiceImpl { private void requestSetVolumeLocked(IMediaRouter2Client client, MediaRoute2Info route, int volume) { final IBinder binder = client.asBinder(); - ClientRecord clientRecord = mAllClientRecords.get(binder); + Client2Record clientRecord = mAllClientRecords.get(binder); if (clientRecord != null) { clientRecord.mUserRecord.mHandler.sendMessage( @@ -472,7 +425,7 @@ class MediaRouter2ServiceImpl { private void requestUpdateVolumeLocked(IMediaRouter2Client client, MediaRoute2Info route, int delta) { final IBinder binder = client.asBinder(); - ClientRecord clientRecord = mAllClientRecords.get(binder); + Client2Record clientRecord = mAllClientRecords.get(binder); if (clientRecord != null) { clientRecord.mUserRecord.mHandler.sendMessage( @@ -511,7 +464,7 @@ class MediaRouter2ServiceImpl { obtainMessage(UserHandler::notifyRoutesToManager, userRecord.mHandler, manager)); - for (ClientRecord clientRecord : userRecord.mClientRecords) { + for (Client2Record clientRecord : userRecord.mClientRecords) { // TODO: Do not use updateClientUsage since it updates all managers. // Instead, Notify only to the manager that is currently being registered. @@ -538,7 +491,7 @@ class MediaRouter2ServiceImpl { String packageName, MediaRoute2Info route) { ManagerRecord managerRecord = mAllManagerRecords.get(manager.asBinder()); if (managerRecord != null) { - ClientRecord clientRecord = + Client2Record clientRecord = managerRecord.mUserRecord.findClientRecordLocked(packageName); if (clientRecord == null) { Slog.w(TAG, "Ignoring route selection for unknown client."); @@ -600,41 +553,10 @@ class MediaRouter2ServiceImpl { } } - private void registerClient1Locked(IMediaRouterClient client, String packageName, - int userId) { - final IBinder binder = client.asBinder(); - if (mAllClientRecords.get(binder) == null) { - boolean newUser = false; - UserRecord userRecord = mUserRecords.get(userId); - if (userRecord == null) { - userRecord = new UserRecord(userId); - newUser = true; - } - ClientRecord clientRecord = new Client1Record(userRecord, client, packageName); - - if (newUser) { - mUserRecords.put(userId, userRecord); - initializeUserLocked(userRecord); - } - - userRecord.mClientRecords.add(clientRecord); - mAllClientRecords.put(binder, clientRecord); - } - } - - private void unregisterClient1Locked(IMediaRouterClient client) { - ClientRecord clientRecord = mAllClientRecords.remove(client.asBinder()); - if (clientRecord != null) { - UserRecord userRecord = clientRecord.mUserRecord; - userRecord.mClientRecords.remove(clientRecord); - disposeUserIfNeededLocked(userRecord); - } - } - final class UserRecord { public final int mUserId; //TODO: make records private for thread-safety - final ArrayList<ClientRecord> mClientRecords = new ArrayList<>(); + final ArrayList<Client2Record> mClientRecords = new ArrayList<>(); final ArrayList<ManagerRecord> mManagerRecords = new ArrayList<>(); final UserHandler mHandler; @@ -643,8 +565,8 @@ class MediaRouter2ServiceImpl { mHandler = new UserHandler(MediaRouter2ServiceImpl.this, this); } - ClientRecord findClientRecordLocked(String packageName) { - for (ClientRecord clientRecord : mClientRecords) { + Client2Record findClientRecordLocked(String packageName) { + for (Client2Record clientRecord : mClientRecords) { if (TextUtils.equals(clientRecord.mPackageName, packageName)) { return clientRecord; } @@ -653,44 +575,26 @@ class MediaRouter2ServiceImpl { } } - class ClientRecord { + final class Client2Record implements IBinder.DeathRecipient { public final UserRecord mUserRecord; public final String mPackageName; public final List<Integer> mSelectRouteSequenceNumbers; + public final IMediaRouter2Client mClient; + public final int mUid; + public final int mPid; + public final boolean mTrusted; public List<String> mControlCategories; public boolean mIsManagerSelecting; public MediaRoute2Info mSelectingRoute; public MediaRoute2Info mSelectedRoute; - ClientRecord(UserRecord userRecord, String packageName) { + Client2Record(UserRecord userRecord, IMediaRouter2Client client, + int uid, int pid, String packageName, boolean trusted) { mUserRecord = userRecord; mPackageName = packageName; mSelectRouteSequenceNumbers = new ArrayList<>(); mControlCategories = Collections.emptyList(); - } - } - - final class Client1Record extends ClientRecord { - public final IMediaRouterClient mClient; - - Client1Record(UserRecord userRecord, IMediaRouterClient client, - String packageName) { - super(userRecord, packageName); - mClient = client; - } - } - - final class Client2Record extends ClientRecord - implements IBinder.DeathRecipient { - public final IMediaRouter2Client mClient; - public final int mUid; - public final int mPid; - public final boolean mTrusted; - - Client2Record(UserRecord userRecord, IMediaRouter2Client client, - int uid, int pid, String packageName, boolean trusted) { - super(userRecord, packageName); mClient = client; mUid = uid; mPid = pid; @@ -909,15 +813,10 @@ class MediaRouter2ServiceImpl { return; } - ClientRecord clientRecord; + Client2Record clientRecord; synchronized (service.mLock) { clientRecord = mUserRecord.findClientRecordLocked(clientPackageName); } - if (!(clientRecord instanceof Client2Record)) { - Log.w(TAG, "Ignoring route selection for unknown client."); - unselectRoute(clientPackageName, selectedRoute); - return; - } //TODO: handle a case such that controlHints is null. (How should we notify MR2?) @@ -931,7 +830,7 @@ class MediaRouter2ServiceImpl { clientRecord.mSelectingRoute = null; clientRecord.mSelectedRoute = selectedRoute; - notifyRouteSelectedToClient(((Client2Record) clientRecord).mClient, + notifyRouteSelectedToClient(clientRecord.mClient, selectedRoute, clientRecord.mIsManagerSelecting ? MediaRouter2.SELECT_REASON_SYSTEM_SELECTED : @@ -950,14 +849,10 @@ class MediaRouter2ServiceImpl { return; } - ClientRecord clientRecord; + Client2Record clientRecord; synchronized (service.mLock) { clientRecord = mUserRecord.findClientRecordLocked(clientPackageName); } - if (!(clientRecord instanceof Client2Record)) { - Log.w(TAG, "Ignoring fallback route selection for unknown client."); - return; - } if (clientRecord.mSelectingRoute == null || !TextUtils.equals( clientRecord.mSelectingRoute.getUniqueId(), selectingRoute.getUniqueId())) { @@ -972,7 +867,7 @@ class MediaRouter2ServiceImpl { MediaRoute2Info fallbackRoute = null; clientRecord.mSelectedRoute = fallbackRoute; - notifyRouteSelectedToClient(((Client2Record) clientRecord).mClient, + notifyRouteSelectedToClient(clientRecord.mClient, fallbackRoute, MediaRouter2.SELECT_REASON_FALLBACK, Bundle.EMPTY /* controlHints */); @@ -1029,10 +924,8 @@ class MediaRouter2ServiceImpl { return clients; } synchronized (service.mLock) { - for (ClientRecord clientRecord : mUserRecord.mClientRecords) { - if (clientRecord instanceof Client2Record) { - clients.add(((Client2Record) clientRecord).mClient); - } + for (Client2Record clientRecord : mUserRecord.mClientRecords) { + clients.add(clientRecord.mClient); } } return clients; @@ -1157,7 +1050,7 @@ class MediaRouter2ServiceImpl { } } - private void updateClientUsage(ClientRecord clientRecord) { + private void updateClientUsage(Client2Record clientRecord) { MediaRouter2ServiceImpl service = mServiceRef.get(); if (service == null) { return; diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java index 9336af427452..9c99e8f43639 100644 --- a/services/core/java/com/android/server/media/MediaRouterService.java +++ b/services/core/java/com/android/server/media/MediaRouterService.java @@ -249,7 +249,6 @@ public final class MediaRouterService extends IMediaRouterService.Stub synchronized (mLock) { registerClientLocked(client, uid, pid, packageName, resolvedUserId, trusted); } - mService2.registerClient(client, packageName); } finally { Binder.restoreCallingIdentity(token); } @@ -290,7 +289,6 @@ public final class MediaRouterService extends IMediaRouterService.Stub synchronized (mLock) { unregisterClientLocked(client, false); } - mService2.unregisterClient(client); } finally { Binder.restoreCallingIdentity(token); } @@ -397,12 +395,6 @@ public final class MediaRouterService extends IMediaRouterService.Stub // Binder call @Override - public void setControlCategories(IMediaRouterClient client, List<String> controlCategories) { - mService2.setControlCategories(client, controlCategories); - } - - // Binder call - @Override public void requestUpdateVolume(IMediaRouterClient client, String routeId, int direction) { if (client == null) { throw new IllegalArgumentException("client must not be null"); @@ -501,8 +493,8 @@ public final class MediaRouterService extends IMediaRouterService.Stub // Binder call @Override - public void setControlCategories2(IMediaRouter2Client client, List<String> categories) { - mService2.setControlCategories2(client, categories); + public void setControlCategories(IMediaRouter2Client client, List<String> categories) { + mService2.setControlCategories(client, categories); } // Binder call @@ -601,7 +593,6 @@ public final class MediaRouterService extends IMediaRouterService.Stub synchronized (mLock) { unregisterClientLocked(clientRecord.mClient, true); } - mService2.unregisterClient(clientRecord.mClient); } private void registerClientLocked(IMediaRouterClient client, |