New autofill tests for tapping home while UI is shown.
Test: cts-tradefed run commandAndExit cts-dev -m CtsAutoFillServiceTestCases -t android.autofillservice.cts.SimpleSaveActivityTest#testTapHomeWhileSaveUiIsShowing
Test: cts-tradefed run commandAndExit cts-dev -m CtsAutoFillServiceTestCases -t android.autofillservice.cts.SimpleSaveActivityTest#testTapHomeWhileDatasetPickerUiIsShowing
Bug: 65414762
Change-Id: Ib48a2373169750444805dc58779c44fb66b02206
diff --git a/tests/autofillservice/src/android/autofillservice/cts/Helper.java b/tests/autofillservice/src/android/autofillservice/cts/Helper.java
index 4a4213f..16b2734 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/Helper.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/Helper.java
@@ -96,6 +96,11 @@
static final int UI_TIMEOUT_MS = 2000;
/**
+ * Timeout (in milliseconds) for an activity to be brought out to top.
+ */
+ static final int ACTIVITY_RESURRECTION_MS = 5000;
+
+ /**
* Timeout (in milliseconds) for changing the screen orientation.
*/
static final int UI_SCREEN_ORIENTATION_TIMEOUT_MS = 5000;
diff --git a/tests/autofillservice/src/android/autofillservice/cts/SimpleSaveActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/SimpleSaveActivityTest.java
index 83950eb..9fb16a2 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/SimpleSaveActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/SimpleSaveActivityTest.java
@@ -59,6 +59,13 @@
mActivity = mActivityRule.launchActivity(intent);
}
+ private void restartActivity() {
+ final Intent intent = new Intent(mContext.getApplicationContext(),
+ SimpleSaveActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ mContext.startActivity(intent);
+ }
+
@Test
public void testAutoFillOneDatasetAndSave() throws Exception {
startActivity();
@@ -349,6 +356,98 @@
sUiBot.assertSaveNotShowing(SAVE_DATA_TYPE_GENERIC);
}
+ @Test
+ public void testTapHomeWhileDatasetPickerUiIsShowing() throws Exception {
+ startActivity();
+ enableService();
+ final MyAutofillCallback callback = mActivity.registerCallback();
+
+ // Set expectations.
+ sReplier.addResponse(new CannedFillResponse.Builder()
+ .addDataset(new CannedDataset.Builder()
+ .setField(ID_INPUT, "id")
+ .setField(ID_PASSWORD, "pass")
+ .setPresentation(createPresentation("YO"))
+ .build())
+ .build());
+
+ // Trigger autofill.
+ sUiBot.assertShownByRelativeId(ID_INPUT).click();
+ sReplier.getNextFillRequest();
+ sUiBot.assertDatasets("YO");
+ callback.assertUiShownEvent(mActivity.mInput);
+
+ // Go home, you are drunk!
+ sUiBot.pressHome();
+ sUiBot.assertNoDatasets();
+ callback.assertUiHiddenEvent(mActivity.mInput);
+
+ // Switch back to the activity.
+ restartActivity();
+ sUiBot.assertShownByText(TEXT_LABEL, Helper.ACTIVITY_RESURRECTION_MS);
+ final UiObject2 datasetPicker = sUiBot.assertDatasets("YO");
+ callback.assertUiShownEvent(mActivity.mInput);
+
+ // Now autofill it.
+ final FillExpectation autofillExpecation = mActivity.expectAutoFill("id", "pass");
+ sUiBot.selectDataset(datasetPicker, "YO");
+ autofillExpecation.assertAutoFilled();
+ }
+
+ @Test
+ public void testTapHomeWhileSaveUiIsShowing() throws Exception {
+ startActivity();
+ enableService();
+
+ // Set expectations.
+ sReplier.addResponse(new CannedFillResponse.Builder()
+ .setRequiredSavableIds(SAVE_DATA_TYPE_GENERIC, ID_INPUT)
+ .build());
+
+ // Trigger autofill.
+ mActivity.syncRunOnUiThread(() -> mActivity.mInput.requestFocus());
+ sReplier.getNextFillRequest();
+ sUiBot.assertNoDatasets();
+
+ // Trigger save, but don't tap it.
+ mActivity.syncRunOnUiThread(() -> {
+ mActivity.mInput.setText("108");
+ mActivity.mCommit.performClick();
+ });
+ sUiBot.assertSaveShowing(SAVE_DATA_TYPE_GENERIC);
+
+ // Go home, you are drunk!
+ sUiBot.pressHome();
+ sUiBot.assertSaveNotShowing(SAVE_DATA_TYPE_GENERIC);
+ Helper.assertNoDanglingSessions();
+
+ // Prepare the response for the next session, which will be automatically triggered
+ // when the activity is brought back.
+ sReplier.addResponse(new CannedFillResponse.Builder()
+ .setRequiredSavableIds(SAVE_DATA_TYPE_GENERIC, ID_INPUT, ID_PASSWORD)
+ .addDataset(new CannedDataset.Builder()
+ .setField(ID_INPUT, "id")
+ .setField(ID_PASSWORD, "pass")
+ .setPresentation(createPresentation("YO"))
+ .build())
+ .build());
+
+ // Switch back to the activity.
+ restartActivity();
+ sUiBot.assertShownByText(TEXT_LABEL, Helper.ACTIVITY_RESURRECTION_MS);
+ sUiBot.assertSaveNotShowing(SAVE_DATA_TYPE_GENERIC);
+ sReplier.getNextFillRequest();
+ sUiBot.assertNoDatasets();
+
+ // Trigger and select UI.
+ mActivity.syncRunOnUiThread(() -> mActivity.mPassword.requestFocus());
+ final FillExpectation autofillExpecation = mActivity.expectAutoFill("id", "pass");
+ sUiBot.selectDataset("YO");
+
+ // Assert it.
+ autofillExpecation.assertAutoFilled();
+ }
+
private void startWelcomeActivityOnNewTask() throws Exception {
final Intent intent = new Intent(mContext, WelcomeActivity.class);
intent.setFlags(
diff --git a/tests/autofillservice/src/android/autofillservice/cts/UiBot.java b/tests/autofillservice/src/android/autofillservice/cts/UiBot.java
index d1f3baa..b12e137 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/UiBot.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/UiBot.java
@@ -182,7 +182,11 @@
* {@link #assertDatasets(String...)}.
*/
public UiObject2 assertShownByText(String text) {
- final UiObject2 object = waitForObject(By.text(text));
+ return assertShownByText(text, UI_TIMEOUT_MS);
+ }
+
+ public UiObject2 assertShownByText(String text, int timeoutMs) {
+ final UiObject2 object = waitForObject(By.text(text), timeoutMs);
assertWithMessage("No node with text '%s'", text).that(object).isNotNull();
return object;
}