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
This commit is contained in:
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user