summaryrefslogtreecommitdiffstats
path: root/core/java/android/content
diff options
context:
space:
mode:
authord34d <clark@cyngn.com>2016-02-23 14:44:08 -0800
committerClark Scheff <clark@cyngn.com>2016-03-04 14:01:06 -0800
commit1bd60bda797443e029846ef340b2083638b5e554 (patch)
treeb852a5e9ac5584640ab338cd827f629445e0f414 /core/java/android/content
parent8ff13dea571cefa0197d71b37d69adbe2908ad55 (diff)
downloadframeworks_base-1bd60bda797443e029846ef340b2083638b5e554.zip
frameworks_base-1bd60bda797443e029846ef340b2083638b5e554.tar.gz
frameworks_base-1bd60bda797443e029846ef340b2083638b5e554.tar.bz2
Themes: Refactor themes to CMSDK [1/6]
Change-Id: I3688b37342eddcfceeabaae982085884e9bc63ee TICKET: CYNGNOS-2126
Diffstat (limited to 'core/java/android/content')
-rw-r--r--core/java/android/content/Context.java10
-rw-r--r--core/java/android/content/Intent.java23
-rw-r--r--core/java/android/content/pm/ThemeUtils.java605
-rw-r--r--core/java/android/content/res/IThemeChangeListener.aidl22
-rw-r--r--core/java/android/content/res/IThemeProcessingListener.aidl21
-rw-r--r--core/java/android/content/res/IThemeService.aidl43
-rw-r--r--core/java/android/content/res/ThemeChangeRequest.aidl19
-rw-r--r--core/java/android/content/res/ThemeChangeRequest.java307
-rw-r--r--core/java/android/content/res/ThemeConfig.java52
-rw-r--r--core/java/android/content/res/ThemeManager.java316
10 files changed, 19 insertions, 1399 deletions
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index fc40a73..7ddda11 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3152,16 +3152,6 @@ public abstract class Context {
/**
* Use with {@link #getSystemService} to retrieve a
- * {@link android.content.res.ThemeManager} for accessing theme service.
- *
- * @see #getSystemService
- * @see android.content.res.ThemeManager
- * @hide
- */
- public static final String THEME_SERVICE = "themes";
-
- /**
- * Use with {@link #getSystemService} to retrieve a
* {@link android.nfc.NfcManager} for using NFC.
*
* @see #getSystemService
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 2a24fe3..d063454 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2881,21 +2881,6 @@ public class Intent implements Parcelable, Cloneable {
"android.intent.action.QUICK_CLOCK";
/**
- * Broadcast Action: Indicate that unrecoverable error happened during app launch.
- * Could indicate that curently applied theme is malicious.
- * @hide
- */
- public static final String ACTION_APP_FAILURE =
- "com.tmobile.intent.action.APP_FAILURE";
-
- /**
- * Broadcast Action: Request to reset the unrecoverable errors count to 0.
- * @hide
- */
- public static final String ACTION_APP_FAILURE_RESET =
- "com.tmobile.intent.action.APP_FAILURE_RESET";
-
- /**
* Activity Action: Shows the brightness setting dialog.
* @hide
*/
@@ -3282,14 +3267,6 @@ public class Intent implements Parcelable, Cloneable {
@SdkConstant(SdkConstantType.INTENT_CATEGORY)
public static final String CATEGORY_CAR_MODE = "android.intent.category.CAR_MODE";
- /**
- * Used to indicate that a theme package has been installed or un-installed.
- *
- * @hide
- */
- public static final String CATEGORY_THEME_PACKAGE_INSTALLED_STATE_CHANGE =
- "com.tmobile.intent.category.THEME_PACKAGE_INSTALL_STATE_CHANGE";
-
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// Application launch intent categories (see addCategory()).
diff --git a/core/java/android/content/pm/ThemeUtils.java b/core/java/android/content/pm/ThemeUtils.java
index e41523c..07e73b5 100644
--- a/core/java/android/content/pm/ThemeUtils.java
+++ b/core/java/android/content/pm/ThemeUtils.java
@@ -15,112 +15,30 @@
*/
package android.content.pm;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.IntentFilter;
-import android.content.res.AssetManager;
-import android.content.res.Configuration;
import android.content.res.ThemeConfig;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.FileUtils;
-import android.os.SystemProperties;
-import android.provider.MediaStore;
-import android.provider.Settings;
-import android.provider.ThemesContract;
-import android.provider.ThemesContract.ThemesColumns;
import android.text.TextUtils;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.WindowManager;
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.InputStreamReader;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
import java.util.jar.StrictJarFile;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import java.util.zip.ZipOutputStream;
-
-import static android.content.res.ThemeConfig.SYSTEM_DEFAULT;
/**
* @hide
*/
public class ThemeUtils {
- private static final String TAG = "ThemeUtils";
+ private static final String TAG = ThemeUtils.class.getSimpleName();
/* Path inside a theme APK to the overlay folder */
public static final String OVERLAY_PATH = "assets/overlays/";
public static final String ICONS_PATH = "assets/icons/";
public static final String COMMON_RES_PATH = "assets/overlays/common/";
- public static final String FONT_XML = "fonts.xml";
public static final String RESOURCE_CACHE_DIR = "/data/resource-cache/";
- public static final String IDMAP_SUFFIX = "@idmap";
- public static final String COMMON_RES_SUFFIX = ".common";
public static final String COMMON_RES_TARGET = "common";
- public static final String ICON_HASH_FILENAME = "hash";
-
- // path to external theme resources, i.e. bootanimation.zip
- public static final String SYSTEM_THEME_PATH = "/data/system/theme";
- public static final String SYSTEM_THEME_FONT_PATH = SYSTEM_THEME_PATH + File.separator + "fonts";
- public static final String SYSTEM_THEME_RINGTONE_PATH = SYSTEM_THEME_PATH
- + File.separator + "ringtones";
- public static final String SYSTEM_THEME_NOTIFICATION_PATH = SYSTEM_THEME_PATH
- + File.separator + "notifications";
- public static final String SYSTEM_THEME_ALARM_PATH = SYSTEM_THEME_PATH
- + File.separator + "alarms";
- public static final String SYSTEM_THEME_ICON_CACHE_DIR = SYSTEM_THEME_PATH
- + File.separator + "icons";
- // internal path to bootanimation.zip inside theme apk
- public static final String THEME_BOOTANIMATION_PATH = "assets/bootanimation/bootanimation.zip";
-
- public static final String SYSTEM_MEDIA_PATH = "/system/media/audio";
- public static final String SYSTEM_ALARMS_PATH = SYSTEM_MEDIA_PATH + File.separator
- + "alarms";
- public static final String SYSTEM_RINGTONES_PATH = SYSTEM_MEDIA_PATH + File.separator
- + "ringtones";
- public static final String SYSTEM_NOTIFICATIONS_PATH = SYSTEM_MEDIA_PATH + File.separator
- + "notifications";
-
- // path to asset lockscreen and wallpapers directory
- public static final String LOCKSCREEN_WALLPAPER_PATH = "lockscreen";
- public static final String WALLPAPER_PATH = "wallpapers";
-
- private static final String MEDIA_CONTENT_URI = "content://media/internal/audio/media";
-
- // Constants for theme change broadcast
- public static final String ACTION_THEME_CHANGED = "org.cyanogenmod.intent.action.THEME_CHANGED";
- public static final String CATEGORY_THEME_COMPONENT_PREFIX = "org.cyanogenmod.intent.category.";
- public static final String EXTRA_COMPONENTS = "components";
- public static final String EXTRA_REQUEST_TYPE = "request_type";
- public static final String EXTRA_UPDATE_TIME = "update_time";
-
- public static final int SYSTEM_TARGET_API = 0;
// Package name for any app which does not have a specific theme applied
private static final String DEFAULT_PKG = "default";
- private static final String SETTINGS_DB =
- "/data/data/com.android.providers.settings/databases/settings.db";
- private static final String SETTINGS_SECURE_TABLE = "secure";
private static final String MANIFEST_NAME = "META-INF/MANIFEST.MF";
/**
@@ -156,18 +74,10 @@ public class ThemeUtils {
/**
* Get the path of the resource cache for the given target and theme
- * @param targetPkgName
- * @param themePkg
+ * @param targetPkgName Target app package name
+ * @param themePkgName Theme package name
* @return Path to the resource cache for this target and theme
*/
- public static String getTargetCacheDir(String targetPkgName, PackageInfo themePkg) {
- return getTargetCacheDir(targetPkgName, themePkg.packageName);
- }
-
- public static String getTargetCacheDir(String targetPkgName, PackageParser.Package themePkg) {
- return getTargetCacheDir(targetPkgName, themePkg.packageName);
- }
-
public static String getTargetCacheDir(String targetPkgName, String themePkgName) {
return getOverlayResourceCacheDir(themePkgName) + File.separator + targetPkgName;
}
@@ -181,18 +91,10 @@ public class ThemeUtils {
return getOverlayResourceCacheDir(pkgName) + File.separator + "icons";
}
- public static String getIconHashFile(String pkgName) {
- return getIconPackDir(pkgName) + File.separator + ICON_HASH_FILENAME;
- }
-
public static String getIconPackApkPath(String pkgName) {
return getIconPackDir(pkgName) + "/resources.apk";
}
- public static String getIconPackResPath(String pkgName) {
- return getIconPackDir(pkgName) + "/resources.arsc";
- }
-
public static String getIdmapPath(String targetPkgName, String overlayPkgName) {
return getTargetCacheDir(targetPkgName, overlayPkgName) + File.separator + "idmap";
}
@@ -211,507 +113,6 @@ public class ThemeUtils {
return COMMON_RES_TARGET;
}
- public static void createCacheDirIfNotExists() throws IOException {
- File file = new File(RESOURCE_CACHE_DIR);
- if (!file.exists() && !file.mkdir()) {
- throw new IOException("Could not create dir: " + file.toString());
- }
- FileUtils.setPermissions(file, FileUtils.S_IRWXU
- | FileUtils.S_IRWXG | FileUtils.S_IROTH | FileUtils.S_IXOTH, -1, -1);
- }
-
- public static void createResourcesDirIfNotExists(String targetPkgName, String overlayPkgName)
- throws IOException {
- createDirIfNotExists(getOverlayResourceCacheDir(overlayPkgName));
- File file = new File(getTargetCacheDir(targetPkgName, overlayPkgName));
- if (!file.exists() && !file.mkdir()) {
- throw new IOException("Could not create dir: " + file.toString());
- }
- FileUtils.setPermissions(file, FileUtils.S_IRWXU
- | FileUtils.S_IRWXG | FileUtils.S_IROTH | FileUtils.S_IXOTH, -1, -1);
- }
-
- public static void createIconDirIfNotExists(String pkgName) throws IOException {
- createDirIfNotExists(getOverlayResourceCacheDir(pkgName));
- File file = new File(getIconPackDir(pkgName));
- if (!file.exists() && !file.mkdir()) {
- throw new IOException("Could not create dir: " + file.toString());
- }
- FileUtils.setPermissions(file, FileUtils.S_IRWXU
- | FileUtils.S_IRWXG | FileUtils.S_IROTH | FileUtils.S_IXOTH, -1, -1);
- }
-
- private static boolean dirExists(String dirPath) {
- final File dir = new File(dirPath);
- return dir.exists() && dir.isDirectory();
- }
-
- private static void createDirIfNotExists(String dirPath) {
- if (!dirExists(dirPath)) {
- File dir = new File(dirPath);
- if (dir.mkdir()) {
- FileUtils.setPermissions(dir, FileUtils.S_IRWXU |
- FileUtils.S_IRWXG| FileUtils.S_IROTH | FileUtils.S_IXOTH, -1, -1);
- }
- }
- }
-
- /**
- * Create SYSTEM_THEME_PATH directory if it does not exist
- */
- public static void createThemeDirIfNotExists() {
- createDirIfNotExists(SYSTEM_THEME_PATH);
- }
-
- /**
- * Create SYSTEM_FONT_PATH directory if it does not exist
- */
- public static void createFontDirIfNotExists() {
- createDirIfNotExists(SYSTEM_THEME_FONT_PATH);
- }
-
- /**
- * Create SYSTEM_THEME_RINGTONE_PATH directory if it does not exist
- */
- public static void createRingtoneDirIfNotExists() {
- createDirIfNotExists(SYSTEM_THEME_RINGTONE_PATH);
- }
-
- /**
- * Create SYSTEM_THEME_NOTIFICATION_PATH directory if it does not exist
- */
- public static void createNotificationDirIfNotExists() {
- createDirIfNotExists(SYSTEM_THEME_NOTIFICATION_PATH);
- }
-
- /**
- * Create SYSTEM_THEME_ALARM_PATH directory if it does not exist
- */
- public static void createAlarmDirIfNotExists() {
- createDirIfNotExists(SYSTEM_THEME_ALARM_PATH);
- }
-
- /**
- * Create SYSTEM_THEME_ICON_CACHE_DIR directory if it does not exist
- */
- public static void createIconCacheDirIfNotExists() {
- createDirIfNotExists(SYSTEM_THEME_ICON_CACHE_DIR);
- }
-
- public static void clearIconCache() {
- FileUtils.deleteContents(new File(SYSTEM_THEME_ICON_CACHE_DIR));
- }
-
- public static InputStream getInputStreamFromAsset(Context ctx, String path) throws IOException {
- if (ctx == null || path == null)
- return null;
- InputStream is = null;
- String ASSET_BASE = "file:///android_asset/";
- path = path.substring(ASSET_BASE.length());
- AssetManager assets = ctx.getAssets();
- is = assets.open(path);
- return is;
- }
-
- public static void closeQuietly(InputStream stream) {
- if (stream == null)
- return;
- try {
- stream.close();
- } catch (IOException e) {
- }
- }
-
- public static void closeQuietly(OutputStream stream) {
- if (stream == null)
- return;
- try {
- stream.close();
- } catch (IOException e) {
- }
- }
-
- /**
- * Scale the boot animation to better fit the device by editing the desc.txt found
- * in the bootanimation.zip
- * @param context Context to use for getting an instance of the WindowManager
- * @param input InputStream of the original bootanimation.zip
- * @param dst Path to store the newly created bootanimation.zip
- * @throws IOException
- */
- public static void copyAndScaleBootAnimation(Context context, InputStream input, String dst)
- throws IOException {
- final OutputStream os = new FileOutputStream(dst);
- final ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(os));
- final ZipInputStream bootAni = new ZipInputStream(new BufferedInputStream(input));
- ZipEntry ze;
-
- zos.setMethod(ZipOutputStream.STORED);
- final byte[] bytes = new byte[4096];
- int len;
- while ((ze = bootAni.getNextEntry()) != null) {
- ZipEntry entry = new ZipEntry(ze.getName());
- entry.setMethod(ZipEntry.STORED);
- entry.setCrc(ze.getCrc());
- entry.setSize(ze.getSize());
- entry.setCompressedSize(ze.getSize());
- if (!ze.getName().equals("desc.txt")) {
- // just copy this entry straight over into the output zip
- zos.putNextEntry(entry);
- while ((len = bootAni.read(bytes)) > 0) {
- zos.write(bytes, 0, len);
- }
- } else {
- String line;
- BufferedReader reader = new BufferedReader(new InputStreamReader(bootAni));
- final String[] info = reader.readLine().split(" ");
-
- int scaledWidth;
- int scaledHeight;
- WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
- DisplayMetrics dm = new DisplayMetrics();
- wm.getDefaultDisplay().getRealMetrics(dm);
- // just in case the device is in landscape orientation we will
- // swap the values since most (if not all) animations are portrait
- if (dm.widthPixels > dm.heightPixels) {
- scaledWidth = dm.heightPixels;
- scaledHeight = dm.widthPixels;
- } else {
- scaledWidth = dm.widthPixels;
- scaledHeight = dm.heightPixels;
- }
-
- int width = Integer.parseInt(info[0]);
- int height = Integer.parseInt(info[1]);
-
- if (width == height)
- scaledHeight = scaledWidth;
- else {
- // adjust scaledHeight to retain original aspect ratio
- float scale = (float)scaledWidth / (float)width;
- int newHeight = (int)((float)height * scale);
- if (newHeight < scaledHeight)
- scaledHeight = newHeight;
- }
-
- CRC32 crc32 = new CRC32();
- int size = 0;
- ByteBuffer buffer = ByteBuffer.wrap(bytes);
- line = String.format("%d %d %s\n", scaledWidth, scaledHeight, info[2]);
- buffer.put(line.getBytes());
- size += line.getBytes().length;
- crc32.update(line.getBytes());
- while ((line = reader.readLine()) != null) {
- line = String.format("%s\n", line);
- buffer.put(line.getBytes());
- size += line.getBytes().length;
- crc32.update(line.getBytes());
- }
- entry.setCrc(crc32.getValue());
- entry.setSize(size);
- entry.setCompressedSize(size);
- zos.putNextEntry(entry);
- zos.write(buffer.array(), 0, size);
- }
- zos.closeEntry();
- }
- zos.close();
- }
-
- public static boolean isValidAudible(String fileName) {
- return (fileName != null &&
- (fileName.endsWith(".mp3") || fileName.endsWith(".ogg")));
- }
-
- public static boolean setAudible(Context context, File ringtone, int type, String name) {
- final String path = ringtone.getAbsolutePath();
- final String mimeType = name.endsWith(".ogg") ? "audio/ogg" : "audio/mp3";
- ContentValues values = new ContentValues();
- values.put(MediaStore.MediaColumns.DATA, path);
- values.put(MediaStore.MediaColumns.TITLE, name);
- values.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
- values.put(MediaStore.MediaColumns.SIZE, ringtone.length());
- values.put(MediaStore.Audio.Media.IS_RINGTONE, type == RingtoneManager.TYPE_RINGTONE);
- values.put(MediaStore.Audio.Media.IS_NOTIFICATION,
- type == RingtoneManager.TYPE_NOTIFICATION);
- values.put(MediaStore.Audio.Media.IS_ALARM, type == RingtoneManager.TYPE_ALARM);
- values.put(MediaStore.Audio.Media.IS_MUSIC, false);
-
- Uri uri = MediaStore.Audio.Media.getContentUriForPath(path);
- Uri newUri = null;
- Cursor c = context.getContentResolver().query(uri,
- new String[] {MediaStore.MediaColumns._ID},
- MediaStore.MediaColumns.DATA + "='" + path + "'",
- null, null);
- if (c != null && c.getCount() > 0) {
- c.moveToFirst();
- long id = c.getLong(0);
- c.close();
- newUri = Uri.withAppendedPath(Uri.parse(MEDIA_CONTENT_URI), "" + id);
- context.getContentResolver().update(uri, values,
- MediaStore.MediaColumns._ID + "=" + id, null);
- }
- if (newUri == null)
- newUri = context.getContentResolver().insert(uri, values);
- try {
- RingtoneManager.setActualDefaultRingtoneUri(context, type, newUri);
- } catch (Exception e) {
- return false;
- }
- return true;
- }
-
- public static boolean setDefaultAudible(Context context, int type) {
- final String audiblePath = getDefaultAudiblePath(type);
- if (audiblePath != null) {
- Uri uri = MediaStore.Audio.Media.getContentUriForPath(audiblePath);
- Cursor c = context.getContentResolver().query(uri,
- new String[] {MediaStore.MediaColumns._ID},
- MediaStore.MediaColumns.DATA + "='" + audiblePath + "'",
- null, null);
- if (c != null && c.getCount() > 0) {
- c.moveToFirst();
- long id = c.getLong(0);
- c.close();
- uri = Uri.withAppendedPath(
- Uri.parse(MEDIA_CONTENT_URI), "" + id);
- }
- if (uri != null)
- RingtoneManager.setActualDefaultRingtoneUri(context, type, uri);
- } else {
- return false;
- }
- return true;
- }
-
- public static String getDefaultAudiblePath(int type) {
- final String name;
- final String path;
- switch (type) {
- case RingtoneManager.TYPE_ALARM:
- name = SystemProperties.get("ro.config.alarm_alert", null);
- path = name != null ? SYSTEM_ALARMS_PATH + File.separator + name : null;
- break;
- case RingtoneManager.TYPE_NOTIFICATION:
- name = SystemProperties.get("ro.config.notification_sound", null);
- path = name != null ? SYSTEM_NOTIFICATIONS_PATH + File.separator + name : null;
- break;
- case RingtoneManager.TYPE_RINGTONE:
- name = SystemProperties.get("ro.config.ringtone", null);
- path = name != null ? SYSTEM_RINGTONES_PATH + File.separator + name : null;
- break;
- default:
- path = null;
- break;
- }
- return path;
- }
-
- public static void clearAudibles(Context context, String audiblePath) {
- final File audibleDir = new File(audiblePath);
- if (audibleDir.exists()) {
- String[] files = audibleDir.list();
- final ContentResolver resolver = context.getContentResolver();
- for (String s : files) {
- final String filePath = audiblePath + File.separator + s;
- Uri uri = MediaStore.Audio.Media.getContentUriForPath(filePath);
- resolver.delete(uri, MediaStore.MediaColumns.DATA + "=\""
- + filePath + "\"", null);
- (new File(filePath)).delete();
- }
- }
- }
-
- public static Context createUiContext(final Context context) {
- try {
- Context uiContext = context.createPackageContext("com.android.systemui",
- Context.CONTEXT_RESTRICTED);
- return new ThemedUiContext(uiContext, context.getApplicationContext());
- } catch (PackageManager.NameNotFoundException e) {
- }
-
- return null;
- }
-
- public static void registerThemeChangeReceiver(final Context context,
- final BroadcastReceiver receiver) {
- IntentFilter filter = new IntentFilter(ACTION_THEME_CHANGED);
-
- context.registerReceiver(receiver, filter);
- }
-
- public static String getLockscreenWallpaperPath(AssetManager assetManager) throws IOException {
- String[] assets = assetManager.list(LOCKSCREEN_WALLPAPER_PATH);
- String asset = getFirstNonEmptyAsset(assets);
- if (asset == null) return null;
- return LOCKSCREEN_WALLPAPER_PATH + File.separator + asset;
- }
-
- public static String getWallpaperPath(AssetManager assetManager) throws IOException {
- String[] assets = assetManager.list(WALLPAPER_PATH);
- String asset = getFirstNonEmptyAsset(assets);
- if (asset == null) return null;
- return WALLPAPER_PATH + File.separator + asset;
- }
-
- public static List<String> getWallpaperPathList(AssetManager assetManager)
- throws IOException {
- List<String> wallpaperList = new ArrayList<String>();
- String[] assets = assetManager.list(WALLPAPER_PATH);
- for (String asset : assets) {
- if (!TextUtils.isEmpty(asset)) {
- wallpaperList.add(WALLPAPER_PATH + File.separator + asset);
- }
- }
- return wallpaperList;
- }
-
- // Returns the first non-empty asset name. Empty assets can occur if the APK is built
- // with folders included as zip entries in the APK. Searching for files inside "folderName" via
- // assetManager.list("folderName") can cause these entries to be included as empty strings.
- private static String getFirstNonEmptyAsset(String[] assets) {
- if (assets == null) return null;
- String filename = null;
- for(String asset : assets) {
- if (!TextUtils.isEmpty(asset)) {
- filename = asset;
- break;
- }
- }
- return filename;
- }
-
- public static String getDefaultThemePackageName(Context context) {
- final String defaultThemePkg = Settings.Secure.getString(context.getContentResolver(),
- Settings.Secure.DEFAULT_THEME_PACKAGE);
- if (!TextUtils.isEmpty(defaultThemePkg)) {
- PackageManager pm = context.getPackageManager();
- try {
- if (pm.getPackageInfo(defaultThemePkg, 0) != null) {
- return defaultThemePkg;
- }
- } catch (PackageManager.NameNotFoundException e) {
- // doesn't exist so system will be default
- Log.w(TAG, "Default theme " + defaultThemePkg + " not found", e);
- }
- }
-
- return SYSTEM_DEFAULT;
- }
-
- private static class ThemedUiContext extends ContextWrapper {
- private Context mAppContext;
-
- public ThemedUiContext(Context context, Context appContext) {
- super(context);
- mAppContext = appContext;
- }
-
- @Override
- public Context getApplicationContext() {
- return mAppContext;
- }
-
- @Override
- public String getPackageName() {
- return mAppContext.getPackageName();
- }
- }
-
- // Returns a mutable list of all theme components
- public static List<String> getAllComponents() {
- List<String> components = new ArrayList<String>(9);
- components.add(ThemesColumns.MODIFIES_FONTS);
- components.add(ThemesColumns.MODIFIES_LAUNCHER);
- components.add(ThemesColumns.MODIFIES_ALARMS);
- components.add(ThemesColumns.MODIFIES_BOOT_ANIM);
- components.add(ThemesColumns.MODIFIES_ICONS);
- components.add(ThemesColumns.MODIFIES_LOCKSCREEN);
- components.add(ThemesColumns.MODIFIES_NOTIFICATIONS);
- components.add(ThemesColumns.MODIFIES_OVERLAYS);
- components.add(ThemesColumns.MODIFIES_RINGTONES);
- components.add(ThemesColumns.MODIFIES_STATUS_BAR);
- components.add(ThemesColumns.MODIFIES_NAVIGATION_BAR);
- components.add(ThemesColumns.MODIFIES_LIVE_LOCK_SCREEN);
- return components;
- }
-
- /**
- * Returns a mutable list of all the theme components supported by a given package
- * NOTE: This queries the themes content provider. If there isn't a provider installed
- * or if it is too early in the boot process this method will not work.
- */
- public static List<String> getSupportedComponents(Context context, String pkgName) {
- List<String> supportedComponents = new ArrayList<String>();
-
- String selection = ThemesContract.ThemesColumns.PKG_NAME + "= ?";
- String[] selectionArgs = new String[]{ pkgName };
- Cursor c = context.getContentResolver().query(ThemesContract.ThemesColumns.CONTENT_URI,
- null, selection, selectionArgs, null);
-
- if (c != null) {
- if (c.moveToFirst()) {
- List<String> allComponents = getAllComponents();
- for (String component : allComponents) {
- int index = c.getColumnIndex(component);
- if (c.getInt(index) == 1) {
- supportedComponents.add(component);
- }
- }
- }
- c.close();
- }
- return supportedComponents;
- }
-
- /**
- * Get the components from the default theme. If the default theme is not SYSTEM then any
- * components that are not in the default theme will come from SYSTEM to create a complete
- * component map.
- * @param context
- * @return
- */
- public static Map<String, String> getDefaultComponents(Context context) {
- String defaultThemePkg = getDefaultThemePackageName(context);
- List<String> defaultComponents = null;
- List<String> systemComponents = getSupportedComponents(context, SYSTEM_DEFAULT);
- if (!SYSTEM_DEFAULT.equals(defaultThemePkg)) {
- defaultComponents = getSupportedComponents(context, defaultThemePkg);
- }
-
- Map<String, String> componentMap = new HashMap<String, String>(systemComponents.size());
- if (defaultComponents != null) {
- for (String component : defaultComponents) {
- componentMap.put(component, defaultThemePkg);
- }
- }
- for (String component : systemComponents) {
- if (!componentMap.containsKey(component)) {
- componentMap.put(component, SYSTEM_DEFAULT);
- }
- }
-
- return componentMap;
- }
-
- /**
- * Takes an existing component map and adds any missing components from the default
- * map of components.
- * @param context
- * @param componentMap An existing component map
- */
- public static void completeComponentMap(Context context,
- Map<String, String> componentMap) {
- if (componentMap == null) return;
-
- Map<String, String> defaultComponents = getDefaultComponents(context);
- for (String component : defaultComponents.keySet()) {
- if (!componentMap.containsKey(component)) {
- componentMap.put(component, defaultComponents.get(component));
- }
- }
- }
-
/**
* Convenience method to determine if a theme component is a per app theme and not a standard
* component.
diff --git a/core/java/android/content/res/IThemeChangeListener.aidl b/core/java/android/content/res/IThemeChangeListener.aidl
deleted file mode 100644
index a2e2abd..0000000
--- a/core/java/android/content/res/IThemeChangeListener.aidl
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2014 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} */
-oneway interface IThemeChangeListener {
- void onProgress(int progress);
- void onFinish(boolean isSuccess);
-}
diff --git a/core/java/android/content/res/IThemeProcessingListener.aidl b/core/java/android/content/res/IThemeProcessingListener.aidl
deleted file mode 100644
index 2e1c16e..0000000
--- a/core/java/android/content/res/IThemeProcessingListener.aidl
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2014 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} */
-oneway interface IThemeProcessingListener {
- void onFinishedProcessing(String pkgName);
-}
diff --git a/core/java/android/content/res/IThemeService.aidl b/core/java/android/content/res/IThemeService.aidl
deleted file mode 100644
index 90cb9fb..0000000
--- a/core/java/android/content/res/IThemeService.aidl
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2014 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.content.res.IThemeChangeListener;
-import android.content.res.IThemeProcessingListener;
-import android.content.res.ThemeChangeRequest;
-import android.graphics.Bitmap;
-
-import java.util.Map;
-
-/** {@hide} */
-interface IThemeService {
- void requestThemeChangeUpdates(in IThemeChangeListener listener);
- void removeUpdates(in IThemeChangeListener listener);
-
- void requestThemeChange(in ThemeChangeRequest request, boolean removePerAppThemes);
- void applyDefaultTheme();
- boolean isThemeApplying();
- int getProgress();
-
- boolean cacheComposedIcon(in Bitmap icon, String path);
-
- boolean processThemeResources(String themePkgName);
- boolean isThemeBeingProcessed(String themePkgName);
- void registerThemeProcessingListener(in IThemeProcessingListener listener);
- void unregisterThemeProcessingListener(in IThemeProcessingListener listener);
-
- void rebuildResourceCache();
-}
diff --git a/core/java/android/content/res/ThemeChangeRequest.aidl b/core/java/android/content/res/ThemeChangeRequest.aidl
deleted file mode 100644
index e6cf115..0000000
--- a/core/java/android/content/res/ThemeChangeRequest.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 1d13bb0..0000000
--- a/core/java/android/content/res/ThemeChangeRequest.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * 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.content.pm.ThemeUtils;
-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 {
- public static final int DEFAULT_WALLPAPER_ID = -1;
-
- private final Map<String, String> mThemeComponents = new HashMap<String, String>();
- private final Map<String, String> mPerAppOverlays = new HashMap<String, String>();
- 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<String, String> 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<String, String> 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<String, String> components, Map<String, String> 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) {
- 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();
- }
-
- @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));
- }
- dest.writeInt(mRequestType.ordinal());
- dest.writeLong(mWallpaperId);
- }
-
- 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 enum RequestType {
- USER_REQUEST,
- USER_REQUEST_MIXNMATCH,
- THEME_UPDATED,
- THEME_REMOVED,
- THEME_RESET;
- }
-
- public static class Builder {
- Map<String, String> mThemeComponents = new HashMap<String, String>();
- Map<String, String> mPerAppOverlays = new HashMap<String, String>();
- 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<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 ac95d6b..f304801 100644
--- a/core/java/android/content/res/ThemeConfig.java
+++ b/core/java/android/content/res/ThemeConfig.java
@@ -1,12 +1,12 @@
/*
- * Copyright (C) 2014 The CyanogenMod Project
+ * Copyright (C) 2016 The CyanogenMod Project
* Portions copyright (C) 2014, T-Mobile USA, Inc.
*
* 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
+ * 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,
@@ -17,12 +17,13 @@
package android.content.res;
import android.content.ContentResolver;
-import android.content.res.ThemeChangeRequest.RequestType;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.JsonReader;
import android.util.JsonToken;
import android.util.JsonWriter;
@@ -34,8 +35,6 @@ 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;
/**
@@ -61,9 +60,7 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
private static final SystemAppTheme mSystemAppTheme = new SystemAppTheme();
// Maps pkgname to theme (ex com.angry.birds -> red theme)
- protected final Map<String, AppTheme> mThemes = new HashMap<String, AppTheme>();
-
- private RequestType mLastThemeChangeRequestType = RequestType.USER_REQUEST;
+ protected final Map<String, AppTheme> mThemes = new ArrayMap<>();
public ThemeConfig(Map<String, AppTheme> appThemes) {
mThemes.putAll(appThemes);
@@ -111,10 +108,6 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
return Collections.unmodifiableMap(mThemes);
}
- public RequestType getLastThemeChangeRequestType() {
- return mLastThemeChangeRequestType;
- }
-
private AppTheme getThemeFor(String pkgName) {
AppTheme theme = mThemes.get(pkgName);
if (theme == null) theme = getDefaultTheme();
@@ -136,12 +129,11 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
ThemeConfig o = (ThemeConfig) object;
Map<String, AppTheme> currThemes = (mThemes == null) ?
- new HashMap<String, AppTheme>() : mThemes;
+ new ArrayMap<String, AppTheme>() : mThemes;
Map<String, AppTheme> newThemes = (o.mThemes == null) ?
- new HashMap<String, AppTheme>() : o.mThemes;
+ new ArrayMap<String, AppTheme>() : o.mThemes;
- return (currThemes.equals(newThemes) &&
- mLastThemeChangeRequestType == o.mLastThemeChangeRequestType);
+ return currThemes.equals(newThemes);
}
return false;
}
@@ -160,8 +152,6 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
public int hashCode() {
int hash = 17;
hash = 31 * hash + mThemes.hashCode();
- hash = 31 * hash + (mLastThemeChangeRequestType == null ? 0 :
- mLastThemeChangeRequestType.ordinal());
return hash;
}
@@ -227,7 +217,6 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
public void writeToParcel(Parcel dest, int flags) {
String json = JsonSerializer.toJson(this);
dest.writeString(json);
- dest.writeInt(mLastThemeChangeRequestType.ordinal());
}
public static final Parcelable.Creator<ThemeConfig> CREATOR =
@@ -235,7 +224,6 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
public ThemeConfig createFromParcel(Parcel source) {
String json = source.readString();
ThemeConfig themeConfig = JsonSerializer.fromJson(json);
- themeConfig.mLastThemeChangeRequestType = RequestType.values()[source.readInt()];
return themeConfig;
}
@@ -351,10 +339,9 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
public static class Builder {
- private HashMap<String, String> mOverlays = new HashMap<String, String>();
- private HashMap<String, String> mIcons = new HashMap<String, String>();
- private HashMap<String, String> mFonts = new HashMap<String, String>();
- private RequestType mLastThemeChangeRequestType = RequestType.USER_REQUEST;
+ private Map<String, String> mOverlays = new ArrayMap<>();
+ private Map<String, String> mIcons = new ArrayMap<>();
+ private Map<String, String> mFonts = new ArrayMap<>();
public Builder() {}
@@ -366,7 +353,6 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
mIcons.put(key, appTheme.getIconPackPkgName());
mOverlays.put(key, appTheme.getOverlayPkgName());
}
- mLastThemeChangeRequestType = theme.mLastThemeChangeRequestType;
}
/**
@@ -427,18 +413,13 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
return this;
}
- public Builder setLastThemeChangeRequestType(RequestType requestType) {
- mLastThemeChangeRequestType = requestType;
- return this;
- }
-
public ThemeConfig build() {
- HashSet<String> appPkgSet = new HashSet<String>();
+ ArraySet<String> appPkgSet = new ArraySet<>();
appPkgSet.addAll(mOverlays.keySet());
appPkgSet.addAll(mIcons.keySet());
appPkgSet.addAll(mFonts.keySet());
- HashMap<String, AppTheme> appThemes = new HashMap<String, AppTheme>();
+ Map<String, AppTheme> appThemes = new ArrayMap<>();
for(String appPkgName : appPkgSet) {
String icon = mIcons.get(appPkgName);
String overlay = mOverlays.get(appPkgName);
@@ -455,7 +436,6 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
}
}
ThemeConfig themeConfig = new ThemeConfig(appThemes);
- themeConfig.mLastThemeChangeRequestType = mLastThemeChangeRequestType;
return themeConfig;
}
}
@@ -506,7 +486,7 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
public static ThemeConfig fromJson(String json) {
if (json == null) return null;
- HashMap<String, AppTheme> map = new HashMap<String, AppTheme>();
+ Map<String, AppTheme> map = new ArrayMap<>();
StringReader reader = null;
JsonReader jsonReader = null;
try {
@@ -582,7 +562,7 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
public static class SystemConfig extends ThemeConfig {
public SystemConfig() {
- super(new HashMap<String, AppTheme>());
+ super(new ArrayMap<String, AppTheme>());
}
}
@@ -593,7 +573,7 @@ public class ThemeConfig implements Cloneable, Parcelable, Comparable<ThemeConfi
@Override
public String toString() {
- return "No Theme Applied (Holo)";
+ return "No Theme Applied (System)";
}
}
}
diff --git a/core/java/android/content/res/ThemeManager.java b/core/java/android/content/res/ThemeManager.java
deleted file mode 100644
index fd05f1e..0000000
--- a/core/java/android/content/res/ThemeManager.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copyright (C) 2014 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.content.Context;
-import android.content.pm.ThemeUtils;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.RemoteException;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * {@hide}
- */
-public class ThemeManager {
- private static final String TAG = ThemeManager.class.getName();
- private Context mContext;
- private IThemeService mService;
- private Handler mHandler;
-
- private Set<ThemeChangeListener> mChangeListeners =
- new HashSet<ThemeChangeListener>();
-
- private Set<ThemeProcessingListener> mProcessingListeners =
- new HashSet<ThemeProcessingListener>();
-
- public ThemeManager(Context context, IThemeService service) {
- mContext = context;
- mService = service;
- mHandler = new Handler(Looper.getMainLooper());
- }
-
- private final IThemeChangeListener mThemeChangeListener = new IThemeChangeListener.Stub() {
- @Override
- public void onProgress(final int progress) throws RemoteException {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- synchronized (mChangeListeners) {
- List<ThemeChangeListener> listenersToRemove = new ArrayList
- <ThemeChangeListener>();
- for (ThemeChangeListener listener : mChangeListeners) {
- try {
- listener.onProgress(progress);
- } catch (Throwable e) {
- Log.w(TAG, "Unable to update theme change progress", e);
- listenersToRemove.add(listener);
- }
- }
- if (listenersToRemove.size() > 0) {
- for (ThemeChangeListener listener : listenersToRemove) {
- mChangeListeners.remove(listener);
- }
- }
- }
- }
- });
- }
-
- @Override
- public void onFinish(final boolean isSuccess) throws RemoteException {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- synchronized (mChangeListeners) {
- List<ThemeChangeListener> listenersToRemove = new ArrayList
- <ThemeChangeListener>();
- for (ThemeChangeListener listener : mChangeListeners) {
- try {
- listener.onFinish(isSuccess);
- } catch (Throwable e) {
- Log.w(TAG, "Unable to update theme change listener", e);
- listenersToRemove.add(listener);
- }
- }
- if (listenersToRemove.size() > 0) {
- for (ThemeChangeListener listener : listenersToRemove) {
- mChangeListeners.remove(listener);
- }
- }
- }
- }
- });
- }
- };
-
- private final IThemeProcessingListener mThemeProcessingListener =
- new IThemeProcessingListener.Stub() {
- @Override
- public void onFinishedProcessing(final String pkgName) throws RemoteException {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- synchronized (mProcessingListeners) {
- List<ThemeProcessingListener> listenersToRemove = new ArrayList
- <ThemeProcessingListener>();
- for (ThemeProcessingListener listener : mProcessingListeners) {
- try {
- listener.onFinishedProcessing(pkgName);
- } catch (Throwable e) {
- Log.w(TAG, "Unable to update theme change progress", e);
- listenersToRemove.add(listener);
- }
- }
- if (listenersToRemove.size() > 0) {
- for (ThemeProcessingListener listener : listenersToRemove) {
- mProcessingListeners.remove(listener);
- }
- }
- }
- }
- });
- }
- };
-
-
- public void addClient(ThemeChangeListener listener) {
- synchronized (mChangeListeners) {
- if (mChangeListeners.contains(listener)) {
- throw new IllegalArgumentException("Client was already added ");
- }
- if (mChangeListeners.size() == 0) {
- try {
- mService.requestThemeChangeUpdates(mThemeChangeListener);
- } catch (RemoteException e) {
- Log.w(TAG, "Unable to register listener", e);
- }
- }
- mChangeListeners.add(listener);
- }
- }
-
- public void removeClient(ThemeChangeListener listener) {
- synchronized (mChangeListeners) {
- mChangeListeners.remove(listener);
- if (mChangeListeners.size() == 0) {
- try {
- mService.removeUpdates(mThemeChangeListener);
- } catch (RemoteException e) {
- Log.w(TAG, "Unable to remove listener", e);
- }
- }
- }
- }
-
- public void onClientPaused(ThemeChangeListener listener) {
- removeClient(listener);
- }
-
- public void onClientResumed(ThemeChangeListener listener) {
- addClient(listener);
- }
-
- public void onClientDestroyed(ThemeChangeListener listener) {
- removeClient(listener);
- }
-
- /**
- * Register a ThemeProcessingListener to be notified when a theme is done being processed.
- * @param listener ThemeChangeListener to register
- */
- public void registerProcessingListener(ThemeProcessingListener listener) {
- synchronized (mProcessingListeners) {
- if (mProcessingListeners.contains(listener)) {
- throw new IllegalArgumentException("Listener was already added ");
- }
- if (mProcessingListeners.size() == 0) {
- try {
- mService.registerThemeProcessingListener(mThemeProcessingListener);
- } catch (RemoteException e) {
- Log.w(TAG, "Unable to register listener", e);
- }
- }
- mProcessingListeners.add(listener);
- }
- }
-
- /**
- * Unregister a ThemeChangeListener.
- * @param listener ThemeChangeListener to unregister
- */
- public void unregisterProcessingListener(ThemeChangeListener listener) {
- synchronized (mProcessingListeners) {
- mProcessingListeners.remove(listener);
- if (mProcessingListeners.size() == 0) {
- try {
- mService.unregisterThemeProcessingListener(mThemeProcessingListener);
- } catch (RemoteException e) {
- Log.w(TAG, "Unable to remove listener", e);
- }
- }
- }
- }
-
- /**
- * Convenience method. Applies the entire theme.
- */
- public void requestThemeChange(String pkgName) {
- //List<String> components = ThemeUtils.getSupportedComponents(mContext, pkgName);
- //requestThemeChange(pkgName, components);
- }
-
- 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, 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(request, removePerAppThemes);
- } catch (RemoteException e) {
- logThemeServiceException(e);
- }
- }
-
- public void applyDefaultTheme() {
- try {
- mService.applyDefaultTheme();
- } catch (RemoteException e) {
- logThemeServiceException(e);
- }
- }
-
- public boolean isThemeApplying() {
- try {
- return mService.isThemeApplying();
- } catch (RemoteException e) {
- logThemeServiceException(e);
- }
-
- return false;
- }
-
- public boolean isThemeBeingProcessed(String themePkgName) {
- try {
- return mService.isThemeBeingProcessed(themePkgName);
- } catch (RemoteException e) {
- logThemeServiceException(e);
- }
- return false;
- }
-
- public int getProgress() {
- try {
- return mService.getProgress();
- } catch (RemoteException e) {
- logThemeServiceException(e);
- }
- return -1;
- }
-
- public boolean processThemeResources(String themePkgName) {
- try {
- return mService.processThemeResources(themePkgName);
- } catch (RemoteException e) {
- logThemeServiceException(e);
- }
- return false;
- }
-
- private void logThemeServiceException(Exception e) {
- Log.w(TAG, "Unable to access ThemeService", e);
- }
-
- public interface ThemeChangeListener {
- void onProgress(int progress);
- void onFinish(boolean isSuccess);
- }
-
- public interface ThemeProcessingListener {
- void onFinishedProcessing(String pkgName);
- }
-}
-