summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/org/cyanogenmod/themes/provider/AppReceiver.java2
-rw-r--r--src/org/cyanogenmod/themes/provider/BitmapUtils.java92
-rw-r--r--src/org/cyanogenmod/themes/provider/CopyImageService.java59
-rw-r--r--src/org/cyanogenmod/themes/provider/ThemePackageHelper.java86
-rw-r--r--src/org/cyanogenmod/themes/provider/ThemesOpenHelper.java63
-rw-r--r--src/org/cyanogenmod/themes/provider/ThemesProvider.java37
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);
}
}
}