Loading core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -12216,6 +12216,7 @@ package android.content.pm { } public final class ShortcutInfo implements android.os.Parcelable { method @NonNull public static android.content.pm.ShortcutInfo createFromGenericDocument(@NonNull android.content.Context, @NonNull android.app.appsearch.GenericDocument); method public int describeContents(); method @Nullable public android.content.ComponentName getActivity(); method @NonNull public java.util.List<java.lang.String> getCapabilityParameterValues(@NonNull String, @NonNull String); core/java/android/content/pm/AppSearchShortcutInfo.java +236 −342 File changed.Preview size limit exceeded, changes collapsed. Show changes core/java/android/content/pm/AppSearchPerson.java→core/java/android/content/pm/AppSearchShortcutPerson.java +75 −15 Original line number Diff line number Diff line Loading @@ -21,28 +21,38 @@ import android.annotation.Nullable; import android.app.Person; import android.app.appsearch.AppSearchSchema; import android.app.appsearch.GenericDocument; import android.graphics.drawable.Icon; import android.net.UriCodec; import com.android.internal.annotations.VisibleForTesting; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Objects; import java.util.UUID; /** * A {@link GenericDocument} representation of {@link Person} object. * * @hide */ public class AppSearchPerson extends GenericDocument { public class AppSearchShortcutPerson extends GenericDocument { /** The name of the schema type for {@link Person} documents.*/ public static final String SCHEMA_TYPE = "Person"; /** * The name of the schema type for {@link Person} documents. * @hide */ public static final String SCHEMA_TYPE = "ShortcutPerson"; public static final String KEY_NAME = "name"; public static final String KEY_KEY = "key"; public static final String KEY_IS_BOT = "isBot"; public static final String KEY_IS_IMPORTANT = "isImportant"; private static final String KEY_NAME = "name"; private static final String KEY_KEY = "key"; private static final String KEY_IS_BOT = "isBot"; private static final String KEY_IS_IMPORTANT = "isImportant"; private static final String KEY_ICON = "icon"; public AppSearchPerson(@NonNull GenericDocument document) { public AppSearchShortcutPerson(@NonNull GenericDocument document) { super(document); } Loading @@ -67,11 +77,15 @@ public class AppSearchPerson extends GenericDocument { .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REQUIRED) .build() ).addProperty(new AppSearchSchema.BytesPropertyConfig.Builder(KEY_ICON) .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL) .build() ).build(); /** hide */ /** @hide */ @NonNull public static AppSearchPerson instance(@NonNull final Person person) { public static AppSearchShortcutPerson instance(@NonNull final Person person) { Objects.requireNonNull(person); final String id; if (person.getUri() != null) { Loading @@ -82,10 +96,13 @@ public class AppSearchPerson extends GenericDocument { } return new Builder(id).setName(person.getName()) .setKey(person.getKey()).setIsBot(person.isBot()) .setIsImportant(person.isImportant()).build(); .setIsImportant(person.isImportant()) .setIcon(transformToByteArray(person.getIcon())).build(); } /** hide */ /** * Convert this {@link GenericDocument} into {@link Person}. */ @NonNull public Person toPerson() { String uri; Loading @@ -99,7 +116,9 @@ public class AppSearchPerson extends GenericDocument { return new Person.Builder().setName(getPropertyString(KEY_NAME)) .setUri(uri).setKey(getPropertyString(KEY_KEY)) .setBot(getPropertyBoolean(KEY_IS_BOT)) .setImportant(getPropertyBoolean(KEY_IS_IMPORTANT)).build(); .setImportant(getPropertyBoolean(KEY_IS_IMPORTANT)) .setIcon(transformToIcon(getPropertyBytes(KEY_ICON))) .build(); } /** @hide */ Loading Loading @@ -142,10 +161,51 @@ public class AppSearchPerson extends GenericDocument { return this; } /** @hide */ @NonNull public Builder setIcon(@Nullable final byte[] icon) { if (icon != null) { setPropertyBytes(KEY_ICON, icon); } return this; } /** @hide */ @NonNull @Override public AppSearchPerson build() { return new AppSearchPerson(super.build()); public AppSearchShortcutPerson build() { return new AppSearchShortcutPerson(super.build()); } } /** * Convert {@link Icon} into byte[]. */ @Nullable private static byte[] transformToByteArray(@Nullable final Icon icon) { if (icon == null) { return null; } try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { icon.writeToStream(baos); return baos.toByteArray(); } catch (IOException e) { return null; } } /** * Convert byte[] into {@link Icon}. */ @Nullable private Icon transformToIcon(@Nullable final byte[] icon) { if (icon == null) { return null; } try (ByteArrayInputStream bais = new ByteArrayInputStream(icon)) { return Icon.createFromStream(bais); } catch (IOException e) { return null; } } } core/java/android/content/pm/ShortcutInfo.java +23 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.annotation.UserIdInt; import android.app.Notification; import android.app.Person; import android.app.TaskStackBuilder; import android.app.appsearch.GenericDocument; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; Loading Loading @@ -655,6 +656,28 @@ public final class ShortcutInfo implements Parcelable { mStartingThemeResName = source.mStartingThemeResName; } /** * Convert a {@link GenericDocument} into a ShortcutInfo. * * @param context Client context * @param document An instance of {@link GenericDocument} that represents the shortcut. */ @NonNull public static ShortcutInfo createFromGenericDocument(@NonNull final Context context, @NonNull final GenericDocument document) { Objects.requireNonNull(context); Objects.requireNonNull(document); return createFromGenericDocument(context.getUserId(), document); } /** * @hide */ public static ShortcutInfo createFromGenericDocument( final int userId, @NonNull final GenericDocument document) { return new AppSearchShortcutInfo(document).toShortcutInfo(userId); } /** * Load a string resource from the publisher app. * Loading core/tests/coretests/src/android/content/pm/AppSearchPersonTest.java→core/tests/coretests/src/android/content/pm/AppSearchShortcutPersonTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ import android.platform.test.annotations.Presubmit; import org.junit.Test; @Presubmit public class AppSearchPersonTest { public class AppSearchShortcutPersonTest { @Test public void testBuildPersonAndGetValue() { Loading @@ -32,7 +32,7 @@ public class AppSearchPersonTest { final String key = "key"; final String uri = "name:name"; final Person person = new AppSearchPerson.Builder(uri) final Person person = new AppSearchShortcutPerson.Builder(uri) .setName(name) .setKey(key) .setIsBot(true) Loading Loading
core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -12216,6 +12216,7 @@ package android.content.pm { } public final class ShortcutInfo implements android.os.Parcelable { method @NonNull public static android.content.pm.ShortcutInfo createFromGenericDocument(@NonNull android.content.Context, @NonNull android.app.appsearch.GenericDocument); method public int describeContents(); method @Nullable public android.content.ComponentName getActivity(); method @NonNull public java.util.List<java.lang.String> getCapabilityParameterValues(@NonNull String, @NonNull String);
core/java/android/content/pm/AppSearchShortcutInfo.java +236 −342 File changed.Preview size limit exceeded, changes collapsed. Show changes
core/java/android/content/pm/AppSearchPerson.java→core/java/android/content/pm/AppSearchShortcutPerson.java +75 −15 Original line number Diff line number Diff line Loading @@ -21,28 +21,38 @@ import android.annotation.Nullable; import android.app.Person; import android.app.appsearch.AppSearchSchema; import android.app.appsearch.GenericDocument; import android.graphics.drawable.Icon; import android.net.UriCodec; import com.android.internal.annotations.VisibleForTesting; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Objects; import java.util.UUID; /** * A {@link GenericDocument} representation of {@link Person} object. * * @hide */ public class AppSearchPerson extends GenericDocument { public class AppSearchShortcutPerson extends GenericDocument { /** The name of the schema type for {@link Person} documents.*/ public static final String SCHEMA_TYPE = "Person"; /** * The name of the schema type for {@link Person} documents. * @hide */ public static final String SCHEMA_TYPE = "ShortcutPerson"; public static final String KEY_NAME = "name"; public static final String KEY_KEY = "key"; public static final String KEY_IS_BOT = "isBot"; public static final String KEY_IS_IMPORTANT = "isImportant"; private static final String KEY_NAME = "name"; private static final String KEY_KEY = "key"; private static final String KEY_IS_BOT = "isBot"; private static final String KEY_IS_IMPORTANT = "isImportant"; private static final String KEY_ICON = "icon"; public AppSearchPerson(@NonNull GenericDocument document) { public AppSearchShortcutPerson(@NonNull GenericDocument document) { super(document); } Loading @@ -67,11 +77,15 @@ public class AppSearchPerson extends GenericDocument { .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REQUIRED) .build() ).addProperty(new AppSearchSchema.BytesPropertyConfig.Builder(KEY_ICON) .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL) .build() ).build(); /** hide */ /** @hide */ @NonNull public static AppSearchPerson instance(@NonNull final Person person) { public static AppSearchShortcutPerson instance(@NonNull final Person person) { Objects.requireNonNull(person); final String id; if (person.getUri() != null) { Loading @@ -82,10 +96,13 @@ public class AppSearchPerson extends GenericDocument { } return new Builder(id).setName(person.getName()) .setKey(person.getKey()).setIsBot(person.isBot()) .setIsImportant(person.isImportant()).build(); .setIsImportant(person.isImportant()) .setIcon(transformToByteArray(person.getIcon())).build(); } /** hide */ /** * Convert this {@link GenericDocument} into {@link Person}. */ @NonNull public Person toPerson() { String uri; Loading @@ -99,7 +116,9 @@ public class AppSearchPerson extends GenericDocument { return new Person.Builder().setName(getPropertyString(KEY_NAME)) .setUri(uri).setKey(getPropertyString(KEY_KEY)) .setBot(getPropertyBoolean(KEY_IS_BOT)) .setImportant(getPropertyBoolean(KEY_IS_IMPORTANT)).build(); .setImportant(getPropertyBoolean(KEY_IS_IMPORTANT)) .setIcon(transformToIcon(getPropertyBytes(KEY_ICON))) .build(); } /** @hide */ Loading Loading @@ -142,10 +161,51 @@ public class AppSearchPerson extends GenericDocument { return this; } /** @hide */ @NonNull public Builder setIcon(@Nullable final byte[] icon) { if (icon != null) { setPropertyBytes(KEY_ICON, icon); } return this; } /** @hide */ @NonNull @Override public AppSearchPerson build() { return new AppSearchPerson(super.build()); public AppSearchShortcutPerson build() { return new AppSearchShortcutPerson(super.build()); } } /** * Convert {@link Icon} into byte[]. */ @Nullable private static byte[] transformToByteArray(@Nullable final Icon icon) { if (icon == null) { return null; } try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { icon.writeToStream(baos); return baos.toByteArray(); } catch (IOException e) { return null; } } /** * Convert byte[] into {@link Icon}. */ @Nullable private Icon transformToIcon(@Nullable final byte[] icon) { if (icon == null) { return null; } try (ByteArrayInputStream bais = new ByteArrayInputStream(icon)) { return Icon.createFromStream(bais); } catch (IOException e) { return null; } } }
core/java/android/content/pm/ShortcutInfo.java +23 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.annotation.UserIdInt; import android.app.Notification; import android.app.Person; import android.app.TaskStackBuilder; import android.app.appsearch.GenericDocument; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; Loading Loading @@ -655,6 +656,28 @@ public final class ShortcutInfo implements Parcelable { mStartingThemeResName = source.mStartingThemeResName; } /** * Convert a {@link GenericDocument} into a ShortcutInfo. * * @param context Client context * @param document An instance of {@link GenericDocument} that represents the shortcut. */ @NonNull public static ShortcutInfo createFromGenericDocument(@NonNull final Context context, @NonNull final GenericDocument document) { Objects.requireNonNull(context); Objects.requireNonNull(document); return createFromGenericDocument(context.getUserId(), document); } /** * @hide */ public static ShortcutInfo createFromGenericDocument( final int userId, @NonNull final GenericDocument document) { return new AppSearchShortcutInfo(document).toShortcutInfo(userId); } /** * Load a string resource from the publisher app. * Loading
core/tests/coretests/src/android/content/pm/AppSearchPersonTest.java→core/tests/coretests/src/android/content/pm/AppSearchShortcutPersonTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ import android.platform.test.annotations.Presubmit; import org.junit.Test; @Presubmit public class AppSearchPersonTest { public class AppSearchShortcutPersonTest { @Test public void testBuildPersonAndGetValue() { Loading @@ -32,7 +32,7 @@ public class AppSearchPersonTest { final String key = "key"; final String uri = "name:name"; final Person person = new AppSearchPerson.Builder(uri) final Person person = new AppSearchShortcutPerson.Builder(uri) .setName(name) .setKey(key) .setIsBot(true) Loading