From d23b0fcb5f2be06951676d85aa5cae50c6abd9a0 Mon Sep 17 00:00:00 2001 From: Clark Scheff Date: Wed, 18 Feb 2015 16:15:29 -0800 Subject: Themes: Enhanced theming capabilities [1/3] This patch includes a new class, ThemeChangeRequest, which will be used to facilitate theme changes. This class includes a builder that will be used to create a ThemeChangeRequest. Change-Id: I60144f8a6505aefcc570feb15ccc50e77bcb1114 --- core/java/android/content/res/IThemeService.aidl | 3 +- .../android/content/res/ThemeChangeRequest.aidl | 19 ++ .../android/content/res/ThemeChangeRequest.java | 225 +++++++++++++++++++++ core/java/android/content/res/ThemeConfig.java | 16 +- core/java/android/content/res/ThemeManager.java | 22 +- 5 files changed, 280 insertions(+), 5 deletions(-) create mode 100644 core/java/android/content/res/ThemeChangeRequest.aidl create mode 100644 core/java/android/content/res/ThemeChangeRequest.java (limited to 'core/java/android/content/res') diff --git a/core/java/android/content/res/IThemeService.aidl b/core/java/android/content/res/IThemeService.aidl index 101ace9..90cb9fb 100644 --- a/core/java/android/content/res/IThemeService.aidl +++ b/core/java/android/content/res/IThemeService.aidl @@ -17,6 +17,7 @@ package android.content.res; import android.content.res.IThemeChangeListener; import android.content.res.IThemeProcessingListener; +import android.content.res.ThemeChangeRequest; import android.graphics.Bitmap; import java.util.Map; @@ -26,7 +27,7 @@ interface IThemeService { void requestThemeChangeUpdates(in IThemeChangeListener listener); void removeUpdates(in IThemeChangeListener listener); - void requestThemeChange(in Map componentMap); + void requestThemeChange(in ThemeChangeRequest request, boolean removePerAppThemes); void applyDefaultTheme(); boolean isThemeApplying(); int getProgress(); diff --git a/core/java/android/content/res/ThemeChangeRequest.aidl b/core/java/android/content/res/ThemeChangeRequest.aidl new file mode 100644 index 0000000..e6cf115 --- /dev/null +++ b/core/java/android/content/res/ThemeChangeRequest.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2015 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.content.res; + +/** @hide */ +parcelable ThemeChangeRequest; diff --git a/core/java/android/content/res/ThemeChangeRequest.java b/core/java/android/content/res/ThemeChangeRequest.java new file mode 100644 index 0000000..2c1f6ff --- /dev/null +++ b/core/java/android/content/res/ThemeChangeRequest.java @@ -0,0 +1,225 @@ +/* + * Copyright (C) 2015 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.content.res; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + + +import static android.provider.ThemesContract.ThemesColumns.*; + +/** @hide */ +public final class ThemeChangeRequest implements Parcelable { + private final Map mThemeComponents = new HashMap(); + private final Map mPerAppOverlays = new HashMap(); + + public String getOverlayThemePackageName() { + return getThemePackageNameForComponent(MODIFIES_OVERLAYS); + } + + public String getStatusBarThemePackageName() { + return getThemePackageNameForComponent(MODIFIES_STATUS_BAR); + } + + public String getNavBarThemePackageName() { + return getThemePackageNameForComponent(MODIFIES_NAVIGATION_BAR); + } + + public String getFontThemePackageName() { + return getThemePackageNameForComponent(MODIFIES_FONTS); + } + + public String getIconsThemePackageName() { + return getThemePackageNameForComponent(MODIFIES_ICONS); + } + + public String getBootanimationThemePackageName() { + return getThemePackageNameForComponent(MODIFIES_BOOT_ANIM); + } + + public String getWallpaperThemePackageName() { + return getThemePackageNameForComponent(MODIFIES_LAUNCHER); + } + + public String getLockWallpaperThemePackageName() { + return getThemePackageNameForComponent(MODIFIES_LOCKSCREEN); + } + + public String getAlarmThemePackageName() { + return getThemePackageNameForComponent(MODIFIES_ALARMS); + } + + public String getNotificationThemePackageName() { + return getThemePackageNameForComponent(MODIFIES_NOTIFICATIONS); + } + + public String getRingtoneThemePackageName() { + return getThemePackageNameForComponent(MODIFIES_RINGTONES); + } + + public final Map getThemeComponentsMap() { + return Collections.unmodifiableMap(mThemeComponents); + } + + /** + * Get the mapping for per app themes + * @return A mapping of apps and the theme to apply for each one. or null if none set. + */ + public final Map getPerAppOverlays() { + return Collections.unmodifiableMap(mPerAppOverlays); + } + + public int getNumChangesRequested() { + return mThemeComponents.size() + mPerAppOverlays.size(); + } + + private String getThemePackageNameForComponent(String componentName) { + return mThemeComponents.get(componentName); + } + + private ThemeChangeRequest(Map components, Map perAppThemes) { + if (components != null) { + mThemeComponents.putAll(components); + } + if (perAppThemes != null) { + mPerAppOverlays.putAll(perAppThemes); + } + } + + private ThemeChangeRequest(Parcel source) { + int numComponents = source.readInt(); + for (int i = 0; i < numComponents; i++) { + mThemeComponents.put(source.readString(), source.readString()); + } + + numComponents = source.readInt(); + for (int i = 0 ; i < numComponents; i++) { + mPerAppOverlays.put(source.readString(), source.readString()); + } + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(mThemeComponents.size()); + for (String component : mThemeComponents.keySet()) { + dest.writeString(component); + dest.writeString(mThemeComponents.get(component)); + } + dest.writeInt((mPerAppOverlays.size())); + for (String appPkgName : mPerAppOverlays.keySet()) { + dest.writeString(appPkgName); + dest.writeString(mPerAppOverlays.get(appPkgName)); + } + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + @Override + public ThemeChangeRequest createFromParcel(Parcel source) { + return new ThemeChangeRequest(source); + } + + @Override + public ThemeChangeRequest[] newArray(int size) { + return new ThemeChangeRequest[size]; + } + }; + + public static class Builder { + Map mThemeComponents = new HashMap(); + Map mPerAppOverlays = new HashMap(); + + public Builder() {} + + public Builder setOverlay(String pkgName) { + return setComponent(MODIFIES_OVERLAYS, pkgName); + } + + public Builder setStatusBar(String pkgName) { + return setComponent(MODIFIES_STATUS_BAR, pkgName); + } + + public Builder setNavBar(String pkgName) { + return setComponent(MODIFIES_NAVIGATION_BAR, pkgName); + } + + public Builder setFont(String pkgName) { + return setComponent(MODIFIES_FONTS, pkgName); + } + + public Builder setIcons(String pkgName) { + return setComponent(MODIFIES_ICONS, pkgName); + } + + public Builder setBootanimation(String pkgName) { + return setComponent(MODIFIES_BOOT_ANIM, pkgName); + } + + public Builder setWallpaper(String pkgName) { + return setComponent(MODIFIES_LAUNCHER, pkgName); + } + + public Builder setLockWallpaper(String pkgName) { + return setComponent(MODIFIES_LOCKSCREEN, pkgName); + } + + public Builder setAlarm(String pkgName) { + return setComponent(MODIFIES_ALARMS, pkgName); + } + + public Builder setNotification(String pkgName) { + return setComponent(MODIFIES_NOTIFICATIONS, pkgName); + } + + public Builder setRingtone(String pkgName) { + return setComponent(MODIFIES_RINGTONES, pkgName); + } + + public Builder setComponent(String component, String pkgName) { + if (pkgName != null) { + mThemeComponents.put(component, pkgName); + } else { + mThemeComponents.remove(component); + } + return this; + } + + public Builder setAppOverlay(String appPkgName, String themePkgName) { + if (appPkgName != null) { + if (themePkgName != null) { + mPerAppOverlays.put(appPkgName, themePkgName); + } else { + mPerAppOverlays.remove(appPkgName); + } + } + + return this; + } + + public ThemeChangeRequest build() { + return new ThemeChangeRequest(mThemeComponents, mPerAppOverlays); + } + } +} diff --git a/core/java/android/content/res/ThemeConfig.java b/core/java/android/content/res/ThemeConfig.java index 61c37c3..1882211 100644 --- a/core/java/android/content/res/ThemeConfig.java +++ b/core/java/android/content/res/ThemeConfig.java @@ -31,6 +31,7 @@ import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -105,6 +106,10 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable getAppThemes() { + return Collections.unmodifiableMap(mThemes); + } + private AppTheme getThemeFor(String pkgName) { AppTheme theme = mThemes.get(pkgName); if (theme == null) theme = getDefaultTheme(); @@ -429,8 +434,15 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable components) { + requestThemeChange(pkgName, components, true); + } + + public void requestThemeChange(String pkgName, List components, + boolean removePerAppThemes) { Map componentMap = new HashMap(components.size()); for (String component : components) { componentMap.put(component, pkgName); } - requestThemeChange(componentMap); + requestThemeChange(componentMap, removePerAppThemes); } public void requestThemeChange(Map componentMap) { + requestThemeChange(componentMap, true); + } + + public void requestThemeChange(Map componentMap, boolean removePerAppThemes) { + ThemeChangeRequest.Builder builder = new ThemeChangeRequest.Builder(); + for (String component : componentMap.keySet()) { + builder.setComponent(component, componentMap.get(component)); + } + + requestThemeChange(builder.build(), removePerAppThemes); + } + + public void requestThemeChange(ThemeChangeRequest request, boolean removePerAppThemes) { try { - mService.requestThemeChange(componentMap); + mService.requestThemeChange(request, removePerAppThemes); } catch (RemoteException e) { logThemeServiceException(e); } -- cgit v1.1