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

Commit 11885571 authored by Taran Singh's avatar Taran Singh Committed by Android (Google) Code Review
Browse files

Merge "InputMethodManager: invoke ResultReceiver when returning true" into main

parents 432a62b8 2aed6844
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -1248,7 +1248,15 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
            mService.publishLocalService();
            IInputMethodManager.Stub service;
            if (Flags.useZeroJankProxy()) {
                service = new ZeroJankProxy(mService.mHandler::post, mService);
                service =
                        new ZeroJankProxy(
                                mService.mHandler::post,
                                mService,
                                () -> {
                                    synchronized (ImfLock.class) {
                                        return mService.isInputShown();
                                    }
                                });
            } else {
                service = mService;
            }
+32 −6
Original line number Diff line number Diff line
@@ -46,7 +46,6 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ShellCallback;
import android.util.ExceptionUtils;
import android.util.Slog;
import android.view.WindowManager;
import android.view.inputmethod.CursorAnchorInfo;
@@ -77,6 +76,7 @@ import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.function.BooleanSupplier;

/**
 * A proxy that processes all {@link IInputMethodManager} calls asynchronously.
@@ -86,10 +86,12 @@ public class ZeroJankProxy extends IInputMethodManager.Stub {

    private final IInputMethodManager mInner;
    private final Executor mExecutor;
    private final BooleanSupplier mIsInputShown;

    ZeroJankProxy(Executor executor, IInputMethodManager inner) {
    ZeroJankProxy(Executor executor, IInputMethodManager inner, BooleanSupplier isInputShown) {
        mInner = inner;
        mExecutor = executor;
        mIsInputShown = isInputShown;
    }

    private void offload(ThrowingRunnable r) {
@@ -163,8 +165,19 @@ public class ZeroJankProxy extends IInputMethodManager.Stub {
            int lastClickTooType, ResultReceiver resultReceiver,
            @SoftInputShowHideReason int reason)
            throws RemoteException {
        offload(() -> mInner.showSoftInput(client, windowToken, statsToken, flags, lastClickTooType,
                resultReceiver, reason));
        offload(
                () -> {
                    if (!mInner.showSoftInput(
                            client,
                            windowToken,
                            statsToken,
                            flags,
                            lastClickTooType,
                            resultReceiver,
                            reason)) {
                        sendResultReceiverFailure(resultReceiver);
                    }
                });
        return true;
    }

@@ -173,11 +186,24 @@ public class ZeroJankProxy extends IInputMethodManager.Stub {
            @Nullable ImeTracker.Token statsToken, @InputMethodManager.HideFlags int flags,
            ResultReceiver resultReceiver, @SoftInputShowHideReason int reason)
            throws RemoteException {
        offload(() -> mInner.hideSoftInput(client, windowToken, statsToken, flags, resultReceiver,
                reason));
        offload(
                () -> {
                    if (!mInner.hideSoftInput(
                            client, windowToken, statsToken, flags, resultReceiver, reason)) {
                        sendResultReceiverFailure(resultReceiver);
                    }
                });
        return true;
    }

    private void sendResultReceiverFailure(ResultReceiver resultReceiver) {
        resultReceiver.send(
                mIsInputShown.getAsBoolean()
                        ? InputMethodManager.RESULT_UNCHANGED_SHOWN
                        : InputMethodManager.RESULT_UNCHANGED_HIDDEN,
                null);
    }

    @Override
    @EnforcePermission(Manifest.permission.TEST_INPUT_METHOD)
    public void hideSoftInputFromServerForTest() throws RemoteException {