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

Commit 560830c9 authored by Todd Kennedy's avatar Todd Kennedy
Browse files

Track both framework and app overlays per package

Always bundle framework and app overlays. The old implementation, where
framework and app overlays were tracked independently, lead to an error
in the following scenario:

  1. Enable app overlay -> change reflected in app
  2. Enable framework overlay -> error: no change reflected in app
  3. Disable app overlay -> change reflected in app, including framework
     overlay

This change also leads to better architecture since the package manager
no longer needs to know that an app's overlays consist of both framework
and app specific overlays. Instead, that knowledge is handled by the
overlay manager.

Also, correct indentation in "cmd package dump packages" output and
remove obsolete constant DUMP_ENABLED_OVERLAYS.

Test: Manual
Change-Id: I707fc00052a15b22fb8c17e6155732520e6b2e52
Bug: 62680061
parent b274947d
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -714,11 +714,17 @@ public final class OverlayManagerService extends SystemService {

        final Map<String, List<String>> pendingChanges = new ArrayMap<>(targetPackageNames.size());
        synchronized (mLock) {
            final List<String> frameworkOverlays =
                mImpl.getEnabledOverlayPackageNames("android", userId);
            final int N = targetPackageNames.size();
            for (int i = 0; i < N; i++) {
                final String targetPackageName = targetPackageNames.get(i);
                pendingChanges.put(targetPackageName,
                        mImpl.getEnabledOverlayPackageNames(targetPackageName, userId));
                List<String> list = new ArrayList<>();
                if (!"android".equals(targetPackageName)) {
                    list.addAll(frameworkOverlays);
                }
                list.addAll(mImpl.getEnabledOverlayPackageNames(targetPackageName, userId));
                pendingChanges.put(targetPackageName, list);
            }
        }

+10 −3
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@ final class OverlayManagerServiceImpl {

        final PackageInfo targetPackage = mPackageManager.getPackageInfo(packageName, userId);
        updateAllOverlaysForTarget(packageName, userId, targetPackage);
        mListener.onOverlaysChanged(packageName, userId);
    }

    void onTargetPackageChanged(@NonNull final String packageName, final int userId) {
@@ -178,7 +179,9 @@ final class OverlayManagerServiceImpl {
        }

        final PackageInfo targetPackage = mPackageManager.getPackageInfo(packageName, userId);
        updateAllOverlaysForTarget(packageName, userId, targetPackage);
        if (updateAllOverlaysForTarget(packageName, userId, targetPackage)) {
            mListener.onOverlaysChanged(packageName, userId);
        }
    }

    void onTargetPackageUpgrading(@NonNull final String packageName, final int userId) {
@@ -186,7 +189,9 @@ final class OverlayManagerServiceImpl {
            Slog.d(TAG, "onTargetPackageUpgrading packageName=" + packageName + " userId=" + userId);
        }

        updateAllOverlaysForTarget(packageName, userId, null);
        if (updateAllOverlaysForTarget(packageName, userId, null)) {
            mListener.onOverlaysChanged(packageName, userId);
        }
    }

    void onTargetPackageUpgraded(@NonNull final String packageName, final int userId) {
@@ -195,7 +200,9 @@ final class OverlayManagerServiceImpl {
        }

        final PackageInfo targetPackage = mPackageManager.getPackageInfo(packageName, userId);
        updateAllOverlaysForTarget(packageName, userId, targetPackage);
        if (updateAllOverlaysForTarget(packageName, userId, targetPackage)) {
            mListener.onOverlaysChanged(packageName, userId);
        }
    }

    void onTargetPackageRemoved(@NonNull final String packageName, final int userId) {
+2 −10
Original line number Diff line number Diff line
@@ -21583,8 +21583,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
        public static final int DUMP_FROZEN = 1 << 19;
        public static final int DUMP_DEXOPT = 1 << 20;
        public static final int DUMP_COMPILER_STATS = 1 << 21;
        public static final int DUMP_ENABLED_OVERLAYS = 1 << 22;
        public static final int DUMP_CHANGES = 1 << 23;
        public static final int DUMP_CHANGES = 1 << 22;
        public static final int OPTION_SHOW_FILTERS = 1 << 0;
@@ -21828,8 +21827,6 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
                dumpState.setDump(DumpState.DUMP_DEXOPT);
            } else if ("compiler-stats".equals(cmd)) {
                dumpState.setDump(DumpState.DUMP_COMPILER_STATS);
            } else if ("enabled-overlays".equals(cmd)) {
                dumpState.setDump(DumpState.DUMP_ENABLED_OVERLAYS);
            } else if ("changes".equals(cmd)) {
                dumpState.setDump(DumpState.DUMP_CHANGES);
            } else if ("write".equals(cmd)) {
@@ -24606,12 +24603,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
                }
                final PackageSetting ps = mSettings.mPackages.get(targetPackageName);
                String[] frameworkOverlayPaths = null;
                if (!"android".equals(targetPackageName)) {
                    frameworkOverlayPaths =
                            mSettings.mPackages.get("android").getOverlayPaths(userId);
                }
                ps.setOverlayPaths(overlayPaths, frameworkOverlayPaths, userId);
                ps.setOverlayPaths(overlayPaths, userId);
                return true;
            }
        }
+3 −15
Original line number Diff line number Diff line
@@ -330,21 +330,9 @@ abstract class PackageSettingBase extends SettingBase {
        modifyUserState(userId).installReason = installReason;
    }

    void setOverlayPaths(List<String> overlayPaths, String[] frameworkOverlayPaths, int userId) {
        if (overlayPaths == null && frameworkOverlayPaths == null) {
            modifyUserState(userId).overlayPaths = null;
            return;
        }
        final List<String> paths;
        if (frameworkOverlayPaths == null) {
            paths = overlayPaths;
        } else {
            paths = Lists.newArrayList(frameworkOverlayPaths);
            if (overlayPaths != null) {
                paths.addAll(overlayPaths);
            }
        }
        modifyUserState(userId).overlayPaths = paths.toArray(new String[paths.size()]);
    void setOverlayPaths(List<String> overlayPaths, int userId) {
        modifyUserState(userId).overlayPaths = overlayPaths == null ? null :
            overlayPaths.toArray(new String[overlayPaths.size()]);
    }

    String[] getOverlayPaths(int userId) {
+2 −2
Original line number Diff line number Diff line
@@ -4861,9 +4861,9 @@ final class Settings {

            String[] overlayPaths = ps.getOverlayPaths(user.id);
            if (overlayPaths != null && overlayPaths.length > 0) {
                pw.println("Overlay paths:");
                pw.print(prefix); pw.println("  overlay paths:");
                for (String path : overlayPaths) {
                    pw.println(path);
                    pw.print(prefix); pw.print("    "); pw.println(path);
                }
            }