summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjorn Bringert <bringert@android.com>2010-03-15 23:58:54 +0000
committerBjorn Bringert <bringert@android.com>2010-03-15 23:58:54 +0000
commit72b3dbb33c455151d3fa6a8e2bb73d262e5b0c15 (patch)
treec21eafb84f6334bfa7f7b8bd72451a9d33bd42ed
parentcc315f1aec39f30f4be877e320b3d4311280cf77 (diff)
downloadApplicationsProvider-72b3dbb33c455151d3fa6a8e2bb73d262e5b0c15.tar.gz
Use icon names instead of resource IDs for app icons
This should make app shortcut icons in QSB more stable when apps are upgraded. But it's not foolproof, since an app may change the resource name of its app icon. Part of http://b/issue?id=2513568 Change-Id: Ic9f07d9d5d5cf59aabcc74d21212bc1c28947dce
-rw-r--r--src/com/android/providers/applications/ApplicationsProvider.java58
1 files changed, 45 insertions, 13 deletions
diff --git a/src/com/android/providers/applications/ApplicationsProvider.java b/src/com/android/providers/applications/ApplicationsProvider.java
index bf19e42..a00de2e 100644
--- a/src/com/android/providers/applications/ApplicationsProvider.java
+++ b/src/com/android/providers/applications/ApplicationsProvider.java
@@ -26,8 +26,11 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.UriMatcher;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
@@ -439,19 +442,7 @@ public class ApplicationsProvider extends ContentProvider {
if (TextUtils.isEmpty(title)) {
title = info.activityInfo.name;
}
-
- String icon;
- if (info.activityInfo.getIconResource() != 0) {
- // Use a resource Uri for the icon.
- icon = new Uri.Builder()
- .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
- .authority(info.activityInfo.applicationInfo.packageName)
- .encodedPath(String.valueOf(info.activityInfo.getIconResource()))
- .toString();
- } else {
- // No icon for app, use default app icon.
- icon = String.valueOf(com.android.internal.R.drawable.sym_def_app_icon);
- }
+ String icon = getActivityIconUri(info.activityInfo);
inserter.prepareForInsert();
inserter.bind(nameCol, title);
inserter.bind(descriptionCol, description);
@@ -468,6 +459,13 @@ public class ApplicationsProvider extends ContentProvider {
if (DBG) Log.d(TAG, "Finished updating database.");
}
+ private String getActivityIconUri(ActivityInfo activityInfo) {
+ int icon = activityInfo.getIconResource();
+ if (icon == 0) return null;
+ Uri uri = getResourceUri(getContext(), activityInfo.applicationInfo, icon);
+ return uri == null ? null : uri.toString();
+ }
+
private void removeApplications(String packageName) {
if (packageName == null) {
mDb.delete(APPLICATIONS_TABLE, null, null);
@@ -532,4 +530,38 @@ public class ApplicationsProvider extends ContentProvider {
.appendPath(className)
.build();
}
+
+ private static Uri getResourceUri(Context context, ApplicationInfo appInfo, int res) {
+ try {
+ Resources resources = context.getPackageManager().getResourcesForApplication(appInfo);
+ return getResourceUri(resources, appInfo.packageName, res);
+ } catch (PackageManager.NameNotFoundException e) {
+ return null;
+ } catch (Resources.NotFoundException e) {
+ return null;
+ }
+ }
+
+ private static Uri getResourceUri(Resources resources, String appPkg, int res)
+ throws Resources.NotFoundException {
+ String resPkg = resources.getResourcePackageName(res);
+ String type = resources.getResourceTypeName(res);
+ String name = resources.getResourceEntryName(res);
+ return makeResourceUri(appPkg, resPkg, type, name);
+ }
+
+ private static Uri makeResourceUri(String appPkg, String resPkg, String type, String name)
+ throws Resources.NotFoundException {
+ Uri.Builder uriBuilder = new Uri.Builder();
+ uriBuilder.scheme(ContentResolver.SCHEME_ANDROID_RESOURCE);
+ uriBuilder.encodedAuthority(appPkg);
+ uriBuilder.appendEncodedPath(type);
+ if (!appPkg.equals(resPkg)) {
+ uriBuilder.appendEncodedPath(resPkg + ":" + name);
+ } else {
+ uriBuilder.appendEncodedPath(name);
+ }
+ return uriBuilder.build();
+ }
+
}