diff options
author | Douglas Sigelbaum <sigelbaum@google.com> | 2017-11-27 13:08:34 -0500 |
---|---|---|
committer | Douglas Sigelbaum <sigelbaum@google.com> | 2017-12-12 11:34:19 -0800 |
commit | c6d490dccbd465c91ca4280ad96ece1cd7720cdb (patch) | |
tree | 74b17fce1a856174ab7542dd8a7582d277ec39cc /input/autofill | |
parent | 25c564de28bb0e50797e3dd1160394b209fdeea2 (diff) | |
download | android-c6d490dccbd465c91ca4280ad96ece1cd7720cdb.tar.gz |
Autofill sample: Add DAL check req levels to settings.
Bug: 66900717
Test: manual
Change-Id: Ib3d740c6a6ead33a79bf6278a790643831d419d9
Diffstat (limited to 'input/autofill')
8 files changed, 151 insertions, 46 deletions
diff --git a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/MyAutofillService.java b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/MyAutofillService.java index 9e887496..956b5217 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/MyAutofillService.java +++ b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/MyAutofillService.java @@ -51,7 +51,7 @@ import com.example.android.autofill.service.model.DatasetWithFilledAutofillField import com.example.android.autofill.service.settings.MyPreferences; import com.example.android.autofill.service.util.AppExecutors; import com.example.android.autofill.service.util.Util; - +import static com.example.android.autofill.service.util.Util.DalCheckRequirement; import java.util.List; import static com.example.android.autofill.service.data.adapter.ResponseAdapter.CLIENT_STATE_PARTIAL_ID_TEMPLATE; @@ -210,7 +210,8 @@ public class MyAutofillService extends AutofillService { return; } if (webDomain != null && webDomain.length() > 0) { - mDalRepository.checkValid(new DalInfo(webDomain, packageName), + DalCheckRequirement req = MyPreferences.getInstance(this).getDalCheckRequirement(); + mDalRepository.checkValid(req, new DalInfo(webDomain, packageName), new DataCallback<DalCheck>() { @Override public void onLoaded(DalCheck dalCheck) { diff --git a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/DigitalAssetLinksDataSource.java b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/DigitalAssetLinksDataSource.java index c01573b0..00661a7f 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/DigitalAssetLinksDataSource.java +++ b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/DigitalAssetLinksDataSource.java @@ -19,6 +19,8 @@ import com.example.android.autofill.service.data.DataCallback; import com.example.android.autofill.service.model.DalCheck; import com.example.android.autofill.service.model.DalInfo; +import static com.example.android.autofill.service.util.Util.DalCheckRequirement; + /** * Data source for * <a href="https://developers.google.com/digital-asset-links/">Digital Asset Links</a>. @@ -28,7 +30,8 @@ public interface DigitalAssetLinksDataSource { /** * Checks if the association between a web domain and a package is valid. */ - void checkValid(DalInfo dalInfo, DataCallback<DalCheck> dalCheckCallback); + void checkValid(DalCheckRequirement dalCheckRequirement, DalInfo dalInfo, + DataCallback<DalCheck> dalCheckCallback); /** * Clears all cached data. diff --git a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/DigitalAssetLinksRepository.java b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/DigitalAssetLinksRepository.java index dfcecab4..6303a1e7 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/DigitalAssetLinksRepository.java +++ b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/DigitalAssetLinksRepository.java @@ -19,12 +19,12 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.support.annotation.NonNull; -import com.example.android.autofill.service.util.SecurityHelper; -import com.example.android.autofill.service.data.source.DalService; import com.example.android.autofill.service.data.DataCallback; +import com.example.android.autofill.service.data.source.DalService; import com.example.android.autofill.service.data.source.DigitalAssetLinksDataSource; import com.example.android.autofill.service.model.DalCheck; import com.example.android.autofill.service.model.DalInfo; +import com.example.android.autofill.service.util.SecurityHelper; import com.google.common.net.InternetDomainName; import java.util.HashMap; @@ -34,6 +34,10 @@ import retrofit2.Callback; import retrofit2.Response; import retrofit2.Retrofit; +import static com.example.android.autofill.service.util.Util.DalCheckRequirement; +import static com.example.android.autofill.service.util.Util.DalCheckRequirement.AllUrls; +import static com.example.android.autofill.service.util.Util.DalCheckRequirement.Disabled; +import static com.example.android.autofill.service.util.Util.DalCheckRequirement.LoginOnly; import static com.example.android.autofill.service.util.Util.logd; @@ -41,7 +45,6 @@ import static com.example.android.autofill.service.util.Util.logd; * Singleton repository that caches the result of Digital Asset Links checks. */ public class DigitalAssetLinksRepository implements DigitalAssetLinksDataSource { - private static final String DAL_BASE_URL = "https://digitalassetlinks.googleapis.com"; private static final String PERMISSION_GET_LOGIN_CREDS = "common.get_login_creds"; private static final String PERMISSION_HANDLE_ALL_URLS = "common.handle_all_urls"; @@ -80,7 +83,15 @@ public class DigitalAssetLinksRepository implements DigitalAssetLinksDataSource mCache.clear(); } - public void checkValid(DalInfo dalInfo, DataCallback<DalCheck> dalCheckDataCallback) { + public void checkValid(DalCheckRequirement dalCheckRequirement, DalInfo dalInfo, + DataCallback<DalCheck> dalCheckDataCallback) { + if (dalCheckRequirement.equals(Disabled)) { + DalCheck dalCheck = new DalCheck(); + dalCheck.linked = true; + dalCheckDataCallback.onLoaded(dalCheck); + return; + } + DalCheck dalCheck = mCache.get(dalInfo); if (dalCheck != null) { dalCheckDataCallback.onLoaded(dalCheck); @@ -109,22 +120,27 @@ public class DigitalAssetLinksRepository implements DigitalAssetLinksDataSource DalCheck dalCheck = response.body(); if (dalCheck == null || !dalCheck.linked) { // get_login_creds check failed, so try handle_all_urls check - mDalService.check(webDomain, PERMISSION_HANDLE_ALL_URLS, packageName, - fingerprint).enqueue(new Callback<DalCheck>() { - @Override - public void onResponse(@NonNull Call<DalCheck> call, - @NonNull Response<DalCheck> response) { - DalCheck dalCheck = response.body(); - mCache.put(dalInfo, dalCheck); - dalCheckDataCallback.onLoaded(dalCheck); - } - - @Override - public void onFailure(@NonNull Call<DalCheck> call, - @NonNull Throwable t) { - dalCheckDataCallback.onDataNotAvailable(t.getMessage()); - } - }); + if (dalCheckRequirement.equals(LoginOnly)) { + dalCheckDataCallback.onDataNotAvailable( + "DAL: Login creds check failed."); + } else if (dalCheckRequirement.equals(AllUrls)) { + mDalService.check(webDomain, PERMISSION_HANDLE_ALL_URLS, + packageName, fingerprint).enqueue(new Callback<DalCheck>() { + @Override + public void onResponse(@NonNull Call<DalCheck> call, + @NonNull Response<DalCheck> response) { + DalCheck dalCheck = response.body(); + mCache.put(dalInfo, dalCheck); + dalCheckDataCallback.onLoaded(dalCheck); + } + + @Override + public void onFailure(@NonNull Call<DalCheck> call, + @NonNull Throwable t) { + dalCheckDataCallback.onDataNotAvailable(t.getMessage()); + } + }); + } } else { // get_login_creds check succeeded, so we're finished. mCache.put(dalInfo, dalCheck); diff --git a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/settings/MyPreferences.java b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/settings/MyPreferences.java index 73fa3acf..8770ef83 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/settings/MyPreferences.java +++ b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/settings/MyPreferences.java @@ -28,6 +28,7 @@ public class MyPreferences { private static final String DATASET_AUTH_KEY = "dataset_auth"; private static final String MASTER_PASSWORD_KEY = "master_password"; private static final String LOGGING_LEVEL = "logging_level"; + private static final String DAL_CHECK_REQUIRED = "dal_check_required"; private static MyPreferences sInstance; private final SharedPreferences mPrefs; @@ -90,11 +91,20 @@ public class MyPreferences { } public Util.LogLevel getLoggingLevel() { - return Util.LogLevel.values()[mPrefs.getInt(LOGGING_LEVEL, Util.LogLevel.OFF.ordinal())]; + return Util.LogLevel.values()[mPrefs.getInt(LOGGING_LEVEL, Util.LogLevel.Off.ordinal())]; } public void setLoggingLevel(Util.LogLevel level) { mPrefs.edit().putInt(LOGGING_LEVEL, level.ordinal()).apply(); Util.setLoggingLevel(level); } + + public Util.DalCheckRequirement getDalCheckRequirement() { + return Util.DalCheckRequirement.values()[mPrefs.getInt(DAL_CHECK_REQUIRED, + Util.DalCheckRequirement.AllUrls.ordinal())]; + } + + public void setDalCheckRequired(Util.DalCheckRequirement level) { + mPrefs.edit().putInt(DAL_CHECK_REQUIRED, level.ordinal()).apply(); + } } diff --git a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/settings/SettingsActivity.java b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/settings/SettingsActivity.java index 5ccc13ae..82222a80 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/settings/SettingsActivity.java +++ b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/settings/SettingsActivity.java @@ -51,6 +51,9 @@ import com.example.android.autofill.service.util.Util; import java.util.List; +import static com.example.android.autofill.service.util.Util.DalCheckRequirement.AllUrls; +import static com.example.android.autofill.service.util.Util.DalCheckRequirement.Disabled; +import static com.example.android.autofill.service.util.Util.DalCheckRequirement.LoginOnly; import static com.example.android.autofill.service.util.Util.logd; import static com.example.android.autofill.service.util.Util.logw; @@ -60,6 +63,7 @@ public class SettingsActivity extends AppCompatActivity { private AutofillManager mAutofillManager; private LocalAutofillDataSource mLocalAutofillDataSource; private PackageVerificationDataSource mPackageVerificationDataSource; + private MyPreferences mPreferences; @Override public void onCreate(Bundle savedInstanceState) { @@ -72,18 +76,17 @@ public class SettingsActivity extends AppCompatActivity { autofillDao, new AppExecutors()); mAutofillManager = getSystemService(AutofillManager.class); mPackageVerificationDataSource = SharedPrefsPackageVerificationRepository.getInstance(this); - - final MyPreferences preferences = MyPreferences.getInstance(this); + mPreferences = MyPreferences.getInstance(this); setupSettingsSwitch(R.id.settings_auth_responses_container, R.id.settings_auth_responses_label, R.id.settings_auth_responses_switch, - preferences.isResponseAuth(), - (compoundButton, isResponseAuth) -> preferences.setResponseAuth(isResponseAuth)); + mPreferences.isResponseAuth(), + (compoundButton, isResponseAuth) -> mPreferences.setResponseAuth(isResponseAuth)); setupSettingsSwitch(R.id.settings_auth_datasets_container, R.id.settings_auth_datasets_label, R.id.settings_auth_datasets_switch, - preferences.isDatasetAuth(), - (compoundButton, isDatasetAuth) -> preferences.setDatasetAuth(isDatasetAuth)); + mPreferences.isDatasetAuth(), + (compoundButton, isDatasetAuth) -> mPreferences.setDatasetAuth(isDatasetAuth)); setupSettingsButton(R.id.settings_add_data_container, R.id.settings_add_data_label, R.id.settings_add_data_icon, @@ -96,7 +99,7 @@ public class SettingsActivity extends AppCompatActivity { R.id.settings_auth_credentials_label, R.id.settings_auth_credentials_icon, (view) -> { - if (preferences.getMasterPassword() != null) { + if (mPreferences.getMasterPassword() != null) { buildCurrentCredentialsDialog().show(); } else { buildNewCredentialsDialog().show(); @@ -108,29 +111,55 @@ public class SettingsActivity extends AppCompatActivity { mAutofillManager.hasEnabledAutofillServices(), (compoundButton, serviceSet) -> setService(serviceSet)); RadioGroup loggingLevelContainer = findViewById(R.id.loggingLevelContainer); - Util.LogLevel loggingLevel = preferences.getLoggingLevel(); + Util.LogLevel loggingLevel = mPreferences.getLoggingLevel(); Util.setLoggingLevel(loggingLevel); switch (loggingLevel) { - case OFF: + case Off: loggingLevelContainer.check(R.id.loggingOff); break; - case DEBUG: + case Debug: loggingLevelContainer.check(R.id.loggingDebug); break; - case VERBOSE: + case Verbose: loggingLevelContainer.check(R.id.loggingVerbose); break; } loggingLevelContainer.setOnCheckedChangeListener((group, checkedId) -> { switch (checkedId) { case R.id.loggingOff: - preferences.setLoggingLevel(Util.LogLevel.OFF); + mPreferences.setLoggingLevel(Util.LogLevel.Off); break; case R.id.loggingDebug: - preferences.setLoggingLevel(Util.LogLevel.DEBUG); + mPreferences.setLoggingLevel(Util.LogLevel.Debug); break; case R.id.loggingVerbose: - preferences.setLoggingLevel(Util.LogLevel.VERBOSE); + mPreferences.setLoggingLevel(Util.LogLevel.Verbose); + break; + } + }); + RadioGroup dalCheckRequirementContainer = findViewById(R.id.dalCheckRequirementContainer); + Util.DalCheckRequirement dalCheckRequirement = mPreferences.getDalCheckRequirement(); + switch (dalCheckRequirement) { + case Disabled: + dalCheckRequirementContainer.check(R.id.dalDisabled); + break; + case LoginOnly: + dalCheckRequirementContainer.check(R.id.dalLoginOnly); + break; + case AllUrls: + dalCheckRequirementContainer.check(R.id.dalAllUrls); + break; + } + dalCheckRequirementContainer.setOnCheckedChangeListener((group, checkedId) -> { + switch (checkedId) { + case R.id.dalDisabled: + mPreferences.setDalCheckRequired(Disabled); + break; + case R.id.dalLoginOnly: + mPreferences.setDalCheckRequired(LoginOnly); + break; + case R.id.dalAllUrls: + mPreferences.setDalCheckRequired(AllUrls); break; } }); @@ -144,7 +173,7 @@ public class SettingsActivity extends AppCompatActivity { .setPositiveButton(R.string.settings_ok, (dialog, which) -> { mLocalAutofillDataSource.clear(); mPackageVerificationDataSource.clear(); - MyPreferences.getInstance(SettingsActivity.this).clearCredentials(); + mPreferences.clearCredentials(); dialog.dismiss(); }) .create(); @@ -212,7 +241,7 @@ public class SettingsActivity extends AppCompatActivity { @Override public void onClick(DialogInterface dialog, int which) { String password = currentPasswordField.getText().toString(); - if (MyPreferences.getInstance(SettingsActivity.this).getMasterPassword() + if (mPreferences.getMasterPassword() .equals(password)) { buildNewCredentialsDialog().show(); dialog.dismiss(); @@ -232,7 +261,7 @@ public class SettingsActivity extends AppCompatActivity { .setView(newPasswordField) .setPositiveButton(R.string.settings_ok, (dialog, which) -> { String password = newPasswordField.getText().toString(); - MyPreferences.getInstance(SettingsActivity.this).setMasterPassword(password); + mPreferences.setMasterPassword(password); dialog.dismiss(); }) .create(); diff --git a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/util/Util.java b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/util/Util.java index d7b5b45b..53943138 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/util/Util.java +++ b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/util/Util.java @@ -42,7 +42,7 @@ public final class Util { public static final NodeFilter AUTOFILL_ID_FILTER = (node, id) -> id.equals(node.getAutofillId()); private static final String TAG = "AutofillSample"; - public static LogLevel sLoggingLevel = LogLevel.OFF; + public static LogLevel sLoggingLevel = LogLevel.Off; private static void bundleToString(StringBuilder builder, Bundle data) { final Set<String> keySet = data.keySet(); @@ -252,11 +252,11 @@ public final class Util { } public static boolean logDebugEnabled() { - return sLoggingLevel.ordinal() >= LogLevel.DEBUG.ordinal(); + return sLoggingLevel.ordinal() >= LogLevel.Debug.ordinal(); } public static boolean logVerboseEnabled() { - return sLoggingLevel.ordinal() >= LogLevel.VERBOSE.ordinal(); + return sLoggingLevel.ordinal() >= LogLevel.Verbose.ordinal(); } public static void logw(String message, Object... params) { @@ -279,7 +279,9 @@ public final class Util { sLoggingLevel = level; } - public enum LogLevel {OFF, DEBUG, VERBOSE} + public enum LogLevel {Off, Debug, Verbose} + + public enum DalCheckRequirement {Disabled, LoginOnly, AllUrls} /** * Helper interface used to filter Assist nodes. diff --git a/input/autofill/AutofillFramework/afservice/src/main/res/layout/multidataset_service_settings_activity.xml b/input/autofill/AutofillFramework/afservice/src/main/res/layout/multidataset_service_settings_activity.xml index bfbf5f81..ce77e27a 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/res/layout/multidataset_service_settings_activity.xml +++ b/input/autofill/AutofillFramework/afservice/src/main/res/layout/multidataset_service_settings_activity.xml @@ -163,6 +163,44 @@ style="@style/Settings.Header" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:text="@string/settings_dal_header" /> + + <RadioGroup + android:id="@+id/dalCheckRequirementContainer" + style="@style/Settings.Container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <RadioButton + android:id="@+id/dalDisabled" + style="@style/Settings.Label" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minHeight="@dimen/a11y_min_touch_target_dimen" + android:text="@string/settings_dal_disabled" /> + + <RadioButton + android:id="@+id/dalLoginOnly" + style="@style/Settings.Label" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minHeight="@dimen/a11y_min_touch_target_dimen" + android:text="@string/settings_dal_login_only" /> + + <RadioButton + android:id="@+id/dalAllUrls" + style="@style/Settings.Label" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minHeight="@dimen/a11y_min_touch_target_dimen" + android:text="@string/settings_dal_all_urls" /> + </RadioGroup> + + <TextView + style="@style/Settings.Header" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:text="@string/settings_logging_header" /> <RadioGroup diff --git a/input/autofill/AutofillFramework/afservice/src/main/res/values/strings.xml b/input/autofill/AutofillFramework/afservice/src/main/res/values/strings.xml index c6c646d7..da0e0a8c 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/res/values/strings.xml +++ b/input/autofill/AutofillFramework/afservice/src/main/res/values/strings.xml @@ -7,7 +7,7 @@ <string name="settings_name">Autofill Settings</string> <string name="settings_cancel">Cancel</string> <string name="settings_save">Save</string> - <string name="settings_authenticate_responses">Authenticate responses</string> + <string name="settings_authenticate_responses">Authenticate Responses</string> <string name="settings_authenticate_datasets">Authenticate Datasets</string> <string name="settings_add_data_label">Add fake Autofill data</string> <string name="settings_add_data_title">Add Autofill Datasets</string> @@ -27,6 +27,12 @@ <string name="settings_logging_off">Off</string> <string name="settings_logging_debug">Debug</string> <string name="settings_logging_verbose">Verbose</string> + + <string name="settings_dal_header">DAL Check Requirement</string> + <string name="settings_dal_disabled">Disabled</string> + <string name="settings_dal_login_only">Login Credentials Only</string> + <string name="settings_dal_all_urls">Handle All URLs</string> + <string name="settings_enable_header">Enable/Disable</string> <string name="settings_set_service">Set default Autofill service</string> <string name="settings_disable_service">Disable Autofill services</string> |