Loading core/java/android/view/inputmethod/InputMethodManager.java +4 −0 Original line number Diff line number Diff line Loading @@ -973,8 +973,12 @@ public final class InputMethodManager { @GuardedBy("mH") private void setCurrentRootViewLocked(ViewRootImpl rootView) { final boolean wasEmpty = mCurRootView == null; mImeDispatcher.switchRootView(mCurRootView, rootView); mCurRootView = rootView; if (wasEmpty && mCurRootView != null) { mImeDispatcher.updateReceivingDispatcher(mCurRootView.getOnBackInvokedDispatcher()); } } } Loading core/java/android/window/ImeOnBackInvokedDispatcher.java +15 −1 Original line number Diff line number Diff line Loading @@ -27,10 +27,12 @@ import android.os.Parcelable; import android.os.RemoteException; import android.os.ResultReceiver; import android.util.Log; import android.util.Pair; import android.view.ViewRootImpl; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.function.Consumer; Loading Loading @@ -58,7 +60,7 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc // The handler to run callbacks on. This should be on the same thread // the ViewRootImpl holding IME's WindowOnBackInvokedDispatcher is created on. private Handler mHandler; private final ArrayDeque<Pair<Integer, Bundle>> mQueuedReceive = new ArrayDeque<>(); public ImeOnBackInvokedDispatcher(Handler handler) { mResultReceiver = new ResultReceiver(handler) { @Override Loading @@ -66,11 +68,22 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc WindowOnBackInvokedDispatcher dispatcher = getReceivingDispatcher(); if (dispatcher != null) { receive(resultCode, resultData, dispatcher); } else { mQueuedReceive.add(new Pair<>(resultCode, resultData)); } } }; } /** Set receiving dispatcher to consume queued receiving events. */ public void updateReceivingDispatcher(@NonNull WindowOnBackInvokedDispatcher dispatcher) { while (!mQueuedReceive.isEmpty()) { final Pair<Integer, Bundle> queuedMessage = mQueuedReceive.poll(); receive(queuedMessage.first, queuedMessage.second, dispatcher); } } void setHandler(@NonNull Handler handler) { mHandler = handler; } Loading Loading @@ -198,6 +211,7 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc } } mImeCallbacks.clear(); mQueuedReceive.clear(); } @VisibleForTesting(visibility = PACKAGE) Loading Loading
core/java/android/view/inputmethod/InputMethodManager.java +4 −0 Original line number Diff line number Diff line Loading @@ -973,8 +973,12 @@ public final class InputMethodManager { @GuardedBy("mH") private void setCurrentRootViewLocked(ViewRootImpl rootView) { final boolean wasEmpty = mCurRootView == null; mImeDispatcher.switchRootView(mCurRootView, rootView); mCurRootView = rootView; if (wasEmpty && mCurRootView != null) { mImeDispatcher.updateReceivingDispatcher(mCurRootView.getOnBackInvokedDispatcher()); } } } Loading
core/java/android/window/ImeOnBackInvokedDispatcher.java +15 −1 Original line number Diff line number Diff line Loading @@ -27,10 +27,12 @@ import android.os.Parcelable; import android.os.RemoteException; import android.os.ResultReceiver; import android.util.Log; import android.util.Pair; import android.view.ViewRootImpl; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.function.Consumer; Loading Loading @@ -58,7 +60,7 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc // The handler to run callbacks on. This should be on the same thread // the ViewRootImpl holding IME's WindowOnBackInvokedDispatcher is created on. private Handler mHandler; private final ArrayDeque<Pair<Integer, Bundle>> mQueuedReceive = new ArrayDeque<>(); public ImeOnBackInvokedDispatcher(Handler handler) { mResultReceiver = new ResultReceiver(handler) { @Override Loading @@ -66,11 +68,22 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc WindowOnBackInvokedDispatcher dispatcher = getReceivingDispatcher(); if (dispatcher != null) { receive(resultCode, resultData, dispatcher); } else { mQueuedReceive.add(new Pair<>(resultCode, resultData)); } } }; } /** Set receiving dispatcher to consume queued receiving events. */ public void updateReceivingDispatcher(@NonNull WindowOnBackInvokedDispatcher dispatcher) { while (!mQueuedReceive.isEmpty()) { final Pair<Integer, Bundle> queuedMessage = mQueuedReceive.poll(); receive(queuedMessage.first, queuedMessage.second, dispatcher); } } void setHandler(@NonNull Handler handler) { mHandler = handler; } Loading Loading @@ -198,6 +211,7 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc } } mImeCallbacks.clear(); mQueuedReceive.clear(); } @VisibleForTesting(visibility = PACKAGE) Loading