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

Commit 89e122c8 authored by Yurii Zubrytskyi's avatar Yurii Zubrytskyi Committed by Android (Google) Code Review
Browse files

Merge changes Ie7025815,I8545c938 into main

* changes:
  [res] Reduce allocations in OverlayManagerSettings
  [res] Minor optimizations in OverlayManagerService
parents c1e1505e c468c0ed
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -49,6 +49,13 @@ public class OverlayPaths {
    public static class Builder {
        final OverlayPaths mPaths = new OverlayPaths();

        public Builder() {}

        public Builder(@NonNull OverlayPaths base) {
            mPaths.mResourceDirs.addAll(base.getResourceDirs());
            mPaths.mOverlayPaths.addAll(base.getOverlayPaths());
        }

        /**
         * Adds a non-APK path to the contents of {@link OverlayPaths#getOverlayPaths()}.
         */
+18 −16
Original line number Diff line number Diff line
@@ -362,7 +362,7 @@ public final class OverlayManagerService extends SystemService {
                defaultPackages.add(packageName);
            }
        }
        return defaultPackages.toArray(new String[defaultPackages.size()]);
        return defaultPackages.toArray(new String[0]);
    }

    private final class OverlayManagerPackageMonitor extends PackageMonitor {
@@ -1160,7 +1160,7 @@ public final class OverlayManagerService extends SystemService {
        // state may lead to contradictions within OMS. Better then to lag
        // behind until all pending intents have been processed.
        private final ArrayMap<String, PackageStateUsers> mCache = new ArrayMap<>();
        private final Set<Integer> mInitializedUsers = new ArraySet<>();
        private final ArraySet<Integer> mInitializedUsers = new ArraySet<>();

        PackageManagerHelperImpl(Context context) {
            mContext = context;
@@ -1176,8 +1176,7 @@ public final class OverlayManagerService extends SystemService {
         */
        @NonNull
        public ArrayMap<String, PackageState> initializeForUser(final int userId) {
            if (!mInitializedUsers.contains(userId)) {
                mInitializedUsers.add(userId);
            if (mInitializedUsers.add(userId)) {
                mPackageManagerInternal.forEachPackageState((packageState -> {
                    if (packageState.getPkg() != null
                            && packageState.getUserStateOrDefault(userId).isInstalled()) {
@@ -1545,8 +1544,7 @@ public final class OverlayManagerService extends SystemService {
                final OverlayPaths frameworkOverlays =
                        mImpl.getEnabledOverlayPaths("android", userId, false);
                for (final String targetPackageName : targetPackageNames) {
                    final OverlayPaths.Builder list = new OverlayPaths.Builder();
                    list.addAll(frameworkOverlays);
                    final var list = new OverlayPaths.Builder(frameworkOverlays);
                    if (!"android".equals(targetPackageName)) {
                        list.addAll(mImpl.getEnabledOverlayPaths(targetPackageName, userId, true));
                    }
@@ -1558,19 +1556,23 @@ public final class OverlayManagerService extends SystemService {
            final HashSet<String> invalidPackages = new HashSet<>();
            pm.setEnabledOverlayPackages(userId, pendingChanges, updatedPackages, invalidPackages);

            if (DEBUG || !invalidPackages.isEmpty()) {
                for (final String targetPackageName : targetPackageNames) {
                    if (DEBUG) {
                    Slog.d(TAG, "-> Updating overlay: target=" + targetPackageName + " overlays=["
                        Slog.d(TAG,
                                "-> Updating overlay: target=" + targetPackageName + " overlays=["
                                        + pendingChanges.get(targetPackageName)
                                        + "] userId=" + userId);
                    }

                    if (invalidPackages.contains(targetPackageName)) {
                        Slog.e(TAG, TextUtils.formatSimple(
                            "Failed to change enabled overlays for %s user %d", targetPackageName,
                                "Failed to change enabled overlays for %s user %d",
                                targetPackageName,
                                userId));
                    }
                }
            }
            return new ArrayList<>(updatedPackages);
        } finally {
            traceEnd(TRACE_TAG_RRO);
+5 −9
Original line number Diff line number Diff line
@@ -772,24 +772,20 @@ final class OverlayManagerServiceImpl {

    OverlayPaths getEnabledOverlayPaths(@NonNull final String targetPackageName,
            final int userId, boolean includeImmutableOverlays) {
        final List<OverlayInfo> overlays = mSettings.getOverlaysForTarget(targetPackageName,
                userId);
        final OverlayPaths.Builder paths = new OverlayPaths.Builder();
        final int n = overlays.size();
        for (int i = 0; i < n; i++) {
            final OverlayInfo oi = overlays.get(i);
        final var paths = new OverlayPaths.Builder();
        mSettings.forEachMatching(userId, null, targetPackageName, oi -> {
            if (!oi.isEnabled()) {
                continue;
                return;
            }
            if (!includeImmutableOverlays && !oi.isMutable) {
                continue;
                return;
            }
            if (oi.isFabricated()) {
                paths.addNonApkPath(oi.baseCodePath);
            } else {
                paths.addApkPath(oi.baseCodePath);
            }
        }
        });
        return paths.build();
    }

+18 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;

@@ -182,6 +183,23 @@ final class OverlayManagerSettings {
        return CollectionUtils.map(items, SettingsItem::getOverlayInfo);
    }

    void forEachMatching(int userId, String overlayName, String targetPackageName,
            @NonNull Consumer<OverlayInfo> consumer) {
        for (int i = 0, n = mItems.size(); i < n; i++) {
            final SettingsItem item = mItems.get(i);
            if (item.getUserId() != userId) {
                continue;
            }
            if (overlayName != null && !item.mOverlay.getPackageName().equals(overlayName)) {
                continue;
            }
            if (targetPackageName != null && !item.mTargetPackageName.equals(targetPackageName)) {
                continue;
            }
            consumer.accept(item.getOverlayInfo());
        }
    }

    ArrayMap<String, List<OverlayInfo>> getOverlaysForUser(final int userId) {
        final List<SettingsItem> items = selectWhereUser(userId);