Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit 22709f2

Browse files
committed
Add support for Bluetooth keyboards. Fixes #775 (#1878)
1 parent e957ecb commit 22709f2

File tree

2 files changed

+68
-2
lines changed

2 files changed

+68
-2
lines changed

app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -608,12 +608,15 @@ public void onBackPressed() {
608608

609609
@Override
610610
public boolean dispatchKeyEvent(KeyEvent event) {
611+
if (mKeyboard.dispatchKeyEvent(event)) {
612+
return true;
613+
}
614+
final int keyCode = event.getKeyCode();
611615
if (DeviceType.isOculusBuild()) {
612616
int action = event.getAction();
613617
if (action != KeyEvent.ACTION_DOWN) {
614618
return super.dispatchKeyEvent(event);
615619
}
616-
int keyCode = event.getKeyCode();
617620
boolean result;
618621
switch (keyCode) {
619622
case KeyEvent.KEYCODE_VOLUME_UP:
@@ -622,14 +625,17 @@ public boolean dispatchKeyEvent(KeyEvent event) {
622625
case KeyEvent.KEYCODE_VOLUME_DOWN:
623626
result = callOnAudioManager((AudioManager aManager) -> aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI));
624627
break;
628+
case KeyEvent.KEYCODE_VOLUME_MUTE:
629+
result = callOnAudioManager((AudioManager aManager) -> aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, AudioManager.FLAG_SHOW_UI));
630+
break;
625631
default:
626632
return super.dispatchKeyEvent(event);
627633
}
628634
return result || super.dispatchKeyEvent(event);
629635

630636
} else if (DeviceType.isGoogleVR()) {
631637
boolean result;
632-
switch( event.getKeyCode() ) {
638+
switch (keyCode) {
633639
case KeyEvent.KEYCODE_VOLUME_UP:
634640
case KeyEvent.KEYCODE_VOLUME_DOWN:
635641
result = true;

app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/KeyboardWidget.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,16 @@
1515
import android.text.TextWatcher;
1616
import android.util.AttributeSet;
1717
import android.util.Log;
18+
import android.view.KeyCharacterMap;
19+
import android.view.KeyEvent;
1820
import android.view.MotionEvent;
1921
import android.view.View;
2022
import android.view.ViewGroup;
2123
import android.view.inputmethod.EditorInfo;
2224
import android.view.inputmethod.ExtractedText;
2325
import android.view.inputmethod.ExtractedTextRequest;
2426
import android.view.inputmethod.InputConnection;
27+
import android.widget.EditText;
2528
import android.widget.ImageButton;
2629
import android.widget.ImageView;
2730
import android.widget.LinearLayout;
@@ -309,6 +312,10 @@ private void resetKeyboardLayout() {
309312
updateCandidates();
310313
}
311314

315+
private boolean isAttachToWindowWidget() {
316+
return mFocusedView instanceof WindowWidget;
317+
}
318+
312319
public void updateFocusedView(View aFocusedView) {
313320
if (mFocusedView != null && mFocusedView instanceof TextView) {
314321
((TextView)mFocusedView).removeTextChangedListener(this);
@@ -910,6 +917,59 @@ private void displayComposingText(String aText, ComposingAction aAction) {
910917
}
911918
}
912919

920+
private void moveCursor(final int direction) {
921+
EditText textView;
922+
if (mFocusedView != null && mFocusedView instanceof EditText) {
923+
textView = (EditText)mFocusedView;
924+
final int cursor = textView.getSelectionStart() + direction;
925+
if ((cursor <= textView.length()) && (cursor >= 0)) {
926+
textView.setSelection(cursor);
927+
}
928+
}
929+
}
930+
931+
@Override
932+
public boolean dispatchKeyEvent(final KeyEvent event) {
933+
final int keyCode = event.getKeyCode();
934+
final InputConnection connection = mInputConnection;
935+
if (connection != null) {
936+
if (isAttachToWindowWidget()) {
937+
connection.sendKeyEvent(event);
938+
hide(UIWidget.KEEP_WIDGET);
939+
return true;
940+
}
941+
// Android Components do not support InputConnection.sendKeyEvent()
942+
if (event.getAction() == KeyEvent.ACTION_DOWN) {
943+
Log.e("reb", "key = " + KeyEvent.keyCodeToString(keyCode));
944+
945+
switch (keyCode) {
946+
case KeyEvent.KEYCODE_DEL:
947+
handleBackspace(event.isLongPress());
948+
return true;
949+
case KeyEvent.KEYCODE_ENTER:
950+
case KeyEvent.KEYCODE_NUMPAD_ENTER:
951+
handleDone();
952+
return true;
953+
case KeyEvent.KEYCODE_DPAD_LEFT:
954+
moveCursor(-1);
955+
return true;
956+
case KeyEvent.KEYCODE_DPAD_RIGHT:
957+
moveCursor(1);
958+
return true;
959+
default:
960+
break;
961+
}
962+
if (event.getUnicodeChar() != 0) {
963+
KeyCharacterMap map = event.getKeyCharacterMap();
964+
String value = String.valueOf((char) map.get(keyCode, event.getMetaState()));
965+
connection.commitText(value, 1);
966+
return true;
967+
}
968+
}
969+
}
970+
return false;
971+
}
972+
913973
// GeckoSession.TextInputDelegate
914974

915975
@Override

0 commit comments

Comments
 (0)