Updating promise icon's bitmap and label when onBadgingChanged is received

Bug: 17583799
Change-Id: I68b4f9d4086c43bd949ad8b46b574ec78edb32db
This commit is contained in:
Sunny Goyal 2014-09-18 13:25:15 -07:00
parent 136882c195
commit a22666f681
6 changed files with 96 additions and 8 deletions

View File

@ -29,6 +29,7 @@ import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.Log;
@ -382,12 +383,15 @@ public class IconCache {
*/
public void cachePackageInstallInfo(String packageName, UserHandleCompat user,
Bitmap icon, CharSequence title) {
remove(packageName, user);
CacheEntry entry = getEntryForPackage(packageName, user);
if (!TextUtils.isEmpty(title)) {
entry.title = title;
}
if (icon != null) {
entry.icon = Utilities.createIconBitmap(icon, mContext);
entry.icon = Utilities.createIconBitmap(
new BitmapDrawable(mContext.getResources(), icon), mContext);
}
}

View File

@ -4709,6 +4709,18 @@ public class Launcher extends Activity
}
}
/**
* Update the label and icon of all the icons in a package
*
* Implementation of the method from LauncherModel.Callbacks.
*/
@Override
public void updatePackageBadge(String packageName) {
if (mWorkspace != null) {
mWorkspace.updatePackageBadge(packageName, UserHandleCompat.myUserHandle());
}
}
/**
* A package was uninstalled. We take both the super set of packageNames
* in addition to specific applications to remove, the reason being that

View File

@ -260,4 +260,11 @@ public class LauncherAppState implements DeviceProfile.DeviceProfileCallbacks {
public void setPackageState(ArrayList<PackageInstallInfo> installInfo) {
mModel.setPackageState(installInfo);
}
/**
* Updates the icons and label of all icons for the provided package name.
*/
public void updatePackageBadge(String packageName) {
mModel.updatePackageBadge(packageName);
}
}

View File

@ -198,6 +198,7 @@ public class LauncherModel extends BroadcastReceiver
ArrayList<AppInfo> addedApps);
public void bindAppsUpdated(ArrayList<AppInfo> apps);
public void updatePackageState(ArrayList<PackageInstallInfo> installInfo);
public void updatePackageBadge(String packageName);
public void bindComponentsRemoved(ArrayList<String> packageNames,
ArrayList<AppInfo> appInfos, UserHandleCompat user);
public void bindPackagesUpdated(ArrayList<Object> widgetsAndShortcuts);
@ -347,6 +348,19 @@ public class LauncherModel extends BroadcastReceiver
mHandler.post(r);
}
public void updatePackageBadge(final String packageName) {
// Process the updated package badge
Runnable r = new Runnable() {
public void run() {
Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;
if (callbacks != null) {
callbacks.updatePackageBadge(packageName);
}
}
};
mHandler.post(r);
}
public void addAppsToAllApps(final Context ctx, final ArrayList<AppInfo> allAppsApps) {
final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;

View File

@ -4921,6 +4921,38 @@ public class Workspace extends SmoothPagedView
removeItemsByPackageName(packages, user);
}
public void updatePackageBadge(final String packageName, final UserHandleCompat user) {
mapOverItems(MAP_RECURSE, new ItemOperator() {
@Override
public boolean evaluate(ItemInfo info, View v, View parent) {
if (info instanceof ShortcutInfo && v instanceof BubbleTextView) {
ShortcutInfo shortcutInfo = (ShortcutInfo) info;
ComponentName cn = shortcutInfo.getTargetComponent();
if (user.equals(shortcutInfo.user) && cn != null
&& shortcutInfo.isPromise()
&& packageName.equals(cn.getPackageName())) {
if (shortcutInfo.hasStatusFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON)) {
// For auto install apps update the icon as well as label.
mIconCache.getTitleAndIcon(shortcutInfo,
shortcutInfo.promisedIntent, user, true);
} else {
// Only update the icon for restored apps.
shortcutInfo.updateIcon(mIconCache);
}
BubbleTextView shortcut = (BubbleTextView) v;
shortcut.applyFromShortcutInfo(shortcutInfo, mIconCache, true, false);
if (parent != null) {
parent.invalidate();
}
}
}
// process all the shortcuts
return false;
}
});
}
public void updatePackageState(ArrayList<PackageInstallInfo> installInfos) {
HashSet<String> completedPackages = new HashSet<String>();

View File

@ -27,6 +27,7 @@ import com.android.launcher3.IconCache;
import com.android.launcher3.LauncherAppState;
import java.util.ArrayList;
import java.util.HashSet;
public class PackageInstallerCompatVL extends PackageInstallerCompat {
@ -34,6 +35,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat {
private static final boolean DEBUG = false;
private final SparseArray<SessionInfo> mPendingReplays = new SparseArray<SessionInfo>();
private final HashSet<String> mPendingBadgeUpdates = new HashSet<String>();
private final PackageInstaller mInstaller;
private final IconCache mCache;
@ -133,18 +135,20 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat {
if (!updates.isEmpty()) {
app.setPackageState(updates);
}
if (!mPendingBadgeUpdates.isEmpty()) {
for (String pkg : mPendingBadgeUpdates) {
app.updatePackageBadge(pkg);
}
mPendingBadgeUpdates.clear();
}
}
private final SessionCallback mCallback = new SessionCallback() {
@Override
public void onCreated(int sessionId) {
SessionInfo session = mInstaller.getSessionInfo(sessionId);
if (session != null) {
addSessionInfoToCahce(session, UserHandleCompat.myUserHandle());
mPendingReplays.put(sessionId, session);
replayUpdates(null);
}
pushSessionBadgeToLauncher(sessionId);
}
@Override
@ -152,6 +156,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat {
mPendingReplays.remove(sessionId);
SessionInfo session = mInstaller.getSessionInfo(sessionId);
if ((session != null) && (session.getAppPackageName() != null)) {
mPendingBadgeUpdates.remove(session.getAppPackageName());
// Replay all updates with a one time update for this installed package. No
// need to store this record for future updates, as the app list will get
// refreshed on resume.
@ -173,6 +178,20 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat {
public void onActiveChanged(int sessionId, boolean active) { }
@Override
public void onBadgingChanged(int sessionId) { }
public void onBadgingChanged(int sessionId) {
pushSessionBadgeToLauncher(sessionId);
}
private void pushSessionBadgeToLauncher(int sessionId) {
SessionInfo session = mInstaller.getSessionInfo(sessionId);
if (session != null) {
addSessionInfoToCahce(session, UserHandleCompat.myUserHandle());
if (session.getAppPackageName() != null) {
mPendingBadgeUpdates.add(session.getAppPackageName());
}
mPendingReplays.put(sessionId, session);
replayUpdates(null);
}
}
};
}