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

Commit 0d90b895 authored by Iván Budnik's avatar Iván Budnik Committed by Android (Google) Code Review
Browse files

Merge "Non-functionally refactor scanning logic" into main

parents b89ce64a 6ad5015f
Loading
Loading
Loading
Loading
+96 −43
Original line number Diff line number Diff line
@@ -2908,46 +2908,69 @@ class MediaRouter2ServiceImpl {
            if (service == null) {
                return;
            }
            List<RouterRecord> activeRouterRecords = Collections.emptyList();
            List<RouterRecord> activeRouterRecords;
            List<RouterRecord> allRouterRecords = getRouterRecords();
            List<ManagerRecord> managerRecords = getManagerRecords();

            boolean isManagerScanning = false;
            if (Flags.disableScreenOffBroadcastReceiver()
                    || service.mPowerManager.isInteractive()) {
                isManagerScanning = managerRecords.stream().anyMatch(manager ->
                        manager.mIsScanning && service.mActivityManager
                                .getPackageImportance(manager.mOwnerPackageName)
                                <= sPackageImportanceForScanning);

                if (isManagerScanning) {
            boolean areManagersScanning = areManagersScanning(service, getManagerRecords());

            if (areManagersScanning) {
                activeRouterRecords = allRouterRecords;
            } else {
                    activeRouterRecords =
                            allRouterRecords.stream()
                                    .filter(
                                            record ->
                                                    service.mActivityManager.getPackageImportance(
                                                                    record.mPackageName)
                                                            <= sPackageImportanceForScanning)
                                    .collect(Collectors.toList());
                activeRouterRecords = getIndividuallyActiveRouters(service, allRouterRecords);
            }

            updateManagerScanningForProviders(areManagersScanning);

            Set<String> activelyScanningPackages = new HashSet<>();
            RouteDiscoveryPreference newPreference =
                    buildCompositeDiscoveryPreference(
                            activeRouterRecords, areManagersScanning, activelyScanningPackages);

            if (updateScanningOnUserRecord(service, activelyScanningPackages, newPreference)) {
                updateDiscoveryPreferenceForProviders(activelyScanningPackages);
            }
        }

        private void updateDiscoveryPreferenceForProviders(Set<String> activelyScanningPackages) {
            for (MediaRoute2Provider provider : mRouteProviders) {
                if (provider instanceof MediaRoute2ProviderServiceProxy) {
                    ((MediaRoute2ProviderServiceProxy) provider)
                            .setManagerScanning(isManagerScanning);
                provider.updateDiscoveryPreference(
                        activelyScanningPackages, mUserRecord.mCompositeDiscoveryPreference);
            }
        }

            // Build a composite RouteDiscoveryPreference that matches all of the routes
            // that match one or more of the individual discovery preferences. It may also
            // match additional routes. The composite RouteDiscoveryPreference can be used
            // to query route providers once to obtain all of the routes of interest, which
            // can be subsequently filtered for the individual discovery preferences.
        private boolean updateScanningOnUserRecord(
                MediaRouter2ServiceImpl service,
                Set<String> activelyScanningPackages,
                RouteDiscoveryPreference newPreference) {
            synchronized (service.mLock) {
                if (newPreference.equals(mUserRecord.mCompositeDiscoveryPreference)
                        && activelyScanningPackages.equals(mUserRecord.mActivelyScanningPackages)) {
                    return false;
                }
                mUserRecord.mCompositeDiscoveryPreference = newPreference;
                mUserRecord.mActivelyScanningPackages = activelyScanningPackages;
            }
            return true;
        }

        /**
         * Returns a composite {@link RouteDiscoveryPreference} that aggregates every router
         * record's individual discovery preference.
         *
         * <p>The {@link RouteDiscoveryPreference#shouldPerformActiveScan() active scan value} of
         * the composite discovery preference is true if one of the router records is actively
         * scanning or if {@code shouldForceActiveScan} is true.
         *
         * <p>The composite RouteDiscoveryPreference is used to query route providers once to obtain
         * all the routes of interest, which can be subsequently filtered for the individual
         * discovery preferences.
         */
        @NonNull
        private static RouteDiscoveryPreference buildCompositeDiscoveryPreference(
                List<RouterRecord> activeRouterRecords,
                boolean shouldForceActiveScan,
                Set<String> activelyScanningPackages) {
            Set<String> preferredFeatures = new HashSet<>();
            Set<String> activelyScanningPackages = new HashSet<>();
            boolean activeScan = false;
            for (RouterRecord activeRouterRecord : activeRouterRecords) {
                RouteDiscoveryPreference preference = activeRouterRecord.mDiscoveryPreference;
@@ -2957,21 +2980,51 @@ class MediaRouter2ServiceImpl {
                    activelyScanningPackages.add(activeRouterRecord.mPackageName);
                }
            }
            RouteDiscoveryPreference newPreference = new RouteDiscoveryPreference.Builder(
                    List.copyOf(preferredFeatures), activeScan || isManagerScanning).build();
            return new RouteDiscoveryPreference.Builder(
                            List.copyOf(preferredFeatures), activeScan || shouldForceActiveScan)
                    .build();
        }

            synchronized (service.mLock) {
                if (newPreference.equals(mUserRecord.mCompositeDiscoveryPreference)
                        && activelyScanningPackages.equals(mUserRecord.mActivelyScanningPackages)) {
                    return;
        private void updateManagerScanningForProviders(boolean isManagerScanning) {
            for (MediaRoute2Provider provider : mRouteProviders) {
                if (provider instanceof MediaRoute2ProviderServiceProxy) {
                    ((MediaRoute2ProviderServiceProxy) provider)
                            .setManagerScanning(isManagerScanning);
                }
                mUserRecord.mCompositeDiscoveryPreference = newPreference;
                mUserRecord.mActivelyScanningPackages = activelyScanningPackages;
            }
            for (MediaRoute2Provider provider : mRouteProviders) {
                provider.updateDiscoveryPreference(
                        activelyScanningPackages, mUserRecord.mCompositeDiscoveryPreference);
        }

        @NonNull
        private static List<RouterRecord> getIndividuallyActiveRouters(
                MediaRouter2ServiceImpl service, List<RouterRecord> allRouterRecords) {
            if (!Flags.disableScreenOffBroadcastReceiver()
                    && !service.mPowerManager.isInteractive()) {
                return Collections.emptyList();
            }

            return allRouterRecords.stream()
                    .filter(
                            record ->
                                    service.mActivityManager.getPackageImportance(
                                                    record.mPackageName)
                                            <= sPackageImportanceForScanning)
                    .collect(Collectors.toList());
        }

        private static boolean areManagersScanning(
                MediaRouter2ServiceImpl service, List<ManagerRecord> managerRecords) {
            if (!Flags.disableScreenOffBroadcastReceiver()
                    && !service.mPowerManager.isInteractive()) {
                return false;
            }

            return managerRecords.stream()
                    .anyMatch(
                            manager ->
                                    manager.mIsScanning
                                            && service.mActivityManager.getPackageImportance(
                                                            manager.mOwnerPackageName)
                                                    <= sPackageImportanceForScanning);
        }

        private MediaRoute2Provider findProvider(@Nullable String providerId) {