diff options
Diffstat (limited to 'src')
6 files changed, 291 insertions, 48 deletions
diff --git a/src/org/cyanogenmod/themes/provider/AppReceiver.java b/src/org/cyanogenmod/themes/provider/AppReceiver.java index 1a0835e..881ac21 100644 --- a/src/org/cyanogenmod/themes/provider/AppReceiver.java +++ b/src/org/cyanogenmod/themes/provider/AppReceiver.java @@ -34,7 +34,7 @@ public class AppReceiver extends BroadcastReceiver { try { if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED) && !isReplacing) { ThemePackageHelper.insertPackage(context, pkgName); - } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_FULLY_REMOVED)) { + } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_BEING_REMOVED)) { ThemePackageHelper.removePackage(context, pkgName); } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) { ThemePackageHelper.updatePackage(context, pkgName); diff --git a/src/org/cyanogenmod/themes/provider/BitmapUtils.java b/src/org/cyanogenmod/themes/provider/BitmapUtils.java new file mode 100644 index 0000000..4a49068 --- /dev/null +++ b/src/org/cyanogenmod/themes/provider/BitmapUtils.java @@ -0,0 +1,92 @@ +/* + * 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 org.cyanogenmod.themes.provider; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.util.Log; + +import java.io.Closeable; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +public class BitmapUtils { + private static final String TAG = "BitmapUtils"; + private static final int BITMAP_LOAD_BACKOUT_ATTEMPTS = 5; + + /** + * Returns the bitmap from the given uri loaded using the given options. + * Returns null on failure. + */ + public static Bitmap loadBitmap(Context context, InputStream is, BitmapFactory.Options o) { + try { + return BitmapFactory.decodeStream(is, null, o); + } finally { + closeSilently(is); + } + } + + /** + * Loads a bitmap that has been downsampled using sampleSize from a given url. + */ + public static Bitmap loadDownsampledBitmap(Context context, InputStream is, int sampleSize) { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inMutable = true; + options.inSampleSize = sampleSize; + return loadBitmap(context, is, options); + } + + /** + * Loads a bitmap that is downsampled by at least the input sample size. In + * low-memory situations, the bitmap may be downsampled further. + */ + public static Bitmap loadBitmapWithBackouts(Context context, InputStream is, int sampleSize) { + boolean noBitmap = true; + int num_tries = 0; + if (sampleSize <= 0) { + sampleSize = 1; + } + Bitmap bmap = null; + while (noBitmap) { + try { + // Try to decode, downsample if low-memory. + bmap = loadDownsampledBitmap(context, is, sampleSize); + noBitmap = false; + } catch (java.lang.OutOfMemoryError e) { + // Try with more downsampling before failing for good. + if (++num_tries >= BITMAP_LOAD_BACKOUT_ATTEMPTS) { + throw e; + } + bmap = null; + System.gc(); + sampleSize *= 2; + } + } + return bmap; + } + + public static void closeSilently(Closeable c) { + if (c == null) return; + try { + c.close(); + } catch (IOException t) { + Log.w(TAG, "close fail ", t); + } + } +} diff --git a/src/org/cyanogenmod/themes/provider/CopyImageService.java b/src/org/cyanogenmod/themes/provider/CopyImageService.java index 687116f..8a0362a 100644 --- a/src/org/cyanogenmod/themes/provider/CopyImageService.java +++ b/src/org/cyanogenmod/themes/provider/CopyImageService.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.AssetManager; +import android.graphics.Bitmap; import android.net.Uri; import android.os.Environment; import android.provider.ThemesContract.ThemesColumns; @@ -45,6 +46,13 @@ public class CopyImageService extends IntentService { private static final String WALLPAPER_PATH = "/data/org.cyanogenmod.themes.provider/files/wallpapers/"; + private static final String WALLPAPER_PREVIEW = "images/wallpaper_preview"; + private static final String LOCKSCREEN_PREVIEW = "images/lockscreen_preview"; + private static final String STYLES_PREVIEW = "images/styles_preview"; + + private static final String EXT_JPG = ".jpg"; + private static final String EXT_PNG = ".png"; + public CopyImageService() { super(CopyImageService.class.getName()); } @@ -63,10 +71,10 @@ public class CopyImageService extends IntentService { String homescreen = Environment.getDataDirectory().getPath() + IMAGES_PATH + pkgName - + ".homescreen.png"; + + ".homescreen.jpg"; String lockscreen = Environment.getDataDirectory().getPath() + IMAGES_PATH + pkgName - + ".lockscreen.png"; + + ".lockscreen.jpg"; String stylePreview = Environment.getDataDirectory().getPath() + IMAGES_PATH + pkgName + ".stylepreview.jpg"; @@ -107,10 +115,9 @@ public class CopyImageService extends IntentService { // internal storage AssetManager assetManager = themeContext.getAssets(); try { - InputStream homescreen = assetManager - .open("images/icons_wallpaper_straight.png"); - InputStream lockscreen = assetManager - .open("images/lockscreen_portrait.png"); + InputStream homescreen = getPreviewAsset(assetManager, WALLPAPER_PREVIEW); + + InputStream lockscreen = getPreviewAsset(assetManager, LOCKSCREEN_PREVIEW); File dataDir = context.getFilesDir(); // Environment.getDataDirectory(); File imgDir = new File(dataDir, "images"); @@ -118,45 +125,49 @@ public class CopyImageService extends IntentService { imgDir.mkdir(); wpDir.mkdir(); - File homescreenOut = new File(imgDir, pkgName + ".homescreen.png"); - File lockscreenOut = new File(imgDir, pkgName + ".lockscreen.png"); + File homescreenOut = new File(imgDir, pkgName + ".homescreen.jpg"); + File lockscreenOut = new File(imgDir, pkgName + ".lockscreen.jpg"); FileOutputStream out = new FileOutputStream(homescreenOut); - byte[] buffer = new byte[4096]; - int count = 0; - while ((count = homescreen.read(buffer)) != -1) { - out.write(buffer, 0, count); - } + Bitmap bmp = BitmapUtils.loadBitmapWithBackouts(context, homescreen, 1); + bmp.compress(Bitmap.CompressFormat.JPEG, 90, out); out.close(); out = new FileOutputStream(lockscreenOut); - while ((count = lockscreen.read(buffer)) != -1) { - out.write(buffer, 0, count); - } + bmp = BitmapUtils.loadBitmapWithBackouts(context, lockscreen, 1); + bmp.compress(Bitmap.CompressFormat.JPEG, 90, out); out.close(); } catch (IOException e) { - Log.e(TAG, "ThemesOpenHelper could not copy test image data"); + Log.e(TAG, "ThemesOpenHelper could not copy preview image"); } //Copy Style preview try { - InputStream stylepreview = assetManager - .open("images/style.jpg"); + InputStream stylepreview = getPreviewAsset(assetManager, STYLES_PREVIEW); File dataDir = context.getFilesDir(); File imgDir = new File(dataDir, "images"); imgDir.mkdir(); File styleOut = new File(imgDir, pkgName + ".stylepreview.jpg"); - byte[] buffer = new byte[4096]; - int count = 0; FileOutputStream out = new FileOutputStream(styleOut); - while ((count = stylepreview.read(buffer)) != -1) { - out.write(buffer, 0, count); - } + Bitmap bmp = BitmapUtils.loadBitmapWithBackouts(context, stylepreview, 1); + bmp.compress(Bitmap.CompressFormat.JPEG, 90, out); out.close(); } catch (IOException e) { Log.e(TAG, "ThemesOpenHelper could not copy style image data"); } } + + private static InputStream getPreviewAsset(AssetManager am, String preview) throws IOException { + InputStream is = null; + try { + is = am.open(preview + EXT_JPG); + } catch (IOException e) { + // we'll try and fallback to PNG + } + if (is == null) is = am.open(preview + EXT_PNG); + + return is; + } } diff --git a/src/org/cyanogenmod/themes/provider/ThemePackageHelper.java b/src/org/cyanogenmod/themes/provider/ThemePackageHelper.java index 7a6fe42..ed1a740 100644 --- a/src/org/cyanogenmod/themes/provider/ThemePackageHelper.java +++ b/src/org/cyanogenmod/themes/provider/ThemePackageHelper.java @@ -19,8 +19,10 @@ import android.content.ContentValues; import android.content.Context; import android.content.pm.LegacyThemeInfo; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ThemeInfo; +import android.content.pm.ThemeUtils; import android.content.res.AssetManager; import android.content.res.ThemeManager; import android.database.Cursor; @@ -37,6 +39,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import static android.content.res.CustomTheme.HOLO_DEFAULT; + /** * Helper class to populate the provider with info from the theme. */ @@ -68,6 +72,11 @@ public class ThemePackageHelper { insertPackageInternal(context, pi, capabilities); } else if (pi.legacyThemeInfos != null && pi.legacyThemeInfos.length > 0) { insertLegacyPackageInternal(context, pi, capabilities); + } else if (pi.isLegacyIconPackApk){ + // We must be here because it is a legacy icon pack + capabilities = new HashMap<String, Boolean>(); + capabilities.put(ThemesColumns.MODIFIES_ICONS, true); + insertLegacyIconPackInternal(context, pi, capabilities); } return true; } @@ -84,6 +93,8 @@ public class ThemePackageHelper { values.put(ThemesColumns.DATE_CREATED, System.currentTimeMillis()); values.put(ThemesColumns.PRESENT_AS_THEME, isPresentableTheme); values.put(ThemesColumns.IS_LEGACY_THEME, pi.isLegacyThemeApk); + values.put(ThemesColumns.IS_DEFAULT_THEME, + ThemeUtils.getDefaultThemePackageName(context).equals(pi.packageName) ? 1 : 0); values.put(ThemesColumns.LAST_UPDATE_TIME, pi.lastUpdateTime); // Insert theme capabilities @@ -106,6 +117,8 @@ public class ThemePackageHelper { values.put(ThemesColumns.DATE_CREATED, System.currentTimeMillis()); values.put(ThemesColumns.PRESENT_AS_THEME, 1); values.put(ThemesColumns.IS_LEGACY_THEME, pi.isLegacyThemeApk); + values.put(ThemesColumns.IS_DEFAULT_THEME, + ThemeUtils.getDefaultThemePackageName(context).equals(pi.packageName) ? 1 : 0); values.put(ThemesColumns.LAST_UPDATE_TIME, pi.lastUpdateTime); // Insert theme capabilities @@ -119,13 +132,43 @@ public class ThemePackageHelper { context.getContentResolver().insert(ThemesColumns.CONTENT_URI, values); } + private static void insertLegacyIconPackInternal(Context context, PackageInfo pi, + Map<String, Boolean> capabilities) { + PackageManager pm = context.getPackageManager(); + CharSequence labelName = pm.getApplicationLabel(pi.applicationInfo); + if (labelName == null) labelName = context.getString(R.string.unknown_app_name); + + ContentValues values = new ContentValues(); + values.put(ThemesColumns.PKG_NAME, pi.packageName); + values.put(ThemesColumns.TITLE, labelName.toString()); + values.put(ThemesColumns.AUTHOR, ""); + values.put(ThemesColumns.DATE_CREATED, System.currentTimeMillis()); + values.put(ThemesColumns.LAST_UPDATE_TIME, pi.lastUpdateTime); + values.put(ThemesColumns.IS_LEGACY_ICONPACK, 1); + + // Insert theme capabilities + for (Map.Entry<String, Boolean> entry : capabilities.entrySet()) { + String component = entry.getKey(); + Boolean isImplemented = entry.getValue(); + values.put(component, isImplemented); + } + + context.getContentResolver().insert(ThemesColumns.CONTENT_URI, values); + } + public static void updatePackage(Context context, String pkgName) throws NameNotFoundException { - PackageInfo pi = context.getPackageManager().getPackageInfo(pkgName, 0); - Map<String, Boolean> capabilities = getCapabilities(context, pkgName); - if (pi.themeInfos != null && pi.themeInfos.length > 0) { - updatePackageInternal(context, pi, capabilities); - } else if (pi.legacyThemeInfos != null && pi.legacyThemeInfos.length > 0) { - updateLegacyPackageInternal(context, pi, capabilities); + if (HOLO_DEFAULT.equals(pkgName)) { + updateHoloPackageInternal(context); + } else { + PackageInfo pi = context.getPackageManager().getPackageInfo(pkgName, 0); + Map<String, Boolean> capabilities = getCapabilities(context, pkgName); + if (pi.themeInfos != null && pi.themeInfos.length > 0) { + updatePackageInternal(context, pi, capabilities); + } else if (pi.legacyThemeInfos != null && pi.legacyThemeInfos.length > 0) { + updateLegacyPackageInternal(context, pi, capabilities); + } else if (pi.isLegacyIconPackApk) { + updateLegacyIconPackInternal(context, pi, capabilities); + } } } @@ -140,6 +183,8 @@ public class ThemePackageHelper { values.put(ThemesColumns.DATE_CREATED, System.currentTimeMillis()); values.put(ThemesColumns.PRESENT_AS_THEME, isPresentableTheme); values.put(ThemesColumns.IS_LEGACY_THEME, pi.isLegacyThemeApk); + values.put(ThemesColumns.IS_DEFAULT_THEME, + ThemeUtils.getDefaultThemePackageName(context).equals(pi.packageName) ? 1 : 0); values.put(ThemesColumns.LAST_UPDATE_TIME, pi.lastUpdateTime); String where = ThemesColumns.PKG_NAME + "=?"; @@ -147,6 +192,15 @@ public class ThemePackageHelper { context.getContentResolver().update(ThemesColumns.CONTENT_URI, values, where, args); } + private static void updateHoloPackageInternal(Context context) { + ContentValues values = new ContentValues(); + values.put(ThemesColumns.IS_DEFAULT_THEME, + HOLO_DEFAULT == ThemeUtils.getDefaultThemePackageName(context) ? 1 : 0); + String where = ThemesColumns.PKG_NAME + "=?"; + String[] args = { HOLO_DEFAULT }; + context.getContentResolver().update(ThemesColumns.CONTENT_URI, values, where, args); + } + private static void updateLegacyPackageInternal(Context context, PackageInfo pi, Map<String, Boolean> capabilities) { LegacyThemeInfo info = pi.legacyThemeInfos[0]; @@ -157,6 +211,26 @@ public class ThemePackageHelper { values.put(ThemesColumns.DATE_CREATED, System.currentTimeMillis()); values.put(ThemesColumns.PRESENT_AS_THEME, 1); values.put(ThemesColumns.IS_LEGACY_THEME, pi.isLegacyThemeApk); + values.put(ThemesColumns.IS_DEFAULT_THEME, + ThemeUtils.getDefaultThemePackageName(context).equals(pi.packageName) ? 1 : 0); + values.put(ThemesColumns.LAST_UPDATE_TIME, pi.lastUpdateTime); + + String where = ThemesColumns.PKG_NAME + "=?"; + String[] args = { pi.packageName }; + context.getContentResolver().update(ThemesColumns.CONTENT_URI, values, where, args); + } + + private static void updateLegacyIconPackInternal(Context context, PackageInfo pi, + Map<String, Boolean> capabilities) { + PackageManager pm = context.getPackageManager(); + CharSequence labelName = pm.getApplicationLabel(pi.applicationInfo); + if (labelName == null) labelName = context.getString(R.string.unknown_app_name); + + boolean isPresentableTheme = ThemePackageHelper.isPresentableTheme(capabilities); + ContentValues values = new ContentValues(); + values.put(ThemesColumns.PKG_NAME, pi.packageName); + values.put(ThemesColumns.TITLE, labelName.toString()); + values.put(ThemesColumns.DATE_CREATED, System.currentTimeMillis()); values.put(ThemesColumns.LAST_UPDATE_TIME, pi.lastUpdateTime); String where = ThemesColumns.PKG_NAME + "=?"; diff --git a/src/org/cyanogenmod/themes/provider/ThemesOpenHelper.java b/src/org/cyanogenmod/themes/provider/ThemesOpenHelper.java index 915f465..6a0f54a 100644 --- a/src/org/cyanogenmod/themes/provider/ThemesOpenHelper.java +++ b/src/org/cyanogenmod/themes/provider/ThemesOpenHelper.java @@ -17,6 +17,8 @@ package org.cyanogenmod.themes.provider; import android.content.ContentValues; import android.content.Context; +import android.content.pm.ThemeUtils; +import android.content.res.CustomTheme; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; @@ -28,12 +30,15 @@ import android.util.Log; public class ThemesOpenHelper extends SQLiteOpenHelper { private static final String TAG = ThemesOpenHelper.class.getName(); - private static final int DATABASE_VERSION = 3; + private static final int DATABASE_VERSION = 5; private static final String DATABASE_NAME = "themes.db"; - private static final String DEFAULT_PKG_NAME = "default"; + private static final String DEFAULT_PKG_NAME = CustomTheme.HOLO_DEFAULT; + + private Context mContext; public ThemesOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); + mContext = context; } @Override @@ -41,7 +46,7 @@ public class ThemesOpenHelper extends SQLiteOpenHelper { db.execSQL(ThemesTable.THEMES_TABLE_CREATE); db.execSQL(MixnMatchTable.MIXNMATCH_TABLE_CREATE); - ThemesTable.insertDefaults(db); + ThemesTable.insertHoloDefaults(db, mContext); MixnMatchTable.insertDefaults(db); } @@ -57,6 +62,14 @@ public class ThemesOpenHelper extends SQLiteOpenHelper { upgradeToVersion3(db); oldVersion = 3; } + if (oldVersion == 3) { + upgradeToVersion4(db); + oldVersion = 4; + } + if (oldVersion == 4) { + upgradeToVersion5(db); + oldVersion = 5; + } if (oldVersion != DATABASE_VERSION) { Log.e(TAG, "Recreating db because unknown database version: " + oldVersion); dropTables(db); @@ -85,6 +98,38 @@ public class ThemesOpenHelper extends SQLiteOpenHelper { db.insert(MixnMatchTable.TABLE_NAME, null, values); } + private void upgradeToVersion4(SQLiteDatabase db) { + String isLegacyIconPackColumn = String.format("ALTER TABLE %s" + + " ADD COLUMN %s INTEGER DEFAULT 0", + ThemesTable.TABLE_NAME, ThemesColumns.IS_LEGACY_ICONPACK); + db.execSQL(isLegacyIconPackColumn); + } + + private void upgradeToVersion5(SQLiteDatabase db) { + String addIsDefault = String.format("ALTER TABLE %s ADD COLUMN %s TEXT", + ThemesTable.TABLE_NAME, ThemesColumns.IS_DEFAULT_THEME); + db.execSQL(addIsDefault); + + // change default package name to holo + String changeDefaultToHolo = String.format("UPDATE %s SET %s='%s' WHERE" + + " %s='%s'", ThemesTable.TABLE_NAME, ThemesColumns.PKG_NAME, + DEFAULT_PKG_NAME, ThemesColumns.PKG_NAME, "default"); + db.execSQL(changeDefaultToHolo); + + if (isHoloDefault(mContext)) { + // flag holo as default if + String makeHoloDefault = String.format("UPDATE %s SET %s=%d WHERE" + + " %s='%s'", ThemesTable.TABLE_NAME, ThemesColumns.IS_DEFAULT_THEME, 1, + ThemesColumns.PKG_NAME, DEFAULT_PKG_NAME); + db.execSQL(makeHoloDefault); + } + + // change any existing mixnmatch values set to "default" to "holo" + db.execSQL(String.format("UPDATE %s SET %s='%s' WHERE %s='%s'", + MixnMatchTable.TABLE_NAME, MixnMatchColumns.COL_VALUE, DEFAULT_PKG_NAME, + MixnMatchColumns.COL_VALUE, "default")); + } + private void dropTables(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS " + ThemesTable.TABLE_NAME); db.execSQL("DROP TABLE IF EXISTS " + MixnMatchTable.TABLE_NAME); @@ -121,10 +166,13 @@ public class ThemesOpenHelper extends SQLiteOpenHelper { ThemesColumns.MODIFIES_OVERLAYS + " INTEGER DEFAULT 0, " + ThemesColumns.PRESENT_AS_THEME + " INTEGER DEFAULT 0, " + ThemesColumns.IS_LEGACY_THEME + " INTEGER DEFAULT 0," + + ThemesColumns.IS_DEFAULT_THEME + " INTEGER DEFAULT 0," + + ThemesColumns.IS_LEGACY_ICONPACK + " INTEGER DEFAULT 0," + ThemesColumns.LAST_UPDATE_TIME + " INTEGER DEFAULT 0" + ")"; - public static void insertDefaults(SQLiteDatabase db) { + public static void insertHoloDefaults(SQLiteDatabase db, Context context) { + int isDefault = isHoloDefault(context) ? 1 : 0; ContentValues values = new ContentValues(); values.put(ThemesColumns.TITLE, "Holo (Default)"); values.put(ThemesColumns.PKG_NAME, DEFAULT_PKG_NAME); @@ -146,6 +194,8 @@ public class ThemesOpenHelper extends SQLiteOpenHelper { values.put(ThemesColumns.MODIFIES_RINGTONES, 1); values.put(ThemesColumns.PRESENT_AS_THEME, 1); values.put(ThemesColumns.IS_LEGACY_THEME, 0); + values.put(ThemesColumns.IS_DEFAULT_THEME, isDefault); + values.put(ThemesColumns.IS_LEGACY_ICONPACK, 0); values.put(ThemesColumns.MODIFIES_OVERLAYS, 1); db.insert(TABLE_NAME, null, values); } @@ -168,6 +218,11 @@ public class ThemesOpenHelper extends SQLiteOpenHelper { } } } + + private static boolean isHoloDefault(Context context) { + // == is okay since we are checking if what is returned is the same constant string value + return CustomTheme.HOLO_DEFAULT == ThemeUtils.getDefaultThemePackageName(context); + } } diff --git a/src/org/cyanogenmod/themes/provider/ThemesProvider.java b/src/org/cyanogenmod/themes/provider/ThemesProvider.java index 6c70709..4154b3e 100644 --- a/src/org/cyanogenmod/themes/provider/ThemesProvider.java +++ b/src/org/cyanogenmod/themes/provider/ThemesProvider.java @@ -15,6 +15,7 @@ */ package org.cyanogenmod.themes.provider; + import android.content.ContentProvider; import android.content.ContentValues; import android.content.Context; @@ -24,6 +25,7 @@ import android.content.SharedPreferences.Editor; import android.content.UriMatcher; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.ThemeUtils; import android.content.res.ThemeManager; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; @@ -36,7 +38,6 @@ import android.provider.ThemesContract.MixnMatchColumns; import android.provider.ThemesContract.ThemesColumns; import android.util.Log; -import org.cyanogenmod.themes.provider.AppReceiver; import org.cyanogenmod.themes.provider.ThemesOpenHelper.MixnMatchTable; import org.cyanogenmod.themes.provider.ThemesOpenHelper.ThemesTable; @@ -47,6 +48,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import static android.content.res.CustomTheme.HOLO_DEFAULT; + public class ThemesProvider extends ContentProvider { private static final String TAG = ThemesProvider.class.getSimpleName(); private static final boolean DEBUG = false; @@ -76,7 +79,8 @@ public class ThemesProvider extends ContentProvider { public static String getActiveTheme(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - return prefs.getString("SelectedThemePkgName", "default"); + return prefs.getString("SelectedThemePkgName", + ThemeUtils.getDefaultThemePackageName(context)); } @Override @@ -283,7 +287,7 @@ public class ThemesProvider extends ContentProvider { List<PackageInfo> themePackages = new ArrayList<PackageInfo>(); Map<String, PackageInfo> pmThemes = new HashMap<String, PackageInfo>(); for (PackageInfo info : packages) { - if (info.isThemeApk || info.isLegacyThemeApk) { + if (info.isThemeApk || info.isLegacyThemeApk || info.isLegacyIconPackApk) { themePackages.add(info); pmThemes.put(info.packageName, info); } @@ -295,16 +299,22 @@ public class ThemesProvider extends ContentProvider { */ Cursor current = mDb.query(ThemesTable.TABLE_NAME, null, null, null, null, null, null); List<String> deleteList = new LinkedList<String>(); - List<PackageInfo> updateList = new LinkedList<PackageInfo>(); + List<String> updateList = new LinkedList<String>(); + String defaultThemePkg = ThemeUtils.getDefaultThemePackageName(getContext()); while (current.moveToNext()) { int updateTimeIdx = current.getColumnIndex( ThemesContract.ThemesColumns.LAST_UPDATE_TIME); int pkgNameIdx = current.getColumnIndex(ThemesContract.ThemesColumns.PKG_NAME); + int isDefaultIdx = current.getColumnIndex(ThemesColumns.IS_DEFAULT_THEME); long updateTime = current.getLong(updateTimeIdx); String pkgName = current.getString(pkgNameIdx); + boolean isDefault = current.getInt(isDefaultIdx) == 1; - // Ignore default theme - if (pkgName.equals("default")) { + // Ignore holo theme + if (pkgName.equals(HOLO_DEFAULT)) { + if (defaultThemePkg.equals(HOLO_DEFAULT) != isDefault) { + updateList.add(HOLO_DEFAULT); + } continue; } @@ -319,8 +329,9 @@ public class ThemesProvider extends ContentProvider { // updated in the db long pmUpdateTime = (info.lastUpdateTime == 0) ? info.firstInstallTime : info.lastUpdateTime; - if (pmUpdateTime != updateTime) { - updateList.add(info); + if (pmUpdateTime != updateTime || + (defaultThemePkg.equals(info.packageName) != isDefault)) { + updateList.add(info.packageName); } // The remaining packages in pmThemes @@ -347,7 +358,7 @@ public class ThemesProvider extends ContentProvider { } ThemeManager mService = (ThemeManager) getContext().getSystemService( Context.THEME_SERVICE); - mService.requestThemeChange("default", moveToDefault); + mService.requestThemeChange(HOLO_DEFAULT, moveToDefault); // Update the database after we revert to default deleteThemes(deleteList); @@ -375,12 +386,12 @@ public class ThemesProvider extends ContentProvider { } } - private void updateThemes(List<PackageInfo> themesToUpdate) { - for (PackageInfo themeInfo : themesToUpdate) { + private void updateThemes(List<String> themesToUpdate) { + for (String pkgName : themesToUpdate) { try { - ThemePackageHelper.updatePackage(getContext(), themeInfo.packageName); + ThemePackageHelper.updatePackage(getContext(), pkgName); } catch (NameNotFoundException e) { - Log.e(TAG, "Unable to update theme " + themeInfo.packageName, e); + Log.e(TAG, "Unable to update theme " + pkgName, e); } } } |