Keyboard support for a submit button and setting the IME's text content and selection * Add a KeyboardClient.Submit callback invoked when the submit key is pressed in the IME * KeyboardService.SetText and SetSelection can be used to update the IME's state to match the contents of an edit widget * Also copy InputConnectionAdaptor.sendKeyEvent to keep the Mojo version of InputConnectionAdaptor in sync with Sky's version R=abarth@chromium.org, jamesr@chromium.org Review URL: https://codereview.chromium.org/1382943003 .
diff --git a/examples/keyboard_client/keyboard_client.cc b/examples/keyboard_client/keyboard_client.cc index 4c2fa8d..de0690d 100644 --- a/examples/keyboard_client/keyboard_client.cc +++ b/examples/keyboard_client/keyboard_client.cc
@@ -246,6 +246,8 @@ void SetSelection(int32_t start, int32_t end) override { DrawText(); } + void Submit(keyboard::SubmitAction action) override {} + // mojo::ViewObserver implementation. void OnViewDestroyed(mojo::View* view) override { if (view == text_view_) {
diff --git a/mojo/services/keyboard/interfaces/keyboard.mojom b/mojo/services/keyboard/interfaces/keyboard.mojom index f47ecc4..9794220 100644 --- a/mojo/services/keyboard/interfaces/keyboard.mojom +++ b/mojo/services/keyboard/interfaces/keyboard.mojom
@@ -18,6 +18,10 @@ string new_text; }; +enum SubmitAction { + DONE, +}; + interface KeyboardClient { CommitCompletion(CompletionData completion); CommitCorrection(CorrectionData correction); @@ -26,6 +30,7 @@ SetComposingRegion(int32 start, int32 end); SetComposingText(string text, int32 newCursorPosition); SetSelection(int32 start, int32 end); + Submit(SubmitAction action); }; // Loosely modeled on Android InputType: @@ -41,4 +46,6 @@ Show(KeyboardClient client, KeyboardType type); ShowByRequest(); Hide(); + SetText(string text); + SetSelection(int32 start, int32 end); };
diff --git a/services/keyboard/src/org/chromium/mojo/keyboard/InputConnectionAdaptor.java b/services/keyboard/src/org/chromium/mojo/keyboard/InputConnectionAdaptor.java index 42bdd57..2efbce6 100644 --- a/services/keyboard/src/org/chromium/mojo/keyboard/InputConnectionAdaptor.java +++ b/services/keyboard/src/org/chromium/mojo/keyboard/InputConnectionAdaptor.java
@@ -4,6 +4,8 @@ package org.chromium.mojo.keyboard; +import android.text.Editable; +import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.CompletionInfo; @@ -13,19 +15,29 @@ import org.chromium.mojom.keyboard.CompletionData; import org.chromium.mojom.keyboard.CorrectionData; import org.chromium.mojom.keyboard.KeyboardClient; +import org.chromium.mojom.keyboard.SubmitAction; /** * An adaptor between InputConnection and KeyboardClient. */ public class InputConnectionAdaptor extends BaseInputConnection { private KeyboardClient mClient; + private Editable mEditable; - public InputConnectionAdaptor(View view, KeyboardClient client, EditorInfo outAttrs) { + public InputConnectionAdaptor(View view, KeyboardClient client, Editable editable, + EditorInfo outAttrs) { super(view, true); assert client != null; mClient = client; + mEditable = editable; outAttrs.initialSelStart = -1; outAttrs.initialSelEnd = -1; + outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE; + } + + @Override + public Editable getEditable() { + return mEditable; } @Override @@ -71,4 +83,20 @@ mClient.setSelection(start, end); return super.setSelection(start, end); } + + // Number keys come through as key events instead of commitText!? + @Override + public boolean sendKeyEvent(KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_UP) { + // 1 appears to always be the value for newCursorPosition? + mClient.commitText(String.valueOf(event.getNumber()), 1); + } + return super.sendKeyEvent(event); + } + + @Override + public boolean performEditorAction(int actionCode) { + mClient.submit(SubmitAction.DONE); + return true; + } }
diff --git a/services/keyboard/src/org/chromium/mojo/keyboard/KeyboardServiceImpl.java b/services/keyboard/src/org/chromium/mojo/keyboard/KeyboardServiceImpl.java index 42dbc7a..4e0cbfa 100644 --- a/services/keyboard/src/org/chromium/mojo/keyboard/KeyboardServiceImpl.java +++ b/services/keyboard/src/org/chromium/mojo/keyboard/KeyboardServiceImpl.java
@@ -75,4 +75,17 @@ imm.hideSoftInputFromWindow(sViewState.getView().getApplicationWindowToken(), 0); close(); } + + @Override + public void setText(String text) { + sViewState.setText(text); + InputMethodManager imm = + (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.restartInput(sViewState.getView()); + } + + @Override + public void setSelection(int start, int end) { + sViewState.setSelection(start, end); + } }
diff --git a/services/keyboard/src/org/chromium/mojo/keyboard/KeyboardServiceState.java b/services/keyboard/src/org/chromium/mojo/keyboard/KeyboardServiceState.java index 7196b24..4b025f1 100644 --- a/services/keyboard/src/org/chromium/mojo/keyboard/KeyboardServiceState.java +++ b/services/keyboard/src/org/chromium/mojo/keyboard/KeyboardServiceState.java
@@ -4,7 +4,10 @@ package org.chromium.mojo.keyboard; +import android.text.Editable; import android.text.InputType; +import android.text.Selection; +import android.text.SpannableStringBuilder; import android.view.View; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; @@ -18,23 +21,26 @@ private View mView; private KeyboardClient mActiveClient; private int mRequestedInputType; + private Editable mActiveEditable; public KeyboardServiceState(View view) { mView = view; mActiveClient = null; mRequestedInputType = InputType.TYPE_CLASS_TEXT; + mActiveEditable = null; } public InputConnection createInputConnection(EditorInfo outAttrs) { if (mActiveClient == null) return null; outAttrs.inputType = mRequestedInputType; - return new InputConnectionAdaptor(mView, mActiveClient, outAttrs); + return new InputConnectionAdaptor(mView, mActiveClient, mActiveEditable, outAttrs); } public void setClient(KeyboardClient client, int inputType) { if (mActiveClient != null) mActiveClient.close(); mActiveClient = client; mRequestedInputType = inputType; + mActiveEditable = new SpannableStringBuilder(); } public View getView() { @@ -45,5 +51,14 @@ if (mActiveClient == null) return; mActiveClient.close(); mActiveClient = null; + mActiveEditable = null; + } + + public void setText(String text) { + mActiveEditable.replace(0, mActiveEditable.length(), text); + } + + public void setSelection(int start, int end) { + Selection.setSelection(mActiveEditable, start, end); } }
diff --git a/services/keyboard_native/keyboard_service_impl.cc b/services/keyboard_native/keyboard_service_impl.cc index 45a2fee..27321c0 100644 --- a/services/keyboard_native/keyboard_service_impl.cc +++ b/services/keyboard_native/keyboard_service_impl.cc
@@ -25,6 +25,12 @@ void KeyboardServiceImpl::Hide() { } +void KeyboardServiceImpl::SetText(const mojo::String& text) { +} + +void KeyboardServiceImpl::SetSelection(int32_t start, int32_t end) { +} + void KeyboardServiceImpl::OnKey(const char* key) { client_->CommitText(key, 1); }
diff --git a/services/keyboard_native/keyboard_service_impl.h b/services/keyboard_native/keyboard_service_impl.h index 0d9213f..17b68fd 100644 --- a/services/keyboard_native/keyboard_service_impl.h +++ b/services/keyboard_native/keyboard_service_impl.h
@@ -22,6 +22,8 @@ void Show(KeyboardClientPtr client, KeyboardType type) override; void ShowByRequest() override; void Hide() override; + void SetText(const mojo::String& text) override; + void SetSelection(int32_t start, int32_t end) override; void OnKey(const char* key); void OnDelete();