update placeholder on package install or restore

Bug: 10778992
Change-Id: I3293d8bab8ae0ef49fc5554531bba5bd6f70932c
This commit is contained in:
Chris Wren
2014-01-27 14:17:08 -05:00
parent c87c21a0cd
commit b6d4c2827a
5 changed files with 88 additions and 4 deletions
+4
View File
@@ -64,6 +64,10 @@ class AppInfo extends ItemInfo {
return intent;
}
protected Intent getRestoredIntent() {
return null;
}
/**
* Must not hold the Context.
*/
+4
View File
@@ -122,6 +122,10 @@ public class ItemInfo {
throw new RuntimeException("Unexpected Intent");
}
protected Intent getRestoredIntent() {
throw new RuntimeException("Unexpected Intent");
}
/**
* Write the fields of this item to the DB
*
+54 -3
View File
@@ -302,6 +302,15 @@ public class LauncherModel extends BroadcastReceiver {
return;
}
final ArrayList<AppInfo> restoredAppsFinal = new ArrayList<AppInfo>();
Iterator<AppInfo> iter = allAppsApps.iterator();
while (iter.hasNext()) {
ItemInfo a = iter.next();
if (LauncherModel.appWasRestored(ctx, a.getIntent())) {
restoredAppsFinal.add((AppInfo) a);
}
}
// Process the newly added applications and add them to the database first
Runnable r = new Runnable() {
public void run() {
@@ -310,6 +319,9 @@ public class LauncherModel extends BroadcastReceiver {
Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
if (callbacks == cb && cb != null) {
callbacks.bindAppsAdded(null, null, null, allAppsApps);
if (!restoredAppsFinal.isEmpty()) {
callbacks.bindAppsUpdated(restoredAppsFinal);
}
}
}
});
@@ -333,6 +345,7 @@ public class LauncherModel extends BroadcastReceiver {
public void run() {
final ArrayList<ItemInfo> addedShortcutsFinal = new ArrayList<ItemInfo>();
final ArrayList<Long> addedWorkspaceScreensFinal = new ArrayList<Long>();
final ArrayList<AppInfo> restoredAppsFinal = new ArrayList<AppInfo>();
// Get the list of workspace screens. We need to append to this list and
// can not use sBgWorkspaceScreens because loadWorkspace() may not have been
@@ -353,6 +366,11 @@ public class LauncherModel extends BroadcastReceiver {
// Short-circuit this logic if the icon exists somewhere on the workspace
if (LauncherModel.shortcutExists(context, name, launchIntent)) {
// Only InstallShortcutReceiver sends us shortcutInfos, ignore them
if (a instanceof AppInfo &&
LauncherModel.appWasRestored(context, launchIntent)) {
restoredAppsFinal.add((AppInfo) a);
}
continue;
}
@@ -428,6 +446,9 @@ public class LauncherModel extends BroadcastReceiver {
}
callbacks.bindAppsAdded(addedWorkspaceScreensFinal,
addNotAnimated, addAnimated, null);
if (!restoredAppsFinal.isEmpty()) {
callbacks.bindAppsUpdated(restoredAppsFinal);
}
}
}
});
@@ -792,6 +813,30 @@ public class LauncherModel extends BroadcastReceiver {
return result;
}
/**
* Returns true if the shortcuts already exists in the database.
* we identify a shortcut by the component name of the intent.
*/
static boolean appWasRestored(Context context, Intent intent) {
final ContentResolver cr = context.getContentResolver();
final ComponentName component = intent.getComponent();
if (component == null) {
return false;
}
String componentName = component.flattenToString();
final String where = "intent glob \"*component=" + componentName + "*\" and restored = 1";
Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI,
new String[]{"intent", "restored"}, where, null, null);
boolean result = false;
try {
result = c.moveToFirst();
} finally {
c.close();
}
Log.d(TAG, "shortcutWasRestored is " + result + " for " + componentName);
return result;
}
/**
* Returns an ItemInfo array containing all the items in the LauncherModel.
* The ItemInfo.id is not set through this function.
@@ -1839,7 +1884,7 @@ public class LauncherModel extends BroadcastReceiver {
Launcher.addDumpLog(TAG,
"constructing info for partially restored package",
true);
info = getRestoredItemInfo(c, titleIndex);
info = getRestoredItemInfo(c, titleIndex, intent);
intent = getRestoredItemIntent(c, context, intent);
} else if (itemType ==
LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) {
@@ -2810,7 +2855,7 @@ public class LauncherModel extends BroadcastReceiver {
* Make an ShortcutInfo object for a restored application or shortcut item that points
* to a package that is not yet installed on the system.
*/
public ShortcutInfo getRestoredItemInfo(Cursor cursor, int titleIndex) {
public ShortcutInfo getRestoredItemInfo(Cursor cursor, int titleIndex, Intent intent) {
final ShortcutInfo info = new ShortcutInfo();
info.usingFallbackIcon = true;
info.setIcon(getFallbackIcon());
@@ -2820,6 +2865,7 @@ public class LauncherModel extends BroadcastReceiver {
info.title = "";
}
info.itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
info.restoredIntent = intent;
return info;
}
@@ -2828,6 +2874,7 @@ public class LauncherModel extends BroadcastReceiver {
* to the market page for the item.
*/
private Intent getRestoredItemIntent(Cursor c, Context context, Intent intent) {
final boolean debug = false;
ComponentName componentName = intent.getComponent();
Intent marketIntent = new Intent(Intent.ACTION_VIEW);
Uri marketUri = new Uri.Builder()
@@ -2835,7 +2882,7 @@ public class LauncherModel extends BroadcastReceiver {
.authority("details")
.appendQueryParameter("id", componentName.getPackageName())
.build();
Log.d(TAG, "manufactured intent uri: " + marketUri.toString());
if (debug) Log.d(TAG, "manufactured intent uri: " + marketUri.toString());
marketIntent.setData(marketUri);
return marketIntent;
}
@@ -3001,6 +3048,10 @@ public class LauncherModel extends BroadcastReceiver {
Intent.ACTION_MAIN.equals(intent.getAction()) && name != null) {
return true;
}
// placeholder shortcuts get special treatment, let them through too.
if (info.getRestoredIntent() != null) {
return true;
}
}
return false;
}
@@ -64,6 +64,12 @@ class ShortcutInfo extends ItemInfo {
long firstInstallTime;
int flags = 0;
/**
* If this shortcut is a placeholder, then intent will be a market intent for the package, and
* this will hold the original intent from the database. Otherwise, null.
*/
Intent restoredIntent;
ShortcutInfo() {
itemType = LauncherSettings.BaseLauncherColumns.ITEM_TYPE_SHORTCUT;
}
@@ -72,6 +78,21 @@ class ShortcutInfo extends ItemInfo {
return intent;
}
protected Intent getRestoredIntent() {
return restoredIntent;
}
/**
* Overwrite placeholder data with restored data, or do nothing if this is not a placeholder.
*/
public void restore() {
if (restoredIntent != null) {
intent = restoredIntent;
restoredIntent = null;
}
}
ShortcutInfo(Intent intent, CharSequence title, Bitmap icon) {
this();
this.intent = intent;
+5 -1
View File
@@ -4612,11 +4612,15 @@ public class Workspace extends SmoothPagedView
private void updateShortcut(HashMap<ComponentName, AppInfo> appsMap, ItemInfo info,
View child) {
ComponentName cn = info.getIntent().getComponent();
if (info.getRestoredIntent() != null) {
cn = info.getRestoredIntent().getComponent();
}
if (cn != null) {
AppInfo appInfo = appsMap.get(info.getIntent().getComponent());
AppInfo appInfo = appsMap.get(cn);
if ((appInfo != null) && LauncherModel.isShortcutInfoUpdateable(info)) {
ShortcutInfo shortcutInfo = (ShortcutInfo) info;
BubbleTextView shortcut = (BubbleTextView) child;
shortcutInfo.restore();
shortcutInfo.updateIcon(mIconCache);
shortcutInfo.title = appInfo.title.toString();
shortcut.applyFromShortcutInfo(shortcutInfo, mIconCache);