summaryrefslogtreecommitdiffstats
path: root/core/java/android/content/res
diff options
context:
space:
mode:
authorClark Scheff <clark@cyngn.com>2015-02-18 16:15:29 -0800
committerClark Scheff <clark@cyngn.com>2015-10-27 10:40:35 -0700
commitd23b0fcb5f2be06951676d85aa5cae50c6abd9a0 (patch)
tree5a2ddd80bb4ce6e66bdde62878f6964e3571f6d6 /core/java/android/content/res
parentd12db22f546d6d55f9c6d1ec729875282c6f4097 (diff)
downloadframeworks_base-d23b0fcb5f2be06951676d85aa5cae50c6abd9a0.zip
frameworks_base-d23b0fcb5f2be06951676d85aa5cae50c6abd9a0.tar.gz
frameworks_base-d23b0fcb5f2be06951676d85aa5cae50c6abd9a0.tar.bz2
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
Diffstat (limited to 'core/java/android/content/res')
-rw-r--r--core/java/android/content/res/IThemeService.aidl3
-rw-r--r--core/java/android/content/res/ThemeChangeRequest.aidl19
-rw-r--r--core/java/android/content/res/ThemeChangeRequest.java225
-rw-r--r--core/java/android/content/res/ThemeConfig.java16
-rw-r--r--core/java/android/content/res/ThemeManager.java22
5 files changed, 280 insertions, 5 deletions
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<String, String> mThemeComponents = new HashMap<String, String>();
+ private final Map<String, String> mPerAppOverlays = new HashMap<String, String>();
+
+ 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<String, String> 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<String, String> 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<String, String> components, Map<String, String> 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<ThemeChangeRequest> CREATOR =
+ new Parcelable.Creator<ThemeChangeRequest>() {
+ @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<String, String> mThemeComponents = new HashMap<String, String>();
+ Map<String, String> mPerAppOverlays = new HashMap<String, String>();
+
+ 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<ThemeConfi
return theme.mFontPkgName;
}
+ public Map<String, AppTheme> 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<ThemeConfi
String overlay = mOverlays.get(appPkgName);
String font = mFonts.get(appPkgName);
- AppTheme appTheme = new AppTheme(overlay, icon, font);
- appThemes.put(appPkgName, appTheme);
+ // Remove app theme if all items are null
+ if (overlay == null && icon == null && font == null) {
+ if (appThemes.containsKey(appPkgName)) {
+ appThemes.remove(appPkgName);
+ }
+ } else {
+ AppTheme appTheme = new AppTheme(overlay, icon, font);
+ appThemes.put(appPkgName, appTheme);
+ }
}
ThemeConfig themeConfig = new ThemeConfig(appThemes);
themeConfig.mThemeChangeTimestamp = mThemeChangeTimestamp;
diff --git a/core/java/android/content/res/ThemeManager.java b/core/java/android/content/res/ThemeManager.java
index a9d2fcc..fd05f1e 100644
--- a/core/java/android/content/res/ThemeManager.java
+++ b/core/java/android/content/res/ThemeManager.java
@@ -222,16 +222,34 @@ public class ThemeManager {
}
public void requestThemeChange(String pkgName, List<String> components) {
+ requestThemeChange(pkgName, components, true);
+ }
+
+ public void requestThemeChange(String pkgName, List<String> components,
+ boolean removePerAppThemes) {
Map<String, String> componentMap = new HashMap<String, String>(components.size());
for (String component : components) {
componentMap.put(component, pkgName);
}
- requestThemeChange(componentMap);
+ requestThemeChange(componentMap, removePerAppThemes);
}
public void requestThemeChange(Map<String, String> componentMap) {
+ requestThemeChange(componentMap, true);
+ }
+
+ public void requestThemeChange(Map<String, String> 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);
}