summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java146
1 files changed, 64 insertions, 82 deletions
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index e1b8e9f559ed..8b06dadbaeeb 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -1653,9 +1653,11 @@ class MediaRouter2ServiceImpl {
manager));
}
+ List<MediaRoute2Info> routes =
+ userRecord.mHandler.mLastNotifiedRoutesToPrivilegedRouters.values().stream()
+ .toList();
userRecord.mHandler.sendMessage(
- obtainMessage(
- UserHandler::notifyInitialRoutesToManager, userRecord.mHandler, manager));
+ obtainMessage(ManagerRecord::notifyRoutesUpdated, managerRecord, routes));
}
@GuardedBy("mLock")
@@ -2433,6 +2435,51 @@ class MediaRouter2ServiceImpl {
}
}
+ /**
+ * Notifies the corresponding manager of the availability of the given routes.
+ *
+ * @param routes The routes available to the manager that corresponds to this record.
+ */
+ public void notifyRoutesUpdated(List<MediaRoute2Info> routes) {
+ try {
+ mManager.notifyRoutesUpdated(routes);
+ } catch (RemoteException ex) {
+ Slog.w(TAG, "Failed to notify routes. Manager probably died.", ex);
+ }
+ }
+
+ /**
+ * Notifies the corresponding manager of an update in the given session.
+ *
+ * @param sessionInfo The updated session info.
+ */
+ public void notifySessionUpdated(RoutingSessionInfo sessionInfo) {
+ try {
+ mManager.notifySessionUpdated(sessionInfo);
+ } catch (RemoteException ex) {
+ Slog.w(
+ TAG,
+ "notifySessionUpdatedToManagers: Failed to notify. Manager probably died.",
+ ex);
+ }
+ }
+
+ /**
+ * Notifies the corresponding manager that the given session has been released.
+ *
+ * @param sessionInfo The released session info.
+ */
+ public void notifySessionReleased(RoutingSessionInfo sessionInfo) {
+ try {
+ mManager.notifySessionReleased(sessionInfo);
+ } catch (RemoteException ex) {
+ Slog.w(
+ TAG,
+ "notifySessionReleasedToManagers: Failed to notify. Manager probably died.",
+ ex);
+ }
+ }
+
private void updateScanningState(@ScanningState int scanningState) {
if (mScanningState == scanningState) {
return;
@@ -2761,18 +2808,20 @@ class MediaRouter2ServiceImpl {
getRouterRecords(/* hasSystemRoutingPermission= */ true);
List<RouterRecord> routerRecordsWithoutSystemRoutingPermission =
getRouterRecords(/* hasSystemRoutingPermission= */ false);
- List<IMediaRouter2Manager> managers = getManagers();
+ List<ManagerRecord> managers = getManagerRecords();
// Managers receive all provider updates with all routes.
- notifyRoutesUpdatedToManagers(
- managers, new ArrayList<>(mLastNotifiedRoutesToPrivilegedRouters.values()));
+ List<MediaRoute2Info> routesForPrivilegedRouters =
+ mLastNotifiedRoutesToPrivilegedRouters.values().stream().toList();
+ for (ManagerRecord manager : managers) {
+ manager.notifyRoutesUpdated(routesForPrivilegedRouters);
+ }
// Routers with system routing access (either via {@link MODIFY_AUDIO_ROUTING} or
// {@link BLUETOOTH_CONNECT} + {@link BLUETOOTH_SCAN}) receive all provider updates
// with all routes.
notifyRoutesUpdatedToRouterRecords(
- routerRecordsWithSystemRoutingPermission,
- new ArrayList<>(mLastNotifiedRoutesToPrivilegedRouters.values()));
+ routerRecordsWithSystemRoutingPermission, routesForPrivilegedRouters);
if (!isSystemProvider) {
// Regular routers receive updates from all non-system providers with all non-system
@@ -3068,8 +3117,10 @@ class MediaRouter2ServiceImpl {
private void onSessionInfoChangedOnHandler(@NonNull MediaRoute2Provider provider,
@NonNull RoutingSessionInfo sessionInfo) {
- List<IMediaRouter2Manager> managers = getManagers();
- notifySessionUpdatedToManagers(managers, sessionInfo);
+ List<ManagerRecord> managers = getManagerRecords();
+ for (ManagerRecord manager : managers) {
+ manager.notifySessionUpdated(sessionInfo);
+ }
// For system provider, notify all routers.
if (provider == mSystemProvider) {
@@ -3093,8 +3144,10 @@ class MediaRouter2ServiceImpl {
private void onSessionReleasedOnHandler(@NonNull MediaRoute2Provider provider,
@NonNull RoutingSessionInfo sessionInfo) {
- List<IMediaRouter2Manager> managers = getManagers();
- notifySessionReleasedToManagers(managers, sessionInfo);
+ List<ManagerRecord> managers = getManagerRecords();
+ for (ManagerRecord manager : managers) {
+ manager.notifySessionReleased(sessionInfo);
+ }
RouterRecord routerRecord = mSessionToRouterMap.get(sessionInfo.getId());
if (routerRecord == null) {
@@ -3169,20 +3222,6 @@ class MediaRouter2ServiceImpl {
return true;
}
- private List<IMediaRouter2Manager> getManagers() {
- final List<IMediaRouter2Manager> managers = new ArrayList<>();
- MediaRouter2ServiceImpl service = mServiceRef.get();
- if (service == null) {
- return managers;
- }
- synchronized (service.mLock) {
- for (ManagerRecord managerRecord : mUserRecord.mManagerRecords) {
- managers.add(managerRecord.mManager);
- }
- }
- return managers;
- }
-
private List<RouterRecord> getRouterRecords() {
MediaRouter2ServiceImpl service = mServiceRef.get();
if (service == null) {
@@ -3269,37 +3308,6 @@ class MediaRouter2ServiceImpl {
}
}
- /**
- * Notifies {@code manager} with all known routes. This only happens once after {@code
- * manager} is registered through {@link #registerManager(IMediaRouter2Manager, String)
- * registerManager()}.
- *
- * @param manager {@link IMediaRouter2Manager} to be notified.
- */
- private void notifyInitialRoutesToManager(@NonNull IMediaRouter2Manager manager) {
- if (mLastNotifiedRoutesToPrivilegedRouters.isEmpty()) {
- return;
- }
- try {
- manager.notifyRoutesUpdated(
- new ArrayList<>(mLastNotifiedRoutesToPrivilegedRouters.values()));
- } catch (RemoteException ex) {
- Slog.w(TAG, "Failed to notify all routes. Manager probably died.", ex);
- }
- }
-
- private void notifyRoutesUpdatedToManagers(
- @NonNull List<IMediaRouter2Manager> managers,
- @NonNull List<MediaRoute2Info> routes) {
- for (IMediaRouter2Manager manager : managers) {
- try {
- manager.notifyRoutesUpdated(routes);
- } catch (RemoteException ex) {
- Slog.w(TAG, "Failed to notify routes changed. Manager probably died.", ex);
- }
- }
- }
-
private void notifySessionCreatedToManagers(long managerRequestId,
@NonNull RoutingSessionInfo session) {
int requesterId = toRequesterId(managerRequestId);
@@ -3317,32 +3325,6 @@ class MediaRouter2ServiceImpl {
}
}
- private void notifySessionUpdatedToManagers(
- @NonNull List<IMediaRouter2Manager> managers,
- @NonNull RoutingSessionInfo sessionInfo) {
- for (IMediaRouter2Manager manager : managers) {
- try {
- manager.notifySessionUpdated(sessionInfo);
- } catch (RemoteException ex) {
- Slog.w(TAG, "notifySessionUpdatedToManagers: "
- + "Failed to notify. Manager probably died.", ex);
- }
- }
- }
-
- private void notifySessionReleasedToManagers(
- @NonNull List<IMediaRouter2Manager> managers,
- @NonNull RoutingSessionInfo sessionInfo) {
- for (IMediaRouter2Manager manager : managers) {
- try {
- manager.notifySessionReleased(sessionInfo);
- } catch (RemoteException ex) {
- Slog.w(TAG, "notifySessionReleasedToManagers: "
- + "Failed to notify. Manager probably died.", ex);
- }
- }
- }
-
private void notifyDiscoveryPreferenceChangedToManager(@NonNull RouterRecord routerRecord,
@NonNull IMediaRouter2Manager manager) {
try {