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

Commit 93e21228 authored by Terry Wang's avatar Terry Wang
Browse files

Porting AppSearch jetpack upstream changes to platform

Changes included:
#af6646e : Support retrieving the current database's schema
#2696e50 : Unhide the createGlobalSearchSession API.

Bug: 162450968
Test: presubmit
Change-Id: I1a69db42742c45b97fca945e3b917df274ba75bb
parent eef8137c
Loading
Loading
Loading
Loading
+53 −6
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.app.appsearch.exceptions.AppSearchException;
import android.os.Bundle;
import android.os.ParcelableException;
import android.os.RemoteException;
import android.util.ArraySet;

import java.util.ArrayList;
import java.util.List;
@@ -34,6 +35,8 @@ import java.util.function.Consumer;
/**
 * Represents a connection to an AppSearch storage system where {@link GenericDocument}s can be
 * placed and queried.
 *
 * This class is thread safe.
 * @hide
 */
public final class AppSearchSession {
@@ -79,7 +82,7 @@ public final class AppSearchSession {
    }

    /**
     * Sets the schema will be used by documents provided to the {@link #putDocuments} method.
     * Sets the schema that will be used by documents provided to the {@link #putDocuments} method.
     *
     * <p>The schema provided here is compared to the stored copy of the schema previously supplied
     * to {@link #setSchema}, if any, to determine how to treat existing documents. The following
@@ -123,11 +126,19 @@ public final class AppSearchSession {
     * <p>It is a no-op to set the same schema as has been previously set; this is handled
     * efficiently.
     *
     * <p>By default, documents are visible on platform surfaces. To opt out, call {@code
     * SetSchemaRequest.Builder#setPlatformSurfaceable} with {@code surfaceable} as false. Any
     * visibility settings apply only to the schemas that are included in the {@code request}.
     * Visibility settings for a schema type do not apply or persist across
     * {@link SetSchemaRequest}s.
     *
     * @param request The schema update request.
     * @param executor Executor on which to invoke the callback.
     * @param callback Callback to receive errors resulting from setting the schema. If the
     *                 operation succeeds, the callback will be invoked with {@code null}.
     */
    // TODO(b/169883602): Change @code references to @link when setPlatformSurfaceable APIs are
    //  exposed.
    public void setSchema(
            @NonNull SetSchemaRequest request,
            @NonNull @CallbackExecutor Executor executor,
@@ -155,6 +166,39 @@ public final class AppSearchSession {
        }
    }

