/* * Copyright (C) 2015-2016 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 cyanogenmod.themes; import android.content.pm.ThemeUtils; import android.content.res.ThemeConfig; import android.os.Parcel; import android.os.Parcelable; import cyanogenmod.os.Concierge; import cyanogenmod.os.Concierge.ParcelInfo; import java.util.Collections; import java.util.HashMap; import java.util.Map; import static cyanogenmod.providers.ThemesContract.ThemesColumns.*; public final class ThemeChangeRequest implements Parcelable { public static final int DEFAULT_WALLPAPER_ID = -1; private final Map mThemeComponents = new HashMap<>(); private final Map mPerAppOverlays = new HashMap<>(); private RequestType mRequestType; private long mWallpaperId = -1; 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 String getLiveLockScreenThemePackageName() { return getThemePackageNameForComponent(MODIFIES_LIVE_LOCK_SCREEN); } public final Map getThemeComponentsMap() { return Collections.unmodifiableMap(mThemeComponents); } public long getWallpaperId() { return mWallpaperId; } /** * 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(); } public RequestType getReqeustType() { return mRequestType; } private String getThemePackageNameForComponent(String componentName) { return mThemeComponents.get(componentName); } private ThemeChangeRequest(Map components, Map perAppThemes, RequestType requestType, long wallpaperId) { if (components != null) { mThemeComponents.putAll(components); } if (perAppThemes != null) { mPerAppOverlays.putAll(perAppThemes); } mRequestType = requestType; mWallpaperId = wallpaperId; } private ThemeChangeRequest(Parcel source) { // Read parcelable version via the Concierge ParcelInfo parcelInfo = Concierge.receiveParcel(source); int parcelableVersion = parcelInfo.getParcelVersion(); 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()); } mRequestType = RequestType.values()[source.readInt()]; mWallpaperId = source.readLong(); // Complete parcel info for the concierge parcelInfo.complete(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // Tell the concierge to prepare the parcel ParcelInfo parcelInfo = Concierge.prepareParcel(dest); 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)); } dest.writeInt(mRequestType.ordinal()); dest.writeLong(mWallpaperId); // Complete the parcel info for the concierge parcelInfo.complete(); } 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 enum RequestType { USER_REQUEST, USER_REQUEST_MIXNMATCH, THEME_UPDATED, THEME_REMOVED, THEME_RESET } public static class Builder { Map mThemeComponents = new HashMap<>(); Map mPerAppOverlays = new HashMap<>(); RequestType mRequestType = RequestType.USER_REQUEST; long mWallpaperId; public Builder() {} public Builder(ThemeConfig themeConfig) { if (themeConfig != null) { buildChangeRequestFromThemeConfig(themeConfig); } } 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); } // Used in the case that more than one wallpaper exists for a given pkg name public Builder setWallpaperId(long id) { mWallpaperId = id; return this; } 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 setLiveLockScreen(String pkgName) { return setComponent(MODIFIES_LIVE_LOCK_SCREEN, 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 Builder setRequestType(RequestType requestType) { mRequestType = requestType != null ? requestType : RequestType.USER_REQUEST; return this; } public ThemeChangeRequest build() { 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 themes = themeConfig.getAppThemes(); for (String appPkgName : themes.keySet()) { if (ThemeUtils.isPerAppThemeComponent(appPkgName)) { this.setAppOverlay(appPkgName, themes.get(appPkgName).getOverlayPkgName()); } } } } }