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

Commit 5dba5f93 authored by Mårten Kongstad's avatar Mårten Kongstad
Browse files

OMS: fix broken 'overlay list' output

Immutable overlays that target the android package are incorrectly
omitted from the output of 'overlay list'. However, those overlays are
correctly omitted when the package manager is told what overlays are
enabled.

Move the filter closer to the interaction between the overlay and
package managers so as not to interfere with other operations such as
'overlay list'.

Bug: 228404475
Test: atest OverlayHostTests OverlayDeviceTests
Test: manual: 'adb abb overlay list android' includes immutable overlays
Test: manual: inspect /proc/<pid>/maps to verify idmap files are not loaded twice
Change-Id: I94f5206326fef6c3b62d6d1c7a9e74ea161495ee
parent 4bbf0ccd
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1481,13 +1481,13 @@ public final class OverlayManagerService extends SystemService {
                    new ArrayMap<>(targetPackageNames.size());
            synchronized (mLock) {
                final OverlayPaths frameworkOverlays =
                        mImpl.getEnabledOverlayPaths("android", userId);
                        mImpl.getEnabledOverlayPaths("android", userId, false);
                for (final String targetPackageName : targetPackageNames) {
                    final OverlayPaths.Builder list = new OverlayPaths.Builder();
                    if (!"android".equals(targetPackageName)) {
                    list.addAll(frameworkOverlays);
                    if (!"android".equals(targetPackageName)) {
                        list.addAll(mImpl.getEnabledOverlayPaths(targetPackageName, userId, true));
                    }
                    list.addAll(mImpl.getEnabledOverlayPaths(targetPackageName, userId));
                    pendingChanges.put(targetPackageName, list.build());
                }
            }
+4 −1
Original line number Diff line number Diff line
@@ -744,7 +744,7 @@ final class OverlayManagerServiceImpl {
    }

    OverlayPaths getEnabledOverlayPaths(@NonNull final String targetPackageName,
            final int userId) {
            final int userId, boolean includeImmutableOverlays) {
        final List<OverlayInfo> overlays = mSettings.getOverlaysForTarget(targetPackageName,
                userId);
        final OverlayPaths.Builder paths = new OverlayPaths.Builder();
@@ -754,6 +754,9 @@ final class OverlayManagerServiceImpl {
            if (!oi.isEnabled()) {
                continue;
            }
            if (!includeImmutableOverlays && !oi.isMutable) {
                continue;
            }
            if (oi.isFabricated()) {
                paths.addNonApkPath(oi.baseCodePath);
            } else {
+0 −10
Original line number Diff line number Diff line
@@ -178,18 +178,12 @@ final class OverlayManagerSettings {

    List<OverlayInfo> getOverlaysForTarget(@NonNull final String targetPackageName,
            final int userId) {
        // Immutable RROs targeting "android" are loaded from AssetManager, and so they should be
        // ignored in OverlayManagerService.
        final List<SettingsItem> items = selectWhereTarget(targetPackageName, userId);
        items.removeIf(OverlayManagerSettings::isImmutableFrameworkOverlay);
        return CollectionUtils.map(items, SettingsItem::getOverlayInfo);
    }

    ArrayMap<String, List<OverlayInfo>> getOverlaysForUser(final int userId) {
        // Immutable RROs targeting "android" are loaded from AssetManager, and so they should be
        // ignored in OverlayManagerService.
        final List<SettingsItem> items = selectWhereUser(userId);
        items.removeIf(OverlayManagerSettings::isImmutableFrameworkOverlay);

        final ArrayMap<String, List<OverlayInfo>> targetInfos = new ArrayMap<>();
        for (int i = 0, n = items.size(); i < n; i++) {
@@ -234,10 +228,6 @@ final class OverlayManagerSettings {
        return mItems.stream().mapToInt(SettingsItem::getUserId).distinct().toArray();
    }

    private static boolean isImmutableFrameworkOverlay(@NonNull SettingsItem item) {
        return !item.isMutable() && "android".equals(item.getTargetPackageName());
    }

    /**
     * Returns true if the settings were modified, false if they remain the same.
     */