diff options
| author | 2020-12-15 03:36:45 +0000 | |
|---|---|---|
| committer | 2020-12-15 03:36:45 +0000 | |
| commit | 115113c67cabe2b8359c5dcdfa4ad56ae05feadc (patch) | |
| tree | b4f749e61b0569edc770c90d8df87f73f001dd24 | |
| parent | f480dbb6ed1ad5f71284f0fb0cdb64f73e93dbd4 (diff) | |
| parent | 79c45aaa3c6783a1ea1ca591681f098aa044297e (diff) | |
Merge "Porting AppSearch jetpack upstream changes to platform"
5 files changed, 99 insertions, 11 deletions
diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java index 1d86595a4063..59e7807deeef 100644 --- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java +++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.os.Bundle; import android.os.ParcelableException; import android.os.RemoteException; +import android.util.ArraySet; import java.util.ArrayList; import java.util.List; @@ -33,6 +34,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 { @@ -78,7 +81,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 @@ -122,11 +125,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,43 @@ 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. + */ + public void getSchema( + @NonNull @CallbackExecutor Executor executor, + @NonNull Consumer<AppSearchResult<Set<AppSearchSchema>>> callback) { + Objects.requireNonNull(executor); + Objects.requireNonNull(callback); + try { + mService.getSchema( + mDatabaseName, + new IAppSearchResultCallback.Stub() { + public void onResult(AppSearchResult result) { + executor.execute(() -> { + if (result.isSuccess()) { + 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(AppSearchResult.newSuccessfulResult(schemas)); + } else { + callback.accept(result); + } + }); + } + }); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Indexes documents into AppSearch. * * <p>Each {@link GenericDocument}'s {@code schemaType} field must be set to the name of a @@ -368,7 +416,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. * @@ -376,10 +424,13 @@ public final class AppSearchSession { * the current database. * * @param queryExpression Query String to search. - * @param searchSpec Defines what and how to remove - * @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 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}. */ public void removeByQuery(@NonNull String queryExpression, @NonNull SearchSpec searchSpec, diff --git a/apex/appsearch/framework/java/android/app/appsearch/GlobalSearchSession.java b/apex/appsearch/framework/java/android/app/appsearch/GlobalSearchSession.java index d2aa8eab4708..07938b704f11 100644 --- a/apex/appsearch/framework/java/android/app/appsearch/GlobalSearchSession.java +++ b/apex/appsearch/framework/java/android/app/appsearch/GlobalSearchSession.java @@ -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) { diff --git a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl index 1d7cb87131c0..7883046f258e 100644 --- a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl +++ b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl @@ -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}<{@link List}<{@link Bundle}>>, where the value are + * AppSearchSchema bundle. + */ + void getSchema(in String databaseName, in IAppSearchResultCallback callback); + /** * Inserts documents into the index. * diff --git a/apex/appsearch/framework/java/android/app/appsearch/SearchResults.java b/apex/appsearch/framework/java/android/app/appsearch/SearchResults.java index 8548d209c787..7d3ea8bc132d 100644 --- a/apex/appsearch/framework/java/android/app/appsearch/SearchResults.java +++ b/apex/appsearch/framework/java/android/app/appsearch/SearchResults.java @@ -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. */ diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java index 551347c5c202..15128253b765 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java @@ -90,6 +90,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, @NonNull List<Bundle> documentBundles, |