/* * Copyright (C) 2017 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.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.IntentSender; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.view.View; import android.view.inputmethod.InlineSuggestionsRequest; import com.android.internal.util.DataClass; import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; /** * This class represents a request to an autofill service * to interpret the screen and provide information to the system which views are * interesting for saving and what are the possible ways to fill the inputs on * the screen if applicable. * * @see AutofillService#onFillRequest(FillRequest, android.os.CancellationSignal, FillCallback) */ @DataClass( genToString = true, genHiddenConstructor = true, genHiddenConstDefs = true) public final class FillRequest implements Parcelable { /** * Indicates autofill was explicitly requested by the user. * *
Users typically make an explicit request to autofill a screen in two situations: *
This flag is particularly useful for the second case. For example, the service could offer * a complex UI where the user can map which screen views belong to each user data, or it could * offer a simpler UI where the user picks the data for just the view used to trigger the * request (that would be the view whose * {@link android.app.assist.AssistStructure.ViewNode#isFocused()} method returns {@code true}). * *
An explicit autofill request is triggered when the * {@link android.view.autofill.AutofillManager#requestAutofill(View)} or * {@link android.view.autofill.AutofillManager#requestAutofill(View, int, android.graphics.Rect)} * is called. For example, standard {@link android.widget.TextView} views show an * {@code AUTOFILL} option in the overflow menu that triggers such request. */ public static final @RequestFlags int FLAG_MANUAL_REQUEST = 0x1; /** * Indicates this request was made using * compatibility mode. */ public static final @RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST = 0x2; /** * Indicates the request came from a password field. * * (TODO: b/141703197) Temporary fix for augmented autofill showing passwords. * * @hide */ public static final @RequestFlags int FLAG_PASSWORD_INPUT_TYPE = 0x4; /** * Indicates the view was not focused. * *
Note: Defines the flag value to 0x10, because the flag value 0x08 has been defined * in {@link AutofillManager}.
* * @hide */ public static final @RequestFlags int FLAG_VIEW_NOT_FOCUSED = 0x10; /** * Indicates the request supports fill dialog presentation for the fields, the * system will send the request when the activity just started. */ public static final @RequestFlags int FLAG_SUPPORTS_FILL_DIALOG = 0x40; /** * Indicates the ime is showing while request coming. * @hide */ public static final @RequestFlags int FLAG_IME_SHOWING = 0x80; /** * Indicates whether autofill session should reset the fill dialog state. * @hide */ public static final @RequestFlags int FLAG_RESET_FILL_DIALOG_STATE = 0x100; /** * Indicate the fill request is made for PCC detection * @hide */ public static final @RequestFlags int FLAG_PCC_DETECTION = 0x200; /** * Indicate whether the screen has credman field * @hide */ public static final @RequestFlags int FLAG_SCREEN_HAS_CREDMAN_FIELD = 0x400; /** * Indicate whether the user has focused on a credman field view. * @hide */ public static final @RequestFlags int FLAG_VIEW_REQUESTS_CREDMAN_SERVICE = 0x800; /** @hide */ public static final int INVALID_REQUEST_ID = Integer.MIN_VALUE; /** * Gets the unique id of this request. */ private final int mId; /** * Gets the contexts associated with each previous fill request. * *Note: 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.
*/
private final @NonNull List Note: Prior to Android {@link android.os.Build.VERSION_CODES#P}, only client state
* bundles set by {@link FillResponse.Builder#setClientState(Bundle)} were considered. On
* Android {@link android.os.Build.VERSION_CODES#P} and higher, bundles set in the result of
* an authenticated request through the
* {@link android.view.autofill.AutofillManager#EXTRA_CLIENT_STATE} extra are
* also considered (and take precedence when set).
*
* @return The client state.
*/
private final @Nullable Bundle mClientState;
/**
* Gets the flags associated with this request.
*
* @return any combination of {@link #FLAG_MANUAL_REQUEST},
* {@link #FLAG_SUPPORTS_FILL_DIALOG} and
* {@link #FLAG_COMPATIBILITY_MODE_REQUEST}.
*
*/
private final @RequestFlags int mFlags;
/**
* Gets the {@link InlineSuggestionsRequest} associated
* with this request.
*
* Autofill Framework will send a {@code @non-null} {@link InlineSuggestionsRequest} if
* currently inline suggestions are supported and can be displayed. If the Autofill service
* wants to show inline suggestions, they may return {@link Dataset} with valid
* {@link InlinePresentation}. The Autofill Service must set supportsInlineSuggestions in its XML to enable support
* for inline suggestions. The autofill service must first indicate that it wants to return a delayed
* {@link FillResponse} by setting {@link FillResponse#FLAG_DELAY_FILL} in a successful
* fill response. Then it can use this IntentSender to send an Intent with extra
* {@link AutofillService#EXTRA_FILL_RESPONSE} with the delayed response. Note that this may be null if a delayed fill response is not supported for
* this fill request. Note: 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
* 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.
* @param clientState
* Gets the latest client state bundle set by the service in a
* {@link FillResponse.Builder#setClientState(Bundle) fill response}.
*
* Note: Prior to Android {@link android.os.Build.VERSION_CODES#P}, only client state
* bundles set by {@link FillResponse.Builder#setClientState(Bundle)} were considered. On
* Android {@link android.os.Build.VERSION_CODES#P} and higher, bundles set in the result of
* an authenticated request through the
* {@link android.view.autofill.AutofillManager#EXTRA_CLIENT_STATE} extra are
* also considered (and take precedence when set).
* @param flags
* Gets the flags associated with this request.
*
* @return any combination of {@link #FLAG_MANUAL_REQUEST},
* {@link #FLAG_SUPPORTS_FILL_DIALOG} and
* {@link #FLAG_COMPATIBILITY_MODE_REQUEST}.
* @param inlineSuggestionsRequest
* Gets the {@link InlineSuggestionsRequest} associated
* with this request.
*
* Autofill Framework will send a {@code @non-null} {@link InlineSuggestionsRequest} if
* currently inline suggestions are supported and can be displayed. If the Autofill service
* wants to show inline suggestions, they may return {@link Dataset} with valid
* {@link InlinePresentation}. The Autofill Service must set supportsInlineSuggestions in its XML to enable support
* for inline suggestions. The autofill service must first indicate that it wants to return a delayed
* {@link FillResponse} by setting {@link FillResponse#FLAG_DELAY_FILL} in a successful
* fill response. Then it can use this IntentSender to send an Intent with extra
* {@link AutofillService#EXTRA_FILL_RESPONSE} with the delayed response. Note that this may be null if a delayed fill response is not supported for
* this fill request. Note: 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.
*/
@DataClass.Generated.Member
public @NonNull List Note: Prior to Android {@link android.os.Build.VERSION_CODES#P}, only client state
* bundles set by {@link FillResponse.Builder#setClientState(Bundle)} were considered. On
* Android {@link android.os.Build.VERSION_CODES#P} and higher, bundles set in the result of
* an authenticated request through the
* {@link android.view.autofill.AutofillManager#EXTRA_CLIENT_STATE} extra are
* also considered (and take precedence when set).
*
* @return The client state.
*/
@DataClass.Generated.Member
public @Nullable Bundle getClientState() {
return mClientState;
}
/**
* Gets the flags associated with this request.
*
* @return any combination of {@link #FLAG_MANUAL_REQUEST},
* {@link #FLAG_SUPPORTS_FILL_DIALOG} and
* {@link #FLAG_COMPATIBILITY_MODE_REQUEST}.
*/
@DataClass.Generated.Member
public @RequestFlags int getFlags() {
return mFlags;
}
/**
* Gets the {@link InlineSuggestionsRequest} associated
* with this request.
*
* Autofill Framework will send a {@code @non-null} {@link InlineSuggestionsRequest} if
* currently inline suggestions are supported and can be displayed. If the Autofill service
* wants to show inline suggestions, they may return {@link Dataset} with valid
* {@link InlinePresentation}. The Autofill Service must set supportsInlineSuggestions in its XML to enable support
* for inline suggestions. The autofill service must first indicate that it wants to return a delayed
* {@link FillResponse} by setting {@link FillResponse#FLAG_DELAY_FILL} in a successful
* fill response. Then it can use this IntentSender to send an Intent with extra
* {@link AutofillService#EXTRA_FILL_RESPONSE} with the delayed response. Note that this may be null if a delayed fill response is not supported for
* this fill request.