diff --git a/api/current.txt b/api/current.txt index 957dac0e348ca..8e380360f8487 100644 --- a/api/current.txt +++ b/api/current.txt @@ -10050,7 +10050,7 @@ package android.content.pm { public final class ShortcutInfo implements android.os.Parcelable { method public int describeContents(); method public android.content.ComponentName getActivityComponent(); - method public java.util.List getCategories(); + method public java.util.Set getCategories(); method public android.os.PersistableBundle getExtras(); method public int getIconResourceId(); method public java.lang.String getId(); @@ -10083,7 +10083,7 @@ package android.content.pm { ctor public ShortcutInfo.Builder(android.content.Context); method public android.content.pm.ShortcutInfo build(); method public android.content.pm.ShortcutInfo.Builder setActivityComponent(android.content.ComponentName); - method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.List); + method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set); method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle); method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon); method public android.content.pm.ShortcutInfo.Builder setId(java.lang.String); diff --git a/api/system-current.txt b/api/system-current.txt index f2b13e5c19d29..672f63cae193c 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -10450,7 +10450,7 @@ package android.content.pm { public final class ShortcutInfo implements android.os.Parcelable { method public int describeContents(); method public android.content.ComponentName getActivityComponent(); - method public java.util.List getCategories(); + method public java.util.Set getCategories(); method public android.os.PersistableBundle getExtras(); method public int getIconResourceId(); method public java.lang.String getId(); @@ -10483,7 +10483,7 @@ package android.content.pm { ctor public ShortcutInfo.Builder(android.content.Context); method public android.content.pm.ShortcutInfo build(); method public android.content.pm.ShortcutInfo.Builder setActivityComponent(android.content.ComponentName); - method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.List); + method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set); method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle); method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon); method public android.content.pm.ShortcutInfo.Builder setId(java.lang.String); diff --git a/api/test-current.txt b/api/test-current.txt index 6896941ce8f97..61d57219d3bd7 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -10061,7 +10061,7 @@ package android.content.pm { public final class ShortcutInfo implements android.os.Parcelable { method public int describeContents(); method public android.content.ComponentName getActivityComponent(); - method public java.util.List getCategories(); + method public java.util.Set getCategories(); method public android.os.PersistableBundle getExtras(); method public int getIconResourceId(); method public java.lang.String getId(); @@ -10094,7 +10094,7 @@ package android.content.pm { ctor public ShortcutInfo.Builder(android.content.Context); method public android.content.pm.ShortcutInfo build(); method public android.content.pm.ShortcutInfo.Builder setActivityComponent(android.content.ComponentName); - method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.List); + method public android.content.pm.ShortcutInfo.Builder setCategories(java.util.Set); method public android.content.pm.ShortcutInfo.Builder setExtras(android.os.PersistableBundle); method public android.content.pm.ShortcutInfo.Builder setIcon(android.graphics.drawable.Icon); method public android.content.pm.ShortcutInfo.Builder setId(java.lang.String); diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java index a9000155bc00d..9b1d0f7d05bdf 100644 --- a/core/java/android/content/pm/ShortcutInfo.java +++ b/core/java/android/content/pm/ShortcutInfo.java @@ -29,6 +29,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.PersistableBundle; import android.os.UserHandle; +import android.util.ArraySet; import com.android.internal.util.Preconditions; @@ -36,6 +37,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; +import java.util.Set; // TODO Enhance javadoc /** @@ -132,7 +134,7 @@ public final class ShortcutInfo implements Parcelable { private String mText; @NonNull - private List mCategories; + private ArraySet mCategories; /** * Intent *with extras removed*. @@ -192,8 +194,8 @@ public final class ShortcutInfo implements Parcelable { updateTimestamp(); } - private ArrayList clone(List source) { - return (source == null) ? null : new ArrayList<>(source); + private ArraySet clone(Set source) { + return (source == null) ? null : new ArraySet<>(source); } /** @@ -346,7 +348,7 @@ public final class ShortcutInfo implements Parcelable { private String mText; - private List mCategories; + private Set mCategories; private Intent mIntent; @@ -433,7 +435,7 @@ public final class ShortcutInfo implements Parcelable { * @see #SHORTCUT_CATEGORY_CONVERSATION */ @NonNull - public Builder setCategories(List categories) { + public Builder setCategories(Set categories) { mCategories = categories; return this; } @@ -539,7 +541,7 @@ public final class ShortcutInfo implements Parcelable { * Return the categories. */ @Nullable - public List getCategories() { + public Set getCategories() { return mCategories; } @@ -733,8 +735,6 @@ public final class ShortcutInfo implements Parcelable { mIcon = source.readParcelable(cl); mTitle = source.readString(); mText = source.readString(); - mCategories = new ArrayList<>(); - source.readStringList(mCategories); mIntent = source.readParcelable(cl); mIntentPersistableExtras = source.readParcelable(cl); mWeight = source.readInt(); @@ -743,6 +743,16 @@ public final class ShortcutInfo implements Parcelable { mFlags = source.readInt(); mIconResourceId = source.readInt(); mBitmapPath = source.readString(); + + int N = source.readInt(); + if (N == 0) { + mCategories = null; + } else { + mCategories = new ArraySet<>(N); + for (int i = 0; i < N; i++) { + mCategories.add(source.readString().intern()); + } + } } @Override @@ -754,7 +764,7 @@ public final class ShortcutInfo implements Parcelable { dest.writeParcelable(mIcon, flags); dest.writeString(mTitle); dest.writeString(mText); - dest.writeStringList(mCategories); + dest.writeParcelable(mIntent, flags); dest.writeParcelable(mIntentPersistableExtras, flags); dest.writeInt(mWeight); @@ -763,6 +773,16 @@ public final class ShortcutInfo implements Parcelable { dest.writeInt(mFlags); dest.writeInt(mIconResourceId); dest.writeString(mBitmapPath); + + if (mCategories != null) { + final int N = mCategories.size(); + dest.writeInt(N); + for (int i = 0; i < N; i++) { + dest.writeString(mCategories.valueAt(i)); + } + } else { + dest.writeInt(0); + } } public static final Creator CREATOR = @@ -859,7 +879,7 @@ public final class ShortcutInfo implements Parcelable { /** @hide */ public ShortcutInfo( @UserIdInt int userId, String id, String packageName, ComponentName activityComponent, - Icon icon, String title, String text, List categories, Intent intent, + Icon icon, String title, String text, Set categories, Intent intent, PersistableBundle intentPersistableExtras, int weight, PersistableBundle extras, long lastChangedTimestamp, int flags, int iconResId, String bitmapPath) { diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index b9b65ebc5ff8e..8e96a580b0bbe 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -40,6 +40,7 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Set; import java.util.function.Predicate; /** @@ -493,7 +494,7 @@ class ShortcutPackage extends ShortcutPackageItem { } { - final List cat = si.getCategories(); + final Set cat = si.getCategories(); if (cat != null && cat.size() > 0) { out.startTag(null, TAG_CATEGORIES); XmlUtils.writeStringArrayXml(cat.toArray(new String[cat.size()]), @@ -567,7 +568,7 @@ class ShortcutPackage extends ShortcutPackageItem { int flags; int iconRes; String bitmapPath; - String[] categories = null; + ArraySet categories = null; id = ShortcutService.parseStringAttribute(parser, ATTR_ID); activityComponent = ShortcutService.parseComponentNameAttribute(parser, @@ -607,15 +608,21 @@ class ShortcutPackage extends ShortcutPackageItem { case TAG_STRING_ARRAY_XMLUTILS: if (NAME_CATEGORIES.equals(ShortcutService.parseStringAttribute(parser, ATTR_NAME_XMLUTILS))) { - categories = XmlUtils.readThisStringArrayXml(parser, TAG_STRING_ARRAY_XMLUTILS, null); + final String[] ar = XmlUtils.readThisStringArrayXml( + parser, TAG_STRING_ARRAY_XMLUTILS, null); + categories = new ArraySet<>(ar.length); + for (int i = 0; i < ar.length; i++) { + categories.add(ar[i]); + } } continue; } throw ShortcutService.throwForInvalidTag(depth, tag); } + return new ShortcutInfo( userId, id, packageName, activityComponent, /* icon =*/ null, title, text, - (categories == null ? null : Arrays.asList(categories)), intent, + categories, intent, intentPersistableExtras, weight, extras, lastChangedTimestamp, flags, iconRes, bitmapPath); } diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java index d20d5fa7f3b9c..5387f312a10df 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java @@ -5053,7 +5053,7 @@ public class ShortcutManagerTest extends InstrumentationTestCase { .setTitle("title") .setText("text") .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val")) - .setCategories(list(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz")) + .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz")) .setWeight(123) .setExtras(pb) .build(); @@ -5069,7 +5069,7 @@ public class ShortcutManagerTest extends InstrumentationTestCase { assertEquals("content://a.b.c/", si.getIcon().getUriString()); assertEquals("title", si.getTitle()); assertEquals("text", si.getText()); - assertEquals(list(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); + assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); assertEquals("action", si.getIntent().getAction()); assertEquals("val", si.getIntent().getStringExtra("key")); assertEquals(123, si.getWeight()); @@ -5091,7 +5091,7 @@ public class ShortcutManagerTest extends InstrumentationTestCase { .setIcon(Icon.createWithContentUri("content://a.b.c/")) .setTitle("title") .setText("text") - .setCategories(list(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz")) + .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz")) .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val")) .setWeight(123) .setExtras(pb) @@ -5110,7 +5110,7 @@ public class ShortcutManagerTest extends InstrumentationTestCase { assertEquals("content://a.b.c/", si.getIcon().getUriString()); assertEquals("title", si.getTitle()); assertEquals("text", si.getText()); - assertEquals(list(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); + assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); assertEquals("action", si.getIntent().getAction()); assertEquals("val", si.getIntent().getStringExtra("key")); assertEquals(123, si.getWeight()); @@ -5128,7 +5128,7 @@ public class ShortcutManagerTest extends InstrumentationTestCase { assertEquals(null, si.getIcon()); assertEquals("title", si.getTitle()); assertEquals("text", si.getText()); - assertEquals(list(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); + assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); assertEquals("action", si.getIntent().getAction()); assertEquals("val", si.getIntent().getStringExtra("key")); assertEquals(123, si.getWeight()); @@ -5147,7 +5147,7 @@ public class ShortcutManagerTest extends InstrumentationTestCase { assertEquals(null, si.getIcon()); assertEquals("title", si.getTitle()); assertEquals("text", si.getText()); - assertEquals(list(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); + assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); assertEquals(null, si.getIntent()); assertEquals(123, si.getWeight()); assertEquals(1, si.getExtras().getInt("k")); @@ -5226,7 +5226,7 @@ public class ShortcutManagerTest extends InstrumentationTestCase { .setIcon(Icon.createWithContentUri("content://a.b.c/")) .setTitle("title") .setText("text") - .setCategories(list(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz")) + .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz")) .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val")) .setWeight(123) .setExtras(pb) @@ -5263,15 +5263,15 @@ public class ShortcutManagerTest extends InstrumentationTestCase { si = sorig.clone(/* flags=*/ 0); si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id") - .setCategories(list()).build()); + .setCategories(set()).build()); assertEquals("text", si.getText()); - assertEquals(list(), si.getCategories()); + assertEquals(set(), si.getCategories()); si = sorig.clone(/* flags=*/ 0); si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id") - .setCategories(list("x")).build()); + .setCategories(set("x")).build()); assertEquals("text", si.getText()); - assertEquals(list("x"), si.getCategories()); + assertEquals(set("x"), si.getCategories()); si = sorig.clone(/* flags=*/ 0); si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id") @@ -5328,7 +5328,7 @@ public class ShortcutManagerTest extends InstrumentationTestCase { .setIcon(bmp32x32) .setTitle("title") .setText("text") - .setCategories(list(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz")) + .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz")) .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val")) .setWeight(123) .setExtras(pb) @@ -5355,7 +5355,7 @@ public class ShortcutManagerTest extends InstrumentationTestCase { assertEquals(null, si.getIcon()); assertEquals("title", si.getTitle()); assertEquals("text", si.getText()); - assertEquals(list(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); + assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); assertEquals("action", si.getIntent().getAction()); assertEquals("val", si.getIntent().getStringExtra("key")); assertEquals(123, si.getWeight()); @@ -5381,7 +5381,7 @@ public class ShortcutManagerTest extends InstrumentationTestCase { .setIcon(bmp32x32) .setTitle("title") .setText("text") - .setCategories(list(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz")) + .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz")) .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val")) .setWeight(123) .setExtras(pb) @@ -5407,7 +5407,7 @@ public class ShortcutManagerTest extends InstrumentationTestCase { assertEquals(null, si.getIcon()); assertEquals("title", si.getTitle()); assertEquals("text", si.getText()); - assertEquals(list(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); + assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); assertEquals("action", si.getIntent().getAction()); assertEquals("val", si.getIntent().getStringExtra("key")); assertEquals(123, si.getWeight());