Merge "Revert "Push chooser targets to the shortcut manager."" into oc-dev
This commit is contained in:
@@ -10333,12 +10333,12 @@ package android.content.pm {
|
||||
ctor public LauncherApps.ShortcutQuery();
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setActivity(android.content.ComponentName);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setChangedSince(long);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setIntent(android.content.Intent);
|
||||
method public deprecated android.content.pm.LauncherApps.ShortcutQuery setIntent(android.content.Intent);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setPackage(java.lang.String);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setQueryFlags(int);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setShortcutIds(java.util.List<java.lang.String>);
|
||||
field public static final int FLAG_GET_KEY_FIELDS_ONLY = 4; // 0x4
|
||||
field public static final int FLAG_MATCH_CHOOSER = 16; // 0x10
|
||||
field public static final deprecated int FLAG_MATCH_CHOOSER = 16; // 0x10
|
||||
field public static final int FLAG_MATCH_DYNAMIC = 1; // 0x1
|
||||
field public static final int FLAG_MATCH_MANIFEST = 8; // 0x8
|
||||
field public static final int FLAG_MATCH_PINNED = 2; // 0x2
|
||||
@@ -10888,9 +10888,9 @@ package android.content.pm {
|
||||
method public int describeContents();
|
||||
method public android.content.ComponentName getActivity();
|
||||
method public java.util.Set<java.lang.String> getCategories();
|
||||
method public android.content.ComponentName[] getChooserComponentNames();
|
||||
method public android.os.PersistableBundle getChooserExtras();
|
||||
method public android.content.IntentFilter[] getChooserIntentFilters();
|
||||
method public deprecated android.content.ComponentName[] getChooserComponentNames();
|
||||
method public deprecated android.os.PersistableBundle getChooserExtras();
|
||||
method public deprecated android.content.IntentFilter[] getChooserIntentFilters();
|
||||
method public java.lang.CharSequence getDisabledMessage();
|
||||
method public android.os.PersistableBundle getExtras();
|
||||
method public java.lang.String getId();
|
||||
@@ -10903,7 +10903,7 @@ package android.content.pm {
|
||||
method public java.lang.CharSequence getShortLabel();
|
||||
method public android.os.UserHandle getUserHandle();
|
||||
method public boolean hasKeyFieldsOnly();
|
||||
method public boolean isChooser();
|
||||
method public deprecated boolean isChooser();
|
||||
method public boolean isDeclaredInManifest();
|
||||
method public boolean isDynamic();
|
||||
method public boolean isEnabled();
|
||||
@@ -10916,11 +10916,11 @@ package android.content.pm {
|
||||
|
||||
public static class ShortcutInfo.Builder {
|
||||
ctor public ShortcutInfo.Builder(android.content.Context, java.lang.String);
|
||||
method public android.content.pm.ShortcutInfo.Builder addChooserIntentFilter(android.content.IntentFilter, android.content.ComponentName);
|
||||
method public deprecated android.content.pm.ShortcutInfo.Builder addChooserIntentFilter(android.content.IntentFilter, android.content.ComponentName);
|
||||
method public android.content.pm.ShortcutInfo build();
|
||||
method public android.content.pm.ShortcutInfo.Builder setActivity(android.content.ComponentName);
|
||||
method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set<java.lang.String>);
|
||||
method public android.content.pm.ShortcutInfo.Builder setChooserExtras(android.os.PersistableBundle);
|
||||
method public deprecated android.content.pm.ShortcutInfo.Builder setChooserExtras(android.os.PersistableBundle);
|
||||
method public android.content.pm.ShortcutInfo.Builder setDisabledMessage(java.lang.CharSequence);
|
||||
method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle);
|
||||
method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon);
|
||||
|
||||
@@ -10957,12 +10957,12 @@ package android.content.pm {
|
||||
ctor public LauncherApps.ShortcutQuery();
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setActivity(android.content.ComponentName);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setChangedSince(long);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setIntent(android.content.Intent);
|
||||
method public deprecated android.content.pm.LauncherApps.ShortcutQuery setIntent(android.content.Intent);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setPackage(java.lang.String);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setQueryFlags(int);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setShortcutIds(java.util.List<java.lang.String>);
|
||||
field public static final int FLAG_GET_KEY_FIELDS_ONLY = 4; // 0x4
|
||||
field public static final int FLAG_MATCH_CHOOSER = 16; // 0x10
|
||||
field public static final deprecated int FLAG_MATCH_CHOOSER = 16; // 0x10
|
||||
field public static final int FLAG_MATCH_DYNAMIC = 1; // 0x1
|
||||
field public static final int FLAG_MATCH_MANIFEST = 8; // 0x8
|
||||
field public static final int FLAG_MATCH_PINNED = 2; // 0x2
|
||||
@@ -11606,9 +11606,9 @@ package android.content.pm {
|
||||
method public int describeContents();
|
||||
method public android.content.ComponentName getActivity();
|
||||
method public java.util.Set<java.lang.String> getCategories();
|
||||
method public android.content.ComponentName[] getChooserComponentNames();
|
||||
method public android.os.PersistableBundle getChooserExtras();
|
||||
method public android.content.IntentFilter[] getChooserIntentFilters();
|
||||
method public deprecated android.content.ComponentName[] getChooserComponentNames();
|
||||
method public deprecated android.os.PersistableBundle getChooserExtras();
|
||||
method public deprecated android.content.IntentFilter[] getChooserIntentFilters();
|
||||
method public java.lang.CharSequence getDisabledMessage();
|
||||
method public android.os.PersistableBundle getExtras();
|
||||
method public java.lang.String getId();
|
||||
@@ -11621,7 +11621,7 @@ package android.content.pm {
|
||||
method public java.lang.CharSequence getShortLabel();
|
||||
method public android.os.UserHandle getUserHandle();
|
||||
method public boolean hasKeyFieldsOnly();
|
||||
method public boolean isChooser();
|
||||
method public deprecated boolean isChooser();
|
||||
method public boolean isDeclaredInManifest();
|
||||
method public boolean isDynamic();
|
||||
method public boolean isEnabled();
|
||||
@@ -11634,11 +11634,11 @@ package android.content.pm {
|
||||
|
||||
public static class ShortcutInfo.Builder {
|
||||
ctor public ShortcutInfo.Builder(android.content.Context, java.lang.String);
|
||||
method public android.content.pm.ShortcutInfo.Builder addChooserIntentFilter(android.content.IntentFilter, android.content.ComponentName);
|
||||
method public deprecated android.content.pm.ShortcutInfo.Builder addChooserIntentFilter(android.content.IntentFilter, android.content.ComponentName);
|
||||
method public android.content.pm.ShortcutInfo build();
|
||||
method public android.content.pm.ShortcutInfo.Builder setActivity(android.content.ComponentName);
|
||||
method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set<java.lang.String>);
|
||||
method public android.content.pm.ShortcutInfo.Builder setChooserExtras(android.os.PersistableBundle);
|
||||
method public deprecated android.content.pm.ShortcutInfo.Builder setChooserExtras(android.os.PersistableBundle);
|
||||
method public android.content.pm.ShortcutInfo.Builder setDisabledMessage(java.lang.CharSequence);
|
||||
method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle);
|
||||
method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon);
|
||||
|
||||
@@ -10369,12 +10369,12 @@ package android.content.pm {
|
||||
ctor public LauncherApps.ShortcutQuery();
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setActivity(android.content.ComponentName);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setChangedSince(long);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setIntent(android.content.Intent);
|
||||
method public deprecated android.content.pm.LauncherApps.ShortcutQuery setIntent(android.content.Intent);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setPackage(java.lang.String);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setQueryFlags(int);
|
||||
method public android.content.pm.LauncherApps.ShortcutQuery setShortcutIds(java.util.List<java.lang.String>);
|
||||
field public static final int FLAG_GET_KEY_FIELDS_ONLY = 4; // 0x4
|
||||
field public static final int FLAG_MATCH_CHOOSER = 16; // 0x10
|
||||
field public static final deprecated int FLAG_MATCH_CHOOSER = 16; // 0x10
|
||||
field public static final int FLAG_MATCH_DYNAMIC = 1; // 0x1
|
||||
field public static final int FLAG_MATCH_MANIFEST = 8; // 0x8
|
||||
field public static final int FLAG_MATCH_PINNED = 2; // 0x2
|
||||
@@ -10928,9 +10928,9 @@ package android.content.pm {
|
||||
method public int describeContents();
|
||||
method public android.content.ComponentName getActivity();
|
||||
method public java.util.Set<java.lang.String> getCategories();
|
||||
method public android.content.ComponentName[] getChooserComponentNames();
|
||||
method public android.os.PersistableBundle getChooserExtras();
|
||||
method public android.content.IntentFilter[] getChooserIntentFilters();
|
||||
method public deprecated android.content.ComponentName[] getChooserComponentNames();
|
||||
method public deprecated android.os.PersistableBundle getChooserExtras();
|
||||
method public deprecated android.content.IntentFilter[] getChooserIntentFilters();
|
||||
method public java.lang.CharSequence getDisabledMessage();
|
||||
method public android.os.PersistableBundle getExtras();
|
||||
method public java.lang.String getId();
|
||||
@@ -10943,7 +10943,7 @@ package android.content.pm {
|
||||
method public java.lang.CharSequence getShortLabel();
|
||||
method public android.os.UserHandle getUserHandle();
|
||||
method public boolean hasKeyFieldsOnly();
|
||||
method public boolean isChooser();
|
||||
method public deprecated boolean isChooser();
|
||||
method public boolean isDeclaredInManifest();
|
||||
method public boolean isDynamic();
|
||||
method public boolean isEnabled();
|
||||
@@ -10956,11 +10956,11 @@ package android.content.pm {
|
||||
|
||||
public static class ShortcutInfo.Builder {
|
||||
ctor public ShortcutInfo.Builder(android.content.Context, java.lang.String);
|
||||
method public android.content.pm.ShortcutInfo.Builder addChooserIntentFilter(android.content.IntentFilter, android.content.ComponentName);
|
||||
method public deprecated android.content.pm.ShortcutInfo.Builder addChooserIntentFilter(android.content.IntentFilter, android.content.ComponentName);
|
||||
method public android.content.pm.ShortcutInfo build();
|
||||
method public android.content.pm.ShortcutInfo.Builder setActivity(android.content.ComponentName);
|
||||
method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set<java.lang.String>);
|
||||
method public android.content.pm.ShortcutInfo.Builder setChooserExtras(android.os.PersistableBundle);
|
||||
method public deprecated android.content.pm.ShortcutInfo.Builder setChooserExtras(android.os.PersistableBundle);
|
||||
method public android.content.pm.ShortcutInfo.Builder setDisabledMessage(java.lang.CharSequence);
|
||||
method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle);
|
||||
method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon);
|
||||
|
||||
@@ -55,8 +55,7 @@ interface ILauncherApps {
|
||||
String callingPackage, String packageName, int flags, in UserHandle user);
|
||||
|
||||
ParceledListSlice getShortcuts(String callingPackage, long changedSince, String packageName,
|
||||
in List shortcutIds, in ComponentName componentName, in Intent intent, int flags,
|
||||
in UserHandle user);
|
||||
in List shortcutIds, in ComponentName componentName, int flags, in UserHandle user);
|
||||
void pinShortcuts(String callingPackage, String packageName, in List<String> shortcutIds,
|
||||
in UserHandle user);
|
||||
boolean startShortcut(String callingPackage, String packageName, String id,
|
||||
|
||||
@@ -275,11 +275,8 @@ public class LauncherApps {
|
||||
@Deprecated
|
||||
public static final int FLAG_GET_MANIFEST = FLAG_MATCH_MANIFEST;
|
||||
|
||||
/**
|
||||
* Include chooser shortcuts in the result.
|
||||
* STOPSHIP TODO: Unless explicitly requesting chooser fields, we should strip out chooser
|
||||
* relevant fields from the Shortcut. This should also be adequately documented.
|
||||
*/
|
||||
/** @deprecated punted, don't use. */
|
||||
@Deprecated
|
||||
public static final int FLAG_MATCH_CHOOSER = 1 << 4;
|
||||
|
||||
/**
|
||||
@@ -319,7 +316,6 @@ public class LauncherApps {
|
||||
FLAG_MATCH_DYNAMIC,
|
||||
FLAG_MATCH_PINNED,
|
||||
FLAG_MATCH_MANIFEST,
|
||||
FLAG_MATCH_CHOOSER,
|
||||
FLAG_GET_KEY_FIELDS_ONLY,
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@@ -336,9 +332,6 @@ public class LauncherApps {
|
||||
@Nullable
|
||||
ComponentName mActivity;
|
||||
|
||||
@Nullable
|
||||
Intent mIntent;
|
||||
|
||||
@QueryFlags
|
||||
int mQueryFlags;
|
||||
|
||||
@@ -382,11 +375,9 @@ public class LauncherApps {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* If non-null, returns only shortcuts with intent filters that match this intent.
|
||||
*/
|
||||
/** @deprecated punted, don't use. */
|
||||
@Deprecated
|
||||
public ShortcutQuery setIntent(@Nullable Intent intent) {
|
||||
mIntent = intent;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -704,7 +695,7 @@ public class LauncherApps {
|
||||
try {
|
||||
return mService.getShortcuts(mContext.getPackageName(),
|
||||
query.mChangedSince, query.mPackage, query.mShortcutIds, query.mActivity,
|
||||
query.mIntent, query.mQueryFlags, user)
|
||||
query.mQueryFlags, user)
|
||||
.getList();
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
|
||||
@@ -21,7 +21,6 @@ import android.annotation.Nullable;
|
||||
import android.annotation.UserIdInt;
|
||||
import android.app.TaskStackBuilder;
|
||||
import android.content.ComponentName;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
@@ -40,12 +39,10 @@ import android.util.ArraySet;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.util.MemInfoReader;
|
||||
import com.android.internal.util.Preconditions;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@@ -99,14 +96,6 @@ public final class ShortcutInfo implements Parcelable {
|
||||
public static final int FLAG_ADAPTIVE_BITMAP = 1 << 9;
|
||||
|
||||
/** @hide */
|
||||
public static final int FLAG_CHOOSER = 1 << 10;
|
||||
|
||||
/**
|
||||
* TODO: Add FLAG_CHOOSER_INFO_OMITTED to reflect that chooser info was omitted in the Shortcut
|
||||
* due to the context in which it was retrieved.
|
||||
* TODO: Add a FLAG_LAUNCHABLE to reflect whether or not the Shortcut has a launchable intent
|
||||
* @hide
|
||||
*/
|
||||
@IntDef(flag = true,
|
||||
value = {
|
||||
FLAG_DYNAMIC,
|
||||
@@ -119,7 +108,6 @@ public final class ShortcutInfo implements Parcelable {
|
||||
FLAG_STRINGS_RESOLVED,
|
||||
FLAG_IMMUTABLE,
|
||||
FLAG_ADAPTIVE_BITMAP,
|
||||
FLAG_CHOOSER,
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface ShortcutFlags {}
|
||||
@@ -214,24 +202,6 @@ public final class ShortcutInfo implements Parcelable {
|
||||
@Nullable
|
||||
private PersistableBundle[] mIntentPersistableExtrases;
|
||||
|
||||
/**
|
||||
* If used in a chooser, extras that should be added into the intent passed through.
|
||||
*/
|
||||
@Nullable
|
||||
private PersistableBundle mChooserExtras;
|
||||
|
||||
/**
|
||||
* Intent filters to be used if the shortcut is to be used in a chooser context.
|
||||
*/
|
||||
@Nullable
|
||||
private IntentFilter[] mChooserIntentFilters;
|
||||
|
||||
/**
|
||||
* Component names corresponding to the above intent filters.
|
||||
*/
|
||||
@Nullable
|
||||
private ComponentName[] mChooserComponentNames;
|
||||
|
||||
private int mRank;
|
||||
|
||||
/**
|
||||
@@ -281,13 +251,6 @@ public final class ShortcutInfo implements Parcelable {
|
||||
mDisabledMessageResId = b.mDisabledMessageResId;
|
||||
mCategories = cloneCategories(b.mCategories);
|
||||
mIntents = cloneIntents(b.mIntents);
|
||||
if (b.mChooserIntentFilters != null) {
|
||||
mChooserIntentFilters = b.mChooserIntentFilters.toArray(new IntentFilter[0]);
|
||||
}
|
||||
if (b.mChooserComponentNames != null) {
|
||||
mChooserComponentNames = b.mChooserComponentNames.toArray(new ComponentName[0]);
|
||||
}
|
||||
mChooserExtras = b.mChooserExtras;
|
||||
fixUpIntentExtras();
|
||||
mRank = b.mRank;
|
||||
mExtras = b.mExtras;
|
||||
@@ -368,28 +331,8 @@ public final class ShortcutInfo implements Parcelable {
|
||||
if (mTitle == null && mTitleResId == 0) {
|
||||
throw new IllegalArgumentException("Short label must be provided");
|
||||
}
|
||||
|
||||
// For a shortcut to be valid, there should either be an Intent, or a non-empty set of
|
||||
// intent filters.
|
||||
if (mIntents == null || mIntents.length == 0) {
|
||||
Preconditions.checkNotNull(mChooserIntentFilters,
|
||||
"Intent must be provided if not a chooser target");
|
||||
Preconditions.checkNotNull(mChooserComponentNames,
|
||||
"Intent must be provided if not a chooser target");
|
||||
}
|
||||
|
||||
// If ChooserIntentFilter are provided, they should match the length of the provided
|
||||
// component names.
|
||||
if (mChooserIntentFilters != null) {
|
||||
if (mChooserComponentNames == null
|
||||
|| mChooserIntentFilters.length != mChooserComponentNames.length) {
|
||||
throw new IllegalArgumentException("Inconsistent intent filters and "
|
||||
+ "component names given");
|
||||
}
|
||||
if (mChooserIntentFilters.length == 0 || mChooserComponentNames.length == 0) {
|
||||
throw new IllegalArgumentException("Empty intent filter and component names given");
|
||||
}
|
||||
}
|
||||
Preconditions.checkNotNull(mIntents, "Shortcut Intent must be provided");
|
||||
Preconditions.checkArgument(mIntents.length > 0, "Shortcut Intent must be provided");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -434,10 +377,6 @@ public final class ShortcutInfo implements Parcelable {
|
||||
mDisabledMessageResName = source.mDisabledMessageResName;
|
||||
mIconResName = source.mIconResName;
|
||||
}
|
||||
// TODO: Omit these by default and add a new clone flag.
|
||||
mChooserIntentFilters = source.mChooserIntentFilters;
|
||||
mChooserComponentNames = source.mChooserComponentNames;
|
||||
mChooserExtras = source.mChooserExtras;
|
||||
} else {
|
||||
// Set this bit.
|
||||
mFlags |= FLAG_KEY_FIELDS_ONLY;
|
||||
@@ -564,25 +503,6 @@ public final class ShortcutInfo implements Parcelable {
|
||||
return fullResourceName.substring(p1 + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the shortcut has any intentFilter matching the passed in one.
|
||||
* @hide
|
||||
*/
|
||||
@VisibleForTesting
|
||||
public boolean hasMatchingFilter(ContentResolver resolver, Intent intent) {
|
||||
if (mChooserIntentFilters == null) {
|
||||
return false;
|
||||
}
|
||||
for (IntentFilter filter : mChooserIntentFilters) {
|
||||
int match = filter.match(resolver, intent, false, TAG);
|
||||
if (match > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Extract the entry name from a fully-donated resource name.
|
||||
* e.g. "com.android.app1:drawable/icon1" -> "icon1"
|
||||
@@ -766,15 +686,6 @@ public final class ShortcutInfo implements Parcelable {
|
||||
if (source.mExtras != null) {
|
||||
mExtras = source.mExtras;
|
||||
}
|
||||
if (source.mChooserExtras != null) {
|
||||
mChooserExtras = source.mChooserExtras;
|
||||
}
|
||||
if (source.mChooserIntentFilters != null) {
|
||||
mChooserIntentFilters = source.mChooserIntentFilters;
|
||||
}
|
||||
if (source.mChooserComponentNames != null) {
|
||||
mChooserComponentNames = source.mChooserComponentNames;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -836,12 +747,6 @@ public final class ShortcutInfo implements Parcelable {
|
||||
|
||||
private PersistableBundle mExtras;
|
||||
|
||||
private PersistableBundle mChooserExtras;
|
||||
|
||||
private List<IntentFilter> mChooserIntentFilters;
|
||||
|
||||
private List<ComponentName> mChooserComponentNames;
|
||||
|
||||
/**
|
||||
* Old style constructor.
|
||||
* @hide
|
||||
@@ -1127,37 +1032,17 @@ public final class ShortcutInfo implements Parcelable {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extras that can be added which will be added to the Intent used to launch the app if
|
||||
* launched from a chooser context.
|
||||
*/
|
||||
/** @deprecated punted, don't use. */
|
||||
@Deprecated
|
||||
@NonNull
|
||||
public Builder setChooserExtras(@NonNull PersistableBundle extras) {
|
||||
mChooserExtras = extras;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* IntentFilters and the components that should resolve a match for a given chooser target.
|
||||
* If multiple matches are found, the component corresponding to the closest match will be
|
||||
* used.
|
||||
*
|
||||
* @param filter IntendFilter that if matched will have the intent forwarded to the given
|
||||
* component
|
||||
* @param name The component that an intent that passes this filter will resolve to.
|
||||
*/
|
||||
/** @deprecated punted, don't use. */
|
||||
@Deprecated
|
||||
public Builder addChooserIntentFilter(@NonNull IntentFilter filter,
|
||||
@NonNull ComponentName name) {
|
||||
Preconditions.checkNotNull(filter, "intent filter cannot be null");
|
||||
Preconditions.checkNotNull(name, "component name cannot be null");
|
||||
|
||||
if (mChooserIntentFilters == null || mChooserComponentNames == null) {
|
||||
mChooserIntentFilters = new ArrayList<>();
|
||||
mChooserComponentNames = new ArrayList<>();
|
||||
}
|
||||
|
||||
mChooserIntentFilters.add(filter);
|
||||
mChooserComponentNames.add(name);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -1361,28 +1246,25 @@ public final class ShortcutInfo implements Parcelable {
|
||||
return mIntentPersistableExtrases;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the extras that will be added in to any intent launched through the chooser.
|
||||
*/
|
||||
/** @deprecated punted, don't use. */
|
||||
@Deprecated
|
||||
@NonNull
|
||||
public PersistableBundle getChooserExtras() {
|
||||
return mChooserExtras;
|
||||
return new PersistableBundle();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the list of intent filters for chooser targets.
|
||||
*/
|
||||
/** @deprecated punted, don't use. */
|
||||
@Deprecated
|
||||
@NonNull
|
||||
public IntentFilter[] getChooserIntentFilters() {
|
||||
return mChooserIntentFilters;
|
||||
return new IntentFilter[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the list of component names corresponding to the above intent filters.
|
||||
*/
|
||||
/** @deprecated punted, don't use. */
|
||||
@Deprecated
|
||||
@NonNull
|
||||
public ComponentName[] getChooserComponentNames() {
|
||||
return mChooserComponentNames;
|
||||
return new ComponentName[0];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1506,9 +1388,10 @@ public final class ShortcutInfo implements Parcelable {
|
||||
return hasFlags(FLAG_PINNED);
|
||||
}
|
||||
|
||||
/** Return whether a shortcut can be shown in the chooser. */
|
||||
/** @deprecated punted, don't use. */
|
||||
@Deprecated
|
||||
public boolean isChooser() {
|
||||
return hasFlags(FLAG_CHOOSER);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1539,14 +1422,6 @@ public final class ShortcutInfo implements Parcelable {
|
||||
return isPinned() && !(isDynamic() || isManifestShortcut());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if pinned but neither static nor dynamic.
|
||||
* @hide
|
||||
*/
|
||||
public boolean isDynamicOrChooser() {
|
||||
return hasFlags(FLAG_DYNAMIC) || hasFlags(FLAG_CHOOSER);
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public boolean isOriginallyFromManifest() {
|
||||
return hasFlags(FLAG_IMMUTABLE);
|
||||
@@ -1829,19 +1704,6 @@ public final class ShortcutInfo implements Parcelable {
|
||||
mCategories.add(source.readString().intern());
|
||||
}
|
||||
}
|
||||
|
||||
// We put a placeholder empty array in to keep the parcelable order, but can do away with
|
||||
// them at this point if they're empty.
|
||||
mChooserComponentNames = source.readParcelableArray(cl, ComponentName.class);
|
||||
if (mChooserComponentNames.length == 0) {
|
||||
mChooserComponentNames = null;
|
||||
}
|
||||
|
||||
mChooserIntentFilters = source.readParcelableArray(cl, IntentFilter.class);
|
||||
if (mChooserIntentFilters.length == 0) {
|
||||
mChooserIntentFilters = null;
|
||||
}
|
||||
mChooserExtras = source.readPersistableBundle(cl);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1888,17 +1750,6 @@ public final class ShortcutInfo implements Parcelable {
|
||||
} else {
|
||||
dest.writeInt(0);
|
||||
}
|
||||
if (mChooserComponentNames != null) {
|
||||
dest.writeParcelableArray(mChooserComponentNames, flags);
|
||||
} else {
|
||||
dest.writeParcelableArray(new ComponentName[0], flags);
|
||||
}
|
||||
if (mChooserIntentFilters != null) {
|
||||
dest.writeParcelableArray(mChooserIntentFilters, flags);
|
||||
} else {
|
||||
dest.writeParcelableArray(new IntentFilter[0], flags);
|
||||
}
|
||||
dest.writePersistableBundle(mChooserExtras);
|
||||
}
|
||||
|
||||
public static final Creator<ShortcutInfo> CREATOR =
|
||||
|
||||
@@ -45,8 +45,8 @@ public abstract class ShortcutServiceInternal {
|
||||
getShortcuts(int launcherUserId,
|
||||
@NonNull String callingPackage, long changedSince,
|
||||
@Nullable String packageName, @Nullable List<String> shortcutIds,
|
||||
@Nullable ComponentName componentName, @Nullable Intent intent,
|
||||
@ShortcutQuery.QueryFlags int flags, int userId);
|
||||
@Nullable ComponentName componentName, @ShortcutQuery.QueryFlags int flags,
|
||||
int userId);
|
||||
|
||||
public abstract boolean
|
||||
isPinnedByCaller(int launcherUserId, @NonNull String callingPackage,
|
||||
|
||||
@@ -23,21 +23,15 @@ import android.app.usage.UsageStatsManager;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.IntentSender;
|
||||
import android.content.IntentSender.SendIntentException;
|
||||
import android.content.ServiceConnection;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.LabeledIntent;
|
||||
import android.content.pm.LauncherApps;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.content.pm.ParceledListSlice;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.pm.ShortcutInfo;
|
||||
import android.content.pm.ShortcutManager;
|
||||
import android.database.DataSetObserver;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.Drawable;
|
||||
@@ -362,7 +356,6 @@ public class ChooserActivity extends ResolverActivity {
|
||||
mChooserListAdapter.addServiceResults(null, Lists.newArrayList(mCallerChooserTargets));
|
||||
}
|
||||
mChooserRowAdapter = new ChooserRowAdapter(mChooserListAdapter);
|
||||
mChooserRowAdapter.updateRowScales();
|
||||
mChooserRowAdapter.registerDataSetObserver(new OffsetDataSetObserver(adapterView));
|
||||
adapterView.setAdapter(mChooserRowAdapter);
|
||||
if (listView != null) {
|
||||
@@ -849,9 +842,7 @@ public class ChooserActivity extends ResolverActivity {
|
||||
return false;
|
||||
}
|
||||
intent.setComponent(mChooserTarget.getComponentName());
|
||||
if (mChooserTarget.getIntentExtras() != null) {
|
||||
intent.putExtras(mChooserTarget.getIntentExtras());
|
||||
}
|
||||
intent.putExtras(mChooserTarget.getIntentExtras());
|
||||
|
||||
// Important: we will ignore the target security checks in ActivityManager
|
||||
// if and only if the ChooserTarget's target package is the same package
|
||||
@@ -934,8 +925,6 @@ public class ChooserActivity extends ResolverActivity {
|
||||
private static final int MAX_SERVICE_TARGETS = 8;
|
||||
private static final int MAX_TARGETS_PER_SERVICE = 4;
|
||||
|
||||
private boolean mAreChooserShortcutsRetrieved;
|
||||
|
||||
private final List<ChooserTargetInfo> mServiceTargets = new ArrayList<>();
|
||||
private final List<TargetInfo> mCallerTargets = new ArrayList<>();
|
||||
private boolean mShowServiceTargets;
|
||||
@@ -1027,21 +1016,6 @@ public class ChooserActivity extends ResolverActivity {
|
||||
if (mServiceTargets != null) {
|
||||
pruneServiceTargets();
|
||||
}
|
||||
|
||||
if (DEBUG) Log.d(TAG, "Adding pushed chooser targets");
|
||||
|
||||
if (!mAreChooserShortcutsRetrieved) {
|
||||
LauncherApps launcherApps = getLauncherApps();
|
||||
LauncherApps.ShortcutQuery query = new LauncherApps.ShortcutQuery();
|
||||
query.setIntent(getTargetIntent());
|
||||
query.setQueryFlags(LauncherApps.ShortcutQuery.FLAG_MATCH_CHOOSER);
|
||||
List<ShortcutInfo> shortcuts = launcherApps.getShortcuts(query,
|
||||
android.os.Process.myUserHandle());
|
||||
if (DEBUG) Log.d(TAG, "Adding " + shortcuts.size() + " chooser shortcuts");
|
||||
addShortcuts(shortcuts);
|
||||
mAreChooserShortcutsRetrieved = true;
|
||||
}
|
||||
|
||||
if (DEBUG) Log.d(TAG, "List built querying services");
|
||||
queryTargetServices(this);
|
||||
}
|
||||
@@ -1067,7 +1041,6 @@ public class ChooserActivity extends ResolverActivity {
|
||||
|
||||
public int getServiceTargetCount() {
|
||||
if (!mShowServiceTargets) {
|
||||
if (DEBUG) Log.d("TAG", "Hiding service targets");
|
||||
return 0;
|
||||
}
|
||||
return Math.min(mServiceTargets.size(), MAX_SERVICE_TARGETS);
|
||||
@@ -1159,71 +1132,6 @@ public class ChooserActivity extends ResolverActivity {
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
// TODO: Pushed targets need to be scored correctly
|
||||
public void addShortcuts(List<ShortcutInfo> infos) {
|
||||
for (ShortcutInfo info : infos) {
|
||||
List<ChooserTarget> newTargets = new ArrayList<>();
|
||||
final ComponentName cn = info.getActivity();
|
||||
ActivityInfo ai;
|
||||
ResolveInfo ri = new ResolveInfo();
|
||||
if (cn != null) {
|
||||
try {
|
||||
ai = getPackageManager().getActivityInfo(cn, 0);
|
||||
ri.activityInfo = ai;
|
||||
UserManager userManager =
|
||||
(UserManager) getSystemService(Context.USER_SERVICE);
|
||||
ri.iconResourceId = ai.icon;
|
||||
ri.labelRes = ai.labelRes;
|
||||
ri.resolvePackageName = ai.packageName;
|
||||
ri.activityInfo.applicationInfo = new ApplicationInfo(
|
||||
ri.activityInfo.applicationInfo);
|
||||
ri.activityInfo.applicationInfo = ai.applicationInfo;
|
||||
ri.activityInfo.applicationInfo.uid = getUserId();
|
||||
} catch (PackageManager.NameNotFoundException ignored) {
|
||||
if (DEBUG) Log.d(TAG, "Package not found, skipping this shortcut");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
DisplayResolveInfo resolveInfo = new DisplayResolveInfo(getTargetIntent(),
|
||||
ri,
|
||||
info.getShortLabel(),
|
||||
info.getLongLabel(),
|
||||
getTargetIntent());
|
||||
|
||||
int bestMatch = 0;
|
||||
ComponentName bestComponent = null;
|
||||
for (int i = 0; i < info.getChooserIntentFilters().length; i++) {
|
||||
int newMatch = info.getChooserIntentFilters()[i]
|
||||
.match(getContentResolver(), getTargetIntent(), false, TAG);
|
||||
if (DEBUG) Log.d(TAG, "A match was found with value: " + newMatch);
|
||||
if (newMatch > bestMatch) {
|
||||
bestMatch = newMatch;
|
||||
bestComponent = info.getChooserComponentNames()[i];
|
||||
}
|
||||
}
|
||||
if (bestMatch == 0) {
|
||||
Log.e(TAG, "Unexpectedly, no match was found for the provided chooser intent");
|
||||
return;
|
||||
}
|
||||
|
||||
Bundle extrasToAdd =
|
||||
info.getChooserExtras() == null ? null: new Bundle(info.getChooserExtras());
|
||||
if (DEBUG) Log.d(TAG, "Adding service target " + info.getShortLabel());
|
||||
newTargets.add(new ChooserTarget(
|
||||
info.getShortLabel(),
|
||||
info.getIcon(),
|
||||
1,
|
||||
bestComponent,
|
||||
extrasToAdd));
|
||||
addServiceResults(resolveInfo, newTargets);
|
||||
}
|
||||
if (mChooserRowAdapter != null) {
|
||||
mChooserRowAdapter.updateRowScales();
|
||||
}
|
||||
setShowServiceTargets(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set to true to reveal all service targets at once.
|
||||
*/
|
||||
@@ -1338,7 +1246,37 @@ public class ChooserActivity extends ResolverActivity {
|
||||
@Override
|
||||
public void onChanged() {
|
||||
super.onChanged();
|
||||
updateRowScales();
|
||||
final int rcount = getServiceTargetRowCount();
|
||||
if (mServiceTargetScale == null
|
||||
|| mServiceTargetScale.length != rcount) {
|
||||
RowScale[] old = mServiceTargetScale;
|
||||
int oldRCount = old != null ? old.length : 0;
|
||||
mServiceTargetScale = new RowScale[rcount];
|
||||
if (old != null && rcount > 0) {
|
||||
System.arraycopy(old, 0, mServiceTargetScale, 0,
|
||||
Math.min(old.length, rcount));
|
||||
}
|
||||
|
||||
for (int i = rcount; i < oldRCount; i++) {
|
||||
old[i].cancelAnimation();
|
||||
}
|
||||
|
||||
for (int i = oldRCount; i < rcount; i++) {
|
||||
final RowScale rs = new RowScale(ChooserRowAdapter.this, 0.f, 1.f)
|
||||
.setInterpolator(mInterpolator);
|
||||
mServiceTargetScale[i] = rs;
|
||||
}
|
||||
|
||||
// Start the animations in a separate loop.
|
||||
// The process of starting animations will result in
|
||||
// binding views to set up initial values, and we must
|
||||
// have ALL of the new RowScale objects created above before
|
||||
// we get started.
|
||||
for (int i = oldRCount; i < rcount; i++) {
|
||||
mServiceTargetScale[i].startAnimation();
|
||||
}
|
||||
}
|
||||
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@@ -1355,40 +1293,6 @@ public class ChooserActivity extends ResolverActivity {
|
||||
});
|
||||
}
|
||||
|
||||
void updateRowScales() {
|
||||
final int rcount = getServiceTargetRowCount();
|
||||
if (mServiceTargetScale == null
|
||||
|| mServiceTargetScale.length != rcount) {
|
||||
if (DEBUG) Log.d(TAG, "Row scales need adjusting to " + rcount + " rows.");
|
||||
RowScale[] old = mServiceTargetScale;
|
||||
int oldRCount = old != null ? old.length : 0;
|
||||
mServiceTargetScale = new RowScale[rcount];
|
||||
if (old != null && rcount > 0) {
|
||||
System.arraycopy(old, 0, mServiceTargetScale, 0,
|
||||
Math.min(old.length, rcount));
|
||||
}
|
||||
|
||||
for (int i = rcount; i < oldRCount; i++) {
|
||||
old[i].cancelAnimation();
|
||||
}
|
||||
|
||||
for (int i = oldRCount; i < rcount; i++) {
|
||||
final RowScale rs = new RowScale(ChooserRowAdapter.this, 0.f, 1.f)
|
||||
.setInterpolator(mInterpolator);
|
||||
mServiceTargetScale[i] = rs;
|
||||
}
|
||||
|
||||
// Start the animations in a separate loop.
|
||||
// The process of starting animations will result in
|
||||
// binding views to set up initial values, and we must
|
||||
// have ALL of the new RowScale objects created above before
|
||||
// we get started.
|
||||
for (int i = oldRCount; i < rcount; i++) {
|
||||
mServiceTargetScale[i].startAnimation();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private float getRowScale(int rowPosition) {
|
||||
final int start = getCallerTargetRowCount();
|
||||
final int end = start + getServiceTargetRowCount();
|
||||
@@ -1659,10 +1563,6 @@ public class ChooserActivity extends ResolverActivity {
|
||||
}
|
||||
}
|
||||
|
||||
public LauncherApps getLauncherApps() {
|
||||
return (LauncherApps) getSystemService(Context.LAUNCHER_APPS_SERVICE);
|
||||
}
|
||||
|
||||
static class ServiceResultInfo {
|
||||
public final DisplayResolveInfo originalTarget;
|
||||
public final List<ChooserTarget> resultTargets;
|
||||
|
||||
@@ -16,17 +16,6 @@
|
||||
|
||||
package com.android.internal.app;
|
||||
|
||||
import android.app.Instrumentation;
|
||||
import android.content.ComponentName;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.LauncherApps;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ShortcutInfo;
|
||||
import android.content.pm.ShortcutManager;
|
||||
import android.graphics.drawable.Icon;
|
||||
import android.os.SystemClock;
|
||||
import com.android.internal.R;
|
||||
import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
|
||||
|
||||
@@ -59,31 +48,25 @@ import static com.android.internal.app.ChooserWrapperActivity.sOverrides;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.CoreMatchers.not;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
import static org.mockito.Mockito.isA;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.times;
|
||||
|
||||
/**
|
||||
* Chooser activity instrumentation tests
|
||||
*/
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class ChooserActivityTest {
|
||||
private Instrumentation instrumentation;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
instrumentation = InstrumentationRegistry.getInstrumentation();
|
||||
sOverrides.reset();
|
||||
}
|
||||
|
||||
@Rule
|
||||
public ActivityTestRule<ChooserWrapperActivity> mActivityRule =
|
||||
new ActivityTestRule<>(ChooserWrapperActivity.class, false,
|
||||
false);
|
||||
|
||||
@Before
|
||||
public void cleanOverrideData() {
|
||||
sOverrides.reset();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void customTitle() throws InterruptedException {
|
||||
Intent sendIntent = createSendImageIntent();
|
||||
@@ -252,6 +235,7 @@ public class ChooserActivityTest {
|
||||
chosen[0] = targetInfo.getResolveInfo();
|
||||
return true;
|
||||
};
|
||||
|
||||
// Make a stable copy of the components as the original list may be modified
|
||||
List<ResolvedComponentInfo> stableCopy =
|
||||
createResolvedComponentsForTestWithOtherProfile(2);
|
||||
@@ -340,32 +324,6 @@ public class ChooserActivityTest {
|
||||
assertThat(chosen[0], is(toChoose));
|
||||
}
|
||||
|
||||
public void pushedChooserTarget() {
|
||||
ResolveInfo[] chosen = new ResolveInfo[1];
|
||||
sOverrides.onSafelyStartCallback = targetInfo -> {
|
||||
chosen[0] = targetInfo.getResolveInfo();
|
||||
return true;
|
||||
};
|
||||
|
||||
setChooserShortcuts(1);
|
||||
List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2);
|
||||
when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(),
|
||||
Mockito.anyBoolean(),
|
||||
Mockito.isA(List.class))).thenReturn(resolvedComponentInfos);
|
||||
|
||||
Intent sendIntent = createSendImageIntent();
|
||||
final ChooserWrapperActivity activity = mActivityRule
|
||||
.launchActivity(Intent.createChooser(sendIntent, null));
|
||||
|
||||
waitForIdle();
|
||||
|
||||
onView(withText("short chooser label 0"))
|
||||
.perform(click());
|
||||
waitForIdle();
|
||||
assertThat(chosen[0].resolvePackageName,
|
||||
is(ResolverDataProvider.createActivityInfo(0).packageName));
|
||||
}
|
||||
|
||||
private Intent createSendImageIntent() {
|
||||
Intent sendIntent = new Intent();
|
||||
sendIntent.setAction(Intent.ACTION_SEND);
|
||||
@@ -413,48 +371,4 @@ public class ChooserActivityTest {
|
||||
}
|
||||
return packageStats.mChooserCounts.get(action).getOrDefault(annotation, 0);
|
||||
}
|
||||
|
||||
private void setChooserShortcuts(int numShortcuts) {
|
||||
ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();
|
||||
for (int i = 0; i < numShortcuts; i++) {
|
||||
shortcuts.add(makeShortcut(i));
|
||||
}
|
||||
when(sOverrides.launcherApps.getShortcuts(
|
||||
Mockito.isA(LauncherApps.ShortcutQuery.class),
|
||||
Mockito.eq(UserHandle.SYSTEM)))
|
||||
.thenReturn(shortcuts);
|
||||
}
|
||||
|
||||
private ShortcutInfo makeShortcut(int i) {
|
||||
try {
|
||||
IntentFilter filter = new IntentFilter(Intent.ACTION_SEND, "image/jpeg");
|
||||
|
||||
ComponentName component = new ComponentName("foo.bar", "foo.bar" + ".MainActivity");
|
||||
ShortcutInfo.Builder b = new ShortcutInfo.Builder(instrumentation.getContext(), "" + i)
|
||||
.setActivity(component)
|
||||
.setShortLabel("short chooser label " + i)
|
||||
.setLongLabel("long chooser label" + i)
|
||||
.setRank(i)
|
||||
.setIntent(createSendImageIntent())
|
||||
.setIcon(Icon.createWithResource(instrumentation.getContext(),
|
||||
android.R.drawable.ic_menu_add))
|
||||
.addChooserIntentFilter(
|
||||
filter,
|
||||
component);
|
||||
|
||||
sOverrides.createPackageManager = pm -> {
|
||||
final PackageManager spied = spy(pm);
|
||||
try {
|
||||
doAnswer(invocation -> ResolverDataProvider.createActivityInfo(i))
|
||||
.when(spied).getActivityInfo(
|
||||
Mockito.isA(ComponentName.class), Mockito.anyInt());
|
||||
} catch (Exception e) {
|
||||
// this is ok, just not found
|
||||
e.printStackTrace();
|
||||
}
|
||||
return spied;
|
||||
};
|
||||
return b.build();
|
||||
} catch (Exception e) {return null;}
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,6 @@ package com.android.internal.app;
|
||||
|
||||
import android.app.usage.UsageStatsManager;
|
||||
import android.content.Context;
|
||||
import android.content.pm.LauncherApps;
|
||||
import android.content.pm.PackageManager;
|
||||
|
||||
import java.util.function.Function;
|
||||
@@ -75,11 +74,6 @@ public class ChooserWrapperActivity extends ChooserActivity {
|
||||
return super.getPackageManager();
|
||||
}
|
||||
|
||||
@Override
|
||||
public LauncherApps getLauncherApps() {
|
||||
return sOverrides.launcherApps;
|
||||
}
|
||||
|
||||
/**
|
||||
* We cannot directly mock the activity created since instrumentation creates it.
|
||||
* <p>
|
||||
@@ -88,7 +82,6 @@ public class ChooserWrapperActivity extends ChooserActivity {
|
||||
static class OverrideData {
|
||||
@SuppressWarnings("Since15")
|
||||
public Function<PackageManager, PackageManager> createPackageManager;
|
||||
public LauncherApps launcherApps;
|
||||
public Function<TargetInfo, Boolean> onSafelyStartCallback;
|
||||
public ResolverListController resolverListController;
|
||||
public Boolean isVoiceInteraction;
|
||||
@@ -97,7 +90,6 @@ public class ChooserWrapperActivity extends ChooserActivity {
|
||||
onSafelyStartCallback = null;
|
||||
isVoiceInteraction = null;
|
||||
createPackageManager = null;
|
||||
launcherApps = mock(LauncherApps.class);
|
||||
resolverListController = mock(ResolverListController.class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -445,8 +445,8 @@ public class LauncherAppsService extends SystemService {
|
||||
|
||||
@Override
|
||||
public ParceledListSlice getShortcuts(String callingPackage, long changedSince,
|
||||
String packageName, List shortcutIds, ComponentName componentName, Intent intent,
|
||||
int flags, UserHandle targetUser) {
|
||||
String packageName, List shortcutIds, ComponentName componentName, int flags,
|
||||
UserHandle targetUser) {
|
||||
ensureShortcutPermission(callingPackage);
|
||||
if (!canAccessProfile(callingPackage, targetUser, "Cannot get shortcuts")
|
||||
|| !isUserEnabled(targetUser)) {
|
||||
@@ -457,17 +457,11 @@ public class LauncherAppsService extends SystemService {
|
||||
"To query by shortcut ID, package name must also be set");
|
||||
}
|
||||
|
||||
if ((flags & ShortcutQuery.FLAG_MATCH_CHOOSER) == 0
|
||||
&& intent != null) {
|
||||
throw new IllegalArgumentException("Supplied an intent in the query, but did "
|
||||
+ "not request chooser targets");
|
||||
}
|
||||
|
||||
// TODO(b/29399275): Eclipse compiler requires explicit List<ShortcutInfo> cast below.
|
||||
return new ParceledListSlice<>((List<ShortcutInfo>)
|
||||
mShortcutServiceInternal.getShortcuts(getCallingUserId(),
|
||||
callingPackage, changedSince, packageName, shortcutIds,
|
||||
componentName, intent, flags, targetUser.getIdentifier()));
|
||||
componentName, flags, targetUser.getIdentifier()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -915,7 +909,6 @@ public class LauncherAppsService extends SystemService {
|
||||
cookie.packageName,
|
||||
/* changedSince= */ 0, packageName, /* shortcutIds=*/ null,
|
||||
/* component= */ null,
|
||||
/* intent= */ null,
|
||||
ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY
|
||||
| ShortcutQuery.FLAG_GET_ALL_KINDS
|
||||
, userId);
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.annotation.Nullable;
|
||||
import android.annotation.UserIdInt;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.ShortcutInfo;
|
||||
import android.content.res.Resources;
|
||||
@@ -32,7 +31,6 @@ import android.util.Log;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.util.ArrayUtils;
|
||||
import com.android.internal.util.Preconditions;
|
||||
import com.android.internal.util.XmlUtils;
|
||||
import com.android.server.pm.ShortcutService.ShortcutOperation;
|
||||
@@ -70,9 +68,6 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
private static final String TAG_EXTRAS = "extras";
|
||||
private static final String TAG_SHORTCUT = "shortcut";
|
||||
private static final String TAG_CATEGORIES = "categories";
|
||||
private static final String TAG_CHOOSER_EXTRAS = "chooser-extras";
|
||||
private static final String TAG_CHOOSER_INTENT_FILTERS = "chooser-intent-filters";
|
||||
private static final String TAG_CHOOSER_COMPONENT_NAMES = "chooser-component-names";
|
||||
|
||||
private static final String ATTR_NAME = "name";
|
||||
private static final String ATTR_CALL_COUNT = "call-count";
|
||||
@@ -96,7 +91,6 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
private static final String ATTR_ICON_RES_ID = "icon-res";
|
||||
private static final String ATTR_ICON_RES_NAME = "icon-resname";
|
||||
private static final String ATTR_BITMAP_PATH = "bitmap-path";
|
||||
private static final String ATTR_COMPONENT_NAMES = "component-names";
|
||||
|
||||
private static final String NAME_CATEGORIES = "categories";
|
||||
|
||||
@@ -206,7 +200,7 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
if (shortcut != null) {
|
||||
mShortcutUser.mService.removeIcon(getPackageUserId(), shortcut);
|
||||
shortcut.clearFlags(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_PINNED
|
||||
| ShortcutInfo.FLAG_MANIFEST | ShortcutInfo.FLAG_CHOOSER);
|
||||
| ShortcutInfo.FLAG_MANIFEST);
|
||||
}
|
||||
return shortcut;
|
||||
}
|
||||
@@ -232,7 +226,7 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
Preconditions.checkArgument(newShortcut.isEnabled(),
|
||||
"add/setDynamicShortcuts() cannot publish disabled shortcuts");
|
||||
|
||||
addCorrectDynamicFlags(newShortcut);
|
||||
newShortcut.addFlags(ShortcutInfo.FLAG_DYNAMIC);
|
||||
|
||||
final ShortcutInfo oldShortcut = mShortcuts.get(newShortcut.getId());
|
||||
|
||||
@@ -256,17 +250,6 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
addShortcutInner(newShortcut);
|
||||
}
|
||||
|
||||
// TODO: Sample code & JavaDoc for ShortcutManager needs updating to reflect the fact that
|
||||
// Chooser shortcuts are not always dynamic.
|
||||
public void addCorrectDynamicFlags(@NonNull ShortcutInfo shortcut) {
|
||||
if (shortcut.getIntent() != null) {
|
||||
shortcut.addFlags(ShortcutInfo.FLAG_DYNAMIC);
|
||||
}
|
||||
if (!ArrayUtils.isEmpty(shortcut.getChooserIntentFilters())) {
|
||||
shortcut.addFlags(ShortcutInfo.FLAG_CHOOSER);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove all shortcuts that aren't pinned nor dynamic.
|
||||
*/
|
||||
@@ -299,11 +282,11 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
boolean changed = false;
|
||||
for (int i = mShortcuts.size() - 1; i >= 0; i--) {
|
||||
final ShortcutInfo si = mShortcuts.valueAt(i);
|
||||
if (si.isDynamic() || si.isChooser()) {
|
||||
if (si.isDynamic()) {
|
||||
changed = true;
|
||||
|
||||
si.setTimestamp(now);
|
||||
si.clearFlags(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_CHOOSER);
|
||||
si.clearFlags(ShortcutInfo.FLAG_DYNAMIC);
|
||||
si.setRank(0); // It may still be pinned, so clear the rank.
|
||||
}
|
||||
}
|
||||
@@ -372,8 +355,7 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
if (oldShortcut.isPinned()) {
|
||||
|
||||
oldShortcut.setRank(0);
|
||||
oldShortcut.clearFlags(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_MANIFEST
|
||||
| ShortcutInfo.FLAG_CHOOSER);
|
||||
oldShortcut.clearFlags(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_MANIFEST);
|
||||
if (disable) {
|
||||
oldShortcut.addFlags(ShortcutInfo.FLAG_DISABLED);
|
||||
}
|
||||
@@ -1133,8 +1115,8 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
// Don't adjust ranks for manifest shortcuts.
|
||||
continue;
|
||||
}
|
||||
// At this point, it must be dynamic or a chooser.
|
||||
if (!si.isDynamicOrChooser()) {
|
||||
// At this point, it must be dynamic.
|
||||
if (!si.isDynamic()) {
|
||||
s.wtf("Non-dynamic shortcut found.");
|
||||
continue;
|
||||
}
|
||||
@@ -1311,7 +1293,7 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
ShortcutService.writeAttr(out, ATTR_FLAGS,
|
||||
si.getFlags() &
|
||||
~(ShortcutInfo.FLAG_HAS_ICON_FILE | ShortcutInfo.FLAG_HAS_ICON_RES
|
||||
| ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_CHOOSER));
|
||||
| ShortcutInfo.FLAG_DYNAMIC));
|
||||
} else {
|
||||
// When writing for backup, ranks shouldn't be saved, since shortcuts won't be restored
|
||||
// as dynamic.
|
||||
@@ -1334,37 +1316,16 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
}
|
||||
final Intent[] intentsNoExtras = si.getIntentsNoExtras();
|
||||
final PersistableBundle[] intentsExtras = si.getIntentPersistableExtrases();
|
||||
if (intentsNoExtras != null) {
|
||||
final int numIntents = intentsNoExtras.length;
|
||||
for (int i = 0; i < numIntents; i++) {
|
||||
out.startTag(null, TAG_INTENT);
|
||||
ShortcutService.writeAttr(out, ATTR_INTENT_NO_EXTRA, intentsNoExtras[i]);
|
||||
ShortcutService.writeTagExtra(out, TAG_EXTRAS, intentsExtras[i]);
|
||||
out.endTag(null, TAG_INTENT);
|
||||
}
|
||||
final int numIntents = intentsNoExtras.length;
|
||||
for (int i = 0; i < numIntents; i++) {
|
||||
out.startTag(null, TAG_INTENT);
|
||||
ShortcutService.writeAttr(out, ATTR_INTENT_NO_EXTRA, intentsNoExtras[i]);
|
||||
ShortcutService.writeTagExtra(out, TAG_EXTRAS, intentsExtras[i]);
|
||||
out.endTag(null, TAG_INTENT);
|
||||
}
|
||||
|
||||
ShortcutService.writeTagExtra(out, TAG_EXTRAS, si.getExtras());
|
||||
|
||||
ShortcutService.writeTagExtra(out, TAG_CHOOSER_EXTRAS, si.getChooserExtras());
|
||||
|
||||
final IntentFilter[] intentFilters = si.getChooserIntentFilters();
|
||||
if (intentFilters != null) {
|
||||
for (int i = 0; i < intentFilters.length; i++) {
|
||||
out.startTag(null, TAG_CHOOSER_INTENT_FILTERS);
|
||||
intentFilters[i].writeToXml(out);
|
||||
out.endTag(null, TAG_CHOOSER_INTENT_FILTERS);
|
||||
}
|
||||
}
|
||||
|
||||
final ComponentName[] componentNames = si.getChooserComponentNames();
|
||||
if (componentNames != null) {
|
||||
for (int i = 0; i < componentNames.length; i++) {
|
||||
out.startTag(null, TAG_CHOOSER_COMPONENT_NAMES);
|
||||
ShortcutService.writeAttr(out, ATTR_COMPONENT_NAMES, componentNames[i]);
|
||||
out.endTag(null, TAG_CHOOSER_COMPONENT_NAMES);
|
||||
}
|
||||
}
|
||||
|
||||
out.endTag(null, TAG_SHORTCUT);
|
||||
}
|
||||
|
||||
@@ -1436,9 +1397,6 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
String iconResName;
|
||||
String bitmapPath;
|
||||
ArraySet<String> categories = null;
|
||||
PersistableBundle chooserExtras;
|
||||
List<IntentFilter> chooserIntentFilters = new ArrayList<>();
|
||||
List<ComponentName> chooserComponentNames = new ArrayList<>();
|
||||
|
||||
id = ShortcutService.parseStringAttribute(parser, ATTR_ID);
|
||||
activityComponent = ShortcutService.parseComponentNameAttribute(parser,
|
||||
@@ -1499,18 +1457,6 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
}
|
||||
}
|
||||
continue;
|
||||
case TAG_CHOOSER_EXTRAS:
|
||||
chooserExtras = PersistableBundle.restoreFromXml(parser);
|
||||
continue;
|
||||
case TAG_CHOOSER_COMPONENT_NAMES:
|
||||
chooserComponentNames.add(ShortcutService.parseComponentNameAttribute(parser,
|
||||
ATTR_ACTIVITY));
|
||||
continue;
|
||||
case TAG_CHOOSER_INTENT_FILTERS:
|
||||
IntentFilter toAdd = new IntentFilter();
|
||||
toAdd.readFromXml(parser);
|
||||
chooserIntentFilters.add(toAdd);
|
||||
continue;
|
||||
}
|
||||
throw ShortcutService.throwForInvalidTag(depth, tag);
|
||||
}
|
||||
@@ -1604,10 +1550,10 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
// Verify each shortcut's status.
|
||||
for (int i = mShortcuts.size() - 1; i >= 0; i--) {
|
||||
final ShortcutInfo si = mShortcuts.valueAt(i);
|
||||
if (!(si.isDeclaredInManifest() || si.isDynamicOrChooser() || si.isPinned())) {
|
||||
if (!(si.isDeclaredInManifest() || si.isDynamic() || si.isPinned())) {
|
||||
failed = true;
|
||||
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
|
||||
+ " is not manifest, dynamic, chooser or pinned.");
|
||||
+ " is not manifest, dynamic or pinned.");
|
||||
}
|
||||
if (si.isDeclaredInManifest() && si.isDynamic()) {
|
||||
failed = true;
|
||||
@@ -1649,11 +1595,6 @@ class ShortcutPackage extends ShortcutPackageItem {
|
||||
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
|
||||
+ " has a dummy target activity");
|
||||
}
|
||||
if (si.getIntent() == null && !si.isChooser()) {
|
||||
failed = true;
|
||||
Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId()
|
||||
+ " has a null intent, but is not a chooser");
|
||||
}
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
|
||||
@@ -27,7 +27,6 @@ import android.app.usage.UsageStatsManagerInternal;
|
||||
import android.appwidget.AppWidgetProviderInfo;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
@@ -65,7 +64,6 @@ import android.os.FileUtils;
|
||||
import android.os.Handler;
|
||||
import android.os.LocaleList;
|
||||
import android.os.Looper;
|
||||
import android.os.Parcel;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.os.PersistableBundle;
|
||||
import android.os.Process;
|
||||
@@ -1754,7 +1752,6 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
ps.clearAllImplicitRanks();
|
||||
assignImplicitRanks(newShortcuts);
|
||||
|
||||
// TODO: Consider removing Chooser fields. If so, the FLAG_CHOOSER should be removed
|
||||
for (int i = 0; i < size; i++) {
|
||||
final ShortcutInfo source = newShortcuts.get(i);
|
||||
fixUpIncomingShortcutInfo(source, /* forUpdate= */ true);
|
||||
@@ -1794,13 +1791,6 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
if (replacingIcon || source.hasStringResources()) {
|
||||
fixUpShortcutResourceNamesAndValues(target);
|
||||
}
|
||||
|
||||
// While updating, we keep the dynamic flag as it previously was, but refresh the
|
||||
// chooser flag.
|
||||
// TODO: If we support clearing Chooser fields, we should also remove the flag.
|
||||
if (target.getChooserIntentFilters() != null) {
|
||||
target.addFlags(ShortcutInfo.FLAG_CHOOSER);
|
||||
}
|
||||
}
|
||||
|
||||
// Lastly, adjust the ranks.
|
||||
@@ -1864,7 +1854,6 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
return true;
|
||||
}
|
||||
|
||||
// TODO: Ensure non-launchable shortcuts can not be pinned
|
||||
@Override
|
||||
public boolean requestPinShortcut(String packageName, ShortcutInfo shortcut,
|
||||
IntentSender resultIntent, int userId) {
|
||||
@@ -2020,7 +2009,7 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
|
||||
return getShortcutsWithQueryLocked(
|
||||
packageName, userId, ShortcutInfo.CLONE_REMOVE_FOR_CREATOR,
|
||||
ShortcutInfo::isDynamicOrChooser);
|
||||
ShortcutInfo::isDynamic);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2213,14 +2202,6 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
synchronized (mLock) {
|
||||
throwIfUserLockedL(userId);
|
||||
|
||||
// For the chooser, we just check is the system is calling.
|
||||
// STOPSHIP: We need to implement a new permission here rather than this terrible check.
|
||||
// The packageName check is to try to distinguish between when an actual
|
||||
// launcher is making the call, and when it's the system.
|
||||
if (isCallerSystem() && packageName.equals("android")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
final ShortcutUser user = getUserShortcutsLocked(userId);
|
||||
|
||||
// Always trust the cached component.
|
||||
@@ -2393,7 +2374,7 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
public List<ShortcutInfo> getShortcuts(int launcherUserId,
|
||||
@NonNull String callingPackage, long changedSince,
|
||||
@Nullable String packageName, @Nullable List<String> shortcutIds,
|
||||
@Nullable ComponentName componentName, @Nullable Intent intent,
|
||||
@Nullable ComponentName componentName,
|
||||
int queryFlags, int userId) {
|
||||
final ArrayList<ShortcutInfo> ret = new ArrayList<>();
|
||||
|
||||
@@ -2415,13 +2396,13 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
if (packageName != null) {
|
||||
getShortcutsInnerLocked(launcherUserId,
|
||||
callingPackage, packageName, shortcutIds, changedSince,
|
||||
componentName, intent, queryFlags, userId, ret, cloneFlag);
|
||||
componentName, queryFlags, userId, ret, cloneFlag);
|
||||
} else {
|
||||
final List<String> shortcutIdsF = shortcutIds;
|
||||
getUserShortcutsLocked(userId).forAllPackages(p -> {
|
||||
getShortcutsInnerLocked(launcherUserId,
|
||||
callingPackage, p.getPackageName(), shortcutIdsF, changedSince,
|
||||
componentName, intent, queryFlags, userId, ret, cloneFlag);
|
||||
componentName, queryFlags, userId, ret, cloneFlag);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -2430,7 +2411,7 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
|
||||
private void getShortcutsInnerLocked(int launcherUserId, @NonNull String callingPackage,
|
||||
@Nullable String packageName, @Nullable List<String> shortcutIds, long changedSince,
|
||||
@Nullable ComponentName componentName, Intent intent, int queryFlags,
|
||||
@Nullable ComponentName componentName, int queryFlags,
|
||||
int userId, ArrayList<ShortcutInfo> ret, int cloneFlag) {
|
||||
final ArraySet<String> ids = shortcutIds == null ? null
|
||||
: new ArraySet<>(shortcutIds);
|
||||
@@ -2455,15 +2436,6 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (intent != null
|
||||
&& !si.hasMatchingFilter(mContext.getContentResolver(), intent)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (((queryFlags & ShortcutQuery.FLAG_MATCH_CHOOSER) != 0)
|
||||
&& si.isChooser()) {
|
||||
return true;
|
||||
}
|
||||
if (((queryFlags & ShortcutQuery.FLAG_GET_DYNAMIC) != 0)
|
||||
&& si.isDynamic()) {
|
||||
return true;
|
||||
|
||||
@@ -36,7 +36,6 @@ import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.annotation.UserIdInt;
|
||||
import android.app.Activity;
|
||||
import android.app.ActivityManager;
|
||||
@@ -1345,23 +1344,20 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
|
||||
protected ShortcutInfo makeShortcut(String id) {
|
||||
return makeShortcut(
|
||||
id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
|
||||
/* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
|
||||
}
|
||||
|
||||
@Deprecated // Title was renamed to short label.
|
||||
protected ShortcutInfo makeShortcutWithTitle(String id, String title) {
|
||||
return makeShortcut(
|
||||
id, title, /* activity =*/ null, /* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
|
||||
/* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
|
||||
}
|
||||
|
||||
protected ShortcutInfo makeShortcutWithShortLabel(String id, String shortLabel) {
|
||||
return makeShortcut(
|
||||
id, shortLabel, /* activity =*/ null, /* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
|
||||
/* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1370,8 +1366,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
|
||||
protected ShortcutInfo makeShortcutWithTimestamp(String id, long timestamp) {
|
||||
final ShortcutInfo s = makeShortcut(
|
||||
id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
|
||||
/* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
|
||||
s.setTimestamp(timestamp);
|
||||
return s;
|
||||
}
|
||||
@@ -1383,8 +1378,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
|
||||
ComponentName activity) {
|
||||
final ShortcutInfo s = makeShortcut(
|
||||
id, "Title-" + id, activity, /* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
|
||||
/* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
|
||||
s.setTimestamp(timestamp);
|
||||
return s;
|
||||
}
|
||||
@@ -1395,27 +1389,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
|
||||
protected ShortcutInfo makeShortcutWithIcon(String id, Icon icon) {
|
||||
return makeShortcut(
|
||||
id, "Title-" + id, /* activity =*/ null, icon,
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
|
||||
/* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
|
||||
}
|
||||
|
||||
protected ShortcutInfo makeChooserShortcut(String id, int i, boolean includeIntent) {
|
||||
List<IntentFilter> filters = new ArrayList<>();
|
||||
List<ComponentName> componentNames = new ArrayList<>();
|
||||
for(int j = 0; j < i; j++) {
|
||||
final IntentFilter filter = new IntentFilter();
|
||||
filter.addAction("view");
|
||||
filters.add(filter);
|
||||
|
||||
componentNames.add(new ComponentName("xxxx", "yy" + i));
|
||||
}
|
||||
Intent intent = null;
|
||||
if (includeIntent) {
|
||||
intent = makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class);
|
||||
}
|
||||
return makeShortcut(
|
||||
id, "Title-" + id, /* activity =*/ null, /* icon */ null,
|
||||
intent, /* rank =*/ 0, filters, componentNames);
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
|
||||
}
|
||||
|
||||
protected ShortcutInfo makePackageShortcut(String packageName, String id) {
|
||||
@@ -1424,8 +1398,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
|
||||
setCaller(packageName);
|
||||
ShortcutInfo s = makeShortcut(
|
||||
id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
|
||||
/* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
|
||||
setCaller(origCaller); // restore the caller
|
||||
|
||||
return s;
|
||||
@@ -1449,52 +1422,39 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
|
||||
protected ShortcutInfo makeShortcutWithActivity(String id, ComponentName activity) {
|
||||
return makeShortcut(
|
||||
id, "Title-" + id, activity, /* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
|
||||
/* chooserFilters =*/ null, /* chooserComponentNames =*/ null);
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
|
||||
}
|
||||
|
||||
protected ShortcutInfo makeShortcutWithIntent(String id, Intent intent) {
|
||||
return makeShortcut(
|
||||
id, "Title-" + id, /* activity =*/ null, /* icon =*/ null,
|
||||
intent, /* rank =*/ 0, /* chooserFilters =*/ null,
|
||||
/* chooserComponentNames =*/ null);
|
||||
|
||||
intent, /* rank =*/ 0);
|
||||
}
|
||||
|
||||
protected ShortcutInfo makeShortcutWithActivityAndTitle(String id, ComponentName activity,
|
||||
String title) {
|
||||
return makeShortcut(
|
||||
id, title, activity, /* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0,
|
||||
/* chooserFilters =*/ null, /* chooserComponentNames =*/ null);
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), /* rank =*/ 0);
|
||||
}
|
||||
|
||||
protected ShortcutInfo makeShortcutWithActivityAndRank(String id, ComponentName activity,
|
||||
int rank) {
|
||||
return makeShortcut(
|
||||
id, "Title-" + id, activity, /* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), rank,
|
||||
/* chooserFilters =*/ null, /* chooserComponentNames =*/ null);
|
||||
makeIntent(Intent.ACTION_VIEW, ShortcutActivity.class), rank);
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a shortcut with details.
|
||||
*/
|
||||
protected ShortcutInfo makeShortcut(String id, String title, ComponentName activity,
|
||||
Icon icon, Intent intent, int rank, @Nullable List<IntentFilter> chooserFilters,
|
||||
@Nullable List<ComponentName> chooserComponentNames) {
|
||||
Icon icon, Intent intent, int rank) {
|
||||
final ShortcutInfo.Builder b = new ShortcutInfo.Builder(mClientContext, id)
|
||||
.setActivity(new ComponentName(mClientContext.getPackageName(), "main"))
|
||||
.setShortLabel(title)
|
||||
.setRank(rank);
|
||||
if (intent != null) {
|
||||
b.setIntent(intent);
|
||||
}
|
||||
if (chooserFilters != null) {
|
||||
for (int i = 0; i < chooserFilters.size(); i++) {
|
||||
b.addChooserIntentFilter(chooserFilters.get(i), chooserComponentNames.get(i));
|
||||
}
|
||||
}
|
||||
.setRank(rank)
|
||||
.setIntent(intent);
|
||||
if (icon != null) {
|
||||
b.setIcon(icon);
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@ package com.android.server.pm;
|
||||
|
||||
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.anyOrNull;
|
||||
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.anyStringOrNull;
|
||||
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllChooser;
|
||||
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllDisabled;
|
||||
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllDynamic;
|
||||
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertAllDynamicOrPinned;
|
||||
@@ -58,7 +57,6 @@ import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils
|
||||
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.mock;
|
||||
@@ -261,9 +259,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
icon1,
|
||||
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
|
||||
"key1", "val1", "nest", makeBundle("key", 123)),
|
||||
/* weight */ 10,
|
||||
/* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* weight */ 10);
|
||||
|
||||
final ShortcutInfo si2 = makeShortcut(
|
||||
"shortcut2",
|
||||
@@ -271,18 +267,14 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
/* activity */ null,
|
||||
icon2,
|
||||
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
|
||||
/* weight */ 12,
|
||||
/* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* weight */ 12);
|
||||
final ShortcutInfo si3 = makeShortcut(
|
||||
"shortcut3",
|
||||
"Title 3",
|
||||
/* activity */ null,
|
||||
icon3,
|
||||
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
|
||||
/* weight */ 13,
|
||||
/* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* weight */ 13);
|
||||
|
||||
assertTrue(mManager.setDynamicShortcuts(list(si1, si2, si3)));
|
||||
assertShortcutIds(assertAllNotKeyFieldsOnly(
|
||||
@@ -993,10 +985,8 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
makeShortcut("s2"),
|
||||
makeShortcut("s3"),
|
||||
makeShortcut("s4"),
|
||||
makeShortcut("s5"),
|
||||
makeChooserShortcut("s6", 2, true),
|
||||
makeChooserShortcut("s7", 2, true),
|
||||
makeChooserShortcut("s8", 1, true))));
|
||||
makeShortcut("s5")
|
||||
)));
|
||||
});
|
||||
runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
|
||||
assertTrue(mManager.setDynamicShortcuts(list(
|
||||
@@ -1004,13 +994,11 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
makeShortcut("s2"),
|
||||
makeShortcut("s3"),
|
||||
makeShortcut("s4"),
|
||||
makeShortcut("s5"),
|
||||
makeChooserShortcut("s6", 2, true),
|
||||
makeChooserShortcut("s7", 2, true),
|
||||
makeChooserShortcut("s8", 1, true))));
|
||||
makeShortcut("s5")
|
||||
)));
|
||||
});
|
||||
runWithCaller(LAUNCHER_1, UserHandle.USER_SYSTEM, () -> {
|
||||
mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2", "s3", "s6"),
|
||||
mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("s2", "s3"),
|
||||
getCallingUser());
|
||||
mLauncherApps.pinShortcuts(CALLING_PACKAGE_2, list("s4", "s5"),
|
||||
getCallingUser());
|
||||
@@ -1023,20 +1011,19 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
mManager.removeDynamicShortcuts(list("s1"));
|
||||
mManager.removeDynamicShortcuts(list("s3"));
|
||||
mManager.removeDynamicShortcuts(list("s5"));
|
||||
mManager.removeDynamicShortcuts(list("s7"));
|
||||
});
|
||||
runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
|
||||
assertShortcutIds(assertAllDynamic(
|
||||
mManager.getDynamicShortcuts()),
|
||||
"s3", "s4", "s5", "s6", "s7", "s8");
|
||||
"s3", "s4", "s5");
|
||||
assertShortcutIds(assertAllPinned(
|
||||
mManager.getPinnedShortcuts()),
|
||||
"s2", "s3", "s6");
|
||||
"s2", "s3");
|
||||
});
|
||||
runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
|
||||
assertShortcutIds(assertAllDynamic(
|
||||
mManager.getDynamicShortcuts()),
|
||||
"s2", "s4", "s6", "s8");
|
||||
"s2", "s4");
|
||||
assertShortcutIds(assertAllPinned(
|
||||
mManager.getPinnedShortcuts()),
|
||||
"s4", "s5");
|
||||
@@ -1073,10 +1060,10 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
|
||||
assertShortcutIds(assertAllDynamic(
|
||||
mManager.getDynamicShortcuts()),
|
||||
"s3", "s4", "s5", "s6", "s7", "s8");
|
||||
"s3", "s4", "s5");
|
||||
assertShortcutIds(assertAllPinned(
|
||||
mManager.getPinnedShortcuts()),
|
||||
"s2", "s3", "s6");
|
||||
"s2", "s3");
|
||||
|
||||
ShortcutInfo s = getCallerShortcut("s2");
|
||||
assertTrue(s.hasIconResource());
|
||||
@@ -1092,7 +1079,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
runWithCaller(CALLING_PACKAGE_2, UserHandle.USER_SYSTEM, () -> {
|
||||
assertShortcutIds(assertAllDynamic(
|
||||
mManager.getDynamicShortcuts()),
|
||||
"s2", "s4", "s6", "s8");
|
||||
"s2", "s4");
|
||||
assertShortcutIds(assertAllPinned(
|
||||
mManager.getPinnedShortcuts()),
|
||||
"s4", "s5");
|
||||
@@ -1189,46 +1176,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
});
|
||||
}
|
||||
|
||||
public void testUpdateShortcuts_chooser() {
|
||||
runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> {
|
||||
assertTrue(mManager.setDynamicShortcuts(list(
|
||||
makeShortcut("s1"),
|
||||
makeChooserShortcut("s2", 2, false),
|
||||
makeChooserShortcut("s3", 2, false)
|
||||
)));
|
||||
|
||||
assertFalse(getCallerShortcut("s1").isChooser());
|
||||
assertTrue(getCallerShortcut("s2").isChooser());
|
||||
assertTrue(getCallerShortcut("s3").isChooser());
|
||||
|
||||
ShortcutInfo s = getCallerShortcut("s1");
|
||||
assertNull(s.getChooserIntentFilters());
|
||||
assertNull(s.getChooserComponentNames());
|
||||
|
||||
assertTrue(getCallerShortcut("s1").isDynamic());
|
||||
assertFalse(getCallerShortcut("s2").isDynamic());
|
||||
assertFalse(getCallerShortcut("s3").isDynamic());
|
||||
|
||||
|
||||
// Replace 2 with a chooser shortcut
|
||||
mManager.updateShortcuts(list(makeChooserShortcut("s1", 2, true)));
|
||||
|
||||
s = getCallerShortcut("s1");
|
||||
assertEquals(2, s.getChooserIntentFilters().length);
|
||||
assertEquals(2, s.getChooserComponentNames().length);
|
||||
|
||||
assertShortcutIds(assertAllChooser(
|
||||
mManager.getDynamicShortcuts()),
|
||||
"s1", "s2", "s3");
|
||||
|
||||
assertTrue(getCallerShortcut("s1").isDynamic());
|
||||
assertFalse(getCallerShortcut("s2").isDynamic());
|
||||
assertFalse(getCallerShortcut("s3").isDynamic());
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// === Test for launcher side APIs ===
|
||||
// === Test for launcher side APIs ===
|
||||
|
||||
public void testGetShortcuts() {
|
||||
|
||||
@@ -1539,17 +1487,15 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
/* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
|
||||
"key1", "val1", "nest", makeBundle("key", 123)),
|
||||
/* weight */ 10, /* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* weight */ 10);
|
||||
|
||||
final ShortcutInfo s1_2 = makeShortcut(
|
||||
"s2", "Title 2",
|
||||
"s2",
|
||||
"Title 2",
|
||||
/* activity */ null,
|
||||
/* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
|
||||
/* weight */ 12,
|
||||
/* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* weight */ 12);
|
||||
|
||||
assertTrue(mManager.setDynamicShortcuts(list(s1_1, s1_2)));
|
||||
dumpsysOnLogcat();
|
||||
@@ -1562,9 +1508,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
/* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_ANSWER, ShortcutActivity2.class,
|
||||
"key1", "val1", "nest", makeBundle("key", 123)),
|
||||
/* weight */ 10,
|
||||
/* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* weight */ 10);
|
||||
assertTrue(mManager.setDynamicShortcuts(list(s2_1)));
|
||||
dumpsysOnLogcat();
|
||||
|
||||
@@ -2733,12 +2677,10 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
final ShortcutInfo s1_2 = makeShortcut(
|
||||
"s2",
|
||||
"Title 2",
|
||||
/* activity */ null,
|
||||
/* icon =*/ null,
|
||||
/* activity */ null,
|
||||
/* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
|
||||
/* rank */ 12,
|
||||
/* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* rank */ 12);
|
||||
|
||||
final ShortcutInfo s1_3 = makeShortcut("s3");
|
||||
|
||||
@@ -2753,9 +2695,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
/* icon =*/ null,
|
||||
makeIntent(Intent.ACTION_ANSWER, ShortcutActivity.class,
|
||||
"key1", "val1", "nest", makeBundle("key", 123)),
|
||||
/* weight */ 10,
|
||||
/* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* weight */ 10);
|
||||
assertTrue(mManager.setDynamicShortcuts(list(s2_1)));
|
||||
});
|
||||
|
||||
@@ -3175,9 +3115,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
icon1,
|
||||
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
|
||||
"key1", "val1", "nest", makeBundle("key", 123)),
|
||||
/* weight */ 10,
|
||||
/* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* weight */ 10);
|
||||
|
||||
final ShortcutInfo si2 = makeShortcut(
|
||||
"s2",
|
||||
@@ -3185,9 +3123,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
/* activity */ null,
|
||||
icon2,
|
||||
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
|
||||
/* weight */ 12,
|
||||
/* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* weight */ 12);
|
||||
|
||||
assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
|
||||
|
||||
@@ -3205,8 +3141,8 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
makeComponent(ShortcutActivity.class),
|
||||
icon1,
|
||||
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
|
||||
"key1", "val1", "nest", makeBundle("key", 123)), /* weight */ 10,
|
||||
/* chooserFilter=*/ null, /* chooserComponentNames=*/ null);
|
||||
"key1", "val1", "nest", makeBundle("key", 123)),
|
||||
/* weight */ 10);
|
||||
|
||||
final ShortcutInfo si2 = makeShortcut(
|
||||
"s2",
|
||||
@@ -3214,8 +3150,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
/* activity */ null,
|
||||
icon2,
|
||||
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
|
||||
/* weight */ 12, /* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* weight */ 12);
|
||||
|
||||
assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
|
||||
|
||||
@@ -3237,8 +3172,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
icon1,
|
||||
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity2.class,
|
||||
"key1", "val1", "nest", makeBundle("key", 123)),
|
||||
/* weight */ 10, /* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* weight */ 10);
|
||||
|
||||
final ShortcutInfo si2 = makeShortcut(
|
||||
"s2",
|
||||
@@ -3246,8 +3180,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
/* activity */ null,
|
||||
icon2,
|
||||
makeIntent(Intent.ACTION_ASSIST, ShortcutActivity3.class),
|
||||
/* weight */ 12, /* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null);
|
||||
/* weight */ 12);
|
||||
|
||||
assertTrue(mManager.setDynamicShortcuts(list(si1, si2)));
|
||||
|
||||
@@ -6884,12 +6817,10 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
|
||||
mManager.setDynamicShortcuts(list(
|
||||
makeShortcut("ms1", "title1",
|
||||
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
|
||||
/* icon */ null, new Intent("action1"), /* rank */ 0,
|
||||
/* chooserFilter=*/ null, /* chooserComponentNames=*/ null),
|
||||
/* icon */ null, new Intent("action1"), /* rank */ 0),
|
||||
makeShortcut("ms2", "title2",
|
||||
new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
|
||||
/* icon */ null, new Intent("action1"), /* rank */ 0, /* chooserFilter=*/ null,
|
||||
/* chooserComponentNames=*/ null)));
|
||||
/* icon */ null, new Intent("action1"), /* rank */ 0)));
|
||||
});
|
||||
|
||||
runWithCaller(LAUNCHER_1, USER_0, () -> {
|
||||
|
||||
@@ -34,7 +34,6 @@ import android.Manifest.permission;
|
||||
import android.app.ActivityManager;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.ShortcutInfo;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.BitmapFactory;
|
||||
@@ -91,6 +90,11 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
"id cannot be empty",
|
||||
() -> new ShortcutInfo.Builder(getTestContext(), ""));
|
||||
|
||||
assertExpectException(
|
||||
RuntimeException.class,
|
||||
"intents cannot contain null",
|
||||
() -> new ShortcutInfo.Builder(getTestContext(), "id").setIntent(null));
|
||||
|
||||
assertExpectException(
|
||||
RuntimeException.class,
|
||||
"action must be set",
|
||||
@@ -137,19 +141,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
"disabledMessage cannot be empty",
|
||||
() -> new ShortcutInfo.Builder(getTestContext(), "id").setDisabledMessage(""));
|
||||
|
||||
|
||||
assertExpectException(
|
||||
RuntimeException.class,
|
||||
"component name cannot be null",
|
||||
() -> new ShortcutInfo.Builder(getTestContext(), "id")
|
||||
.addChooserIntentFilter(new IntentFilter(Intent.ACTION_SEND), null));
|
||||
|
||||
assertExpectException(
|
||||
RuntimeException.class,
|
||||
"intent filter cannot be null",
|
||||
() -> new ShortcutInfo.Builder(getTestContext(), "id")
|
||||
.addChooserIntentFilter(null, new ComponentName("xxx", "s")));
|
||||
|
||||
assertExpectException(NullPointerException.class, "action must be set",
|
||||
() -> new ShortcutInfo.Builder(getTestContext(), "id").setIntent(new Intent()));
|
||||
|
||||
@@ -248,10 +239,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
|
||||
PersistableBundle pb = new PersistableBundle();
|
||||
pb.putInt("k", 1);
|
||||
IntentFilter chooserFilter = new IntentFilter();
|
||||
chooserFilter.addAction(Intent.ACTION_VIEW);
|
||||
PersistableBundle pb2 = new PersistableBundle();
|
||||
pb2.putInt("l", 1);
|
||||
|
||||
si = new ShortcutInfo.Builder(getTestContext())
|
||||
.setId("id")
|
||||
@@ -264,8 +251,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
.setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
|
||||
.setRank(123)
|
||||
.setExtras(pb)
|
||||
.addChooserIntentFilter(chooserFilter, new ComponentName("a", "b"))
|
||||
.setChooserExtras(pb2)
|
||||
.build();
|
||||
si.addFlags(ShortcutInfo.FLAG_PINNED);
|
||||
si.setBitmapPath("abc");
|
||||
@@ -296,12 +281,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
assertEquals(null, si.getTextResName());
|
||||
assertEquals(0, si.getDisabledMessageResourceId());
|
||||
assertEquals(null, si.getDisabledMessageResName());
|
||||
|
||||
assertEquals(1, si.getChooserIntentFilters().length);
|
||||
assertEquals(Intent.ACTION_VIEW, si.getChooserIntentFilters()[0].getAction(0));
|
||||
assertEquals(1, si.getChooserComponentNames().length);
|
||||
assertEquals(new ComponentName("a", "b"), si.getChooserComponentNames()[0]);
|
||||
assertEquals(1, si.getChooserExtras().getInt("l"));
|
||||
}
|
||||
|
||||
public void testShortcutInfoParcel_resId() {
|
||||
@@ -310,10 +289,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
|
||||
PersistableBundle pb = new PersistableBundle();
|
||||
pb.putInt("k", 1);
|
||||
IntentFilter chooserFilter = new IntentFilter();
|
||||
chooserFilter.addAction(Intent.ACTION_VIEW);
|
||||
PersistableBundle pb2 = new PersistableBundle();
|
||||
pb2.putInt("l", 1);
|
||||
|
||||
si = new ShortcutInfo.Builder(getTestContext())
|
||||
.setId("id")
|
||||
@@ -326,8 +301,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
.setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"))
|
||||
.setRank(123)
|
||||
.setExtras(pb)
|
||||
.addChooserIntentFilter(chooserFilter, new ComponentName("a", "b"))
|
||||
.setChooserExtras(pb2)
|
||||
.build();
|
||||
si.addFlags(ShortcutInfo.FLAG_PINNED);
|
||||
si.setBitmapPath("abc");
|
||||
@@ -364,11 +337,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
|
||||
PersistableBundle pb = new PersistableBundle();
|
||||
pb.putInt("k", 1);
|
||||
IntentFilter chooserFilter = new IntentFilter();
|
||||
chooserFilter.addAction(Intent.ACTION_VIEW);
|
||||
PersistableBundle pb2 = new PersistableBundle();
|
||||
pb2.putInt("l", 1);
|
||||
|
||||
ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
|
||||
.setId("id")
|
||||
.setActivity(new ComponentName("a", "b"))
|
||||
@@ -380,8 +348,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
.setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
|
||||
.setRank(123)
|
||||
.setExtras(pb)
|
||||
.addChooserIntentFilter(chooserFilter, new ComponentName("a", "b"))
|
||||
.setChooserExtras(pb2)
|
||||
.build();
|
||||
sorig.addFlags(ShortcutInfo.FLAG_PINNED);
|
||||
sorig.setBitmapPath("abc");
|
||||
@@ -411,12 +377,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
assertEquals(456, si.getIconResourceId());
|
||||
assertEquals("string/r456", si.getIconResName());
|
||||
|
||||
assertEquals(1, si.getChooserIntentFilters().length);
|
||||
assertEquals(Intent.ACTION_VIEW, si.getChooserIntentFilters()[0].getAction(0));
|
||||
assertEquals(1, si.getChooserComponentNames().length);
|
||||
assertEquals(new ComponentName("a", "b"), si.getChooserComponentNames()[0]);
|
||||
assertEquals(1, si.getChooserExtras().getInt("l"));
|
||||
|
||||
si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
|
||||
|
||||
assertEquals(mClientContext.getPackageName(), si.getPackage());
|
||||
@@ -484,10 +444,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
|
||||
PersistableBundle pb = new PersistableBundle();
|
||||
pb.putInt("k", 1);
|
||||
IntentFilter chooserFilter = new IntentFilter();
|
||||
chooserFilter.addAction(Intent.ACTION_VIEW);
|
||||
PersistableBundle pb2 = new PersistableBundle();
|
||||
pb2.putInt("l", 1);
|
||||
ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext)
|
||||
.setId("id")
|
||||
.setActivity(new ComponentName("a", "b"))
|
||||
@@ -499,8 +455,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
.setIntent(makeIntent("action", ShortcutActivity.class, "key", "val"))
|
||||
.setRank(123)
|
||||
.setExtras(pb)
|
||||
.addChooserIntentFilter(chooserFilter, new ComponentName("a", "b"))
|
||||
.setChooserExtras(pb2)
|
||||
.build();
|
||||
sorig.addFlags(ShortcutInfo.FLAG_PINNED);
|
||||
sorig.setBitmapPath("abc");
|
||||
@@ -533,12 +487,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
assertEquals(456, si.getIconResourceId());
|
||||
assertEquals("string/r456", si.getIconResName());
|
||||
|
||||
assertEquals(1, si.getChooserIntentFilters().length);
|
||||
assertEquals(Intent.ACTION_VIEW, si.getChooserIntentFilters()[0].getAction(0));
|
||||
assertEquals(1, si.getChooserComponentNames().length);
|
||||
assertEquals(new ComponentName("a", "b"), si.getChooserComponentNames()[0]);
|
||||
assertEquals(1, si.getChooserExtras().getInt("l"));
|
||||
|
||||
si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR);
|
||||
|
||||
assertEquals(mClientContext.getPackageName(), si.getPackage());
|
||||
@@ -654,10 +602,6 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
public void testShortcutInfoCopyNonNullFieldsFrom() throws InterruptedException {
|
||||
PersistableBundle pb = new PersistableBundle();
|
||||
pb.putInt("k", 1);
|
||||
IntentFilter chooserFilter = new IntentFilter();
|
||||
chooserFilter.addAction(Intent.ACTION_VIEW);
|
||||
PersistableBundle pb2 = new PersistableBundle();
|
||||
pb2.putInt("l", 1);
|
||||
ShortcutInfo sorig = new ShortcutInfo.Builder(getTestContext())
|
||||
.setId("id")
|
||||
.setActivity(new ComponentName("a", "b"))
|
||||
@@ -769,12 +713,12 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
|
||||
assertEquals(999, si.getRank());
|
||||
|
||||
|
||||
PersistableBundle pb3 = new PersistableBundle();
|
||||
pb3.putInt("x", 99);
|
||||
PersistableBundle pb2 = new PersistableBundle();
|
||||
pb2.putInt("x", 99);
|
||||
|
||||
si = sorig.clone(/* flags=*/ 0);
|
||||
si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id")
|
||||
.setExtras(pb3).build());
|
||||
.setExtras(pb2).build());
|
||||
assertEquals("text", si.getText());
|
||||
assertEquals(99, si.getExtras().getInt("x"));
|
||||
}
|
||||
|
||||
@@ -512,13 +512,6 @@ public class ShortcutManagerTestUtils {
|
||||
return actualShortcuts;
|
||||
}
|
||||
|
||||
public static List<ShortcutInfo> assertAllChooser(List<ShortcutInfo> actualShortcuts) {
|
||||
for (ShortcutInfo s : actualShortcuts) {
|
||||
assertTrue("ID " + s.getId(), s.isChooser());
|
||||
}
|
||||
return actualShortcuts;
|
||||
}
|
||||
|
||||
public static List<ShortcutInfo> assertAllPinned(List<ShortcutInfo> actualShortcuts) {
|
||||
for (ShortcutInfo s : actualShortcuts) {
|
||||
assertTrue("ID " + s.getId(), s.isPinned());
|
||||
|
||||
Reference in New Issue
Block a user