diff options
author | Brint E. Kriebel <bekit@cyngn.com> | 2014-06-30 19:39:44 -0700 |
---|---|---|
committer | Brint E. Kriebel <bekit@cyngn.com> | 2014-06-30 19:39:44 -0700 |
commit | 429e9d7fcb16ee91e5577222254ab47af28e7cd5 (patch) | |
tree | 18f88c0ec360b017b159c44871dc59756daa9803 | |
parent | 047b5bdb7884c9ed73833a229d6cfbd2af47306c (diff) | |
parent | 2071f7e229e34cf716ad0d99bc5ba51e96b32ab1 (diff) | |
download | android_packages_providers_ThemesProvider-429e9d7fcb16ee91e5577222254ab47af28e7cd5.tar.gz android_packages_providers_ThemesProvider-429e9d7fcb16ee91e5577222254ab47af28e7cd5.tar.bz2 android_packages_providers_ThemesProvider-429e9d7fcb16ee91e5577222254ab47af28e7cd5.zip |
Merge branch 'cm-11.0' into stable/cm-11.0
-rw-r--r-- | AndroidManifest.xml | 4 | ||||
-rw-r--r-- | res/values-cs/strings.xml | 2 | ||||
-rw-r--r-- | res/values-hr/strings.xml | 1 | ||||
-rw-r--r-- | res/values-lt/strings.xml | 2 | ||||
-rw-r--r-- | res/values-ro/strings.xml | 21 | ||||
-rw-r--r-- | res/values-sv/strings.xml | 1 | ||||
-rw-r--r-- | src/org/cyanogenmod/themes/provider/AppReceiver.java | 26 | ||||
-rw-r--r-- | src/org/cyanogenmod/themes/provider/CopyImageService.java | 110 | ||||
-rw-r--r-- | src/org/cyanogenmod/themes/provider/ThemePackageHelper.java | 61 | ||||
-rw-r--r-- | src/org/cyanogenmod/themes/provider/ThemesProvider.java | 16 |
10 files changed, 185 insertions, 59 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 6a8b499..f759f2a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -19,6 +19,8 @@ <provider android:name="org.cyanogenmod.themes.provider.ThemesProvider" android:authorities="com.cyanogenmod.themes" + android:readPermission="android.permission.READ_THEMES" + android:writePermission="android.permission.WRITE_THEMES" android:exported="true" /> <service android:name=".CopyImageService" > @@ -34,7 +36,7 @@ <data android:scheme="package" /> </intent-filter> <intent-filter> - <action android:name="android.intent.action.PACKAGE_BEING_REMOVED" /> + <action android:name="android.intent.action.PACKAGE_FULLY_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-cs/strings.xml b/res/values-cs/strings.xml index 525308d..b076a93 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -16,6 +16,6 @@ limitations under the License. --> <resources> - <string name="app_name">Poskytovatel témat</string> + <string name="app_name">Poskytovatel motivů</string> <string name="unknown_app_name">Neznámé</string> </resources> diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index a67de54..a09bf52 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -17,4 +17,5 @@ --> <resources> <string name="app_name">Pružatelj tema</string> + <string name="unknown_app_name">Nepoznato</string> </resources> diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 7f3bea8..3978bf5 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -16,6 +16,6 @@ limitations under the License. --> <resources> - <string name="app_name">Temų tiekėjas</string> + <string name="app_name">Temų teikėjas</string> <string name="unknown_app_name">Nežinoma</string> </resources> diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml new file mode 100644 index 0000000..bae2111 --- /dev/null +++ b/res/values-ro/strings.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!--Generated by crowdin.net--> +<!-- + 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. +--> +<resources> + <string name="app_name">Furnizor de teme</string> + <string name="unknown_app_name">Necunoscut</string> +</resources> diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 56af373..586fae7 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -17,4 +17,5 @@ --> <resources> <string name="app_name">Temaleverantör</string> + <string name="unknown_app_name">Okänt</string> </resources> diff --git a/src/org/cyanogenmod/themes/provider/AppReceiver.java b/src/org/cyanogenmod/themes/provider/AppReceiver.java index 881ac21..cf0d1c3 100644 --- a/src/org/cyanogenmod/themes/provider/AppReceiver.java +++ b/src/org/cyanogenmod/themes/provider/AppReceiver.java @@ -19,7 +19,9 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager.NameNotFoundException; +import android.database.Cursor; import android.net.Uri; +import android.provider.ThemesContract; import android.util.Log; public class AppReceiver extends BroadcastReceiver { @@ -34,13 +36,33 @@ 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_BEING_REMOVED)) { + } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_FULLY_REMOVED)) { ThemePackageHelper.removePackage(context, pkgName); } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) { - ThemePackageHelper.updatePackage(context, pkgName); + if (themeExistsInProvider(context, pkgName)) { + ThemePackageHelper.updatePackage(context, pkgName); + } else { + // Edge case where app was not a theme in previous install + ThemePackageHelper.insertPackage(context, pkgName); + } } } catch(NameNotFoundException e) { Log.e(TAG, "Unable to add package to theme's provider ", e); } } + + private static boolean themeExistsInProvider(Context context, String pkgName) { + boolean exists = false; + String[] projection = new String[] { ThemesContract.ThemesColumns.PKG_NAME }; + String selection = ThemesContract.ThemesColumns.PKG_NAME + "=?"; + String[] selectionArgs = new String[] { pkgName }; + Cursor c = context.getContentResolver().query(ThemesContract.ThemesColumns.CONTENT_URI, + projection, selection, selectionArgs, null); + + if (c != null) { + exists = c.getCount() >= 1; + c.close(); + } + return exists; + } } diff --git a/src/org/cyanogenmod/themes/provider/CopyImageService.java b/src/org/cyanogenmod/themes/provider/CopyImageService.java index 8a0362a..cbf7be2 100644 --- a/src/org/cyanogenmod/themes/provider/CopyImageService.java +++ b/src/org/cyanogenmod/themes/provider/CopyImageService.java @@ -37,7 +37,8 @@ import java.io.InputStream; * Copies images from the theme APK to the local provider's cache */ public class CopyImageService extends IntentService { - + public static final String ACTION_INSERT = "org.cyanogenmod.themes.provider.action.insert"; + public static final String ACTION_DELETE = "org.cyanogenmod.themes.provider.action.delete"; public static final String EXTRA_PKG_NAME = "extra_pkg_name"; private static final String TAG = CopyImageService.class.getName(); @@ -59,47 +60,21 @@ public class CopyImageService extends IntentService { @Override protected void onHandleIntent(Intent intent) { - - if (intent.getExtras() == null) + if (intent.getExtras() == null || intent.getExtras().getString(EXTRA_PKG_NAME) == null) { + Log.e(TAG, "No package name or extras provided"); return; + } String pkgName = intent.getExtras().getString(EXTRA_PKG_NAME); - - if (pkgName != null) { - generate(this, pkgName); + if (ACTION_INSERT.equals(intent.getAction())) { + createPreviewImages(this, pkgName); + insertPreviewValuesIntoDb(pkgName); + } else if (ACTION_DELETE.equals(intent.getAction())) { + deletePreviewImages(pkgName); } - - String homescreen = Environment.getDataDirectory().getPath() - + IMAGES_PATH + pkgName - + ".homescreen.jpg"; - String lockscreen = Environment.getDataDirectory().getPath() - + IMAGES_PATH + pkgName - + ".lockscreen.jpg"; - String stylePreview = Environment.getDataDirectory().getPath() - + IMAGES_PATH + pkgName - + ".stylepreview.jpg"; - String wallpaper = ContentResolver.SCHEME_FILE + "://" + Environment.getDataDirectory().getPath() - + WALLPAPER_PATH + pkgName - + ".wallpaper1.jpg"; - Uri hsUri = Uri.parse(homescreen); - Uri lsUri = Uri.parse(lockscreen); - Uri wpUri = Uri.parse(wallpaper); - Uri styleUri = Uri.parse(stylePreview); - - String where = ThemesColumns.PKG_NAME + "=?"; - String[] selectionArgs = { pkgName }; - - ContentValues values = new ContentValues(); - values.put(ThemesColumns.HOMESCREEN_URI, hsUri.toString()); - values.put(ThemesColumns.LOCKSCREEN_URI, lsUri.toString()); - values.put(ThemesColumns.STYLE_URI, styleUri.toString()); - values.put(ThemesColumns.WALLPAPER_URI, "file:///android_asset/wallpapers/wallpaper1.jpg"); - - getContentResolver().update(ThemesColumns.CONTENT_URI, values, - where, selectionArgs); } - public static void generate(Context context, String pkgName) { + public static void createPreviewImages(Context context, String pkgName) { // Presently this is just mocked up. IE We expect the theme APK to // provide the bitmap. Context themeContext = null; @@ -159,6 +134,69 @@ public class CopyImageService extends IntentService { } } + private void insertPreviewValuesIntoDb(String pkgName) { + String homescreen = getHomeScreenPreviewPath(pkgName); + String lockscreen = getLockScreenPreviewPath(pkgName); + String stylePreview = getStylesPreviewPath(pkgName); + String wallpaper = getWallpaperPreviewPath(pkgName); + + Uri hsUri = Uri.parse(homescreen); + Uri lsUri = Uri.parse(lockscreen); + Uri wpUri = Uri.parse(wallpaper); + Uri styleUri = Uri.parse(stylePreview); + + String where = ThemesColumns.PKG_NAME + "=?"; + String[] selectionArgs = { pkgName }; + + ContentValues values = new ContentValues(); + values.put(ThemesColumns.HOMESCREEN_URI, hsUri.toString()); + values.put(ThemesColumns.LOCKSCREEN_URI, lsUri.toString()); + values.put(ThemesColumns.STYLE_URI, styleUri.toString()); + values.put(ThemesColumns.WALLPAPER_URI, "file:///android_asset/wallpapers/wallpaper1.jpg"); + + getContentResolver().update(ThemesColumns.CONTENT_URI, values, + where, selectionArgs); + } + + private void deletePreviewImages(String pkgName) { + File home = new File(getHomeScreenPreviewPath(pkgName)); + home.delete(); + + File lockscreen = new File(getLockScreenPreviewPath(pkgName)); + lockscreen.delete(); + + File style = new File(getStylesPreviewPath(pkgName)); + style.delete(); + + File wallpaper = new File(getWallpaperPreviewPath(pkgName)); + wallpaper.delete(); + } + + private static String getHomeScreenPreviewPath(String pkgName) { + return Environment.getDataDirectory().getPath() + + IMAGES_PATH + pkgName + + ".homescreen.jpg"; + } + + private static String getLockScreenPreviewPath(String pkgName) { + return Environment.getDataDirectory().getPath() + + IMAGES_PATH + pkgName + + ".lockscreen.jpg"; + } + + private static String getStylesPreviewPath(String pkgName) { + return Environment.getDataDirectory().getPath() + + IMAGES_PATH + pkgName + + ".stylepreview.jpg"; + } + + private static String getWallpaperPreviewPath(String pkgName) { + return ContentResolver.SCHEME_FILE + "://" + + Environment.getDataDirectory().getPath() + + WALLPAPER_PATH + pkgName + + ".wallpaper1.jpg"; + } + private static InputStream getPreviewAsset(AssetManager am, String preview) throws IOException { InputStream is = null; try { diff --git a/src/org/cyanogenmod/themes/provider/ThemePackageHelper.java b/src/org/cyanogenmod/themes/provider/ThemePackageHelper.java index ed1a740..d602315 100644 --- a/src/org/cyanogenmod/themes/provider/ThemePackageHelper.java +++ b/src/org/cyanogenmod/themes/provider/ThemePackageHelper.java @@ -98,11 +98,7 @@ public class ThemePackageHelper { values.put(ThemesColumns.LAST_UPDATE_TIME, pi.lastUpdateTime); // Insert theme capabilities - for (Map.Entry<String, Boolean> entry : capabilities.entrySet()) { - String component = entry.getKey(); - Boolean isImplemented = entry.getValue(); - values.put(component, isImplemented); - } + insertCapabilities(capabilities, values); context.getContentResolver().insert(ThemesColumns.CONTENT_URI, values); } @@ -122,12 +118,7 @@ public class ThemePackageHelper { values.put(ThemesColumns.LAST_UPDATE_TIME, pi.lastUpdateTime); // Insert theme capabilities - for (Map.Entry<String, Boolean> entry : capabilities.entrySet()) { - String component = entry.getKey(); - Boolean isImplemented = ThemesColumns.MODIFIES_OVERLAYS.equals(component) ? Boolean.TRUE - : entry.getValue(); - values.put(component, isImplemented); - } + insertCapabilities(capabilities, values); context.getContentResolver().insert(ThemesColumns.CONTENT_URI, values); } @@ -147,11 +138,7 @@ public class ThemePackageHelper { 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); - } + insertCapabilities(capabilities, values); context.getContentResolver().insert(ThemesColumns.CONTENT_URI, values); } @@ -169,6 +156,9 @@ public class ThemePackageHelper { } else if (pi.isLegacyIconPackApk) { updateLegacyIconPackInternal(context, pi, capabilities); } + + // We should reapply any components that are currently applied for this theme. + reapplyInstalledComponentsForTheme(context, pkgName); } } @@ -215,6 +205,9 @@ public class ThemePackageHelper { ThemeUtils.getDefaultThemePackageName(context).equals(pi.packageName) ? 1 : 0); values.put(ThemesColumns.LAST_UPDATE_TIME, pi.lastUpdateTime); + // Insert theme capabilities + insertCapabilities(capabilities, values); + String where = ThemesColumns.PKG_NAME + "=?"; String[] args = { pi.packageName }; context.getContentResolver().update(ThemesColumns.CONTENT_URI, values, where, args); @@ -233,6 +226,9 @@ public class ThemePackageHelper { values.put(ThemesColumns.DATE_CREATED, System.currentTimeMillis()); values.put(ThemesColumns.LAST_UPDATE_TIME, pi.lastUpdateTime); + // Insert theme capabilities + insertCapabilities(capabilities, values); + String where = ThemesColumns.PKG_NAME + "=?"; String[] args = { pi.packageName }; context.getContentResolver().update(ThemesColumns.CONTENT_URI, values, where, args); @@ -240,7 +236,7 @@ public class ThemePackageHelper { 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 + // installed. If it is not installed, we need to set the component back to the default theme List<String> moveToDefault = new LinkedList<String>(); // components to move back to default Cursor mixnmatch = context.getContentResolver().query(MixnMatchColumns.CONTENT_URI, null, null, null, null); @@ -254,8 +250,9 @@ public class ThemePackageHelper { moveToDefault.add(component); } } + String pkgName = ThemeUtils.getDefaultThemePackageName(context); ThemeManager manager = (ThemeManager) context.getSystemService(Context.THEME_SERVICE); - manager.requestThemeChange("default", moveToDefault); + manager.requestThemeChange(pkgName, moveToDefault); // Delete the theme from the db String selection = ThemesColumns.PKG_NAME + "= ?"; @@ -299,6 +296,15 @@ public class ThemePackageHelper { return implementMap; } + private static void insertCapabilities(Map<String, Boolean> capabilities, + ContentValues values) { + for (Map.Entry<String, Boolean> entry : capabilities.entrySet()) { + String component = entry.getKey(); + Boolean isImplemented = entry.getValue(); + values.put(component, isImplemented); + } + } + private static boolean hasThemeComponentLegacy(PackageInfo pi, String component) { if (ThemesColumns.MODIFIES_OVERLAYS.equals(component)) { return true; @@ -345,4 +351,23 @@ public class ThemePackageHelper { } return count >= 2; } + + private static void reapplyInstalledComponentsForTheme(Context context, String pkgName) { + List<String> reApply = new LinkedList<String>(); // components to re-apply + Cursor mixnmatch = context.getContentResolver().query(MixnMatchColumns.CONTENT_URI, + null, null, null, null); + while (mixnmatch.moveToNext()) { + String mixnmatchKey = mixnmatch.getString(mixnmatch + .getColumnIndex(MixnMatchColumns.COL_KEY)); + String component = ThemesContract.MixnMatchColumns + .mixNMatchKeyToComponent(mixnmatchKey); + String pkg = mixnmatch.getString( + mixnmatch.getColumnIndex(MixnMatchColumns.COL_VALUE)); + if (pkgName.equals(pkg)) { + reApply.add(component); + } + } + ThemeManager manager = (ThemeManager) context.getSystemService(Context.THEME_SERVICE); + manager.requestThemeChange(pkgName, reApply); + } } diff --git a/src/org/cyanogenmod/themes/provider/ThemesProvider.java b/src/org/cyanogenmod/themes/provider/ThemesProvider.java index 4154b3e..ba50d72 100644 --- a/src/org/cyanogenmod/themes/provider/ThemesProvider.java +++ b/src/org/cyanogenmod/themes/provider/ThemesProvider.java @@ -89,6 +89,21 @@ public class ThemesProvider extends ContentProvider { switch (match) { case THEMES: SQLiteDatabase sqlDB = mDatabase.getWritableDatabase(); + + // Determine the pkg name and delete preview images + String[] columns = new String[] {ThemesColumns.PKG_NAME}; + Cursor c = sqlDB.query(ThemesTable.TABLE_NAME, columns, selection, + selectionArgs, null, null, null); + if (c == null) return 0; + if (c.moveToFirst()) { + String pkgName = c.getString(0); + Intent intent = new Intent(getContext(), CopyImageService.class); + intent.setAction(CopyImageService.ACTION_DELETE); + intent.putExtra(CopyImageService.EXTRA_PKG_NAME, pkgName); + getContext().startService(intent); + } + c.close(); + int rowsDeleted = sqlDB.delete(ThemesTable.TABLE_NAME, selection, selectionArgs); getContext().getContentResolver().notifyChange(uri, null); return rowsDeleted; @@ -124,6 +139,7 @@ public class ThemesProvider extends ContentProvider { case THEMES: id = sqlDB.insert(ThemesOpenHelper.ThemesTable.TABLE_NAME, null, values); Intent intent = new Intent(getContext(), CopyImageService.class); + intent.setAction(CopyImageService.ACTION_INSERT); intent.putExtra(CopyImageService.EXTRA_PKG_NAME, values.getAsString(ThemesColumns.PKG_NAME)); getContext().startService(intent); |