summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/content/res/ThemeChangeRequest.java33
-rw-r--r--core/java/android/content/res/ThemeConfig.java18
-rw-r--r--services/core/java/com/android/server/ThemeService.java42
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java5
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);
}
}