Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d17d3c6b authored by Pinyao Ting's avatar Pinyao Ting
Browse files

Finalized schema in AppSearchShortcutInfo

BYPASS_INCLUSIVE_LANGUAGE_REASON: The term "Man" in this CL is a
shorthand of the term "Manifest", it's a false alarm.

Bug: 151359749
Test: atest CtsShortcutManagerTestCases
Change-Id: I0b17bd4cb0eca3a2eba95e2b9de122d41da08502
parent d067cf02
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -13476,6 +13476,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);
+236 −342

File changed.

Preview size limit exceeded, changes collapsed.

+75 −15
Original line number Diff line number Diff line
@@ -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);
    }

@@ -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) {
@@ -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;
@@ -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 */
@@ -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;
        }
    }
}
+23 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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.
     *
+2 −2
Original line number Diff line number Diff line
@@ -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() {
@@ -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