summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authord34d <clark@cyngn.com>2015-03-13 21:12:54 -0700
committerd34d <clark@cyngn.com>2015-10-28 11:37:26 -0700
commit12a2541a0b8490038ca2f17c9b9b59d67befb6c9 (patch)
treec64c26a79a43deeb75b78a7ce2977e5aafe49bf9
parent577488854a893fe07df193fbd6a616e67bf548e0 (diff)
downloadframeworks_base-12a2541a0b8490038ca2f17c9b9b59d67befb6c9.zip
frameworks_base-12a2541a0b8490038ca2f17c9b9b59d67befb6c9.tar.gz
frameworks_base-12a2541a0b8490038ca2f17c9b9b59d67befb6c9.tar.bz2
Themes: Switch themes when user changes
This patch grabs the theme config for the new user and then creates a ThemeChangeRequest from that config. This request is then processed and applied for the new user. Secondary users will not be able to change themes at this time. This patch helps pave the way for that ability and provides a better user experience when switching users. Change-Id: I6d7e2ab312b8e3e5c099d1e9e2e62892bead10da
-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);
}
}