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

Commit 2afe2aa1 authored by Yohei Yukawa's avatar Yohei Yukawa
Browse files

Add a new API IMM#dispatchKeyEventFromInputMethod().

This is a part of effort to reduce the number of dependencies on @hide
method in BaseInputConnection.

Currently BaseInputConnection#sendKeyEvent() cannot be implemented
without relying on @hide internal fields in InputMethodManager.

This is not ideal because app developers cannot implement their own
InputConnection without relying on BaseInputConnection.  If this
functionality needs to be exposed to app developers anyway, then it
should be a public API.

Bug: 24688781
Change-Id: Ib5ea8131de5ba792b10e1a4e51b4d163cf3649e3
parent 159dd47d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -43492,6 +43492,7 @@ package android.view.inputmethod {
  }
  public final class InputMethodManager {
    method public void dispatchKeyEventFromInputMethod(android.view.View, android.view.KeyEvent);
    method public void displayCompletions(android.view.View, android.view.inputmethod.CompletionInfo[]);
    method public android.view.inputmethod.InputMethodSubtype getCurrentInputMethodSubtype();
    method public java.util.List<android.view.inputmethod.InputMethodInfo> getEnabledInputMethodList();
+1 −0
Original line number Diff line number Diff line
@@ -45842,6 +45842,7 @@ package android.view.inputmethod {
  }
  public final class InputMethodManager {
    method public void dispatchKeyEventFromInputMethod(android.view.View, android.view.KeyEvent);
    method public void displayCompletions(android.view.View, android.view.inputmethod.CompletionInfo[]);
    method public android.view.inputmethod.InputMethodSubtype getCurrentInputMethodSubtype();
    method public java.util.List<android.view.inputmethod.InputMethodInfo> getEnabledInputMethodList();
+1 −0
Original line number Diff line number Diff line
@@ -43508,6 +43508,7 @@ package android.view.inputmethod {
  }
  public final class InputMethodManager {
    method public void dispatchKeyEventFromInputMethod(android.view.View, android.view.KeyEvent);
    method public void displayCompletions(android.view.View, android.view.inputmethod.CompletionInfo[]);
    method public android.view.inputmethod.InputMethodSubtype getCurrentInputMethodSubtype();
    method public java.util.List<android.view.inputmethod.InputMethodInfo> getEnabledInputMethodList();
+1 −11
Original line number Diff line number Diff line
@@ -514,17 +514,7 @@ public class BaseInputConnection implements InputConnection {
     * attached to the input connection's view.
     */
    public boolean sendKeyEvent(KeyEvent event) {
        synchronized (mIMM.mH) {
            ViewRootImpl viewRootImpl = mTargetView != null ? mTargetView.getViewRootImpl() : null;
            if (viewRootImpl == null) {
                if (mIMM.mServedView != null) {
                    viewRootImpl = mIMM.mServedView.getViewRootImpl();
                }
            }
            if (viewRootImpl != null) {
                viewRootImpl.dispatchKeyFromIme(event);
            }
        }
        mIMM.dispatchKeyEventFromInputMethod(mTargetView, event);
        return false;
    }

+30 −0
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import com.android.internal.view.IInputMethodSession;
import com.android.internal.view.InputBindResult;
import com.android.internal.view.InputMethodClient;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.content.Context;
import android.graphics.Rect;
@@ -1823,6 +1825,34 @@ public final class InputMethodManager {
        return DISPATCH_NOT_HANDLED;
    }

    /**
     * Provides the default implementation of {@link InputConnection#sendKeyEvent(KeyEvent)}, which
     * is expected to dispatch an keyboard event sent from the IME to an appropriate event target
     * depending on the given {@link View} and the current focus state.
     *
     * <p>CAUTION: This method is provided only for the situation where
     * {@link InputConnection#sendKeyEvent(KeyEvent)} needs to be implemented without relying on
     * {@link BaseInputConnection}. Do not use this API for anything else.</p>
     *
     * @param targetView the default target view. If {@code null} is specified, then this method
     * tries to find a good event target based on the current focus state.
     * @param event the key event to be dispatched.
     */
    public void dispatchKeyEventFromInputMethod(@Nullable View targetView,
            @NonNull KeyEvent event) {
        synchronized (mH) {
            ViewRootImpl viewRootImpl = targetView != null ? targetView.getViewRootImpl() : null;
            if (viewRootImpl == null) {
                if (mServedView != null) {
                    viewRootImpl = mServedView.getViewRootImpl();
                }
            }
            if (viewRootImpl != null) {
                viewRootImpl.dispatchKeyFromIme(event);
            }
        }
    }

    // Must be called on the main looper
    void sendInputEventAndReportResultOnMainLooper(PendingEvent p) {
        final boolean handled;