Merge changes from topic "revert-21047830-autofill-pcc-apis-MBFYLBLCKB"

* changes:
  Revert "Add Autofill PCC Detection APIs for Autofill Providers"
  Revert "API to allow Autofill Providers to give detection result..."
This commit is contained in:
Adrian Roos
2023-02-08 13:43:35 +00:00
committed by Android (Google) Code Review
8 changed files with 31 additions and 272 deletions

View File

@@ -39475,7 +39475,6 @@ package android.service.autofill {
method @NonNull public android.service.autofill.Dataset build();
method @NonNull public android.service.autofill.Dataset.Builder setAuthentication(@Nullable android.content.IntentSender);
method @NonNull public android.service.autofill.Dataset.Builder setField(@NonNull android.view.autofill.AutofillId, @Nullable android.service.autofill.Field);
method @NonNull public android.service.autofill.Dataset.Builder setField(@NonNull String, @NonNull android.service.autofill.Field);
method @NonNull public android.service.autofill.Dataset.Builder setId(@Nullable String);
method @Deprecated @NonNull public android.service.autofill.Dataset.Builder setInlinePresentation(@NonNull android.service.autofill.InlinePresentation);
method @Deprecated @NonNull public android.service.autofill.Dataset.Builder setInlinePresentation(@NonNull android.service.autofill.InlinePresentation, @NonNull android.service.autofill.InlinePresentation);
@@ -39584,7 +39583,6 @@ package android.service.autofill {
method @Nullable public android.content.IntentSender getDelayedFillIntentSender();
method @NonNull public java.util.List<android.service.autofill.FillContext> getFillContexts();
method public int getFlags();
method @NonNull public java.util.List<java.lang.String> getHints();
method public int getId();
method @Nullable public android.view.inputmethod.InlineSuggestionsRequest getInlineSuggestionsRequest();
method public void writeToParcel(@NonNull android.os.Parcel, int);
@@ -39613,7 +39611,6 @@ package android.service.autofill {
method @Deprecated @NonNull public android.service.autofill.FillResponse.Builder setAuthentication(@NonNull android.view.autofill.AutofillId[], @Nullable android.content.IntentSender, @Nullable android.widget.RemoteViews, @Nullable android.service.autofill.InlinePresentation, @Nullable android.service.autofill.InlinePresentation);
method @NonNull public android.service.autofill.FillResponse.Builder setAuthentication(@NonNull android.view.autofill.AutofillId[], @Nullable android.content.IntentSender, @Nullable android.service.autofill.Presentations);
method @NonNull public android.service.autofill.FillResponse.Builder setClientState(@Nullable android.os.Bundle);
method @NonNull public android.service.autofill.FillResponse.Builder setDetectedFieldClassifications(@NonNull java.util.Set<android.service.assist.classification.FieldClassification>);
method @NonNull public android.service.autofill.FillResponse.Builder setDialogHeader(@NonNull android.widget.RemoteViews);
method @NonNull public android.service.autofill.FillResponse.Builder setFieldClassificationIds(@NonNull android.view.autofill.AutofillId...);
method @NonNull public android.service.autofill.FillResponse.Builder setFillDialogTriggerIds(@NonNull android.view.autofill.AutofillId...);

View File

@@ -2529,7 +2529,6 @@ package android.service.autofill {
public final class Dataset implements android.os.Parcelable {
method @Nullable public android.content.IntentSender getAuthentication();
method @Nullable public java.util.ArrayList<java.lang.String> getAutofillDatatypes();
method @Nullable public android.content.ClipData getFieldContent();
method @Nullable public java.util.ArrayList<android.view.autofill.AutofillId> getFieldIds();
method @Nullable public java.util.ArrayList<android.view.autofill.AutofillValue> getFieldValues();
@@ -2550,7 +2549,6 @@ package android.service.autofill {
}
public final class FillResponse implements android.os.Parcelable {
method @NonNull public java.util.Set<android.service.assist.classification.FieldClassification> getDetectedFieldClassifications();
method public int getFlags();
}
@@ -3280,7 +3278,6 @@ package android.view.autofill {
field public static final String DEVICE_CONFIG_AUTOFILL_CREDENTIAL_MANAGER_IGNORE_VIEWS = "autofill_credential_manager_ignore_views";
field public static final String DEVICE_CONFIG_AUTOFILL_DIALOG_ENABLED = "autofill_dialog_enabled";
field public static final String DEVICE_CONFIG_AUTOFILL_PCC_CLASSIFICATION_ENABLED = "pcc_classification_enabled";
field public static final String DEVICE_CONFIG_AUTOFILL_PCC_FEATURE_PROVIDER_HINTS = "pcc_classification_hints";
field public static final String DEVICE_CONFIG_AUTOFILL_SMART_SUGGESTION_SUPPORTED_MODES = "smart_suggestion_supported_modes";
field public static final String DEVICE_CONFIG_NON_AUTOFILLABLE_IME_ACTION_IDS = "non_autofillable_ime_action_ids";
field public static final String DEVICE_CONFIG_PACKAGE_DENYLIST_FOR_UNIMPORTANT_VIEW = "package_deny_list_for_unimportant_view";

View File

@@ -120,8 +120,6 @@ public final class Dataset implements Parcelable {
private final ArrayList<InlinePresentation> mFieldInlinePresentations;
private final ArrayList<InlinePresentation> mFieldInlineTooltipPresentations;
private final ArrayList<DatasetFieldFilter> mFieldFilters;
private final ArrayList<String> mAutofillDatatypes;
@Nullable private final ClipData mFieldContent;
private final RemoteViews mPresentation;
private final RemoteViews mDialogPresentation;
@@ -145,14 +143,6 @@ public final class Dataset implements Parcelable {
mInlineTooltipPresentation = builder.mInlineTooltipPresentation;
mAuthentication = builder.mAuthentication;
mId = builder.mId;
mAutofillDatatypes = builder.mAutofillDatatypes;
}
/** @hide */
@TestApi
@SuppressLint({"ConcreteCollection", "NullableCollection"})
public @Nullable ArrayList<String> getAutofillDatatypes() {
return mAutofillDatatypes;
}
/** @hide */
@@ -303,7 +293,6 @@ public final class Dataset implements Parcelable {
private ArrayList<InlinePresentation> mFieldInlinePresentations;
private ArrayList<InlinePresentation> mFieldInlineTooltipPresentations;
private ArrayList<DatasetFieldFilter> mFieldFilters;
private ArrayList<String> mAutofillDatatypes;
@Nullable private ClipData mFieldContent;
private RemoteViews mPresentation;
private RemoteViews mDialogPresentation;
@@ -932,55 +921,6 @@ public final class Dataset implements Parcelable {
return this;
}
/**
* Adds a field to this Dataset with a specific type and no
* AutofillId. This is used to send back Field information
* when Autofilling with platform detections is on.
* Platform detections are on when receiving a populated list from
* FillRequest#getHints().
*
* Populate every field/type known for this user for this app.
*
* For example, if getHints() contains "username" and "password",
* a new Dataset should be created that calls this method twice,
* one for the username, then another for the password (assuming
* the only one credential pair is found for the user). If a user
* has two credential pairs, then two Datasets should be created,
* and so on.
*
* Using this will remove any data populated with
* setField(@NonNull AutofillId id, @Nullable Field field).
*
* @param hint An autofill hint returned from {@link
* FillRequest#getHints()}.
*
* @param field the fill information about the field.
*
* @throws IllegalStateException if {@link #build()} was already called
* or this builder also contains AutofillId information
*
* @return this builder.
*/
public @NonNull Dataset.Builder setField(
@NonNull String hint, @NonNull Field field) {
throwIfDestroyed();
final DatasetFieldFilter filter = field.getDatasetFieldFilter();
final Presentations presentations = field.getPresentations();
if (presentations == null) {
setLifeTheUniverseAndEverything(hint, field.getValue(), null, null, null,
filter, null);
} else {
setLifeTheUniverseAndEverything(hint, field.getValue(),
presentations.getMenuPresentation(),
presentations.getInlinePresentation(),
presentations.getInlineTooltipPresentation(), filter,
presentations.getDialogPresentation());
}
return this;
}
/**
* Sets the value of a field with an <a href="#Filtering">explicit filter</a>, and using an
* {@link InlinePresentation} to visualize it as an inline suggestion.
@@ -1018,32 +958,6 @@ public final class Dataset implements Parcelable {
return this;
}
private void setLifeTheUniverseAndEverything(String datatype,
@Nullable AutofillValue value,
@Nullable RemoteViews presentation,
@Nullable InlinePresentation inlinePresentation,
@Nullable InlinePresentation tooltip,
@Nullable DatasetFieldFilter filter,
@Nullable RemoteViews dialogPresentation) {
if (mAutofillDatatypes == null) {
mFieldValues = new ArrayList<>();
mFieldPresentations = new ArrayList<>();
mFieldDialogPresentations = new ArrayList<>();
mFieldInlinePresentations = new ArrayList<>();
mFieldInlineTooltipPresentations = new ArrayList<>();
mFieldFilters = new ArrayList<>();
mAutofillDatatypes = new ArrayList<>();
mFieldIds = null;
}
mFieldValues.add(value);
mFieldPresentations.add(presentation);
mFieldDialogPresentations.add(dialogPresentation);
mFieldInlinePresentations.add(inlinePresentation);
mFieldInlineTooltipPresentations.add(tooltip);
mFieldFilters.add(filter);
mAutofillDatatypes.add(datatype);
}
private void setLifeTheUniverseAndEverything(@NonNull AutofillId id,
@Nullable AutofillValue value, @Nullable RemoteViews presentation,
@Nullable InlinePresentation inlinePresentation,
@@ -1070,7 +984,6 @@ public final class Dataset implements Parcelable {
mFieldInlinePresentations = new ArrayList<>();
mFieldInlineTooltipPresentations = new ArrayList<>();
mFieldFilters = new ArrayList<>();
mAutofillDatatypes = null;
}
mFieldIds.add(id);
mFieldValues.add(value);
@@ -1094,14 +1007,9 @@ public final class Dataset implements Parcelable {
public @NonNull Dataset build() {
throwIfDestroyed();
mDestroyed = true;
if (mFieldIds == null && mAutofillDatatypes == null) {
if (mFieldIds == null) {
throw new IllegalStateException("at least one value must be set");
}
if (mFieldIds != null && mAutofillDatatypes != null) {
if (mFieldIds.size() > 0 && mAutofillDatatypes.size() > 0) {
throw new IllegalStateException("both field and datatype were populated");
}
}
if (mFieldContent != null) {
if (mFieldIds.size() > 1) {
throw new IllegalStateException(
@@ -1143,7 +1051,6 @@ public final class Dataset implements Parcelable {
parcel.writeTypedList(mFieldInlinePresentations, flags);
parcel.writeTypedList(mFieldInlineTooltipPresentations, flags);
parcel.writeTypedList(mFieldFilters, flags);
parcel.writeStringList(mAutofillDatatypes);
parcel.writeParcelable(mFieldContent, flags);
parcel.writeParcelable(mAuthentication, flags);
parcel.writeString(mId);
@@ -1174,8 +1081,6 @@ public final class Dataset implements Parcelable {
parcel.createTypedArrayList(InlinePresentation.CREATOR);
final ArrayList<DatasetFieldFilter> filters =
parcel.createTypedArrayList(DatasetFieldFilter.CREATOR);
final ArrayList<String> datatypes =
parcel.createStringArrayList();
final ClipData fieldContent = parcel.readParcelable(null,
android.content.ClipData.class);
final IntentSender authentication = parcel.readParcelable(null,
@@ -1209,37 +1114,19 @@ public final class Dataset implements Parcelable {
builder.setContent(ids.get(0), fieldContent);
}
final int inlinePresentationsSize = inlinePresentations.size();
if (ids.size() == 0 && datatypes.size() > 0) {
for (int i = 0; i < ids.size(); i++) {
final String datatype = datatypes.get(i);
final AutofillValue value = values.get(i);
final RemoteViews fieldPresentation = presentations.get(i);
final RemoteViews fieldDialogPresentation = dialogPresentations.get(i);
final InlinePresentation fieldInlinePresentation =
i < inlinePresentationsSize ? inlinePresentations.get(i) : null;
final InlinePresentation fieldInlineTooltipPresentation =
i < inlinePresentationsSize ? inlineTooltipPresentations.get(i) : null;
final DatasetFieldFilter filter = filters.get(i);
builder.setLifeTheUniverseAndEverything(
datatype, value, fieldPresentation, fieldInlinePresentation,
fieldInlineTooltipPresentation, filter, fieldDialogPresentation);
}
} else {
for (int i = 0; i < ids.size(); i++) {
final AutofillId id = ids.get(i);
final AutofillValue value = values.get(i);
final RemoteViews fieldPresentation = presentations.get(i);
final RemoteViews fieldDialogPresentation = dialogPresentations.get(i);
final InlinePresentation fieldInlinePresentation =
i < inlinePresentationsSize ? inlinePresentations.get(i) : null;
final InlinePresentation fieldInlineTooltipPresentation =
i < inlinePresentationsSize ? inlineTooltipPresentations.get(i) : null;
final DatasetFieldFilter filter = filters.get(i);
builder.setLifeTheUniverseAndEverything(id, value, fieldPresentation,
fieldInlinePresentation, fieldInlineTooltipPresentation, filter,
fieldDialogPresentation);
}
for (int i = 0; i < ids.size(); i++) {
final AutofillId id = ids.get(i);
final AutofillValue value = values.get(i);
final RemoteViews fieldPresentation = presentations.get(i);
final RemoteViews fieldDialogPresentation = dialogPresentations.get(i);
final InlinePresentation fieldInlinePresentation =
i < inlinePresentationsSize ? inlinePresentations.get(i) : null;
final InlinePresentation fieldInlineTooltipPresentation =
i < inlinePresentationsSize ? inlineTooltipPresentations.get(i) : null;
final DatasetFieldFilter filter = filters.get(i);
builder.setLifeTheUniverseAndEverything(id, value, fieldPresentation,
fieldInlinePresentation, fieldInlineTooltipPresentation, filter,
fieldDialogPresentation);
}
builder.setAuthentication(authentication);
builder.setId(datasetId);

View File

@@ -140,19 +140,6 @@ public final class FillRequest implements Parcelable {
*/
private final @NonNull List<FillContext> mFillContexts;
/**
* Sends a list of datatypes for the Autofill Provider.
*
* If this is populated, Autofill Provider should return data
* for the autofill hints requested here,
* even though the Autofill Provider may not have detected these types.
* The hints would be part of HintConstants:
* https://developer.android.com/reference/androidx/autofill/HintConstants
*
* This is populated if the platform's field detection is enabled.
*/
private final @NonNull List<String> mHints;
/**
* Gets the latest client state bundle set by the service in a
* {@link FillResponse.Builder#setClientState(Bundle) fill response}.
@@ -209,7 +196,6 @@ public final class FillRequest implements Parcelable {
private void onConstructed() {
Preconditions.checkCollectionElementsNotNull(mFillContexts, "contexts");
Preconditions.checkCollectionElementsNotNull(mHints, "hints");
}
@@ -283,11 +269,6 @@ public final class FillRequest implements Parcelable {
* <p><b>Note:</b> Starting on Android {@link android.os.Build.VERSION_CODES#Q}, it could also
* include contexts from requests whose {@link SaveInfo} had the
* {@link SaveInfo#FLAG_DELAY_SAVE} flag.
* @param hints
* Autofill Provider should return data for the autofill hints requested here,
* even though the Autofill Provider may not have detected these types.
* The hints would be part of HintConstants:
* https://developer.android.com/reference/androidx/autofill/HintConstants
* @param clientState
* Gets the latest client state bundle set by the service in a
* {@link FillResponse.Builder#setClientState(Bundle) fill response}.
@@ -331,7 +312,6 @@ public final class FillRequest implements Parcelable {
public FillRequest(
int id,
@NonNull List<FillContext> fillContexts,
@NonNull List<String> hints,
@Nullable Bundle clientState,
@RequestFlags int flags,
@Nullable InlineSuggestionsRequest inlineSuggestionsRequest,
@@ -340,9 +320,6 @@ public final class FillRequest implements Parcelable {
this.mFillContexts = fillContexts;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mFillContexts);
this.mHints = hints;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mHints);
this.mClientState = clientState;
this.mFlags = flags;
@@ -382,17 +359,6 @@ public final class FillRequest implements Parcelable {
return mFillContexts;
}
/**
* Autofill Provider should return data for the autofill hints requested here,
* even though the Autofill Provider may not have detected these types.
* The hints would be part of HintConstants:
* https://developer.android.com/reference/androidx/autofill/HintConstants
*/
@DataClass.Generated.Member
public @NonNull List<String> getHints() {
return mHints;
}
/**
* Gets the latest client state bundle set by the service in a
* {@link FillResponse.Builder#setClientState(Bundle) fill response}.
@@ -467,7 +433,6 @@ public final class FillRequest implements Parcelable {
return "FillRequest { " +
"id = " + mId + ", " +
"fillContexts = " + mFillContexts + ", " +
"hints = " + mHints + ", " +
"clientState = " + mClientState + ", " +
"flags = " + requestFlagsToString(mFlags) + ", " +
"inlineSuggestionsRequest = " + mInlineSuggestionsRequest + ", " +
@@ -482,13 +447,12 @@ public final class FillRequest implements Parcelable {
// void parcelFieldName(Parcel dest, int flags) { ... }
byte flg = 0;
if (mClientState != null) flg |= 0x8;
if (mInlineSuggestionsRequest != null) flg |= 0x20;
if (mDelayedFillIntentSender != null) flg |= 0x40;
if (mClientState != null) flg |= 0x4;
if (mInlineSuggestionsRequest != null) flg |= 0x10;
if (mDelayedFillIntentSender != null) flg |= 0x20;
dest.writeByte(flg);
dest.writeInt(mId);
dest.writeParcelableList(mFillContexts, flags);
dest.writeStringList(mHints);
if (mClientState != null) dest.writeBundle(mClientState);
dest.writeInt(mFlags);
if (mInlineSuggestionsRequest != null) dest.writeTypedObject(mInlineSuggestionsRequest, flags);
@@ -510,20 +474,15 @@ public final class FillRequest implements Parcelable {
int id = in.readInt();
List<FillContext> fillContexts = new ArrayList<>();
in.readParcelableList(fillContexts, FillContext.class.getClassLoader());
List<String> hints = new ArrayList<>();
in.readStringList(hints);
Bundle clientState = (flg & 0x8) == 0 ? null : in.readBundle();
Bundle clientState = (flg & 0x4) == 0 ? null : in.readBundle();
int flags = in.readInt();
InlineSuggestionsRequest inlineSuggestionsRequest = (flg & 0x20) == 0 ? null : (InlineSuggestionsRequest) in.readTypedObject(InlineSuggestionsRequest.CREATOR);
IntentSender delayedFillIntentSender = (flg & 0x40) == 0 ? null : (IntentSender) in.readTypedObject(IntentSender.CREATOR);
InlineSuggestionsRequest inlineSuggestionsRequest = (flg & 0x10) == 0 ? null : (InlineSuggestionsRequest) in.readTypedObject(InlineSuggestionsRequest.CREATOR);
IntentSender delayedFillIntentSender = (flg & 0x20) == 0 ? null : (IntentSender) in.readTypedObject(IntentSender.CREATOR);
this.mId = id;
this.mFillContexts = fillContexts;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mFillContexts);
this.mHints = hints;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mHints);
this.mClientState = clientState;
this.mFlags = flags;
@@ -558,10 +517,10 @@ public final class FillRequest implements Parcelable {
};
@DataClass.Generated(
time = 1675711417112L,
time = 1675460688829L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/core/java/android/service/autofill/FillRequest.java",
inputSignatures = "public static final @android.service.autofill.FillRequest.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_PASSWORD_INPUT_TYPE\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_VIEW_NOT_FOCUSED\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_SUPPORTS_FILL_DIALOG\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_IME_SHOWING\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_RESET_FILL_DIALOG_STATE\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_PCC_DETECTION\npublic static final int INVALID_REQUEST_ID\nprivate final int mId\nprivate final @android.annotation.NonNull java.util.List<android.service.autofill.FillContext> mFillContexts\nprivate final @android.annotation.NonNull java.util.List<java.lang.String> mHints\nprivate final @android.annotation.Nullable android.os.Bundle mClientState\nprivate final @android.service.autofill.FillRequest.RequestFlags int mFlags\nprivate final @android.annotation.Nullable android.view.inputmethod.InlineSuggestionsRequest mInlineSuggestionsRequest\nprivate final @android.annotation.Nullable android.content.IntentSender mDelayedFillIntentSender\nprivate void onConstructed()\nclass FillRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genHiddenConstructor=true, genHiddenConstDefs=true)")
inputSignatures = "public static final @android.service.autofill.FillRequest.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_PASSWORD_INPUT_TYPE\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_VIEW_NOT_FOCUSED\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_SUPPORTS_FILL_DIALOG\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_IME_SHOWING\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_RESET_FILL_DIALOG_STATE\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_PCC_DETECTION\npublic static final int INVALID_REQUEST_ID\nprivate final int mId\nprivate final @android.annotation.NonNull java.util.List<android.service.autofill.FillContext> mFillContexts\nprivate final @android.annotation.Nullable android.os.Bundle mClientState\nprivate final @android.service.autofill.FillRequest.RequestFlags int mFlags\nprivate final @android.annotation.Nullable android.view.inputmethod.InlineSuggestionsRequest mInlineSuggestionsRequest\nprivate final @android.annotation.Nullable android.content.IntentSender mDelayedFillIntentSender\nprivate void onConstructed()\nclass FillRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genHiddenConstructor=true, genHiddenConstDefs=true)")
@Deprecated
private void __metadata() {}

View File

@@ -34,7 +34,6 @@ import android.content.pm.ParceledListSlice;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.service.assist.classification.FieldClassification;
import android.view.autofill.AutofillId;
import android.widget.RemoteViews;
@@ -46,7 +45,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Set;
/**
* Response for an {@link
@@ -115,7 +113,6 @@ public final class FillResponse implements Parcelable {
private final @StringRes int mServiceDisplayNameResourceId;
private final boolean mShowFillDialogIcon;
private final boolean mShowSaveDialogIcon;
private final @Nullable FieldClassification[] mDetectedFieldTypes;
private FillResponse(@NonNull Builder builder) {
mDatasets = (builder.mDatasets != null) ? new ParceledListSlice<>(builder.mDatasets) : null;
@@ -143,14 +140,6 @@ public final class FillResponse implements Parcelable {
mServiceDisplayNameResourceId = builder.mServiceDisplayNameResourceId;
mShowFillDialogIcon = builder.mShowFillDialogIcon;
mShowSaveDialogIcon = builder.mShowSaveDialogIcon;
mDetectedFieldTypes = builder.mDetectedFieldTypes;
}
/** @hide */
@TestApi
@NonNull
public Set<FieldClassification> getDetectedFieldClassifications() {
return Set.of(mDetectedFieldTypes);
}
/** @hide */
@@ -323,28 +312,6 @@ public final class FillResponse implements Parcelable {
private int mServiceDisplayNameResourceId;
private boolean mShowFillDialogIcon = true;
private boolean mShowSaveDialogIcon = true;
private FieldClassification[] mDetectedFieldTypes;
/**
* Adds a new {@link FieldClassification} to this response, to
* help the platform provide more accurate detection results.
*
* Call this when a field has been detected with a type.
*
* Altough similiarly named with {@link setFieldClassificationIds},
* it provides a different functionality - setFieldClassificationIds should
* be used when a field is only suspected to be Autofillable.
* This method should be used when a field is certainly Autofillable
* with a certain type.
*/
@NonNull
public Builder setDetectedFieldClassifications(
@NonNull Set<FieldClassification> fieldInfos) {
throwIfDestroyed();
throwIfDisableAutofillCalled();
mDetectedFieldTypes = fieldInfos.toArray(new FieldClassification[0]);
return this;
}
/**
* Triggers a custom UI before autofilling the screen with any data set in this
@@ -1155,7 +1122,6 @@ public final class FillResponse implements Parcelable {
parcel.writeParcelableArray(mIgnoredIds, flags);
parcel.writeLong(mDisableDuration);
parcel.writeParcelableArray(mFieldClassificationIds, flags);
parcel.writeParcelableArray(mDetectedFieldTypes, flags);
parcel.writeInt(mIconResourceId);
parcel.writeInt(mServiceDisplayNameResourceId);
parcel.writeBoolean(mShowFillDialogIcon);
@@ -1226,12 +1192,6 @@ public final class FillResponse implements Parcelable {
builder.setFieldClassificationIds(fieldClassifactionIds);
}
final FieldClassification[] detectedFields =
parcel.readParcelableArray(null, FieldClassification.class);
if (detectedFields != null) {
builder.setDetectedFieldClassifications(Set.of(detectedFields));
}
builder.setIconResourceId(parcel.readInt());
builder.setServiceDisplayNameResourceId(parcel.readInt());
builder.setShowFillDialogIcon(parcel.readBoolean());

View File

@@ -308,7 +308,7 @@ public final class SaveInfo implements Parcelable {
* username field, another for password).
*/
// TODO(b/113281366): improve documentation: add example, document relationship with other
// flags, etc...
// flagss, etc...
public static final int FLAG_DELAY_SAVE = 0x4;
/** @hide */
@@ -777,13 +777,17 @@ public final class SaveInfo implements Parcelable {
/**
* Builds a new {@link SaveInfo} instance.
*
* If no {@link #Builder(int, AutofillId[]) required ids},
* @throws IllegalStateException if no
* {@link #Builder(int, AutofillId[]) required ids},
* or {@link #setOptionalIds(AutofillId[]) optional ids}, or {@link #FLAG_DELAY_SAVE}
* were set, Save Dialog will only be triggered if platform detection is enabled, which
* is indicated when {@link FillRequest.getHints()} is not empty.
* were set
*/
public SaveInfo build() {
throwIfDestroyed();
Preconditions.checkState(
!ArrayUtils.isEmpty(mRequiredIds) || !ArrayUtils.isEmpty(mOptionalIds)
|| (mFlags & FLAG_DELAY_SAVE) != 0,
"must have at least one required or optional id or FLAG_DELAYED_SAVE");
mDestroyed = true;
return new SaveInfo(this);
}

View File

@@ -81,12 +81,6 @@ public class AutofillFeatureFlags {
public static final String DEVICE_CONFIG_AUTOFILL_DIALOG_ENABLED =
"autofill_dialog_enabled";
/**
* Indicates that PCC Autofill detection feature is enabled or not.
*/
public static final String DEVICE_CONFIG_AUTOFILL_PCC_FEATURE_PROVIDER_HINTS =
"pcc_classification_hints";
/**
* Sets the autofill hints allowed list for the fields that can trigger the fill dialog
* feature at Activity starting.
@@ -196,11 +190,9 @@ public class AutofillFeatureFlags {
"autofill_inline_tooltip_first_show_delay";
private static final String DIALOG_HINTS_DELIMITER = ":";
private static final String PCC_HINTS_DELIMITER = ",";
private static final boolean DEFAULT_HAS_FILL_DIALOG_UI_FEATURE = false;
private static final String DEFAULT_FILL_DIALOG_ENABLED_HINTS = "";
private static final String DEFAULT_PCC_FEATURE_PROVIDER_HINTS = "";
// CREDENTIAL MANAGER DEFAULTS
@@ -232,25 +224,6 @@ public class AutofillFeatureFlags {
DEFAULT_HAS_FILL_DIALOG_UI_FEATURE);
}
/**
* The list of datatypes that is supported by framework
* detection.
*
* @hide
*/
public static String[] getTypeHintsForProvider() {
final String typeHints = DeviceConfig.getString(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_AUTOFILL_PCC_FEATURE_PROVIDER_HINTS,
DEFAULT_PCC_FEATURE_PROVIDER_HINTS);
if (TextUtils.isEmpty(typeHints)) {
return new String[0];
}
return ArrayUtils.filter(typeHints.split(PCC_HINTS_DELIMITER), String[]::new,
(str) -> !TextUtils.isEmpty(str));
}
/**
* Gets fill dialog enabled hints.
*

View File

@@ -117,7 +117,6 @@ import android.util.Slog;
import android.util.SparseArray;
import android.util.TimeUtils;
import android.view.KeyEvent;
import android.view.autofill.AutofillFeatureFlags;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillManager.AutofillCommitReason;
@@ -147,7 +146,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -566,7 +564,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (mPendingInlineSuggestionsRequest.isServiceSupported()) {
mPendingFillRequest = new FillRequest(mPendingFillRequest.getId(),
mPendingFillRequest.getFillContexts(),
mPendingFillRequest.getHints(),
mPendingFillRequest.getClientState(),
mPendingFillRequest.getFlags(),
mPendingInlineSuggestionsRequest,
@@ -675,10 +672,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final ArrayList<FillContext> contexts =
mergePreviousSessionLocked(/* forSave= */ false);
final List<String> hints = getTypeHintsForProvider();
mDelayedFillPendingIntent = createPendingIntent(requestId);
request = new FillRequest(requestId, contexts, hints, mClientState, flags,
request = new FillRequest(requestId, contexts, mClientState, flags,
/*inlineSuggestionsRequest=*/ null,
/*delayedFillIntentSender=*/ mDelayedFillPendingIntent == null
? null
@@ -709,19 +704,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
}
/**
* Get the list of valid autofill hint types from Device flags
* Returns empty list if PCC is off or no types available
*/
private List<String> getTypeHintsForProvider() {
if (!AutofillFeatureFlags.isAutofillPccClassificationEnabled()) {
return Collections.EMPTY_LIST;
}
String[] typeHints = AutofillFeatureFlags.getTypeHintsForProvider();
return List.copyOf(Set.of(typeHints));
}
/**
* Assist Data Receiver for PCC
*/