/* * Copyright (C) 2022 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.service.autofill; import android.annotation.NonNull; import android.annotation.Nullable; import android.view.autofill.AutofillValue; import com.android.internal.util.DataClass; import java.util.regex.Pattern; /** * This class is used to set all information of a field. Such as the {@link AutofillValue} * to be autofilled, a explicit filter, and presentations to be * visualized, etc. */ public final class Field { /** * The value to be autofilled. Pass {@code null} if you do not have the value * but the target view is a logical part of the dataset. For example, if the * dataset needs authentication and you have no access to the value. */ private @Nullable AutofillValue mValue; /** * Regex used to determine if the dataset should be shown in the autofill UI; * when {@code null}, it disables filtering on that dataset (this is the recommended * approach when {@code value} is not {@code null} and field contains sensitive data * such as passwords). * * @see Dataset.DatasetFieldFilter * @hide */ private @Nullable Dataset.DatasetFieldFilter mFilter; /** * The presentations used to visualize this field in Autofill UI. */ private @Nullable Presentations mPresentations; /* package-private */ Field( @Nullable AutofillValue value, @Nullable Dataset.DatasetFieldFilter filter, @Nullable Presentations presentations) { this.mValue = value; this.mFilter = filter; this.mPresentations = presentations; } /** * The value to be autofilled. Pass {@code null} if you do not have the value * but the target view is a logical part of the dataset. For example, if the * dataset needs authentication and you have no access to the value. */ @DataClass.Generated.Member public @Nullable AutofillValue getValue() { return mValue; } /** * Regex used to determine if the dataset should be shown in the autofill UI; * when {@code null}, it disables filtering on that dataset (this is the recommended * approach when {@code value} is not {@code null} and field contains sensitive data * such as passwords). * * @see Dataset.DatasetFieldFilter * @hide */ public @Nullable Dataset.DatasetFieldFilter getDatasetFieldFilter() { return mFilter; } /** * Regex used to determine if the dataset should be shown in the autofill UI; * when {@code null}, it disables filtering on that dataset (this is the recommended * approach when {@code value} is not {@code null} and field contains sensitive data * such as passwords). */ public @Nullable Pattern getFilter() { return mFilter == null ? null : mFilter.pattern; } /** * The presentations used to visualize this field in Autofill UI. */ public @Nullable Presentations getPresentations() { return mPresentations; } /** * A builder for {@link Field} */ public static final class Builder { private @Nullable AutofillValue mValue = null; private @Nullable Dataset.DatasetFieldFilter mFilter = null; private @Nullable Presentations mPresentations = null; private boolean mDestroyed = false; public Builder() { } /** * The value to be autofilled. Pass {@code null} if you do not have the value * but the target view is a logical part of the dataset. For example, if the * dataset needs authentication and you have no access to the value. */ public @NonNull Builder setValue(@NonNull AutofillValue value) { checkNotUsed(); mValue = value; return this; } /** * Regex used to determine if the dataset should be shown in the autofill UI; * when {@code null}, it disables filtering on that dataset (this is the recommended * approach when {@code value} is not {@code null} and field contains sensitive data * such as passwords). */ public @NonNull Builder setFilter(@Nullable Pattern value) { checkNotUsed(); mFilter = new Dataset.DatasetFieldFilter(value); return this; } /** * The presentations used to visualize this field in Autofill UI. */ public @NonNull Builder setPresentations(@NonNull Presentations value) { checkNotUsed(); mPresentations = value; return this; } /** Builds the instance. This builder should not be touched after calling this! */ public @NonNull Field build() { checkNotUsed(); mDestroyed = true; // Mark builder used Field o = new Field( mValue, mFilter, mPresentations); return o; } private void checkNotUsed() { if (mDestroyed) { throw new IllegalStateException( "This Builder should not be reused. Use a new Builder instance instead"); } } } }