    /**
     * Retrieves the schema most recently successfully provided to {@link #setSchema}.
     *
     * @param executor Executor on which to invoke the callback.
     * @param callback Callback to receive the pending results of schema. If the operation succeeds,
     *                 the callback will be invoked with a {@link Set}<{@link AppSearchSchema}>
     */
    @NonNull
    public void getSchema(
            @NonNull @CallbackExecutor Executor executor,
            @NonNull Consumer<Set<AppSearchSchema>> callback) {
        Objects.requireNonNull(executor);
        Objects.requireNonNull(callback);
        try {
            mService.getSchema(
                    mDatabaseName,
                    new IAppSearchResultCallback.Stub() {
                        public void onResult(AppSearchResult result) {
                            executor.execute(() -> {
                                List<Bundle> schemaBundles = (List<Bundle>) result.getResultValue();
                                Set<AppSearchSchema> schemas = new ArraySet<>(schemaBundles.size());
                                for (int i = 0; i < schemaBundles.size(); i++) {
                                    schemas.add(new AppSearchSchema(schemaBundles.get(i)));
                                }
                                callback.accept(schemas);
                            });
                        }
                    });
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Indexes documents into AppSearch.
     *
@@ -369,7 +413,7 @@ public final class AppSearchSession {
    /**
     * Removes {@link GenericDocument}s from the index by Query. Documents will be removed if they
     * match the {@code queryExpression} in given namespaces and schemaTypes which is set via
     * {@link SearchSpec.Builder#addNamespace} and {@link SearchSpec.Builder#addSchema}.
     * {@link SearchSpec.Builder#addNamespace} and {@link SearchSpec.Builder#addSchemaType}.
     *
     * <p> An empty {@code queryExpression} matches all documents.
     *
@@ -377,10 +421,13 @@ public final class AppSearchSession {
     * the current database.
     *
     * @param queryExpression Query String to search.
     * @param searchSpec Defines what and how to remove
     * @param searchSpec      Spec containing schemaTypes, namespaces and query expression indicates
     *                        how document will be removed. All specific about how to scoring,
     *                        ordering, snippeting and resulting will be ignored.
     * @param executor        Executor on which to invoke the callback.
     * @param callback Callback to receive errors resulting from removing the documents. If the
     *                 operation succeeds, the callback will be invoked with {@code null}.
     * @param callback        Callback to receive errors resulting from removing the documents. If
     *                        the operation succeeds, the callback will be invoked with
     *                        {@code null}.
     */
    public void removeByQuery(@NonNull String queryExpression,
            @NonNull SearchSpec searchSpec,
+1 −1
Original line number Diff line number Diff line
@@ -115,7 +115,7 @@ public class GlobalSearchSession {
     * @return The search result of performing this operation.
     */
    @NonNull
    public SearchResults globalQuery(
    public SearchResults query(
            @NonNull String queryExpression,
            @NonNull SearchSpec searchSpec,
            @NonNull @CallbackExecutor Executor executor) {
+14 −3
Original line number Diff line number Diff line
@@ -28,10 +28,10 @@ parcelable SearchResults;
/** {@hide} */
interface IAppSearchManager {
    /**
     * Sets the schema.
     * Updates the AppSearch schema for this database.
     *
     * @param databaseName  The databaseName this document resides in.
     * @param schemaBundles List of AppSearchSchema bundles.
     * @param databaseName  The name of the database where this schema lives.
     * @param schemaBundles List of {@link AppSearchSchema} bundles.
     * @param schemasNotPlatformSurfaceable Schema types that should not be surfaced on platform
     *     surfaces.
     * @param forceOverride Whether to apply the new schema even if it is incompatible. All
@@ -46,6 +46,17 @@ interface IAppSearchManager {
        boolean forceOverride,
        in IAppSearchResultCallback callback);


    /**
     * Retrieves the AppSearch schema for this database.
     *
     * @param databaseName  The name of the database to retrieve.
     * @param callback {@link IAppSearchResultCallback#onResult} will be called with an
     *     {@link AppSearchResult}&lt;{@link List}&lt;{@link Bundle}&gt;&gt;, where the value are
     *     AppSearchSchema bundle.
     */
    void getSchema(in String databaseName, in IAppSearchResultCallback callback);

    /**
     * Inserts documents into the index.
     *
+1 −1
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@ public class SearchResults implements Closeable {
     * <p>Re-call this method to get next page of {@link SearchResult}, until it returns an
     * empty list.
     *
     * <p>The page size is set by {@link SearchSpec.Builder#setNumPerPage}.
     * <p>The page size is set by {@link SearchSpec.Builder#setResultCountPerPage}.
     *
     * @param callback Callback to receive the pending result of performing this operation.
     */
+26 −0
Original line number Diff line number Diff line
@@ -89,6 +89,32 @@ public class AppSearchManagerService extends SystemService {
            }
        }

        @Override
        public void getSchema(
                @NonNull String databaseName,
                @NonNull IAppSearchResultCallback callback) {
            Preconditions.checkNotNull(databaseName);
            Preconditions.checkNotNull(callback);
            int callingUid = Binder.getCallingUidOrThrow();
            int callingUserId = UserHandle.getUserId(callingUid);
            final long callingIdentity = Binder.clearCallingIdentity();
            try {
                AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
                databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid);
                List<AppSearchSchema> schemas = impl.getSchema(databaseName);
                List<Bundle> schemaBundles = new ArrayList<>(schemas.size());
                for (int i = 0; i < schemas.size(); i++) {
                    schemaBundles.add(schemas.get(i).getBundle());
                }
                invokeCallbackOnResult(callback,
                        AppSearchResult.newSuccessfulResult(schemaBundles));
            } catch (Throwable t) {
                invokeCallbackOnError(callback, t);
            } finally {
                Binder.restoreCallingIdentity(callingIdentity);
            }
        }

        @Override
        public void putDocuments(
                @NonNull String databaseName,