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: I8e97304fedd446b88393eb6ca5b42c2e210e3271
This commit is contained in:
Terry Wang
2020-12-09 21:00:18 -08:00
parent f202279b2d
commit 79c45aaa3c
5 changed files with 99 additions and 11 deletions

View File

@@ -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,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.
*
@@ -369,7 +417,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 +425,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,

View File

@@ -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) {

View File

@@ -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.
*

View File

@@ -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.
*/

View File

@@ -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,