Merge "Merge request objects from Jetpack into Framework."

This commit is contained in:
Alexander Dorokhine
2020-10-17 02:51:56 +00:00
committed by Android (Google) Code Review
5 changed files with 411 additions and 49 deletions

View File

@@ -22,9 +22,9 @@ import android.os.Bundle;
import android.os.RemoteException;
import com.android.internal.infra.AndroidFuture;
import com.android.internal.util.Preconditions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@@ -96,46 +96,23 @@ public class AppSearchManager {
* <p>It is a no-op to set the same schema as has been previously set; this is handled
* efficiently.
*
* @param schemas The schema configs for the types used by the calling app.
* @param request The schema update request.
* @return the result of performing this operation.
*
* @hide
*/
@NonNull
public AppSearchResult<Void> setSchema(@NonNull AppSearchSchema... schemas) {
return setSchema(Arrays.asList(schemas), /*forceOverride=*/false);
}
/**
* Sets the schema being used by documents provided to the {@link #putDocuments} method.
*
* <p>This method is similar to {@link #setSchema(AppSearchSchema...)}, except for the
* {@code forceOverride} parameter. If a backwards-incompatible schema is specified but the
* {@code forceOverride} parameter is set to {@code true}, instead of returning an
* {@link AppSearchResult} with the {@link AppSearchResult#RESULT_INVALID_SCHEMA} code, all
* documents which are not compatible with the new schema will be deleted and the incompatible
* schema will be applied.
*
* @param schemas The schema configs for the types used by the calling app.
* @param forceOverride Whether to force the new schema to be applied even if there are
* incompatible changes versus the previously set schema. Documents which are incompatible
* with the new schema will be deleted.
* @return the result of performing this operation.
*
* @hide
*/
@NonNull
public AppSearchResult<Void> setSchema(
@NonNull List<AppSearchSchema> schemas, boolean forceOverride) {
public AppSearchResult<Void> setSchema(@NonNull SetSchemaRequest request) {
Preconditions.checkNotNull(request);
// TODO: This should use com.android.internal.infra.RemoteStream or another mechanism to
// avoid binder limits.
List<Bundle> schemaBundles = new ArrayList<>(schemas.size());
for (AppSearchSchema schema : schemas) {
List<Bundle> schemaBundles = new ArrayList<>(request.getSchemas().size());
for (AppSearchSchema schema : request.getSchemas()) {
schemaBundles.add(schema.getBundle());
}
AndroidFuture<AppSearchResult> future = new AndroidFuture<>();
try {
mService.setSchema(schemaBundles, forceOverride, future);
mService.setSchema(schemaBundles, request.isForceOverride(), future);
} catch (RemoteException e) {
future.completeExceptionally(e);
}
@@ -151,19 +128,20 @@ public class AppSearchManager {
* <p>Each {@link GenericDocument}'s {@code schemaType} field must be set to the name of a
* schema type previously registered via the {@link #setSchema} method.
*
* @param documents {@link GenericDocument}s that need to be indexed.
* @return An {@link AppSearchBatchResult} mapping the document URIs to {@link Void} if they
* were successfully indexed, or a {@link Throwable} describing the failure if they could
* not be indexed.
* @param request {@link PutDocumentsRequest} containing documents to be indexed
* @return The pending result of performing this operation. The keys of the returned
* {@link AppSearchBatchResult} are the URIs of the input documents. The values are
* {@code null} if they were successfully indexed, or a failed {@link AppSearchResult}
* otherwise.
* @hide
*/
public AppSearchBatchResult<String, Void> putDocuments(
@NonNull List<GenericDocument> documents) {
public AppSearchBatchResult<String, Void> putDocuments(@NonNull PutDocumentsRequest request) {
// TODO(b/146386470): Transmit these documents as a RemoteStream instead of sending them in
// one big list.
List<GenericDocument> documents = request.getDocuments();
List<Bundle> documentBundles = new ArrayList<>(documents.size());
for (GenericDocument document : documents) {
documentBundles.add(document.getBundle());
for (int i = 0; i < documents.size(); i++) {
documentBundles.add(documents.get(i).getBundle());
}
AndroidFuture<AppSearchBatchResult> future = new AndroidFuture<>();
try {
@@ -180,15 +158,18 @@ public class AppSearchManager {
* <p>You should not call this method directly; instead, use the
* {@code AppSearch#getDocuments()} API provided by JetPack.
*
* @param uris URIs of the documents to look up.
* @return An {@link AppSearchBatchResult} mapping the document URIs to
* {@link GenericDocument} values if they were successfully retrieved, a {@code null}
* failure if they were not found, or a {@link Throwable} failure describing the problem if
* an error occurred.
* @param request {@link GetByUriRequest} containing URIs to be retrieved.
* @return The pending result of performing this operation. The keys of the returned
* {@link AppSearchBatchResult} are the input URIs. The values are the returned
* {@link GenericDocument}s on success, or a failed {@link AppSearchResult} otherwise.
* URIs that are not found will return a failed {@link AppSearchResult} with a result code
* of {@link AppSearchResult#RESULT_NOT_FOUND}.
*/
public AppSearchBatchResult<String, GenericDocument> getDocuments(@NonNull List<String> uris) {
public AppSearchBatchResult<String, GenericDocument> getByUri(
@NonNull GetByUriRequest request) {
// TODO(b/146386470): Transmit the result documents as a RemoteStream instead of sending
// them in one big list.
List<String> uris = new ArrayList<>(request.getUris());
AndroidFuture<AppSearchBatchResult> future = new AndroidFuture<>();
try {
mService.getDocuments(uris, future);
@@ -300,12 +281,15 @@ public class AppSearchManager {
* <p>You should not call this method directly; instead, use the {@code AppSearch#delete()} API
* provided by JetPack.
*
* @param uris URIs of the documents to delete
* @return An {@link AppSearchBatchResult} mapping each URI to a {@code null} success if
* deletion was successful, to a {@code null} failure if the document did not exist, or to a
* {@code throwable} failure if deletion failed for another reason.
* @param request Request containing URIs to be removed.
* @return The pending result of performing this operation. The keys of the returned
* {@link AppSearchBatchResult} are the input URIs. The values are {@code null} on success,
* or a failed {@link AppSearchResult} otherwise. URIs that are not found will return a
* failed {@link AppSearchResult} with a result code of
* {@link AppSearchResult#RESULT_NOT_FOUND}.
*/
public AppSearchBatchResult<String, Void> delete(@NonNull List<String> uris) {
public AppSearchBatchResult<String, Void> removeByUri(@NonNull RemoveByUriRequest request) {
List<String> uris = new ArrayList<>(request.getUris());
AndroidFuture<AppSearchBatchResult> future = new AndroidFuture<>();
try {
mService.delete(uris, future);

View File

@@ -0,0 +1,100 @@
/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.app.appsearch;
import android.annotation.NonNull;
import android.util.ArraySet;
import com.android.internal.util.Preconditions;
import java.util.Arrays;
import java.util.Collection;
import java.util.Set;
/**
* Encapsulates a request to retrieve documents by namespace and URI.
*
* @see AppSearchManager#getByUri
* @hide
*/
public final class GetByUriRequest {
private final String mNamespace;
private final Set<String> mUris;
GetByUriRequest(@NonNull String namespace, @NonNull Set<String> uris) {
mNamespace = namespace;
mUris = uris;
}
/** @hide */
@NonNull
public String getNamespace() {
return mNamespace;
}
/** @hide */
@NonNull
public Set<String> getUris() {
return mUris;
}
/** Builder for {@link GetByUriRequest} objects. */
public static final class Builder {
private String mNamespace = GenericDocument.DEFAULT_NAMESPACE;
private final Set<String> mUris = new ArraySet<>();
private boolean mBuilt = false;
/**
* Sets which namespace these documents will be retrieved from.
*
* <p>If this is not set, it defaults to {@link GenericDocument#DEFAULT_NAMESPACE}.
*/
@NonNull
public Builder setNamespace(@NonNull String namespace) {
Preconditions.checkState(!mBuilt, "Builder has already been used");
Preconditions.checkNotNull(namespace);
mNamespace = namespace;
return this;
}
/** Adds one or more URIs to the request. */
@NonNull
public Builder addUris(@NonNull String... uris) {
Preconditions.checkNotNull(uris);
return addUris(Arrays.asList(uris));
}
/** Adds one or more URIs to the request. */
@NonNull
public Builder addUris(@NonNull Collection<String> uris) {
Preconditions.checkState(!mBuilt, "Builder has already been used");
Preconditions.checkNotNull(uris);
mUris.addAll(uris);
return this;
}
/** Builds a new {@link GetByUriRequest}. */
@NonNull
public GetByUriRequest build() {
Preconditions.checkState(!mBuilt, "Builder has already been used");
mBuilt = true;
return new GetByUriRequest(mNamespace, mUris);
}
}
}

View File

@@ -0,0 +1,77 @@
/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.app.appsearch;
import android.annotation.NonNull;
import com.android.internal.util.Preconditions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* Encapsulates a request to index a document into an {@link AppSearchManager} database.
*
* @see AppSearchManager#putDocuments
* @hide
*/
public final class PutDocumentsRequest {
private final List<GenericDocument> mDocuments;
PutDocumentsRequest(List<GenericDocument> documents) {
mDocuments = documents;
}
/** @hide */
@NonNull
public List<GenericDocument> getDocuments() {
return mDocuments;
}
/** Builder for {@link PutDocumentsRequest} objects. */
public static final class Builder {
private final List<GenericDocument> mDocuments = new ArrayList<>();
private boolean mBuilt = false;
/** Adds one or more documents to the request. */
@NonNull
public Builder addGenericDocument(@NonNull GenericDocument... documents) {
Preconditions.checkNotNull(documents);
return addGenericDocument(Arrays.asList(documents));
}
/** Adds one or more documents to the request. */
@NonNull
public Builder addGenericDocument(@NonNull Collection<GenericDocument> documents) {
Preconditions.checkState(!mBuilt, "Builder has already been used");
Preconditions.checkNotNull(documents);
mDocuments.addAll(documents);
return this;
}
/** Builds a new {@link PutDocumentsRequest}. */
@NonNull
public PutDocumentsRequest build() {
Preconditions.checkState(!mBuilt, "Builder has already been used");
mBuilt = true;
return new PutDocumentsRequest(mDocuments);
}
}
}

View File

@@ -0,0 +1,100 @@
/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.app.appsearch;
import android.annotation.NonNull;
import android.util.ArraySet;
import com.android.internal.util.Preconditions;
import java.util.Arrays;
import java.util.Collection;
import java.util.Set;
/**
* Encapsulates a request to remove documents by namespace and URI.
*
* @see AppSearchManager#removeByUri
* @hide
*/
public final class RemoveByUriRequest {
private final String mNamespace;
private final Set<String> mUris;
RemoveByUriRequest(String namespace, Set<String> uris) {
mNamespace = namespace;
mUris = uris;
}
/** @hide */
@NonNull
public String getNamespace() {
return mNamespace;
}
/** @hide */
@NonNull
public Set<String> getUris() {
return mUris;
}
/** Builder for {@link RemoveByUriRequest} objects. */
public static final class Builder {
private String mNamespace = GenericDocument.DEFAULT_NAMESPACE;
private final Set<String> mUris = new ArraySet<>();
private boolean mBuilt = false;
/**
* Sets which namespace these documents will be removed from.
*
* <p>If this is not set, it defaults to {@link GenericDocument#DEFAULT_NAMESPACE}.
*/
@NonNull
public Builder setNamespace(@NonNull String namespace) {
Preconditions.checkState(!mBuilt, "Builder has already been used");
Preconditions.checkNotNull(namespace);
mNamespace = namespace;
return this;
}
/** Adds one or more URIs to the request. */
@NonNull
public Builder addUris(@NonNull String... uris) {
Preconditions.checkNotNull(uris);
return addUris(Arrays.asList(uris));
}
/** Adds one or more URIs to the request. */
@NonNull
public Builder addUris(@NonNull Collection<String> uris) {
Preconditions.checkState(!mBuilt, "Builder has already been used");
Preconditions.checkNotNull(uris);
mUris.addAll(uris);
return this;
}
/** Builds a new {@link RemoveByUriRequest}. */
@NonNull
public RemoveByUriRequest build() {
Preconditions.checkState(!mBuilt, "Builder has already been used");
mBuilt = true;
return new RemoveByUriRequest(mNamespace, mUris);
}
}
}

View File

@@ -0,0 +1,101 @@
/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.app.appsearch;
import android.annotation.NonNull;
import android.util.ArraySet;
import com.android.internal.util.Preconditions;
import java.util.Arrays;
import java.util.Collection;
import java.util.Set;
/**
* Encapsulates a request to update the schema of an {@link AppSearchManager} database.
*
* @see AppSearchManager#setSchema
* @hide
*/
public final class SetSchemaRequest {
private final Set<AppSearchSchema> mSchemas;
private final boolean mForceOverride;
SetSchemaRequest(Set<AppSearchSchema> schemas, boolean forceOverride) {
mSchemas = schemas;
mForceOverride = forceOverride;
}
/** @hide */
@NonNull
public Set<AppSearchSchema> getSchemas() {
return mSchemas;
}
/** @hide */
public boolean isForceOverride() {
return mForceOverride;
}
/** Builder for {@link SetSchemaRequest} objects. */
public static final class Builder {
private final Set<AppSearchSchema> mSchemas = new ArraySet<>();
private boolean mForceOverride = false;
private boolean mBuilt = false;
/** Adds one or more types to the schema. */
@NonNull
public Builder addSchema(@NonNull AppSearchSchema... schemas) {
Preconditions.checkNotNull(schemas);
return addSchema(Arrays.asList(schemas));
}
/** Adds one or more types to the schema. */
@NonNull
public Builder addSchema(@NonNull Collection<AppSearchSchema> schemas) {
Preconditions.checkState(!mBuilt, "Builder has already been used");
Preconditions.checkNotNull(schemas);
mSchemas.addAll(schemas);
return this;
}
/**
* Configures the {@link SetSchemaRequest} to delete any existing documents that don't
* follow the new schema.
*
* <p>By default, this is {@code false} and schema incompatibility causes the
* {@link AppSearchManager#setSchema} call to fail.
*
* @see AppSearchManager#setSchema
*/
@NonNull
public Builder setForceOverride(boolean forceOverride) {
mForceOverride = forceOverride;
return this;
}
/** Builds a new {@link SetSchemaRequest}. */
@NonNull
public SetSchemaRequest build() {
Preconditions.checkState(!mBuilt, "Builder has already been used");
mBuilt = true;
return new SetSchemaRequest(mSchemas, mForceOverride);
}
}
}