blob: 95ac8b8c2ddd7453a33fef452dcf175691cd5b8b [file] [log] [blame]
/*
* Copyright (C) 2023 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.view.autofill;
import android.annotation.SuppressLint;
import android.annotation.TestApi;
import android.provider.DeviceConfig;
import android.text.TextUtils;
import android.util.ArraySet;
import android.view.View;
import com.android.internal.util.ArrayUtils;
import java.util.Arrays;
import java.util.Set;
/**
* Feature flags associated with autofill.
* @hide
*/
@TestApi
public class AutofillFeatureFlags {
/**
* {@code DeviceConfig} property used to set which Smart Suggestion modes for Augmented Autofill
* are available.
*/
public static final String DEVICE_CONFIG_AUTOFILL_SMART_SUGGESTION_SUPPORTED_MODES =
"smart_suggestion_supported_modes";
/**
* Sets how long (in ms) the augmented autofill service is bound while idle.
*
* <p>Use {@code 0} to keep it permanently bound.
*
* @hide
*/
public static final String DEVICE_CONFIG_AUGMENTED_SERVICE_IDLE_UNBIND_TIMEOUT =
"augmented_service_idle_unbind_timeout";
/**
* Sets how long (in ms) the augmented autofill service request is killed if not replied.
*
* @hide
*/
public static final String DEVICE_CONFIG_AUGMENTED_SERVICE_REQUEST_TIMEOUT =
"augmented_service_request_timeout";
/**
* Sets allowed list for the autofill compatibility mode.
*
* The list of packages is {@code ":"} colon delimited, and each entry has the name of the
* package and an optional list of url bar resource ids (the list is delimited by
* brackets&mdash{@code [} and {@code ]}&mdash and is also comma delimited).
*
* <p>For example, a list with 3 packages {@code p1}, {@code p2}, and {@code p3}, where
* package {@code p1} have one id ({@code url_bar}, {@code p2} has none, and {@code p3 }
* have 2 ids {@code url_foo} and {@code url_bas}) would be
* {@code p1[url_bar]:p2:p3[url_foo,url_bas]}
*/
public static final String DEVICE_CONFIG_AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES =
"compat_mode_allowed_packages";
/**
* Indicates Fill dialog feature enabled or not.
*/
public static final String DEVICE_CONFIG_AUTOFILL_DIALOG_ENABLED =
"autofill_dialog_enabled";
/**
* Sets the autofill hints allowed list for the fields that can trigger the fill dialog
* feature at Activity starting.
*
* The list of autofill hints is {@code ":"} colon delimited.
*
* <p>For example, a list with 3 hints {@code password}, {@code phone}, and
* { @code emailAddress}, would be {@code password:phone:emailAddress}
*
* Note: By default the password field is enabled even there is no password hint in the list
*
* @see View#setAutofillHints(String...)
* @hide
*/
public static final String DEVICE_CONFIG_AUTOFILL_DIALOG_HINTS =
"autofill_dialog_hints";
// START CREDENTIAL MANAGER FLAGS //
/**
* Indicates whether credential manager tagged views should be ignored from autofill structures.
* This flag is further gated by {@link #DEVICE_CONFIG_AUTOFILL_CREDENTIAL_MANAGER_ENABLED}
*/
public static final String DEVICE_CONFIG_AUTOFILL_CREDENTIAL_MANAGER_IGNORE_VIEWS =
"autofill_credential_manager_ignore_views";
/**
* Indicates CredentialManager feature enabled or not.
* This is the overall feature flag. Individual behavior of credential manager may be controlled
* via a different flag, but gated by this flag.
*/
public static final String DEVICE_CONFIG_AUTOFILL_CREDENTIAL_MANAGER_ENABLED =
"autofill_credential_manager_enabled";
/**
* Indicates whether credential manager tagged views should suppress fill dialog.
* This flag is further gated by {@link #DEVICE_CONFIG_AUTOFILL_CREDENTIAL_MANAGER_ENABLED}
*
* @hide
*/
public static final String DEVICE_CONFIG_AUTOFILL_CREDENTIAL_MANAGER_SUPPRESS_FILL_DIALOG =
"autofill_credential_manager_suppress_fill_dialog";
/**
* Indicates whether credential manager tagged views should suppress save dialog.
* This flag is further gated by {@link #DEVICE_CONFIG_AUTOFILL_CREDENTIAL_MANAGER_ENABLED}
*
* @hide
*/
public static final String DEVICE_CONFIG_AUTOFILL_CREDENTIAL_MANAGER_SUPPRESS_SAVE_DIALOG =
"autofill_credential_manager_suppress_save_dialog";
// END CREDENTIAL MANAGER FLAGS //
// START AUTOFILL FOR ALL APPS FLAGS //
/**
* Sets the list of activities and packages denied for autofill
*
* The list is {@code ";"} colon delimited. Activities under a package is separated by
* {@code ","}. Each package name much be followed by a {@code ":"}. Each package entry must be
* ends with a {@code ";"}
*
* <p>For example, a list with only 1 package would be, {@code Package1:;}. A list with one
* denied activity {@code Activity1} under {@code Package1} and a full denied package
* {@code Package2} would be {@code Package1:Activity1;Package2:;}
*/
public static final String DEVICE_CONFIG_PACKAGE_DENYLIST_FOR_UNIMPORTANT_VIEW =
"package_deny_list_for_unimportant_view";
/**
* Sets the list of activities and packages allowed for autofill. The format is same with
* {@link #DEVICE_CONFIG_PACKAGE_DENYLIST_FOR_UNIMPORTANT_VIEW}
*
* @hide
*/
public static final String DEVICE_CONFIG_PACKAGE_AND_ACTIVITY_ALLOWLIST_FOR_TRIGGERING_FILL_REQUEST =
"package_and_activity_allowlist_for_triggering_fill_request";
/**
* Whether the heuristics check for view is enabled
*/
public static final String DEVICE_CONFIG_TRIGGER_FILL_REQUEST_ON_UNIMPORTANT_VIEW =
"trigger_fill_request_on_unimportant_view";
/**
* Whether to apply heuristic check on important views.
*
* @hide
*/
public static final String DEVICE_CONFIG_TRIGGER_FILL_REQUEST_ON_FILTERED_IMPORTANT_VIEWS =
"trigger_fill_request_on_filtered_important_views";
/**
* Continas imeAction ids that is irrelevant for autofill. For example, ime_action_search. We
* use this to avoid trigger fill request on unimportant views.
*
* The list is {@code ","} delimited.
*
* <p> For example, a imeAction list could be "2,3,4", corresponding to ime_action definition
* in {@link android.view.inputmethod.EditorInfo.java}</p>
*/
@SuppressLint("IntentName")
public static final String DEVICE_CONFIG_NON_AUTOFILLABLE_IME_ACTION_IDS =
"non_autofillable_ime_action_ids";
/**
* Whether to enable autofill on all view types (not just checkbox, spinner, datepicker etc...)
*
* @hide
*/
public static final String DEVICE_CONFIG_SHOULD_ENABLE_AUTOFILL_ON_ALL_VIEW_TYPES =
"should_enable_autofill_on_all_view_types";
/**
* Whether to enable multi-line filter when checking if view is autofillable
*
* @hide
*/
public static final String DEVICE_CONFIG_MULTILINE_FILTER_ENABLED =
"multiline_filter_enabled";
/**
* Whether include all autofill type not none views in assist structure
*
* @hide
*/
public static final String
DEVICE_CONFIG_INCLUDE_ALL_AUTOFILL_TYPE_NOT_NONE_VIEWS_IN_ASSIST_STRUCTURE =
"include_all_autofill_type_not_none_views_in_assist_structure";
/**
* Whether include all views in assist structure
*
* @hide
*/
public static final String
DEVICE_CONFIG_INCLUDE_ALL_VIEWS_IN_ASSIST_STRUCTURE =
"include_all_views_in_assist_structure";
// END AUTOFILL FOR ALL APPS FLAGS //
// START AUTOFILL PCC CLASSIFICATION FLAGS
/**
* Sets the fill dialog feature enabled or not.
*/
public static final String DEVICE_CONFIG_AUTOFILL_PCC_CLASSIFICATION_ENABLED =
"pcc_classification_enabled";
/**
* Give preference to autofill provider's detection.
* @hide
*/
public static final String DEVICE_CONFIG_PREFER_PROVIDER_OVER_PCC = "prefer_provider_over_pcc";
/**
* Indicates the Autofill Hints that would be requested by the service from the Autofill
* Provider.
*/
public static final String DEVICE_CONFIG_AUTOFILL_PCC_FEATURE_PROVIDER_HINTS =
"pcc_classification_hints";
/**
* Use data from secondary source if primary not present .
* For eg: if we prefer PCC over provider, and PCC detection didn't classify a field, however,
* autofill provider did, this flag would decide whether we use that result, and show some
* presentation for that particular field.
* @hide
*/
public static final String DEVICE_CONFIG_PCC_USE_FALLBACK = "pcc_use_fallback";
// END AUTOFILL PCC CLASSIFICATION FLAGS
/**
* Sets a value of delay time to show up the inline tooltip view.
*
* @hide
*/
public static final String DEVICE_CONFIG_AUTOFILL_TOOLTIP_SHOW_UP_DELAY =
"autofill_inline_tooltip_first_show_delay";
private static final String DIALOG_HINTS_DELIMITER = ":";
private static final boolean DEFAULT_HAS_FILL_DIALOG_UI_FEATURE = false;
private static final String DEFAULT_FILL_DIALOG_ENABLED_HINTS = "";
// CREDENTIAL MANAGER DEFAULTS
// Credential manager is enabled by default so as to allow testing by app developers
private static final boolean DEFAULT_CREDENTIAL_MANAGER_ENABLED = true;
private static final boolean DEFAULT_CREDENTIAL_MANAGER_IGNORE_VIEWS = true;
private static final boolean DEFAULT_CREDENTIAL_MANAGER_SUPPRESS_FILL_DIALOG = false;
private static final boolean DEFAULT_CREDENTIAL_MANAGER_SUPPRESS_SAVE_DIALOG = false;
// END CREDENTIAL MANAGER DEFAULTS
// AUTOFILL PCC CLASSIFICATION FLAGS DEFAULTS
// Default for whether the pcc classification is enabled for autofill.
/** @hide */
public static final boolean DEFAULT_AUTOFILL_PCC_CLASSIFICATION_ENABLED = false;
// END AUTOFILL PCC CLASSIFICATION FLAGS DEFAULTS
// AUTOFILL FOR ALL APPS DEFAULTS
private static final boolean DEFAULT_AFAA_ON_UNIMPORTANT_VIEW_ENABLED = true;
private static final boolean DEFAULT_AFAA_ON_IMPORTANT_VIEW_ENABLED = true;
private static final String DEFAULT_AFAA_DENYLIST = "";
private static final String DEFAULT_AFAA_ALLOWLIST = "";
private static final String DEFAULT_AFAA_NON_AUTOFILLABLE_IME_ACTIONS = "2,3,4";
private static final boolean DEFAULT_AFAA_SHOULD_ENABLE_AUTOFILL_ON_ALL_VIEW_TYPES = true;
private static final boolean DEFAULT_AFAA_SHOULD_ENABLE_MULTILINE_FILTER = true;
private AutofillFeatureFlags() {};
/**
* Whether the fill dialog feature is enabled or not
*
* @hide
*/
public static boolean isFillDialogEnabled() {
return DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_AUTOFILL_DIALOG_ENABLED,
DEFAULT_HAS_FILL_DIALOG_UI_FEATURE);
}
/**
* Gets fill dialog enabled hints.
*
* @hide
*/
public static String[] getFillDialogEnabledHints() {
final String dialogHints = DeviceConfig.getString(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_AUTOFILL_DIALOG_HINTS,
DEFAULT_FILL_DIALOG_ENABLED_HINTS);
if (TextUtils.isEmpty(dialogHints)) {
return new String[0];
}
return ArrayUtils.filter(dialogHints.split(DIALOG_HINTS_DELIMITER), String[]::new,
(str) -> !TextUtils.isEmpty(str));
}
/**
* Whether the Credential Manager feature is enabled or not
*
* @hide
*/
public static boolean isCredentialManagerEnabled() {
return DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_AUTOFILL_CREDENTIAL_MANAGER_ENABLED,
DEFAULT_CREDENTIAL_MANAGER_ENABLED);
}
/**
* Whether credential manager tagged views should be ignored for autofill structure.
*
* @hide
*/
public static boolean shouldIgnoreCredentialViews() {
return isCredentialManagerEnabled()
&& DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_AUTOFILL_CREDENTIAL_MANAGER_IGNORE_VIEWS,
DEFAULT_CREDENTIAL_MANAGER_IGNORE_VIEWS);
}
/**
* Whether credential manager tagged views should not trigger fill dialog requests.
*
* @hide
*/
public static boolean isFillDialogDisabledForCredentialManager() {
return isCredentialManagerEnabled()
&& DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_AUTOFILL_CREDENTIAL_MANAGER_SUPPRESS_FILL_DIALOG,
DEFAULT_CREDENTIAL_MANAGER_SUPPRESS_FILL_DIALOG);
}
/**
* Whether triggering fill request on unimportant view is enabled.
*
* @hide
*/
public static boolean isTriggerFillRequestOnUnimportantViewEnabled() {
return DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_TRIGGER_FILL_REQUEST_ON_UNIMPORTANT_VIEW,
DEFAULT_AFAA_ON_UNIMPORTANT_VIEW_ENABLED);
}
/**
* Whether to apply heuristic check on important views before triggering fill request
*
* @hide
*/
public static boolean isTriggerFillRequestOnFilteredImportantViewsEnabled() {
return DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_TRIGGER_FILL_REQUEST_ON_FILTERED_IMPORTANT_VIEWS,
DEFAULT_AFAA_ON_IMPORTANT_VIEW_ENABLED);
}
/**
* Whether to enable autofill on all view types.
*
* @hide
*/
public static boolean shouldEnableAutofillOnAllViewTypes(){
return DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_SHOULD_ENABLE_AUTOFILL_ON_ALL_VIEW_TYPES,
DEFAULT_AFAA_SHOULD_ENABLE_AUTOFILL_ON_ALL_VIEW_TYPES);
}
/**
* Get the non-autofillable ime actions from flag. This will be used in filtering
* condition to trigger fill request.
*
* @hide
*/
public static Set<String> getNonAutofillableImeActionIdSetFromFlag() {
final String mNonAutofillableImeActions = DeviceConfig.getString(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_NON_AUTOFILLABLE_IME_ACTION_IDS,
DEFAULT_AFAA_NON_AUTOFILLABLE_IME_ACTIONS);
return new ArraySet<>(Arrays.asList(mNonAutofillableImeActions.split(",")));
}
/**
* Get denylist string from flag.
*
* Note: This denylist works both on important view and not important views. The flag used here
* is legacy flag which will be replaced with soon.
*
* @hide
*/
public static String getDenylistStringFromFlag() {
return DeviceConfig.getString(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_PACKAGE_DENYLIST_FOR_UNIMPORTANT_VIEW,
DEFAULT_AFAA_DENYLIST);
}
/**
* Get autofill allowlist from flag
*
* @hide
*/
public static String getAllowlistStringFromFlag() {
return DeviceConfig.getString(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_PACKAGE_AND_ACTIVITY_ALLOWLIST_FOR_TRIGGERING_FILL_REQUEST,
DEFAULT_AFAA_ALLOWLIST);
}
/**
* Whether include all views that have autofill type not none in assist structure.
*
* @hide
*/
public static boolean shouldIncludeAllViewsAutofillTypeNotNoneInAssistStructrue() {
return DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_INCLUDE_ALL_AUTOFILL_TYPE_NOT_NONE_VIEWS_IN_ASSIST_STRUCTURE, false);
}
/**
* Whether include all views in assist structure.
*
* @hide
*/
public static boolean shouldIncludeAllChildrenViewInAssistStructure() {
return DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_INCLUDE_ALL_VIEWS_IN_ASSIST_STRUCTURE, false);
}
/**
* Whether should enable multi-line filter
*
* @hide
*/
public static boolean shouldEnableMultilineFilter() {
return DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_MULTILINE_FILTER_ENABLED,
DEFAULT_AFAA_SHOULD_ENABLE_MULTILINE_FILTER);
}
// START AUTOFILL PCC CLASSIFICATION FUNCTIONS
/**
* Whether Autofill PCC Detection is enabled.
*
* @hide
*/
public static boolean isAutofillPccClassificationEnabled() {
// TODO(b/266379948): Add condition for checking whether device has PCC first
return DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_AUTOFILL,
DEVICE_CONFIG_AUTOFILL_PCC_CLASSIFICATION_ENABLED,
DEFAULT_AUTOFILL_PCC_CLASSIFICATION_ENABLED);
}
// END AUTOFILL PCC CLASSIFICATION FUNCTIONS
}