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

Commit 92f190ee authored by Pinyao Ting's avatar Pinyao Ting Committed by Android (Google) Code Review
Browse files

Merge "Finalized schema in AppSearchShortcutInfo"

parents 7a486619 d17d3c6b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
+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