From 4456de181af115c60aac4696639dc70e162882ce Mon Sep 17 00:00:00 2001 From: Andy Mast Date: Wed, 30 Apr 2014 15:31:31 -0700 Subject: Themes: Support launcher based icon packs [2/2] Before this patch, icon packs written for Trebuchet/Nova/Apex could not be used with the new theme engine as the formats were different. For full description, see [1/2] in frameworks/base Change-Id: Ifaec3c4b459a74eab19c69a086e117b96aeb3e0f --- .../themes/provider/ThemePackageHelper.java | 50 ++++++++++++++++++++++ .../themes/provider/ThemesOpenHelper.java | 15 ++++++- .../themes/provider/ThemesProvider.java | 4 +- 3 files changed, 66 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/org/cyanogenmod/themes/provider/ThemePackageHelper.java b/src/org/cyanogenmod/themes/provider/ThemePackageHelper.java index 7a6fe42..bc367e0 100644 --- a/src/org/cyanogenmod/themes/provider/ThemePackageHelper.java +++ b/src/org/cyanogenmod/themes/provider/ThemePackageHelper.java @@ -19,6 +19,7 @@ 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.res.AssetManager; @@ -68,6 +69,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(); + capabilities.put(ThemesColumns.MODIFIES_ICONS, true); + insertLegacyIconPackInternal(context, pi, capabilities); } return true; } @@ -119,6 +125,30 @@ public class ThemePackageHelper { context.getContentResolver().insert(ThemesColumns.CONTENT_URI, values); } + private static void insertLegacyIconPackInternal(Context context, PackageInfo pi, + Map 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 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 capabilities = getCapabilities(context, pkgName); @@ -126,6 +156,8 @@ public class ThemePackageHelper { 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); } } @@ -164,6 +196,24 @@ public class ThemePackageHelper { context.getContentResolver().update(ThemesColumns.CONTENT_URI, values, where, args); } + private static void updateLegacyIconPackInternal(Context context, PackageInfo pi, + Map 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 + "=?"; + String[] args = { pi.packageName }; + context.getContentResolver().update(ThemesColumns.CONTENT_URI, values, where, args); + } + public static void removePackage(Context context, String pkgToRemove) { // Check currently applied components (fonts, wallpapers etc) and verify the theme is still // installed if it is not installed, we need to set the component back to the default theme diff --git a/src/org/cyanogenmod/themes/provider/ThemesOpenHelper.java b/src/org/cyanogenmod/themes/provider/ThemesOpenHelper.java index 915f465..95e4905 100644 --- a/src/org/cyanogenmod/themes/provider/ThemesOpenHelper.java +++ b/src/org/cyanogenmod/themes/provider/ThemesOpenHelper.java @@ -28,7 +28,7 @@ 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 = 4; private static final String DATABASE_NAME = "themes.db"; private static final String DEFAULT_PKG_NAME = "default"; @@ -57,6 +57,10 @@ public class ThemesOpenHelper extends SQLiteOpenHelper { upgradeToVersion3(db); oldVersion = 3; } + if (oldVersion == 3) { + upgradeToVersion4(db); + oldVersion = 4; + } if (oldVersion != DATABASE_VERSION) { Log.e(TAG, "Recreating db because unknown database version: " + oldVersion); dropTables(db); @@ -85,6 +89,13 @@ 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 dropTables(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS " + ThemesTable.TABLE_NAME); db.execSQL("DROP TABLE IF EXISTS " + MixnMatchTable.TABLE_NAME); @@ -121,6 +132,7 @@ 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_LEGACY_ICONPACK + " INTEGER DEFAULT 0," + ThemesColumns.LAST_UPDATE_TIME + " INTEGER DEFAULT 0" + ")"; @@ -146,6 +158,7 @@ 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_LEGACY_ICONPACK, 0); values.put(ThemesColumns.MODIFIES_OVERLAYS, 1); db.insert(TABLE_NAME, null, values); } diff --git a/src/org/cyanogenmod/themes/provider/ThemesProvider.java b/src/org/cyanogenmod/themes/provider/ThemesProvider.java index 6c70709..03c8d44 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; @@ -36,7 +37,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; @@ -283,7 +283,7 @@ public class ThemesProvider extends ContentProvider { List themePackages = new ArrayList(); Map pmThemes = new HashMap(); for (PackageInfo info : packages) { - if (info.isThemeApk || info.isLegacyThemeApk) { + if (info.isThemeApk || info.isLegacyThemeApk || info.isLegacyIconPackApk) { themePackages.add(info); pmThemes.put(info.packageName, info); } -- cgit v1.2.3