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

Commit 3bd55593 authored by Ryan Mitchell's avatar Ryan Mitchell
Browse files

RRO: Update target overlays after install

Newly installed apps were not having the their set of enabled overlays
set correctly. This allows all newly installed packages to update their
set of enabled overlays in the package manager.

Bug: 77279210
Bug: 65319218
Change-Id: I82a10e96e9869bb6fc1ad00305ec4b6cfb17483b
Test: Manual validation of b/77279210 and duplicates. Also enabled a previously failing
PTS test in ag/3941515 within the same topic.
parent b2182c41
Loading
Loading
Loading
Loading
+21 −14
Original line number Diff line number Diff line
@@ -694,11 +694,17 @@ public final class OverlayManagerService extends SystemService {
    private final class OverlayChangeListener
            implements OverlayManagerServiceImpl.OverlayChangeListener {
        @Override
        public void onOverlaysChanged(@NonNull final String targetPackageName, final int userId) {
        public void onChanged(@NonNull final String targetPackageName, final int userId,
                boolean targetChanged, boolean overlayChanged) {
            schedulePersistSettings();
            FgThread.getHandler().post(() -> {
                // Update the targets' overlays if a change to the target or an overlay occurs
                if (targetChanged || overlayChanged) {
                    updateAssets(userId, targetPackageName);
                }

                // Create the broadcast if the overlay changes
                if (overlayChanged) {
                    final Intent intent = new Intent(Intent.ACTION_OVERLAY_CHANGED,
                            Uri.fromParts("package", targetPackageName, null));
                    intent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
@@ -709,11 +715,12 @@ public final class OverlayManagerService extends SystemService {

                    try {
                        ActivityManager.getService().broadcastIntent(null, intent, null, null, 0,
                            null, null, null, android.app.AppOpsManager.OP_NONE, null, false, false,
                            userId);
                                null, null, null, android.app.AppOpsManager.OP_NONE, null, false,
                                false, userId);
                    } catch (RemoteException e) {
                        // Intentionally left empty.
                    }
                }
            });
        }
    }
+37 −33
Original line number Diff line number Diff line
@@ -207,9 +207,7 @@ final class OverlayManagerServiceImpl {
            Slog.d(TAG, "onTargetPackageAdded packageName=" + packageName + " userId=" + userId);
        }

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

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

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

    void onTargetPackageUpgrading(@NonNull final String packageName, final int userId) {
@@ -228,9 +224,7 @@ final class OverlayManagerServiceImpl {
                    + userId);
        }

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

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

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

    void onTargetPackageRemoved(@NonNull final String packageName, final int userId) {
@@ -248,17 +240,17 @@ final class OverlayManagerServiceImpl {
            Slog.d(TAG, "onTargetPackageRemoved packageName=" + packageName + " userId=" + userId);
        }

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

    /**
     * Returns true if the settings were modified for this target.
     * Calls OverlayChangeListener#onChanged if the settings for the overlay target were modified,
     * and calls OverlayChangeListener#onTargetChanged to signal a change in the target package that
     * requires updating target overlays.
     */
    private boolean updateAllOverlaysForTarget(@NonNull final String targetPackageName,
    private void updateAllOverlaysForTarget(@NonNull final String targetPackageName,
            final int userId, final int flags) {
        boolean modified = false;
        boolean overlayModified = false;
        final List<OverlayInfo> ois = mSettings.getOverlaysForTarget(targetPackageName, userId);
        final int N = ois.size();
        for (int i = 0; i < N; i++) {
@@ -266,18 +258,19 @@ final class OverlayManagerServiceImpl {
            final PackageInfo overlayPackage = mPackageManager.getPackageInfo(oi.packageName,
                    userId);
            if (overlayPackage == null) {
                modified |= mSettings.remove(oi.packageName, oi.userId);
                overlayModified |= mSettings.remove(oi.packageName, oi.userId);
                removeIdmapIfPossible(oi);
            } else {
                try {
                    modified |= updateState(targetPackageName, oi.packageName, userId, flags);
                    overlayModified |= updateState(targetPackageName, oi.packageName, userId, flags);
                } catch (OverlayManagerSettings.BadKeyException e) {
                    Slog.e(TAG, "failed to update settings", e);
                    modified |= mSettings.remove(oi.packageName, userId);
                    overlayModified |= mSettings.remove(oi.packageName, userId);
                }
            }
        }
        return modified;

        mListener.onChanged(targetPackageName, userId, /* targetChanged */ true, overlayModified);
    }

    void onOverlayPackageAdded(@NonNull final String packageName, final int userId) {
@@ -298,7 +291,8 @@ final class OverlayManagerServiceImpl {
                overlayPackage.overlayCategory);
        try {
            if (updateState(overlayPackage.overlayTarget, packageName, userId, 0)) {
                mListener.onOverlaysChanged(overlayPackage.overlayTarget, userId);
                mListener.onChanged(overlayPackage.overlayTarget, userId,
                        /* targetChanged */ false,  /* overlayChanged */ true);
            }
        } catch (OverlayManagerSettings.BadKeyException e) {
            Slog.e(TAG, "failed to update settings", e);
@@ -314,7 +308,8 @@ final class OverlayManagerServiceImpl {
        try {
            final OverlayInfo oi = mSettings.getOverlayInfo(packageName, userId);
            if (updateState(oi.targetPackageName, packageName, userId, 0)) {
                mListener.onOverlaysChanged(oi.targetPackageName, userId);
                mListener.onChanged(oi.targetPackageName, userId,
                        /* targetChanged */ false,  /* overlayChanged */ true);
            }
        } catch (OverlayManagerSettings.BadKeyException e) {
            Slog.e(TAG, "failed to update settings", e);
@@ -331,7 +326,8 @@ final class OverlayManagerServiceImpl {
            final OverlayInfo oi = mSettings.getOverlayInfo(packageName, userId);
            if (updateState(oi.targetPackageName, packageName, userId, FLAG_OVERLAY_IS_UPGRADING)) {
                removeIdmapIfPossible(oi);
                mListener.onOverlaysChanged(oi.targetPackageName, userId);
                mListener.onChanged(oi.targetPackageName, userId,
                        /* targetChanged */ false,  /* overlayChanged */ true);
            }
        } catch (OverlayManagerSettings.BadKeyException e) {
            Slog.e(TAG, "failed to update settings", e);
@@ -365,7 +361,8 @@ final class OverlayManagerServiceImpl {
            }

            if (updateState(pkg.overlayTarget, packageName, userId, 0)) {
                mListener.onOverlaysChanged(pkg.overlayTarget, userId);
                mListener.onChanged(pkg.overlayTarget, userId,
                        /* targetChanged */ false,  /* overlayChanged */ true);
            }
        } catch (OverlayManagerSettings.BadKeyException e) {
            Slog.e(TAG, "failed to update settings", e);
@@ -379,7 +376,8 @@ final class OverlayManagerServiceImpl {
                removeIdmapIfPossible(overlayInfo);
                if (overlayInfo.isEnabled()) {
                    // Only trigger updates if the overlay was enabled.
                    mListener.onOverlaysChanged(overlayInfo.targetPackageName, userId);
                    mListener.onChanged(overlayInfo.targetPackageName, userId,
                            /* targetChanged */ false,  /* overlayChanged */ true);
                }
            }
        } catch (OverlayManagerSettings.BadKeyException e) {
@@ -427,7 +425,8 @@ final class OverlayManagerServiceImpl {
            modified |= updateState(oi.targetPackageName, oi.packageName, userId, 0);

            if (modified) {
                mListener.onOverlaysChanged(oi.targetPackageName, userId);
                mListener.onChanged(oi.targetPackageName, userId,
                        /* targetChanged */ false,  /* overlayChanged */ true);
            }
            return true;
        } catch (OverlayManagerSettings.BadKeyException e) {
@@ -486,7 +485,8 @@ final class OverlayManagerServiceImpl {
            modified |= updateState(targetPackageName, packageName, userId, 0);

            if (modified) {
                mListener.onOverlaysChanged(targetPackageName, userId);
                mListener.onChanged(targetPackageName, userId,
                        /* targetChanged */ false,  /* overlayChanged */ true);
            }
            return true;
        } catch (OverlayManagerSettings.BadKeyException e) {
@@ -519,7 +519,8 @@ final class OverlayManagerServiceImpl {
        }

        if (mSettings.setPriority(packageName, newParentPackageName, userId)) {
            mListener.onOverlaysChanged(overlayPackage.overlayTarget, userId);
            mListener.onChanged(overlayPackage.overlayTarget, userId,
                    /* targetChanged */ false,  /* overlayChanged */ true);
        }
        return true;
    }
@@ -539,7 +540,8 @@ final class OverlayManagerServiceImpl {
        }

        if (mSettings.setHighestPriority(packageName, userId)) {
            mListener.onOverlaysChanged(overlayPackage.overlayTarget, userId);
            mListener.onChanged(overlayPackage.overlayTarget, userId,
                    /* targetChanged */ false,  /* overlayChanged */ true);
        }
        return true;
    }
@@ -559,7 +561,8 @@ final class OverlayManagerServiceImpl {
        }

        if (mSettings.setLowestPriority(packageName, userId)) {
            mListener.onOverlaysChanged(overlayPackage.overlayTarget, userId);
            mListener.onChanged(overlayPackage.overlayTarget, userId,
                    /* targetChanged */ false,  /* overlayChanged */ true);
        }
        return true;
    }
@@ -690,7 +693,8 @@ final class OverlayManagerServiceImpl {
    }

    interface OverlayChangeListener {
        void onOverlaysChanged(@NonNull String targetPackage, int userId);
        void onChanged(@NonNull String targetPackage, int userId,
                boolean targetChanged, boolean overlayChanged);
    }

    interface PackageManagerHelper {