diff options
4 files changed, 87 insertions, 11 deletions
diff --git a/core/java/android/content/res/ThemeChangeRequest.java b/core/java/android/content/res/ThemeChangeRequest.java index 08b0217..f4a840d 100644 --- a/core/java/android/content/res/ThemeChangeRequest.java +++ b/core/java/android/content/res/ThemeChangeRequest.java @@ -15,6 +15,7 @@ */ package android.content.res; +import android.content.pm.ThemeUtils; import android.os.Parcel; import android.os.Parcelable; @@ -182,6 +183,12 @@ public final class ThemeChangeRequest implements Parcelable { public Builder() {} + public Builder(ThemeConfig themeConfig) { + if (themeConfig != null) { + buildChangeRequestFromThemeConfig(themeConfig); + } + } + public Builder setOverlay(String pkgName) { return setComponent(MODIFIES_OVERLAYS, pkgName); } @@ -262,5 +269,31 @@ public final class ThemeChangeRequest implements Parcelable { return new ThemeChangeRequest(mThemeComponents, mPerAppOverlays, mRequestType, mWallpaperId); } + + private void buildChangeRequestFromThemeConfig(ThemeConfig themeConfig) { + if (themeConfig.getFontPkgName() != null) { + this.setFont(themeConfig.getFontPkgName()); + } + if (themeConfig.getIconPackPkgName() != null) { + this.setIcons(themeConfig.getIconPackPkgName()); + } + if (themeConfig.getOverlayPkgName() != null) { + this.setOverlay(themeConfig.getOverlayPkgName()); + } + if (themeConfig.getOverlayForStatusBar() != null) { + this.setStatusBar(themeConfig.getOverlayForStatusBar()); + } + if (themeConfig.getOverlayForNavBar() != null) { + this.setNavBar(themeConfig.getOverlayForNavBar()); + } + + // Check if there are any per-app overlays using this theme + final Map<String, ThemeConfig.AppTheme> themes = themeConfig.getAppThemes(); + for (String appPkgName : themes.keySet()) { + if (ThemeUtils.isPerAppThemeComponent(appPkgName)) { + this.setAppOverlay(appPkgName, themes.get(appPkgName).getOverlayPkgName()); + } + } + } } } diff --git a/core/java/android/content/res/ThemeConfig.java b/core/java/android/content/res/ThemeConfig.java index 602ef0a..ac95d6b 100644 --- a/core/java/android/content/res/ThemeConfig.java +++ b/core/java/android/content/res/ThemeConfig.java @@ -179,24 +179,24 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi * preference until the theme is switched at runtime. */ public static ThemeConfig getBootTheme(ContentResolver resolver) { - return getBootThemeForUser(resolver, UserHandle.getCallingUserId()); + return getBootThemeForUser(resolver, UserHandle.USER_OWNER); } public static ThemeConfig getBootThemeForUser(ContentResolver resolver, int userHandle) { ThemeConfig bootTheme = mSystemConfig; try { - String json = Settings.Secure.getString(resolver, - Configuration.THEME_PKG_CONFIGURATION_PERSISTENCE_PROPERTY); + String json = Settings.Secure.getStringForUser(resolver, + Configuration.THEME_PKG_CONFIGURATION_PERSISTENCE_PROPERTY, userHandle); bootTheme = ThemeConfig.fromJson(json); // Handle upgrade Case: Previously the theme configuration was in separate fields if (bootTheme == null) { - String overlayPkgName = Settings.Secure.getString(resolver, - Configuration.THEME_PACKAGE_NAME_PERSISTENCE_PROPERTY); - String iconPackPkgName = Settings.Secure.getString(resolver, - Configuration.THEME_ICONPACK_PACKAGE_NAME_PERSISTENCE_PROPERTY); - String fontPkgName = Settings.Secure.getString(resolver, - Configuration.THEME_FONT_PACKAGE_NAME_PERSISTENCE_PROPERTY); + String overlayPkgName = Settings.Secure.getStringForUser(resolver, + Configuration.THEME_PACKAGE_NAME_PERSISTENCE_PROPERTY, userHandle); + String iconPackPkgName = Settings.Secure.getStringForUser(resolver, + Configuration.THEME_ICONPACK_PACKAGE_NAME_PERSISTENCE_PROPERTY, userHandle); + String fontPkgName = Settings.Secure.getStringForUser(resolver, + Configuration.THEME_FONT_PACKAGE_NAME_PERSISTENCE_PROPERTY, userHandle); Builder builder = new Builder(); builder.defaultOverlay(overlayPkgName); diff --git a/services/core/java/com/android/server/ThemeService.java b/services/core/java/com/android/server/ThemeService.java index 87b8682..c570ca5 100644 --- a/services/core/java/com/android/server/ThemeService.java +++ b/services/core/java/com/android/server/ThemeService.java @@ -240,6 +240,9 @@ public class ThemeService extends IThemeService.Stub { IntentFilter filter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED); mContext.registerReceiver(mWallpaperChangeReceiver, filter); + filter = new IntentFilter(Intent.ACTION_USER_SWITCHED); + mContext.registerReceiver(mUserChangeReceiver, filter); + mPM = mContext.getPackageManager(); processInstalledThemes(); @@ -734,6 +737,24 @@ public class ThemeService extends IThemeService.Stub { return true; } + private boolean updateConfiguration(ThemeConfig themeConfig) { + final IActivityManager am = ActivityManagerNative.getDefault(); + if (am != null) { + final long token = Binder.clearCallingIdentity(); + try { + Configuration config = am.getConfiguration(); + + config.themeConfig = themeConfig; + am.updateConfiguration(config); + } catch (RemoteException e) { + return false; + } finally { + Binder.restoreCallingIdentity(token); + } + } + return true; + } + private boolean shouldUpdateConfiguration(ThemeChangeRequest request) { return request.getOverlayThemePackageName() != null || request.getFontThemePackageName() != null || @@ -1130,6 +1151,27 @@ public class ThemeService extends IThemeService.Stub { } }; + private BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); + if (userHandle >= 0) { + ThemeConfig config = ThemeConfig.getBootThemeForUser(mContext.getContentResolver(), + userHandle); + if (DEBUG) { + Log.d(TAG, + "Changing theme for user " + userHandle + " to " + config.toString()); + } + ThemeChangeRequest request = new ThemeChangeRequest.Builder(config).build(); + try { + requestThemeChange(request, true); + } catch (RemoteException e) { + Log.e(TAG, "Unable to change theme for user change", e); + } + } + } + }; + private Comparator<File> mOldestFilesFirstComparator = new Comparator<File>() { @Override public int compare(File lhs, File rhs) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f28550a..a371978 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -17628,8 +17628,9 @@ public final class ActivityManagerService extends ActivityManagerNative private void saveThemeResourceLocked(ThemeConfig t, boolean isDiff){ if(isDiff) { - Settings.Secure.putString(mContext.getContentResolver(), - Configuration.THEME_PKG_CONFIGURATION_PERSISTENCE_PROPERTY, t.toJson()); + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Configuration.THEME_PKG_CONFIGURATION_PERSISTENCE_PROPERTY, t.toJson(), + UserHandle.USER_CURRENT); } } |
