diff --git a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java index 7e345a6d6..76a913393 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java @@ -608,12 +608,15 @@ public void onBackPressed() { @Override public boolean dispatchKeyEvent(KeyEvent event) { + if (mKeyboard.dispatchKeyEvent(event)) { + return true; + } + final int keyCode = event.getKeyCode(); if (DeviceType.isOculusBuild()) { int action = event.getAction(); if (action != KeyEvent.ACTION_DOWN) { return super.dispatchKeyEvent(event); } - int keyCode = event.getKeyCode(); boolean result; switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: @@ -622,6 +625,9 @@ public boolean dispatchKeyEvent(KeyEvent event) { case KeyEvent.KEYCODE_VOLUME_DOWN: result = callOnAudioManager((AudioManager aManager) -> aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI)); break; + case KeyEvent.KEYCODE_VOLUME_MUTE: + result = callOnAudioManager((AudioManager aManager) -> aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, AudioManager.FLAG_SHOW_UI)); + break; default: return super.dispatchKeyEvent(event); } @@ -629,7 +635,7 @@ public boolean dispatchKeyEvent(KeyEvent event) { } else if (DeviceType.isGoogleVR()) { boolean result; - switch( event.getKeyCode() ) { + switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_VOLUME_DOWN: result = true; diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/KeyboardWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/KeyboardWidget.java index 6e318da62..e96b3fc92 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/KeyboardWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/KeyboardWidget.java @@ -15,6 +15,8 @@ import android.text.TextWatcher; import android.util.AttributeSet; import android.util.Log; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -22,6 +24,7 @@ import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputConnection; +import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; @@ -309,6 +312,10 @@ private void resetKeyboardLayout() { updateCandidates(); } + private boolean isAttachToWindowWidget() { + return mFocusedView instanceof WindowWidget; + } + public void updateFocusedView(View aFocusedView) { if (mFocusedView != null && mFocusedView instanceof TextView) { ((TextView)mFocusedView).removeTextChangedListener(this); @@ -910,6 +917,59 @@ private void displayComposingText(String aText, ComposingAction aAction) { } } + private void moveCursor(final int direction) { + EditText textView; + if (mFocusedView != null && mFocusedView instanceof EditText) { + textView = (EditText)mFocusedView; + final int cursor = textView.getSelectionStart() + direction; + if ((cursor <= textView.length()) && (cursor >= 0)) { + textView.setSelection(cursor); + } + } + } + + @Override + public boolean dispatchKeyEvent(final KeyEvent event) { + final int keyCode = event.getKeyCode(); + final InputConnection connection = mInputConnection; + if (connection != null) { + if (isAttachToWindowWidget()) { + connection.sendKeyEvent(event); + hide(UIWidget.KEEP_WIDGET); + return true; + } + // Android Components do not support InputConnection.sendKeyEvent() + if (event.getAction() == KeyEvent.ACTION_DOWN) { + Log.e("reb", "key = " + KeyEvent.keyCodeToString(keyCode)); + + switch (keyCode) { + case KeyEvent.KEYCODE_DEL: + handleBackspace(event.isLongPress()); + return true; + case KeyEvent.KEYCODE_ENTER: + case KeyEvent.KEYCODE_NUMPAD_ENTER: + handleDone(); + return true; + case KeyEvent.KEYCODE_DPAD_LEFT: + moveCursor(-1); + return true; + case KeyEvent.KEYCODE_DPAD_RIGHT: + moveCursor(1); + return true; + default: + break; + } + if (event.getUnicodeChar() != 0) { + KeyCharacterMap map = event.getKeyCharacterMap(); + String value = String.valueOf((char) map.get(keyCode, event.getMetaState())); + connection.commitText(value, 1); + return true; + } + } + } + return false; + } + // GeckoSession.TextInputDelegate @Override