summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrint E. Kriebel <bekit@cyngn.com>2014-06-30 19:39:44 -0700
committerBrint E. Kriebel <bekit@cyngn.com>2014-06-30 19:39:44 -0700
commit429e9d7fcb16ee91e5577222254ab47af28e7cd5 (patch)
tree18f88c0ec360b017b159c44871dc59756daa9803
parent047b5bdb7884c9ed73833a229d6cfbd2af47306c (diff)
parent2071f7e229e34cf716ad0d99bc5ba51e96b32ab1 (diff)
downloadandroid_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.xml4
-rw-r--r--res/values-cs/strings.xml2
-rw-r--r--res/values-hr/strings.xml1
-rw-r--r--res/values-lt/strings.xml2
-rw-r--r--res/values-ro/strings.xml21
-rw-r--r--res/values-sv/strings.xml1
-rw-r--r--src/org/cyanogenmod/themes/provider/AppReceiver.java26
-rw-r--r--src/org/cyanogenmod/themes/provider/CopyImageService.java110
-rw-r--r--src/org/cyanogenmod/themes/provider/ThemePackageHelper.java61
-rw-r--r--src/org/cyanogenmod/themes/provider/ThemesProvider.java16
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);