Loading services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +9 −1 Original line number Diff line number Diff line Loading @@ -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; } Loading services/core/java/com/android/server/inputmethod/ZeroJankProxy.java +32 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading @@ -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) { Loading Loading @@ -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; } Loading @@ -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 { Loading Loading
services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +9 −1 Original line number Diff line number Diff line Loading @@ -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; } Loading
services/core/java/com/android/server/inputmethod/ZeroJankProxy.java +32 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading @@ -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) { Loading Loading @@ -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; } Loading @@ -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 { Loading