diff options
author | Brint E. Kriebel <bekit@cyngn.com> | 2014-05-20 17:23:32 -0700 |
---|---|---|
committer | Brint E. Kriebel <bekit@cyngn.com> | 2014-05-20 17:23:32 -0700 |
commit | 411d2446bd1e66e3b4a9df57456ad79b099d394c (patch) | |
tree | 15b5b8fdcae0d4f52cb7baaf266ec8bcdf7e3d4d | |
parent | ff2884c18c887a515bed9003d92e03aa073bd31b (diff) | |
parent | 6d17ea67d7f040941706c3afd71149f05c3b1342 (diff) | |
download | android_packages_providers_ThemesProvider-411d2446bd1e66e3b4a9df57456ad79b099d394c.tar.gz android_packages_providers_ThemesProvider-411d2446bd1e66e3b4a9df57456ad79b099d394c.tar.bz2 android_packages_providers_ThemesProvider-411d2446bd1e66e3b4a9df57456ad79b099d394c.zip |
Merge remote-tracking branch 'github/cm-11.0' into HEAD
-rw-r--r-- | AndroidManifest.xml | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 2 | ||||
-rw-r--r-- | src/org/cyanogenmod/themes/provider/AppReceiver.java | 2 | ||||
-rw-r--r-- | src/org/cyanogenmod/themes/provider/ThemePackageHelper.java | 86 | ||||
-rw-r--r-- | src/org/cyanogenmod/themes/provider/ThemesOpenHelper.java | 76 | ||||
-rw-r--r-- | src/org/cyanogenmod/themes/provider/ThemesProvider.java | 37 |
6 files changed, 180 insertions, 25 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8a89803..6a8b499 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -34,7 +34,7 @@ <data android:scheme="package" /> </intent-filter> <intent-filter> - <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" /> + <action android:name="android.intent.action.PACKAGE_BEING_REMOVED" /> <action android:name="android.intent.action.PACKAGE_DATA_CLEARED" /> <category android:name="com.tmobile.intent.category.THEME_PACKAGE_INSTALL_STATE_CHANGE" /> diff --git a/res/values/strings.xml b/res/values/strings.xml index fed2be2..94eb9cc 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -18,4 +18,6 @@ <string name="app_name">Themes Provider</string> + <!-- For when an "legacy" icon pack does not have an app name --> + <string name="unknown_app_name">Unknown</string> </resources> 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/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 092536d..6a0f54a 100644 --- a/src/org/cyanogenmod/themes/provider/ThemesOpenHelper.java +++ b/src/org/cyanogenmod/themes/provider/ThemesOpenHelper.java @@ -17,9 +17,12 @@ 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; +import android.provider.ThemesContract; import android.provider.ThemesContract.ThemesColumns; import android.provider.ThemesContract.MixnMatchColumns; import android.util.Log; @@ -27,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 = 2; + 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 @@ -40,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); } @@ -52,6 +58,18 @@ public class ThemesOpenHelper extends SQLiteOpenHelper { upgradeToVersion2(db); oldVersion = 2; } + if (oldVersion == 2) { + 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); @@ -72,6 +90,46 @@ public class ThemesOpenHelper extends SQLiteOpenHelper { db.execSQL(addStyleColumn); } + private void upgradeToVersion3(SQLiteDatabase db) { + // Add default value to mixnmatch for KEY_ALARM + ContentValues values = new ContentValues(); + values.put(MixnMatchColumns.COL_KEY, ThemesContract.MixnMatchColumns.KEY_ALARM); + values.put(MixnMatchColumns.COL_VALUE, DEFAULT_PKG_NAME); + 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); @@ -108,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); @@ -133,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); } @@ -155,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); } } } |