diff options
author | Bjorn Bringert <bringert@android.com> | 2010-03-15 23:58:54 +0000 |
---|---|---|
committer | Bjorn Bringert <bringert@android.com> | 2010-03-15 23:58:54 +0000 |
commit | 72b3dbb33c455151d3fa6a8e2bb73d262e5b0c15 (patch) | |
tree | c21eafb84f6334bfa7f7b8bd72451a9d33bd42ed | |
parent | cc315f1aec39f30f4be877e320b3d4311280cf77 (diff) | |
download | ApplicationsProvider-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.java | 58 |
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(); + } + } |