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

Commit c0af0d2b authored by Santiago Seifert's avatar Santiago Seifert
Browse files

Simplify onProviderStateChangedOnHandler

Mostly a non-functional refactor, except for the addition
of a validity check when adding routes from a new provider.
Before this change the validity check was only made for
routes added by an existing provider, but not for routes
coming from a new provider. Under the assumption that this
was an oversight, we make the validity check for all routes.

Test: atest mediaroutertest CtsMediaBetterTogetherTestCases
Bug: 205124386
Change-Id: I4b4ca48756ac027e3c54b7c1000dfab05248682a
parent 3c155090
Loading
Loading
Loading
Loading
+50 −91
Original line number Diff line number Diff line
@@ -1681,115 +1681,74 @@ 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);
            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 {
                // 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;
                    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) {
            // 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(prevRoute.getId());
                        if (!isSystemProvider) {
                            mLastNotifiedRoutesToNonPrivilegedRouters.remove(prevRoute.getId());
                        }
                    }
                    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