diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java index 531436ecaf0c4..fd4b1060bcd1b 100644 --- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java +++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java @@ -307,6 +307,41 @@ 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}. + * + *

An empty {@code queryExpression} matches all documents. + * + *

An empty set of namespaces or schemaTypes matches all namespaces or schemaTypes in + * 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}. + */ + public void removeByQuery(@NonNull String queryExpression, + @NonNull SearchSpec searchSpec, + @NonNull @CallbackExecutor Executor executor, + @NonNull Consumer> callback) { + Objects.requireNonNull(queryExpression); + Objects.requireNonNull(searchSpec); + Objects.requireNonNull(executor); + Objects.requireNonNull(callback); + try { + mService.removeByQuery(mDatabaseName, queryExpression, searchSpec.getBundle(), + new IAppSearchResultCallback.Stub() { + public void onResult(AppSearchResult result) { + executor.execute(() -> callback.accept(result)); + } + }); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + // TODO(b/162450968) port query() and SearchResults.java to platform. - // TODO(b/162450968) port removeByQuery() to platform. } diff --git a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl index 4a981022da738..62e60d7f4ab5d 100644 --- a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl +++ b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl @@ -119,13 +119,14 @@ interface IAppSearchManager { * @param databaseName The databaseName this query for. * @param queryExpression String to search for * @param searchSpecBundle SearchSpec bundle - * @param callback {@link AndroidFuture}<{@link AppSearchResult}<{@link SearchResults}>> + * @param callback {@link IAppSearchResultCallback#onResult} will be called with an + * {@link AppSearchResult}<{@link Void}>. */ void removeByQuery( in String databaseName, in String queryExpression, in Bundle searchSpecBundle, - in AndroidFuture callback); + in IAppSearchResultCallback callback); /** * Creates and initializes AppSearchImpl for the calling app. 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 8269799d5a0d6..c9dd89c3b6d15 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java @@ -225,21 +225,21 @@ public class AppSearchManagerService extends SystemService { @NonNull String databaseName, @NonNull String queryExpression, @NonNull Bundle searchSpecBundle, - @NonNull AndroidFuture callback) { + @NonNull IAppSearchResultCallback callback) { Preconditions.checkNotNull(databaseName); Preconditions.checkNotNull(queryExpression); Preconditions.checkNotNull(searchSpecBundle); - 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); - impl.removeByQuery(databaseName, queryExpression, new SearchSpec(searchSpecBundle)); - callback.complete(AppSearchResult.newSuccessfulResult(/*result= */null)); + impl.removeByQuery(databaseName, queryExpression, + new SearchSpec(searchSpecBundle)); + invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(null)); } catch (Throwable t) { - callback.complete(throwableToFailedResult(t)); + invokeCallbackOnError(callback, t); } finally { Binder.restoreCallingIdentity(callingIdentity); }