summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Joanne Chung <joannechung@google.com> 2020-06-02 15:36:46 +0800
committer Joanne Chung <joannechung@google.com> 2020-06-03 01:06:24 +0800
commitfbc89efee39e5bcd64a4feb21d510435c3228eb2 (patch)
tree146d91981e4679b64a8090960ddde374a9bc98bf
parent829ac140f8f5914d5cff3ab36a1b86eb59ead2c6 (diff)
Fix AugmentedAutofillService onFillRequest() wrong focused AutofillId for WebView
When AutofillManagerService try to trigger AugmentedAutofill, it uses AutofillId.withoutSession() to get the AutollId without session. It will return invalid "parentId:NO_ID" if the virtual AutofillId is created with FLAG_IS_VIRTUAL_INT. The virtual AutofillId flag should be FLAG_IS_VIRTUAL_INT or FLAG_IS_VIRTUAL_LONG, we should get mVirtualIntId for FLAG_IS_VIRTUAL_INT or mVirtualLongId for FLAG_IS_VIRTUAL_LONG. Bug: 156408900 Test: atest android.autofillservice.cts.augmented Test: atest android.view.autofill.AutofillIdTest#\ testVirtual_Long_withoutSession Test: atest android.view.autofill.AutofillIdTest#\ testVirtual_Int_withoutSession Test: Manual. Write a simple cts test for webview and check the focused AutofillId is correct while switching between the field. Change-Id: I7ebb4d7cfb6d6f383724b798dae69269ae3a27be
-rw-r--r--core/java/android/view/autofill/AutofillId.java5
-rw-r--r--core/tests/coretests/src/android/view/autofill/AutofillIdTest.java26
2 files changed, 30 insertions, 1 deletions
diff --git a/core/java/android/view/autofill/AutofillId.java b/core/java/android/view/autofill/AutofillId.java
index b387a68dd8a3..68943bf2a83a 100644
--- a/core/java/android/view/autofill/AutofillId.java
+++ b/core/java/android/view/autofill/AutofillId.java
@@ -75,7 +75,10 @@ public final class AutofillId implements Parcelable {
/** @hide */
public static AutofillId withoutSession(@NonNull AutofillId id) {
final int flags = id.mFlags & ~FLAG_HAS_SESSION;
- return new AutofillId(flags, id.mViewId, id.mVirtualLongId, NO_SESSION);
+ final long virtualChildId =
+ ((id.mFlags & FLAG_IS_VIRTUAL_LONG) != 0) ? id.mVirtualLongId
+ : id.mVirtualIntId;
+ return new AutofillId(flags, id.mViewId, virtualChildId, NO_SESSION);
}
/** @hide */
diff --git a/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java b/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java
index a8ca6f048a11..b329e55b569f 100644
--- a/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java
+++ b/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java
@@ -126,6 +126,32 @@ public class AutofillIdTest {
}
@Test
+ public void testVirtual_Long_withoutSession() {
+ final AutofillId id = new AutofillId(new AutofillId(42), 108L, 666);
+ final AutofillId idWithoutSession = AutofillId.withoutSession(id);
+ assertThat(idWithoutSession.getViewId()).isEqualTo(42);
+ assertThat(idWithoutSession.isVirtualLong()).isTrue();
+ assertThat(idWithoutSession.isVirtualInt()).isFalse();
+ assertThat(idWithoutSession.isNonVirtual()).isFalse();
+ assertThat(idWithoutSession.getVirtualChildLongId()).isEqualTo(108L);
+ assertThat(idWithoutSession.getVirtualChildIntId()).isEqualTo(View.NO_ID);
+ assertThat(idWithoutSession.getSessionId()).isEqualTo(NO_SESSION);
+ }
+
+ @Test
+ public void testVirtual_Int_withoutSession() {
+ final AutofillId id = new AutofillId(42, 108);
+ final AutofillId idWithoutSession = AutofillId.withoutSession(id);
+ assertThat(idWithoutSession.getViewId()).isEqualTo(42);
+ assertThat(idWithoutSession.isVirtualLong()).isFalse();
+ assertThat(idWithoutSession.isVirtualInt()).isTrue();
+ assertThat(idWithoutSession.isNonVirtual()).isFalse();
+ assertThat(idWithoutSession.getVirtualChildIntId()).isEqualTo(108);
+ assertThat(idWithoutSession.getVirtualChildLongId()).isEqualTo(View.NO_ID);
+ assertThat(idWithoutSession.getSessionId()).isEqualTo(NO_SESSION);
+ }
+
+ @Test
public void testSetResetSession() {
final AutofillId id = new AutofillId(42);
assertNonVirtual(id, 42, NO_SESSION);