Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad25f42c authored by Haoran Zhang's avatar Haoran Zhang
Browse files

Post onProvideAutofillStructure in Augment Autofill flow to UI thread

This is to fix the issue that onProvideAutofillStructure is called on the binder thread causing CtsInputMethodTestCases FocusHandlingTest#testOnCheckIsTextEditorRunOnUIThreadWithInputMethodManagerIsActive to fail.

Bug: b/362908997
Change-Id: Ic68dca1e0baef2e5b00c248c4417b8891749cdcf
Test: atest
CtsAutoFillServiceTestCases:android.autofillservice.cts.augmented
Flag: EXEMPT bugfix
parent 276222e0
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -117,6 +117,8 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

import sun.misc.Cleaner;
@@ -4914,7 +4916,22 @@ public final class AutofillManager {
                    && (root.getWindowFlags() & WindowManager.LayoutParams.FLAG_SECURE) == 0) {
                ViewNodeBuilder viewStructure = new ViewNodeBuilder();
                viewStructure.setAutofillId(view.getAutofillId());

                // Post onProvideAutofillStructure to the UI thread
                final CountDownLatch latch = new CountDownLatch(1);
                afm.post(
                    () -> {
                        view.onProvideAutofillStructure(viewStructure, /* flags= */ 0);
                        latch.countDown();
                    }
                );
                try {
                    latch.await(5000, TimeUnit.MILLISECONDS);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    return null;
                }

                // TODO(b/141703532): We don't call View#onProvideAutofillVirtualStructure for
                //  efficiency reason. But this also means we will return null for virtual views
                //  for now. We will add a new API to fetch the view node info of the virtual