summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java141
1 files changed, 50 insertions, 91 deletions
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
index 77dbde13889b..f653b9381721 100644
--- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
+++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java
@@ -1662,116 +1662,75 @@ class MediaRouter2ServiceImpl {
}
private void onProviderStateChangedOnHandler(@NonNull MediaRoute2Provider provider) {
- MediaRoute2ProviderInfo currentInfo = provider.getProviderInfo();
-
+ MediaRoute2ProviderInfo newInfo = provider.getProviderInfo();
int providerInfoIndex =
indexOfRouteProviderInfoByUniqueId(provider.getUniqueId(), mLastProviderInfos);
-
- MediaRoute2ProviderInfo prevInfo =
+ MediaRoute2ProviderInfo oldInfo =
providerInfoIndex == -1 ? null : mLastProviderInfos.get(providerInfoIndex);
-
- // Ignore if no changes
- if (Objects.equals(prevInfo, currentInfo)) {
+ if (oldInfo == newInfo) {
+ // Nothing to do.
return;
}
- boolean hasAddedOrModifiedRoutes = false;
- boolean hasRemovedRoutes = false;
-
- boolean isSystemProvider = provider.mIsSystemRouteProvider;
-
- if (prevInfo == null) {
- // Provider is being added.
- mLastProviderInfos.add(currentInfo);
- addToRoutesMap(currentInfo.getRoutes(), isSystemProvider);
- // Check if new provider exposes routes.
- hasAddedOrModifiedRoutes = !currentInfo.getRoutes().isEmpty();
- } else if (currentInfo == null) {
- // Provider is being removed.
- hasRemovedRoutes = true;
- mLastProviderInfos.remove(prevInfo);
- removeFromRoutesMap(prevInfo.getRoutes(), isSystemProvider);
- } else {
- // Provider is being updated.
- mLastProviderInfos.set(providerInfoIndex, currentInfo);
- final Collection<MediaRoute2Info> currentRoutes = currentInfo.getRoutes();
-
- // Checking for individual routes.
- for (MediaRoute2Info route : currentRoutes) {
- if (!route.isValid()) {
- Slog.w(
- TAG,
- "onProviderStateChangedOnHandler: Ignoring invalid route : "
- + route);
- continue;
- }
+ Collection<MediaRoute2Info> newRoutes;
+ Set<String> newRouteIds;
+ if (newInfo != null) {
+ // Adding or updating a provider.
+ newRoutes = newInfo.getRoutes();
+ newRouteIds =
+ newRoutes.stream().map(MediaRoute2Info::getId).collect(Collectors.toSet());
+ if (providerInfoIndex >= 0) {
+ mLastProviderInfos.set(providerInfoIndex, newInfo);
+ } else {
+ mLastProviderInfos.add(newInfo);
+ }
+ } else /* newInfo == null */ {
+ // Removing a provider.
+ mLastProviderInfos.remove(oldInfo);
+ newRouteIds = Collections.emptySet();
+ newRoutes = Collections.emptySet();
+ }
- MediaRoute2Info prevRoute = prevInfo.getRoute(route.getOriginalId());
- if (prevRoute == null || !Objects.equals(prevRoute, route)) {
- hasAddedOrModifiedRoutes = true;
- mLastNotifiedRoutesToPrivilegedRouters.put(route.getId(), route);
- if (!isSystemProvider) {
- mLastNotifiedRoutesToNonPrivilegedRouters.put(route.getId(), route);
- }
- }
+ // Add new routes to the maps.
+ boolean hasAddedOrModifiedRoutes = false;
+ for (MediaRoute2Info newRouteInfo : newRoutes) {
+ if (!newRouteInfo.isValid()) {
+ Slog.w(TAG, "onProviderStateChangedOnHandler: Ignoring invalid route : "
+ + newRouteInfo);
+ continue;
}
+ if (!provider.mIsSystemRouteProvider) {
+ mLastNotifiedRoutesToNonPrivilegedRouters.put(
+ newRouteInfo.getId(), newRouteInfo);
+ }
+ MediaRoute2Info oldRouteInfo =
+ mLastNotifiedRoutesToPrivilegedRouters.put(
+ newRouteInfo.getId(), newRouteInfo);
+ hasAddedOrModifiedRoutes |=
+ oldRouteInfo == null || !oldRouteInfo.equals(newRouteInfo);
+ }
- // Checking for individual removals
- for (MediaRoute2Info prevRoute : prevInfo.getRoutes()) {
- if (currentInfo.getRoute(prevRoute.getOriginalId()) == null) {
- hasRemovedRoutes = true;
- mLastNotifiedRoutesToPrivilegedRouters.remove(prevRoute.getId());
- if (!isSystemProvider) {
- mLastNotifiedRoutesToNonPrivilegedRouters.remove(prevRoute.getId());
- }
- }
+ // Remove stale routes from the maps.
+ Collection<MediaRoute2Info> oldRoutes =
+ oldInfo == null ? Collections.emptyList() : oldInfo.getRoutes();
+ boolean hasRemovedRoutes = false;
+ for (MediaRoute2Info oldRoute : oldRoutes) {
+ String oldRouteId = oldRoute.getId();
+ if (!newRouteIds.contains(oldRouteId)) {
+ hasRemovedRoutes = true;
+ mLastNotifiedRoutesToPrivilegedRouters.remove(oldRouteId);
+ mLastNotifiedRoutesToNonPrivilegedRouters.remove(oldRouteId);
}
}
dispatchUpdates(
hasAddedOrModifiedRoutes,
hasRemovedRoutes,
- isSystemProvider,
+ provider.mIsSystemRouteProvider,
mSystemProvider.getDefaultRoute());
}
/**
- * Adds provided routes to {@link #mLastNotifiedRoutesToPrivilegedRouters}. Also adds them
- * to {@link #mLastNotifiedRoutesToNonPrivilegedRouters} if they were provided by a
- * non-system route provider. Overwrites any route with matching id that already exists.
- *
- * @param routes list of routes to be added.
- * @param isSystemRoutes indicates whether routes come from a system route provider.
- */
- private void addToRoutesMap(
- @NonNull Collection<MediaRoute2Info> routes, boolean isSystemRoutes) {
- for (MediaRoute2Info route : routes) {
- if (!isSystemRoutes) {
- mLastNotifiedRoutesToNonPrivilegedRouters.put(route.getId(), route);
- }
- mLastNotifiedRoutesToPrivilegedRouters.put(route.getId(), route);
- }
- }
-
- /**
- * Removes provided routes from {@link #mLastNotifiedRoutesToPrivilegedRouters}. Also
- * removes them from {@link #mLastNotifiedRoutesToNonPrivilegedRouters} if they were
- * provided by a non-system route provider.
- *
- * @param routes list of routes to be removed.
- * @param isSystemRoutes whether routes come from a system route provider.
- */
- private void removeFromRoutesMap(
- @NonNull Collection<MediaRoute2Info> routes, boolean isSystemRoutes) {
- for (MediaRoute2Info route : routes) {
- if (!isSystemRoutes) {
- mLastNotifiedRoutesToNonPrivilegedRouters.remove(route.getId());
- }
- mLastNotifiedRoutesToPrivilegedRouters.remove(route.getId());
- }
- }
-
- /**
* Dispatches the latest route updates in {@link #mLastNotifiedRoutesToPrivilegedRouters}
* and {@link #mLastNotifiedRoutesToNonPrivilegedRouters} to registered {@link
* android.media.MediaRouter2 routers} and {@link MediaRouter2Manager managers} after a call