From 929ed8d2f46209026cfa6f4baa68b551d54401a0 Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Tue, 7 Mar 2017 16:01:20 -0500 Subject: [PATCH] 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 --- core/java/android/content/om/IOverlayManager.aidl | 5 ++++ .../android/server/om/OverlayManagerService.java | 19 +++++++++++++ .../server/om/OverlayManagerServiceImpl.java | 32 ++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/core/java/android/content/om/IOverlayManager.aidl b/core/java/android/content/om/IOverlayManager.aidl index 4f5d96038d1e..86c1aa8228f1 100644 --- a/core/java/android/content/om/IOverlayManager.aidl +++ b/core/java/android/content/om/IOverlayManager.aidl @@ -89,6 +89,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 * must have the same target and user. diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index 1af541d6587b..2026c1b176ba 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -504,6 +504,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 { enforceChangeOverlayPackagesPermission("setPriority"); diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java index ed493833139a..b085179c7fc5 100644 --- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java @@ -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 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); -- 2.11.0