Loading media/java/android/media/IMediaRouterService.aidl +1 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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); Loading media/java/android/media/MediaRouter.java +0 −30 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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++) { Loading Loading @@ -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); Loading Loading @@ -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); } Loading media/java/android/media/MediaRouter2.java +10 −10 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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); Loading Loading @@ -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."); Loading Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading Loading @@ -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); } Loading Loading @@ -600,7 +600,7 @@ public class MediaRouter2 { } } class Client extends IMediaRouter2Client.Stub { class Client2 extends IMediaRouter2Client.Stub { @Override public void notifyRestoreRoute() throws RemoteException {} Loading services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +28 −135 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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") Loading Loading @@ -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 { Loading Loading @@ -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) { Loading Loading @@ -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); Loading @@ -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; Loading Loading @@ -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; Loading @@ -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( Loading @@ -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( Loading @@ -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( Loading Loading @@ -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. Loading @@ -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."); Loading Loading @@ -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; Loading @@ -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; } Loading @@ -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; Loading Loading @@ -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?) Loading @@ -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 : Loading @@ -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())) { Loading @@ -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 */); Loading Loading @@ -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; Loading Loading @@ -1157,7 +1050,7 @@ class MediaRouter2ServiceImpl { } } private void updateClientUsage(ClientRecord clientRecord) { private void updateClientUsage(Client2Record clientRecord) { MediaRouter2ServiceImpl service = mServiceRef.get(); if (service == null) { return; Loading services/core/java/com/android/server/media/MediaRouterService.java +2 −11 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -290,7 +289,6 @@ public final class MediaRouterService extends IMediaRouterService.Stub synchronized (mLock) { unregisterClientLocked(client, false); } mService2.unregisterClient(client); } finally { Binder.restoreCallingIdentity(token); } Loading Loading @@ -395,12 +393,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) { Loading Loading @@ -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 Loading Loading @@ -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, Loading Loading
media/java/android/media/IMediaRouterService.aidl +1 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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); Loading
media/java/android/media/MediaRouter.java +0 −30 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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++) { Loading Loading @@ -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); Loading Loading @@ -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); } Loading
media/java/android/media/MediaRouter2.java +10 −10 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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); Loading Loading @@ -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."); Loading Loading @@ -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; } Loading @@ -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; } Loading @@ -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; } Loading Loading @@ -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); } Loading Loading @@ -600,7 +600,7 @@ public class MediaRouter2 { } } class Client extends IMediaRouter2Client.Stub { class Client2 extends IMediaRouter2Client.Stub { @Override public void notifyRestoreRoute() throws RemoteException {} Loading
services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +28 −135 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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") Loading Loading @@ -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 { Loading Loading @@ -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) { Loading Loading @@ -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); Loading @@ -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; Loading Loading @@ -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; Loading @@ -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( Loading @@ -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( Loading @@ -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( Loading Loading @@ -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. Loading @@ -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."); Loading Loading @@ -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; Loading @@ -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; } Loading @@ -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; Loading Loading @@ -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?) Loading @@ -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 : Loading @@ -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())) { Loading @@ -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 */); Loading Loading @@ -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; Loading Loading @@ -1157,7 +1050,7 @@ class MediaRouter2ServiceImpl { } } private void updateClientUsage(ClientRecord clientRecord) { private void updateClientUsage(Client2Record clientRecord) { MediaRouter2ServiceImpl service = mServiceRef.get(); if (service == null) { return; Loading
services/core/java/com/android/server/media/MediaRouterService.java +2 −11 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -290,7 +289,6 @@ public final class MediaRouterService extends IMediaRouterService.Stub synchronized (mLock) { unregisterClientLocked(client, false); } mService2.unregisterClient(client); } finally { Binder.restoreCallingIdentity(token); } Loading Loading @@ -395,12 +393,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) { Loading Loading @@ -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 Loading Loading @@ -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, Loading