From fbc89efee39e5bcd64a4feb21d510435c3228eb2 Mon Sep 17 00:00:00 2001 From: Joanne Chung Date: Tue, 2 Jun 2020 15:36:46 +0800 Subject: [PATCH] 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 --- .../android/view/autofill/AutofillId.java | 5 +++- .../android/view/autofill/AutofillIdTest.java | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/autofill/AutofillId.java b/core/java/android/view/autofill/AutofillId.java index b387a68dd8a34..68943bf2a83a0 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 a8ca6f048a116..b329e55b569f7 100644 --- a/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java +++ b/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java @@ -125,6 +125,32 @@ public class AutofillIdTest { assertNonVirtual(idWithoutSession, 42, NO_SESSION); } + @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);