aboutsummaryrefslogtreecommitdiff
path: root/input/autofill
diff options
context:
space:
mode:
authorDouglas Sigelbaum <sigelbaum@google.com>2017-11-28 06:54:15 -0500
committerDouglas Sigelbaum <sigelbaum@google.com>2017-12-12 11:33:27 -0800
commit42668e69d39004e93a5935977dbee66e63e569f8 (patch)
treef39035ca2bb4e48be102bd4cbb083ddb3f9dd26b /input/autofill
parentacb2cfd0dc0c23cb503cf62e610522862e887a5e (diff)
downloadandroid-42668e69d39004e93a5935977dbee66e63e569f8.tar.gz
Autofill sample: Fix authentication bugs.
Bug: 69833446 Test: manual Change-Id: Idaea1b86090153c3f821d4a3219a5a7c915a807c
Diffstat (limited to 'input/autofill')
-rw-r--r--input/autofill/AutofillFramework/afservice/src/androidTest/java/com/example/android/autofill/service/data/source/local/AutofillDaoTest.java10
-rw-r--r--input/autofill/AutofillFramework/afservice/src/main/AndroidManifest.xml7
-rw-r--r--input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/AuthActivity.java11
-rw-r--r--input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/MyAutofillService.java8
-rw-r--r--input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/ClientViewMetadata.java3
-rw-r--r--input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/adapter/ResponseAdapter.java9
-rw-r--r--input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/LocalAutofillDataSource.java4
-rw-r--r--input/autofill/AutofillFramework/afservice/src/main/java/com/example/android/autofill/service/data/source/local/dao/AutofillDao.java6
-rw-r--r--input/autofill/AutofillFramework/afservice/src/main/res/values/strings.xml1
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>