Updating icons for sortcuts when the target app updates.

Bug: 17398260
Change-Id: I055abb971d1f72245e8616ac2ce07bcdf37cdd52
This commit is contained in:
Sunny Goyal
2014-10-06 16:23:56 -07:00
parent 2fce90c38a
commit b50cc8c5d6
6 changed files with 110 additions and 36 deletions
+3 -11
View File
@@ -18,10 +18,6 @@ package com.android.launcher3;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import com.android.launcher3.compat.LauncherActivityInfoCompat;
import com.android.launcher3.compat.LauncherAppsCompat;
@@ -101,10 +97,8 @@ class AllAppsList {
final List<LauncherActivityInfoCompat> matches = launcherApps.getActivityList(packageName,
user);
if (matches.size() > 0) {
for (LauncherActivityInfoCompat info : matches) {
add(new AppInfo(context, info, user, mIconCache, null));
}
for (LauncherActivityInfoCompat info : matches) {
add(new AppInfo(context, info, user, mIconCache, null));
}
}
@@ -149,9 +143,7 @@ class AllAppsList {
// Find enabled activities and add them to the adapter
// Also updates existing activities with new labels/icons
int count = matches.size();
for (int i = 0; i < count; i++) {
final LauncherActivityInfoCompat info = matches.get(i);
for (final LauncherActivityInfoCompat info : matches) {
AppInfo applicationInfo = findApplicationInfoLocked(
info.getComponentName().getPackageName(), user,
info.getComponentName().getClassName());
+1 -1
View File
@@ -121,7 +121,7 @@ public class IconCache {
android.R.mipmap.sym_def_app_icon);
}
public Drawable getFullResIcon(Resources resources, int iconId) {
private Drawable getFullResIcon(Resources resources, int iconId) {
Drawable d;
try {
d = resources.getDrawableForDensity(iconId, mIconDpi);
+20
View File
@@ -4718,6 +4718,26 @@ public class Launcher extends Activity
}
}
/**
* Some shortcuts were updated in the background.
*
* Implementation of the method from LauncherModel.Callbacks.
*/
public void bindShortcutsUpdated(final ArrayList<ShortcutInfo> shortcuts) {
Runnable r = new Runnable() {
public void run() {
bindShortcutsUpdated(shortcuts);
}
};
if (waitUntilResume(r)) {
return;
}
if (mWorkspace != null) {
mWorkspace.updateShortcuts(shortcuts);
}
}
/**
* Update the state of a package, typically related to install state.
*
+43 -24
View File
@@ -198,6 +198,7 @@ public class LauncherModel extends BroadcastReceiver
ArrayList<ItemInfo> addAnimated,
ArrayList<AppInfo> addedApps);
public void bindAppsUpdated(ArrayList<AppInfo> apps);
public void bindShortcutsUpdated(ArrayList<ShortcutInfo> shortcuts);
public void updatePackageState(ArrayList<PackageInstallInfo> installInfo);
public void updatePackageBadge(String packageName);
public void bindComponentsRemoved(ArrayList<String> packageNames,
@@ -3059,6 +3060,43 @@ public class LauncherModel extends BroadcastReceiver
});
}
// Update shortcuts which use an iconResource
if (mOp == OP_ADD || mOp == OP_UPDATE) {
final ArrayList<ShortcutInfo> iconsChanged = new ArrayList<ShortcutInfo>();
HashSet<String> packageSet = new HashSet<String>(Arrays.asList(packages));
// We need to iteration over the items here, so that we can avoid new Bitmap
// creation on the UI thread.
synchronized (sBgLock) {
for (ItemInfo info : sBgWorkspaceItems) {
if (info instanceof ShortcutInfo && mUser.equals(info.user)) {
ShortcutInfo si = (ShortcutInfo) info;
if ((si.iconResource != null)
&& packageSet.contains(si.getTargetComponent().getPackageName())){
Bitmap icon = Utilities.createIconBitmap(si.iconResource.packageName,
si.iconResource.resourceName, mIconCache, context);
if (icon != null) {
si.setIcon(icon);
si.usingFallbackIcon = false;
iconsChanged.add(si);
updateItemInDatabase(context, si);
}
}
}
}
}
if (!iconsChanged.isEmpty()) {
mHandler.post(new Runnable() {
public void run() {
Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
if (callbacks == cb && cb != null) {
callbacks.bindShortcutsUpdated(iconsChanged);
}
}
});
}
}
final ArrayList<String> removedPackageNames =
new ArrayList<String>();
if (mOp == OP_REMOVE) {
@@ -3385,19 +3423,9 @@ public class LauncherModel extends BroadcastReceiver
case LauncherSettings.Favorites.ICON_TYPE_RESOURCE:
String packageName = c.getString(iconPackageIndex);
String resourceName = c.getString(iconResourceIndex);
PackageManager packageManager = context.getPackageManager();
info.customIcon = false;
// the resource
try {
Resources resources = packageManager.getResourcesForApplication(packageName);
if (resources != null) {
final int id = resources.getIdentifier(resourceName, null, null);
icon = Utilities.createIconBitmap(
mIconCache.getFullResIcon(resources, id), context);
}
} catch (Exception e) {
// drop this. we have other places to look for icons
}
icon = Utilities.createIconBitmap(packageName, resourceName, mIconCache, context);
// the db
if (icon == null) {
icon = getIconFromCursor(c, iconIndex, context);
@@ -3490,19 +3518,10 @@ public class LauncherModel extends BroadcastReceiver
customIcon = true;
} else {
Parcelable extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE);
if (extra != null && extra instanceof ShortcutIconResource) {
try {
iconResource = (ShortcutIconResource) extra;
final PackageManager packageManager = context.getPackageManager();
Resources resources = packageManager.getResourcesForApplication(
iconResource.packageName);
final int id = resources.getIdentifier(iconResource.resourceName, null, null);
icon = Utilities.createIconBitmap(
mIconCache.getFullResIcon(resources, id),
context);
} catch (Exception e) {
Log.w(TAG, "Could not load shortcut icon: " + extra);
}
if (extra instanceof ShortcutIconResource) {
iconResource = (ShortcutIconResource) extra;
icon = Utilities.createIconBitmap(iconResource.packageName,
iconResource.resourceName, mIconCache, context);
}
}
+21
View File
@@ -107,6 +107,27 @@ public final class Utilities {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.L;
}
/**
* Returns a bitmap suitable for the all apps view. If the package or the resource do not
* exist, it returns null.
*/
static Bitmap createIconBitmap(String packageName, String resourceName, IconCache cache,
Context context) {
PackageManager packageManager = context.getPackageManager();
// the resource
try {
Resources resources = packageManager.getResourcesForApplication(packageName);
if (resources != null) {
final int id = resources.getIdentifier(resourceName, null, null);
return createIconBitmap(
resources.getDrawableForDensity(id, cache.getFullResIconDpi()), context);
}
} catch (Exception e) {
// Icon not found.
}
return null;
}
/**
* Returns a bitmap which is of the appropriate size to be displayed as an icon
*/
+22
View File
@@ -4800,6 +4800,28 @@ public class Workspace extends SmoothPagedView
}
}
void updateShortcuts(ArrayList<ShortcutInfo> shortcuts) {
final HashSet<ShortcutInfo> updates = new HashSet<ShortcutInfo>(shortcuts);
mapOverItems(MAP_RECURSE, new ItemOperator() {
@Override
public boolean evaluate(ItemInfo info, View v, View parent) {
if (info instanceof ShortcutInfo && v instanceof BubbleTextView &&
updates.contains(info)) {
ShortcutInfo shortcutInfo = (ShortcutInfo) info;
BubbleTextView shortcut = (BubbleTextView) v;
shortcut.applyFromShortcutInfo(shortcutInfo, mIconCache, true, false);
if (parent != null) {
parent.invalidate();
}
}
// process all the shortcuts
return false;
}
});
}
void updateShortcutsAndWidgets(ArrayList<AppInfo> apps) {
// Break the appinfo list per user
final HashMap<UserHandleCompat, ArrayList<AppInfo>> appsPerUser =