Use promisedIntent instead of intent when deep shortcuts are restored.

This ensures that the intent has the package corresponding to the
shortcut publisher, rather than a market intent. It also ensures that
the intent has the EXTRA_SHORTCUT_ID attached.

Bug: 31123204

Change-Id: I05d56396b629880322e915f52bfc0605b921b0b1
This commit is contained in:
Tony Wickham
2016-08-29 15:17:48 -07:00
parent 4a4b49ff34
commit fc02c1b446
5 changed files with 21 additions and 11 deletions

View File

@@ -2932,7 +2932,8 @@ public class Launcher extends Activity
try {
if (Utilities.ATLEAST_MARSHMALLOW && item != null
&& (item.itemType == Favorites.ITEM_TYPE_SHORTCUT
|| item.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT)) {
|| item.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT)
&& ((ShortcutInfo) item).promisedIntent == null) {
// Shortcuts need some special checks due to legacy reasons.
startShortcutIntentSafely(intent, optsBundle, item);
} else if (user == null || user.equals(UserHandleCompat.myUserHandle())) {
@@ -4238,7 +4239,7 @@ public class Launcher extends Activity
for (ShortcutInfo si : removed) {
if (si.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT) {
removedDeepShortcuts.add(ShortcutKey.fromItemInfo(si));
removedDeepShortcuts.add(ShortcutKey.fromShortcutInfo(si));
} else {
removedComponents.add(si.getTargetComponent());
}

View File

@@ -931,7 +931,8 @@ public class LauncherModel extends BroadcastReceiver
}
if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) {
incrementPinnedShortcutCount(
ShortcutKey.fromItemInfo(item), true /* shouldPin */);
ShortcutKey.fromShortcutInfo((ShortcutInfo) item),
true /* shouldPin */);
}
break;
case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET:
@@ -1000,7 +1001,8 @@ public class LauncherModel extends BroadcastReceiver
sBgWorkspaceItems.remove(item);
break;
case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT:
decrementPinnedShortcutCount(ShortcutKey.fromItemInfo(item));
decrementPinnedShortcutCount(ShortcutKey.fromShortcutInfo(
(ShortcutInfo) item));
// Fall through.
case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
@@ -3389,7 +3391,8 @@ public class LauncherModel extends BroadcastReceiver
for (ItemInfo itemInfo : sBgItemsIdMap) {
if (itemInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) {
ShortcutInfo si = (ShortcutInfo) itemInfo;
if (si.getIntent().getPackage().equals(mPackageName) && si.user.equals(mUser)) {
if (si.getPromisedIntent().getPackage().equals(mPackageName)
&& si.user.equals(mUser)) {
String shortcutId = si.getDeepShortcutId();
if (idsToShortcuts.containsKey(shortcutId)) {
idsToWorkspaceShortcutInfos.addToList(shortcutId, si);
@@ -3462,7 +3465,7 @@ public class LauncherModel extends BroadcastReceiver
ShortcutInfo si = (ShortcutInfo) itemInfo;
if (isUserUnlocked) {
ShortcutInfoCompat shortcut =
pinnedShortcuts.get(ShortcutKey.fromItemInfo(si));
pinnedShortcuts.get(ShortcutKey.fromShortcutInfo(si));
// We couldn't verify the shortcut during loader. If its no longer available
// (probably due to clear data), delete the workspace item as well
if (shortcut == null) {

View File

@@ -167,6 +167,11 @@ public class ShortcutInfo extends ItemInfo {
return intent;
}
/** Returns {@link #promisedIntent}, or {@link #intent} if promisedIntent is null. */
public Intent getPromisedIntent() {
return promisedIntent != null ? promisedIntent : intent;
}
ShortcutInfo(Intent intent, CharSequence title, CharSequence contentDescription,
Bitmap icon, UserHandleCompat user) {
this();
@@ -349,7 +354,7 @@ public class ShortcutInfo extends ItemInfo {
/** Returns the ShortcutInfo id associated with the deep shortcut. */
public String getDeepShortcutId() {
return itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT ?
intent.getStringExtra(ShortcutInfoCompat.EXTRA_SHORTCUT_ID) : null;
getPromisedIntent().getStringExtra(ShortcutInfoCompat.EXTRA_SHORTCUT_ID) : null;
}
@Override

View File

@@ -3,7 +3,7 @@ package com.android.launcher3.shortcuts;
import android.content.ComponentName;
import android.content.Intent;
import com.android.launcher3.ItemInfo;
import com.android.launcher3.ShortcutInfo;
import com.android.launcher3.compat.UserHandleCompat;
import com.android.launcher3.util.ComponentKey;
@@ -32,7 +32,7 @@ public class ShortcutKey extends ComponentKey {
return new ShortcutKey(intent.getPackage(), user, shortcutId);
}
public static ShortcutKey fromItemInfo(ItemInfo info) {
return fromIntent(info.getIntent(), info.user);
public static ShortcutKey fromShortcutInfo(ShortcutInfo info) {
return fromIntent(info.getPromisedIntent(), info.user);
}
}

View File

@@ -20,6 +20,7 @@ import android.content.ComponentName;
import com.android.launcher3.ItemInfo;
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.ShortcutInfo;
import com.android.launcher3.compat.UserHandleCompat;
import com.android.launcher3.shortcuts.ShortcutKey;
@@ -57,7 +58,7 @@ public abstract class ItemInfoMatcher {
@Override
public boolean matches(ItemInfo info, ComponentName cn) {
return info.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT &&
keys.contains(ShortcutKey.fromItemInfo(info));
keys.contains(ShortcutKey.fromShortcutInfo((ShortcutInfo) info));
}
};
}