Loading apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java +21 −0 Original line number Diff line number Diff line Loading @@ -354,6 +354,27 @@ public class AppSearchManager { return getFutureOrThrow(future); } /** * Deletes {@link android.app.appsearch.AppSearch.Document}s by schema type. * * <p>You should not call this method directly; instead, use the * {@code AppSearch#deleteByType()} API provided by JetPack. * * @param schemaTypes Schema types whose documents to delete. * @return An {@link AppSearchBatchResult} mapping each schema type to a {@code null} success if * deletion was successful, to a {@code null} failure if the type did not exist, or to a * {@code throwable} failure if deletion failed for another reason. */ public AppSearchBatchResult<String, Void> deleteByTypes(@NonNull List<String> schemaTypes) { AndroidFuture<AppSearchBatchResult> future = new AndroidFuture<>(); try { mService.deleteByTypes(schemaTypes, future); } catch (RemoteException e) { future.completeExceptionally(e); } return getFutureOrThrow(future); } /** Deletes all documents owned by the calling app. */ public AppSearchResult<Void> deleteAll() { AndroidFuture<AppSearchResult> future = new AndroidFuture<>(); Loading apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl +15 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,21 @@ interface IAppSearchManager { */ void delete(in List<String> uris, in AndroidFuture<AppSearchBatchResult> callback); /** * Deletes documents by schema type. * * @param schemaTypes The schema types of the documents to delete * @param callback * {@link AndroidFuture}<{@link AppSearchBatchResult}<{@link String}, {@link Void}>>. * If the call fails to start, {@code callback} will be completed exceptionally. Otherwise, * {@code callback} will be completed with an * {@link AppSearchBatchResult}<{@link String}, {@link Void}> * where the keys are schema types. If a schema type doesn't exist, it will be reported as a * failure where the {@code throwable} is {@code null}. */ void deleteByTypes( in List<String> schemaTypes, in AndroidFuture<AppSearchBatchResult> callback); /** * Deletes all documents belonging to the calling app. * Loading apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +35 −0 Original line number Diff line number Diff line Loading @@ -213,6 +213,41 @@ public class AppSearchManagerService extends SystemService { } } @Override public void deleteByTypes( List<String> schemaTypes, AndroidFuture<AppSearchBatchResult> callback) { Preconditions.checkNotNull(schemaTypes); Preconditions.checkNotNull(callback); int callingUid = Binder.getCallingUidOrThrow(); int callingUserId = UserHandle.getUserId(callingUid); long callingIdentity = Binder.clearCallingIdentity(); try { AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); AppSearchBatchResult.Builder<String, Void> resultBuilder = new AppSearchBatchResult.Builder<>(); for (int i = 0; i < schemaTypes.size(); i++) { String schemaType = schemaTypes.get(i); try { if (!impl.deleteByType(callingUid, schemaType)) { resultBuilder.setFailure( schemaType, AppSearchResult.RESULT_NOT_FOUND, /*errorMessage=*/ null); } else { resultBuilder.setSuccess(schemaType, /*value=*/ null); } } catch (Throwable t) { resultBuilder.setResult(schemaType, throwableToFailedResult(t)); } } callback.complete(resultBuilder.build()); } catch (Throwable t) { callback.completeExceptionally(t); } finally { Binder.restoreCallingIdentity(callingIdentity); } } @Override public void deleteAll(@NonNull AndroidFuture<AppSearchResult> callback) { Preconditions.checkNotNull(callback); Loading apex/appsearch/service/java/com/android/server/appsearch/impl/AppSearchImpl.java +7 −0 Original line number Diff line number Diff line Loading @@ -230,6 +230,13 @@ public final class AppSearchImpl { return mFakeIcing.delete(uri); } /** Deletes all documents having the given {@code schemaType}. */ public boolean deleteByType(int callingUid, @NonNull String schemaType) { String typePrefix = getTypePrefix(callingUid); String qualifiedType = typePrefix + schemaType; return mFakeIcing.deleteByType(qualifiedType); } /** * Deletes all documents owned by the calling app. * Loading apex/appsearch/service/java/com/android/server/appsearch/impl/FakeIcing.java +19 −0 Original line number Diff line number Diff line Loading @@ -157,6 +157,25 @@ public class FakeIcing { } } /** * Deletes all documents having the given type. * * @return true if any documents were deleted. */ public boolean deleteByType(@NonNull String type) { boolean deletedAny = false; for (int i = 0; i < mDocStore.size(); i++) { DocumentProto document = mDocStore.valueAt(i); if (type.equals(document.getSchema())) { mDocStore.removeAt(i); mUriToDocIdMap.remove(document.getUri()); i--; deletedAny = true; } } return deletedAny; } private void indexDocument(int docId, DocumentProto document) { for (PropertyProto property : document.getPropertiesList()) { for (String stringValue : property.getStringValuesList()) { Loading Loading
apex/appsearch/framework/java/android/app/appsearch/AppSearchManager.java +21 −0 Original line number Diff line number Diff line Loading @@ -354,6 +354,27 @@ public class AppSearchManager { return getFutureOrThrow(future); } /** * Deletes {@link android.app.appsearch.AppSearch.Document}s by schema type. * * <p>You should not call this method directly; instead, use the * {@code AppSearch#deleteByType()} API provided by JetPack. * * @param schemaTypes Schema types whose documents to delete. * @return An {@link AppSearchBatchResult} mapping each schema type to a {@code null} success if * deletion was successful, to a {@code null} failure if the type did not exist, or to a * {@code throwable} failure if deletion failed for another reason. */ public AppSearchBatchResult<String, Void> deleteByTypes(@NonNull List<String> schemaTypes) { AndroidFuture<AppSearchBatchResult> future = new AndroidFuture<>(); try { mService.deleteByTypes(schemaTypes, future); } catch (RemoteException e) { future.completeExceptionally(e); } return getFutureOrThrow(future); } /** Deletes all documents owned by the calling app. */ public AppSearchResult<Void> deleteAll() { AndroidFuture<AppSearchResult> future = new AndroidFuture<>(); Loading
apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl +15 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,21 @@ interface IAppSearchManager { */ void delete(in List<String> uris, in AndroidFuture<AppSearchBatchResult> callback); /** * Deletes documents by schema type. * * @param schemaTypes The schema types of the documents to delete * @param callback * {@link AndroidFuture}<{@link AppSearchBatchResult}<{@link String}, {@link Void}>>. * If the call fails to start, {@code callback} will be completed exceptionally. Otherwise, * {@code callback} will be completed with an * {@link AppSearchBatchResult}<{@link String}, {@link Void}> * where the keys are schema types. If a schema type doesn't exist, it will be reported as a * failure where the {@code throwable} is {@code null}. */ void deleteByTypes( in List<String> schemaTypes, in AndroidFuture<AppSearchBatchResult> callback); /** * Deletes all documents belonging to the calling app. * Loading
apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +35 −0 Original line number Diff line number Diff line Loading @@ -213,6 +213,41 @@ public class AppSearchManagerService extends SystemService { } } @Override public void deleteByTypes( List<String> schemaTypes, AndroidFuture<AppSearchBatchResult> callback) { Preconditions.checkNotNull(schemaTypes); Preconditions.checkNotNull(callback); int callingUid = Binder.getCallingUidOrThrow(); int callingUserId = UserHandle.getUserId(callingUid); long callingIdentity = Binder.clearCallingIdentity(); try { AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); AppSearchBatchResult.Builder<String, Void> resultBuilder = new AppSearchBatchResult.Builder<>(); for (int i = 0; i < schemaTypes.size(); i++) { String schemaType = schemaTypes.get(i); try { if (!impl.deleteByType(callingUid, schemaType)) { resultBuilder.setFailure( schemaType, AppSearchResult.RESULT_NOT_FOUND, /*errorMessage=*/ null); } else { resultBuilder.setSuccess(schemaType, /*value=*/ null); } } catch (Throwable t) { resultBuilder.setResult(schemaType, throwableToFailedResult(t)); } } callback.complete(resultBuilder.build()); } catch (Throwable t) { callback.completeExceptionally(t); } finally { Binder.restoreCallingIdentity(callingIdentity); } } @Override public void deleteAll(@NonNull AndroidFuture<AppSearchResult> callback) { Preconditions.checkNotNull(callback); Loading
apex/appsearch/service/java/com/android/server/appsearch/impl/AppSearchImpl.java +7 −0 Original line number Diff line number Diff line Loading @@ -230,6 +230,13 @@ public final class AppSearchImpl { return mFakeIcing.delete(uri); } /** Deletes all documents having the given {@code schemaType}. */ public boolean deleteByType(int callingUid, @NonNull String schemaType) { String typePrefix = getTypePrefix(callingUid); String qualifiedType = typePrefix + schemaType; return mFakeIcing.deleteByType(qualifiedType); } /** * Deletes all documents owned by the calling app. * Loading
apex/appsearch/service/java/com/android/server/appsearch/impl/FakeIcing.java +19 −0 Original line number Diff line number Diff line Loading @@ -157,6 +157,25 @@ public class FakeIcing { } } /** * Deletes all documents having the given type. * * @return true if any documents were deleted. */ public boolean deleteByType(@NonNull String type) { boolean deletedAny = false; for (int i = 0; i < mDocStore.size(); i++) { DocumentProto document = mDocStore.valueAt(i); if (type.equals(document.getSchema())) { mDocStore.removeAt(i); mUriToDocIdMap.remove(document.getUri()); i--; deletedAny = true; } } return deletedAny; } private void indexDocument(int docId, DocumentProto document) { for (PropertyProto property : document.getPropertiesList()) { for (String stringValue : property.getStringValuesList()) { Loading