diff options
author | Douglas Sigelbaum <sigelbaum@google.com> | 2017-11-28 06:54:15 -0500 |
---|---|---|
committer | Douglas Sigelbaum <sigelbaum@google.com> | 2017-12-12 11:33:27 -0800 |
commit | 42668e69d39004e93a5935977dbee66e63e569f8 (patch) | |
tree | f39035ca2bb4e48be102bd4cbb083ddb3f9dd26b /input/autofill/AutofillFramework | |
parent | acb2cfd0dc0c23cb503cf62e610522862e887a5e (diff) | |
download | android-42668e69d39004e93a5935977dbee66e63e569f8.tar.gz |
Autofill sample: Fix authentication bugs.
Bug: 69833446
Test: manual
Change-Id: Idaea1b86090153c3f821d4a3219a5a7c915a807c
Diffstat (limited to 'input/autofill/AutofillFramework')
9 files changed, 42 insertions, 17 deletions
diff --git a/input/autofill/AutofillFramework/afservice/src/androidTest/java/com/example/android/autofill/service/data/source/local/AutofillDaoTest.java b/input/autofill/AutofillFramework/afservice/src/androidTest/java/com/example/android/autofill/service/data/source/local/AutofillDaoTest.java index dc62a298..936da2b1 100644 --- a/input/autofill/AutofillFramework/afservice/src/androidTest/java/com/example/android/autofill/service/data/source/local/AutofillDaoTest.java +++ b/input/autofill/AutofillFramework/afservice/src/androidTest/java/com/example/android/autofill/service/data/source/local/AutofillDaoTest.java @@ -32,6 +32,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.Arrays; +import java.util.Comparator; import java.util.List; import java.util.UUID; @@ -70,7 +72,9 @@ public class AutofillDaoTest { new DatasetWithFilledAutofillFields(); datasetWithFilledAutofillFields.autofillDataset = mDataset; datasetWithFilledAutofillFields.filledAutofillFields = - ImmutableList.of(mUsernameField, mPasswordField); + Arrays.asList(mUsernameField, mPasswordField); + datasetWithFilledAutofillFields.filledAutofillFields + .sort(Comparator.comparing(FilledAutofillField::getHint)); // When inserting a page's autofill fields. mDatabase.autofillDao().saveAutofillDataset(mDataset); @@ -81,7 +85,9 @@ public class AutofillDaoTest { List<String> allHints = ImmutableList.of(View.AUTOFILL_HINT_USERNAME, View.AUTOFILL_HINT_PASSWORD); List<DatasetWithFilledAutofillFields> loadedDatasets = mDatabase.autofillDao() - .getFilledAutofillFields(allHints); + .getDatasets(allHints); + loadedDatasets.get(0).filledAutofillFields.sort( + Comparator.comparing(FilledAutofillField::getHint)); assertThat(loadedDatasets, contains(datasetWithFilledAutofillFields)); assertThat(loadedDatasets, hasSize(1)); } diff --git a/input/autofill/AutofillFramework/afservice/src/main/AndroidManifest.xml b/input/autofill/AutofillFramework/afservice/src/main/AndroidManifest.xml index c5c2723c..1407bc06 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/AndroidManifest.xml +++ b/input/autofill/AutofillFramework/afservice/src/main/AndroidManifest.xml @@ -26,14 +26,17 @@ </intent-filter> </service> - <activity android:name=".AuthActivity" /> + <activity + android:name=".AuthActivity" + android:taskAffinity=".AuthActivity" + android:label="@string/authentication_name" /> <!-- Including launcher icon for Autofill Settings to convenience. Not necessary for a real service. --> <activity android:name=".settings.SettingsActivity" android:exported="true" android:label="@string/settings_name" - android:taskAffinity=".SettingsActivity"> + android:taskAffinity=".settings.SettingsActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> diff --git a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/AuthActivity.java b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/AuthActivity.java index 710bb42f..595643ff 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/AuthActivity.java +++ b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/AuthActivity.java @@ -71,6 +71,7 @@ public class AuthActivity extends AppCompatActivity { private ClientViewMetadata mClientViewMetadata; private String mPackageName; private Intent mReplyIntent; + private MyPreferences mPreferences; public static IntentSender getAuthIntentSenderForResponse(Context context) { final Intent intent = new Intent(context, AuthActivity.class); @@ -99,6 +100,7 @@ public class AuthActivity extends AppCompatActivity { mDalRepository = DigitalAssetLinksRepository.getInstance(getPackageManager()); mMasterPassword = findViewById(R.id.master_password); mPackageName = getPackageName(); + mPreferences = MyPreferences.getInstance(this); findViewById(R.id.login).setOnClickListener((view) -> login()); findViewById(R.id.cancel).setOnClickListener((view) -> { onFailure(); @@ -115,7 +117,6 @@ public class AuthActivity extends AppCompatActivity { Toast.makeText(this, "Password incorrect", Toast.LENGTH_SHORT).show(); onFailure(); } - finish(); } @Override @@ -161,11 +162,13 @@ public class AuthActivity extends AppCompatActivity { RemoteViews remoteViews = RemoteViewsHelper.viewsWithNoAuth( mPackageName, datasetName); setDatasetIntent(mDatasetAdapter.buildDataset(dataset, remoteViews)); + finish(); } @Override public void onDataNotAvailable(String msg, Object... params) { logw(msg, params); + finish(); } }); } @@ -175,13 +178,17 @@ public class AuthActivity extends AppCompatActivity { new DataCallback<List<DatasetWithFilledAutofillFields>>() { @Override public void onLoaded(List<DatasetWithFilledAutofillFields> datasets) { - FillResponse fillResponse = mResponseAdapter.buildResponse(datasets, false); + boolean datasetAuth = mPreferences.isDatasetAuth(); + FillResponse fillResponse = mResponseAdapter.buildResponse(datasets, + datasetAuth); setResponseIntent(fillResponse); + finish(); } @Override public void onDataNotAvailable(String msg, Object... params) { logw(msg, params); + finish(); } }); } 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 ba2065d8..96d307f8 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 @@ -33,12 +33,12 @@ import android.view.View; import android.view.autofill.AutofillId; import android.widget.RemoteViews; -import com.example.android.autofill.service.data.DataCallback; -import com.example.android.autofill.service.data.adapter.DatasetAdapter; -import com.example.android.autofill.service.data.adapter.ResponseAdapter; import com.example.android.autofill.service.data.AutofillDataBuilder; import com.example.android.autofill.service.data.ClientAutofillDataBuilder; import com.example.android.autofill.service.data.ClientViewMetadata; +import com.example.android.autofill.service.data.DataCallback; +import com.example.android.autofill.service.data.adapter.DatasetAdapter; +import com.example.android.autofill.service.data.adapter.ResponseAdapter; import com.example.android.autofill.service.data.source.PackageVerificationDataSource; import com.example.android.autofill.service.data.source.local.DigitalAssetLinksRepository; import com.example.android.autofill.service.data.source.local.LocalAutofillDataSource; @@ -203,7 +203,7 @@ public class MyAutofillService extends AutofillService { String webDomain; try { webDomain = mClientViewMetadata.buildWebDomain(); - } catch(SecurityException e) { + } catch (SecurityException e) { logw(e.getMessage()); callback.onFailure(e.getMessage()); return; diff --git a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/ClientViewMetadata.java b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/ClientViewMetadata.java index 91f20ff8..abc128f8 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/ClientViewMetadata.java +++ b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/ClientViewMetadata.java @@ -78,6 +78,9 @@ public class ClientViewMetadata { if (mCachedSaveInfo == null) { int saveType = getSaveType(); AutofillId[] autofillIdsArray = getAutofillIdsArray(); + if (autofillIdsArray == null || autofillIdsArray.length == 0) { + return null; + } // TODO: on MR1, creates a new SaveType without required ids mCachedSaveInfo = new SaveInfo.Builder(saveType, autofillIdsArray).build(); } diff --git a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/adapter/ResponseAdapter.java b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/adapter/ResponseAdapter.java index f74a1999..39ebf702 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/adapter/ResponseAdapter.java +++ b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/adapter/ResponseAdapter.java @@ -106,8 +106,13 @@ public class ResponseAdapter { && saveType != SaveInfo.SAVE_DATA_TYPE_PASSWORD) || autofillIds.length != 1 || allHints.size() != 1) { logd("Unsupported activity for partial info; returning full"); - responseBuilder.setSaveInfo(mClientViewMetadata.getSaveInfo()); - return responseBuilder.build(); + SaveInfo saveInfo = mClientViewMetadata.getSaveInfo(); + if (saveInfo != null) { + responseBuilder.setSaveInfo(mClientViewMetadata.getSaveInfo()); + return responseBuilder.build(); + } else { + return null; + } } int previousSaveType; String previousHint; diff --git a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/LocalAutofillDataSource.java b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/LocalAutofillDataSource.java index 3c326103..758b5123 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/LocalAutofillDataSource.java +++ b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/LocalAutofillDataSource.java @@ -75,7 +75,7 @@ public class LocalAutofillDataSource implements AutofillDataSource { AutofillHints.convertToStoredHintNames(allAutofillHints); mAppExecutors.diskIO().execute(() -> { List<DatasetWithFilledAutofillFields> datasetsWithFilledAutofillFields = mAutofillDao - .getFilledAutofillFields(storedAllAutofillHints); + .getDatasets(storedAllAutofillHints); mAppExecutors.mainThread().execute(() -> datasetsCallback.onLoaded(datasetsWithFilledAutofillFields) ); @@ -88,7 +88,7 @@ public class LocalAutofillDataSource implements AutofillDataSource { mAppExecutors.diskIO().execute(() -> { // Room does not support TypeConverters for collections. List<DatasetWithFilledAutofillFields> autofillDatasetFields = - mAutofillDao.getFilledAutofillFieldsWithName(allAutofillHints, datasetName); + mAutofillDao.getDatasetsWithName(allAutofillHints, datasetName); if (autofillDatasetFields != null && !autofillDatasetFields.isEmpty()) { if (autofillDatasetFields.size() > 1) { logw("More than 1 dataset with name %s", datasetName); diff --git a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/dao/AutofillDao.java b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/dao/AutofillDao.java index 8a8c6a92..00856ae6 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/dao/AutofillDao.java +++ b/input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/dao/AutofillDao.java @@ -39,7 +39,7 @@ public interface AutofillDao { @Query("SELECT DISTINCT id, datasetName FROM FilledAutofillField, AutofillDataset" + " WHERE AutofillDataset.id = FilledAutofillField.datasetId" + " AND FilledAutofillField.hint IN (:allAutofillHints)") - List<DatasetWithFilledAutofillFields> getFilledAutofillFields(List<String> allAutofillHints); + List<DatasetWithFilledAutofillFields> getDatasets(List<String> allAutofillHints); /** * Fetches a list of datasets associated to autofill fields. It should only return a dataset @@ -50,11 +50,11 @@ public interface AutofillDao { * all of the views on the page. * @param datasetName Filtering parameter; only return datasets with this name. */ - @Query("SELECT id, datasetname FROM FilledAutofillField, AutofillDataset" + + @Query("SELECT DISTINCT id, datasetname FROM FilledAutofillField, AutofillDataset" + " WHERE AutofillDataset.id = FilledAutofillField.datasetId" + " AND AutofillDataset.datasetName = (:datasetName)" + " AND FilledAutofillField.hint IN (:allAutofillHints)") - List<DatasetWithFilledAutofillFields> getFilledAutofillFieldsWithName( + List<DatasetWithFilledAutofillFields> getDatasetsWithName( List<String> allAutofillHints, String datasetName); /** 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 2ade8f1d..9d41f97f 100644 --- a/input/autofill/AutofillFramework/afservice/src/main/res/values/strings.xml +++ b/input/autofill/AutofillFramework/afservice/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ <resources> <string name="invalid_package_signature">Invalid package signature</string> <string name="autofill_sign_in_prompt">Tap to sign in.</string> + <string name="authentication_name">Autofill Authentication</string> <string name="settings_name">Autofill Settings</string> <string name="settings_cancel">Cancel</string> <string name="settings_save">Save</string> |