Do not allow duplicate shortcuts when ALL_APPS is disabled.

When DISABLE_ALL_APPS is true, we want to have only one shortcut for each activityexposed via the Application's manifest.
We ignore INSTALL_SHORTCUT broadcasts which have launch intents with ACTION_MAIN and CATEGORY_LAUNCHER.
Applications can still create shortcuts pointing to an already exposed component if they provide data or extras in the intent.

Change-Id: I0b05283ea6c522d197e0262c2997f7298e08740b
This commit is contained in:
Nilesh Agrawal
2013-12-17 15:20:50 -08:00
parent f6a22ada81
commit dff0bfeb90
2 changed files with 34 additions and 13 deletions

View File

@@ -24,6 +24,7 @@ import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;
import android.widget.Toast;
@@ -223,6 +224,7 @@ public class InstallShortcutReceiver extends BroadcastReceiver {
if (intent == null) {
return;
}
// This name is only used for comparisons and notifications, so fall back to activity name
// if not supplied
String name = ensureValidName(context, intent,
@@ -269,6 +271,12 @@ public class InstallShortcutReceiver extends BroadcastReceiver {
//final Intent data = pendingInfo.data;
final Intent intent = pendingInfo.launchIntent;
final String name = pendingInfo.name;
if (AppsCustomizePagedView.DISABLE_ALL_APPS && !isValidShortcutLaunchIntent(intent)) {
if (DBG) Log.d(TAG, "Ignoring shortcut with launchIntent:" + intent);
continue;
}
final boolean exists = LauncherModel.shortcutExists(context, name, intent);
//final boolean allowDuplicate = data.getBooleanExtra(Launcher.EXTRA_SHORTCUT_DUPLICATE, true);
@@ -301,6 +309,30 @@ public class InstallShortcutReceiver extends BroadcastReceiver {
}
}
/**
* Returns true if the intent is a valid launch intent for a shortcut.
* This is used to identify shortcuts which are different from the ones exposed by the
* applications' manifest file.
*
* When DISABLE_ALL_APPS is true, shortcuts exposed via the app's manifest should never be
* duplicated or removed(unless the app is un-installed).
*
* @param launchIntent The intent that will be launched when the shortcut is clicked.
*/
static boolean isValidShortcutLaunchIntent(Intent launchIntent) {
if (launchIntent != null
&& Intent.ACTION_MAIN.equals(launchIntent.getAction())
&& launchIntent.getComponent() != null
&& launchIntent.getCategories() != null
&& launchIntent.getCategories().size() == 1
&& launchIntent.hasCategory(Intent.CATEGORY_LAUNCHER)
&& launchIntent.getExtras() == null
&& TextUtils.isEmpty(launchIntent.getDataString())) {
return false;
}
return true;
}
private static ShortcutInfo getShortcutInfo(Context context, Intent data,
Intent launchIntent) {
if (launchIntent.getAction() == null) {