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

Commit 929ed8d2 authored by Jason Monk's avatar Jason Monk
Browse files

Add OverlayManagerService#setEnableExclusive

This lets settings use one call to set the current theme overlay
for the "android" package.

Test: Change theme in Settings -> Display
Change-Id: Ia566e58c5479dedb7184f4218151f8080f8ebc0f
parent a33ae2d8
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -88,6 +88,11 @@ interface IOverlayManager {
     */
    boolean setEnabled(in String packageName, in boolean enable, in int userId);

    /**
     * Version of setEnabled that will also disable any other overlays for the target package.
     */
    boolean setEnabledExclusive(in String packageName, in boolean enable, in int userId);

    /**
     * Change the priority of the given overlay to be just higher than the
     * overlay with package name newParentPackageName. Both overlay packages
+19 −0
Original line number Diff line number Diff line
@@ -503,6 +503,25 @@ public final class OverlayManagerService extends SystemService {
            }
        }

        @Override
        public boolean setEnabledExclusive(@Nullable final String packageName, final boolean enable,
                int userId) throws RemoteException {
            enforceChangeOverlayPackagesPermission("setEnabled");
            userId = handleIncomingUser(userId, "setEnabled");
            if (packageName == null) {
                return false;
            }

            final long ident = Binder.clearCallingIdentity();
            try {
                synchronized (mLock) {
                    return mImpl.setEnabledExclusive(packageName, enable, userId);
                }
            } finally {
                Binder.restoreCallingIdentity(ident);
            }
        }

        @Override
        public boolean setPriority(@Nullable final String packageName,
                @Nullable final String parentPackageName, int userId) throws RemoteException {
+32 −0
Original line number Diff line number Diff line
@@ -301,6 +301,38 @@ final class OverlayManagerServiceImpl {
        }
    }

    boolean setEnabledExclusive(@NonNull final String packageName, final boolean enable,
            final int userId) {
        if (DEBUG) {
            Slog.d(TAG, String.format("setEnabled packageName=%s enable=%s userId=%d",
                        packageName, enable, userId));
        }

        final PackageInfo overlayPackage = mPackageManager.getPackageInfo(packageName, userId);
        if (overlayPackage == null) {
            return false;
        }

        try {
            final OverlayInfo oi = mSettings.getOverlayInfo(packageName, userId);
            List<OverlayInfo> allOverlays = getOverlayInfosForTarget(oi.targetPackageName, userId);

            // Disable all other overlays.
            allOverlays.remove(oi);
            for (int i = 0; i < allOverlays.size(); i++) {
                mSettings.setEnabled(allOverlays.get(i).packageName, userId, false);
            }

            final PackageInfo targetPackage =
                    mPackageManager.getPackageInfo(oi.targetPackageName, userId);
            mSettings.setEnabled(packageName, userId, enable);
            updateState(targetPackage, overlayPackage, userId);
            return true;
        } catch (OverlayManagerSettings.BadKeyException e) {
            return false;
        }
    }

    boolean setPriority(@NonNull final String packageName,
            @NonNull final String newParentPackageName, final int userId) {
        return mSettings.setPriority(packageName, newParentPackageName, userId);