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

Commit ffd9affb authored by Feng Cao's avatar Feng Cao
Browse files

Callback the surface package after the views are drawn locally

* SurfaceControlViewHost#setView() method will post a task to the
  main thread to draw the view. We want to callback the surface
  package to the remote process after the view is drawn and ready
  to be shown, to avoid the flicker when the remote process attaches
  it to their window when it's not drawn.

Test: atest android.autofillservice.cts.inline
Bug: 157515522

Change-Id: Ia75baaf9d6a4770a783dfc75ebb01b4b6e62e180
parent 4add1559
Loading
Loading
Loading
Loading
+19 −12
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ public abstract class InlineSuggestionRenderService extends Service {
    public static final String SERVICE_INTERFACE =
            "android.service.autofill.InlineSuggestionRenderService";

    private final Handler mHandler = new Handler(Looper.getMainLooper(), null, true);
    private final Handler mMainHandler = new Handler(Looper.getMainLooper(), null, true);

    private IInlineSuggestionUiCallback mCallback;

@@ -192,15 +192,22 @@ public abstract class InlineSuggestionRenderService extends Service {
                }
                return true;
            });
            final InlineSuggestionUiImpl uiImpl = new InlineSuggestionUiImpl(host, mMainHandler);
            mActiveInlineSuggestions.put(uiImpl, true);

            // We post the callback invocation to the end of the main thread handler queue, to make
            // sure the callback happens after the views are drawn. This is needed because calling
            // {@link SurfaceControlViewHost#setView()} will post a task to the main thread
            // to draw the view asynchronously.
            mMainHandler.post(() -> {
                try {
                InlineSuggestionUiImpl uiImpl = new InlineSuggestionUiImpl(host, mHandler);
                mActiveInlineSuggestions.put(uiImpl, true);
                callback.onContent(new InlineSuggestionUiWrapper(uiImpl), host.getSurfacePackage(),
                    callback.onContent(new InlineSuggestionUiWrapper(uiImpl),
                            host.getSurfacePackage(),
                            measuredSize.getWidth(), measuredSize.getHeight());
                } catch (RemoteException e) {
                    Log.w(TAG, "RemoteException calling onContent()");
                }
            });
        } finally {
            updateDisplay(Display.DEFAULT_DISPLAY);
        }
@@ -305,7 +312,7 @@ public abstract class InlineSuggestionRenderService extends Service {
                public void renderSuggestion(@NonNull IInlineSuggestionUiCallback callback,
                        @NonNull InlinePresentation presentation, int width, int height,
                        @Nullable IBinder hostInputToken, int displayId) {
                    mHandler.sendMessage(
                    mMainHandler.sendMessage(
                            obtainMessage(InlineSuggestionRenderService::handleRenderSuggestion,
                                    InlineSuggestionRenderService.this, callback, presentation,
                                    width, height, hostInputToken, displayId));
@@ -313,7 +320,7 @@ public abstract class InlineSuggestionRenderService extends Service {

                @Override
                public void getInlineSuggestionsRendererInfo(@NonNull RemoteCallback callback) {
                    mHandler.sendMessage(obtainMessage(
                    mMainHandler.sendMessage(obtainMessage(
                            InlineSuggestionRenderService::handleGetInlineSuggestionsRendererInfo,
                            InlineSuggestionRenderService.this, callback));
                }