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

Commit c468c0ed authored by Yurii Zubrytskyi's avatar Yurii Zubrytskyi
Browse files

[res] Reduce allocations in OverlayManagerSettings

Don't collect all items into two lists when all that is needed
is just a loop over them, use a callback instead

Bug: 282215580
Test: build + boot + presubmits
Change-Id: Ie7025815caaa9e2dcbf4efeb0ee65c49e882d271
parent 807a42d4
Loading
Loading
Loading
Loading
+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);