Fixes for android TV keyboard handling

This commit is contained in:
hajdam
2025-10-15 23:19:28 +02:00
parent 4722f50a7c
commit debc0a0410
13 changed files with 67 additions and 15 deletions
@@ -24,6 +24,9 @@ import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.RelativeLayout;
import org.exbin.auxiliary.binary_data.BinaryData;
@@ -304,4 +307,11 @@ public abstract class CodeAreaCore extends ViewGroup implements CodeAreaControl
return super.performClick();
}
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return new BaseInputConnection(this, true) {
};
}
}
@@ -50,6 +50,7 @@ import android.widget.Toast;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
@@ -138,6 +139,7 @@ public class MainActivity extends AppCompatActivity implements FileDialog.OnFile
private static final int PASTE_FROM_CODE_ACTION_POPUP_ID = 10;
private static final int GO_TO_SIDE_PANEL_POPUP_ID = 11;
private static final int OPEN_MAIN_MENU_POPUP_ID = 12;
private static final int SHOW_KEYBOARD_MENU_POPUP_ID = 13;
private static final int STORAGE_PERMISSION_CODE = 1;
@@ -204,15 +206,16 @@ public class MainActivity extends AppCompatActivity implements FileDialog.OnFile
boolean showKeyboard = codeArea.getActiveSection() == BasicCodeAreaSection.TEXT_PREVIEW;
if (showKeyboard != keyboardShown) {
keyboardShown = showKeyboard;
InputMethodManager im = (InputMethodManager) codeArea.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
codeArea.requestFocus();
if (showKeyboard) {
im.showSoftInput(codeArea, InputMethodManager.SHOW_IMPLICIT);
} else {
im.hideSoftInputFromWindow(codeArea.getWindowToken(), 0);
}
codeArea.post(() -> {
InputMethodManager im = (InputMethodManager) getApplication().getSystemService(Context.INPUT_METHOD_SERVICE);
if (showKeyboard) {
im.showSoftInput(codeArea, InputMethodManager.SHOW_IMPLICIT);
} else {
im.hideSoftInputFromWindow(codeArea.getWindowToken(), 0);
}
});
}
};
private final View.OnKeyListener codeAreaOnKeyListener = new CodeAreaKeyListener();
@@ -618,6 +621,10 @@ public class MainActivity extends AppCompatActivity implements FileDialog.OnFile
order++;
menu.add(0, OPEN_MAIN_MENU_POPUP_ID, order, resources.getString(R.string.action_open_main_menu));
order++;
if (codeArea.getCodeAreaCaret().getSection() == BasicCodeAreaSection.TEXT_PREVIEW) {
menu.add(0, SHOW_KEYBOARD_MENU_POPUP_ID, order, resources.getString(R.string.action_show_keyboard));
order++;
}
}
menu.add(0, SELECTION_START_POPUP_ID, order, resources.getString(R.string.action_selection_start));
menu.add(0, SELECTION_END_POPUP_ID, order + 1, resources.getString(R.string.action_selection_end));
@@ -661,6 +668,15 @@ public class MainActivity extends AppCompatActivity implements FileDialog.OnFile
toolbar.showOverflowMenu();
break;
}
case SHOW_KEYBOARD_MENU_POPUP_ID: {
// For some reason it keeps closing if invoked immediately
codeArea.postDelayed(() -> {
codeArea.requestFocus();
InputMethodManager im = (InputMethodManager) getApplication().getSystemService(Context.INPUT_METHOD_SERVICE);
im.showSoftInput(codeArea, InputMethodManager.SHOW_IMPLICIT);
}, 100);
break;
}
case SELECTION_START_POPUP_ID: {
SelectionRange selection = codeArea.getSelection();
CodeAreaCaretPosition touchCaretPosition = codeArea.mousePositionToClosestCaretPosition((int) codeArea.getTouchPositionX(), (int) codeArea.getTouchPositionY(), CaretOverlapMode.PARTIAL_OVERLAP);
@@ -1580,8 +1596,9 @@ public class MainActivity extends AppCompatActivity implements FileDialog.OnFile
editable.clear();
codeArea.getCommandHandler().keyPressed(keyEvent);
} else {
keyListener.onKeyDown(view, editable, keyCode, keyEvent);
processKeys(keyEvent);
if (keyListener.onKeyDown(view, editable, keyCode, keyEvent)) {
processKeys(keyEvent);
}
}
} else if (keyEvent.getAction() == KeyEvent.ACTION_UP) {
editable.clear();
@@ -1607,8 +1624,9 @@ public class MainActivity extends AppCompatActivity implements FileDialog.OnFile
codeArea.getCommandHandler().keyPressed(keyEvent);
}
} else {
keyListener.onKeyOther(view, editable, keyEvent);
processKeys(keyEvent);
if (keyListener.onKeyOther(view, editable, keyEvent)) {
processKeys(keyEvent);
}
}
return true;
} catch (Exception ex) {
@@ -137,6 +137,7 @@ public class SearchDialog extends AppCompatDialogFragment {
FrameLayout frameLayout = searchView.findViewById(R.id.frameLayout);
frameLayout.addView(editText);
frameLayout.setNextFocusDownId(editText.getId());
if (searchParameters != null) {
loadSearchParameters();
@@ -176,6 +177,7 @@ public class SearchDialog extends AppCompatDialogFragment {
if (tabPos != lastTab) {
frameLayout.removeView(lastTab == 0 ? editText : codeArea);
frameLayout.addView(tabPos == 0 ? editText : codeArea);
frameLayout.setNextFocusDownId(tabPos == 0 ? editText.getId() : codeArea.getId());
SwitchCompat matchCaseSwitch = searchView.findViewById(R.id.match_case);
matchCaseSwitch.setEnabled(tabPos == 0);
lastTab = tabPos;
@@ -258,8 +260,23 @@ public class SearchDialog extends AppCompatDialogFragment {
return false;
}
if (keyboardShown && MainActivity.isAndroidTV(codeArea.getContext())) {
return false;
if (MainActivity.isAndroidTV(codeArea.getContext())) {
if (keyboardShown && keyEvent.getKeyCode() == KeyEvent.KEYCODE_FORWARD_DEL) {
return false;
}
if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) {
InputMethodManager im = (InputMethodManager) codeArea.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
im.showSoftInput(codeArea, InputMethodManager.SHOW_IMPLICIT);
return true;
} else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_BACK) {
View fromCursorView = searchView.findViewById(R.id.from_cursor);
if (fromCursorView != null) {
fromCursorView.requestFocus();
}
}
}
}
try {
@@ -64,8 +64,6 @@ import org.exbin.bined.operation.android.command.DeleteSelectionCommand;
import org.exbin.bined.operation.android.command.EditCharDataCommand;
import org.exbin.bined.operation.android.command.EditCodeDataCommand;
import org.exbin.bined.operation.android.command.EditDataCommand;
import org.exbin.bined.operation.android.command.InsertDataCommand;
import org.exbin.bined.operation.android.command.ModifyDataCommand;
import org.exbin.bined.operation.android.command.PasteDataCommand;
import org.exbin.bined.operation.command.BinaryDataAppendableUndoRedo;
import org.exbin.bined.operation.command.BinaryDataUndoRedo;
+1
View File
@@ -27,6 +27,7 @@
<string name="action_exit">Ukončit</string>
<string name="action_open_main_menu">Hlavní menu</string>
<string name="action_go_to_side_panel">Boční panel</string>
<string name="action_show_keyboard">Zobrazit klávesnici</string>
<string name="view_menu">Zobrazit</string>
<string name="visual_theme">Vizuální motiv</string>
+1
View File
@@ -30,6 +30,7 @@
<string name="action_exit">Salir</string>
<string name="action_open_main_menu">Menú principal</string>
<string name="action_go_to_side_panel">Panel lateral</string>
<string name="action_show_keyboard">Mostrar teclado</string>
<string name="action_open_table_file" translatable="false">Abrir archivo de tabla</string>
<string name="view_menu">Ver</string>
+1
View File
@@ -29,6 +29,7 @@
<string name="action_exit">बाहर निकलें</string>
<string name="action_open_main_menu">मुख्य मेन्यू</string>
<string name="action_go_to_side_panel">साइड पैनल</string>
<string name="action_show_keyboard">कीबोर्ड दिखाएँ</string>
<string name="view_menu">देखे</string>
<string name="visual_theme">दृश्य थीम</string>
@@ -28,6 +28,7 @@
<string name="action_exit">Sair</string>
<string name="action_open_main_menu">Menu principal</string>
<string name="action_go_to_side_panel">Painel lateral</string>
<string name="action_show_keyboard">Mostrar teclado</string>
<string name="action_open_table_file">Abrir arquivo de tabela (.tbl)</string>
<string name="view_menu">Visualização</string>
+1
View File
@@ -30,6 +30,7 @@
<string name="action_exit">Выйти</string>
<string name="action_open_main_menu">Главное меню</string>
<string name="action_go_to_side_panel">Боковая панель</string>
<string name="action_show_keyboard">Показать клавиатуру</string>
<string name="action_open_table_file" translatable="false">Открыть файл таблицы</string>
<string name="view_menu">Вид</string>
+1
View File
@@ -29,6 +29,7 @@
<string name="action_exit">Çık</string>
<string name="action_open_main_menu">Ana Menü</string>
<string name="action_go_to_side_panel">Yan Panel</string>
<string name="action_show_keyboard">Klavyeyi Göster</string>
<string name="view_menu">Görünüm</string>
<string name="visual_theme">Tema</string>
@@ -29,6 +29,7 @@
<string name="action_exit">退出</string>
<string name="action_open_main_menu">主菜单</string>
<string name="action_go_to_side_panel">侧面板</string>
<string name="action_show_keyboard">显示键盘</string>
<string name="view_menu">查看</string>
<string name="visual_theme">主题</string>
+1
View File
@@ -29,6 +29,7 @@
<string name="action_exit">Exit</string>
<string name="action_open_main_menu">Main Menu</string>
<string name="action_go_to_side_panel">Side Panel</string>
<string name="action_show_keyboard">Show Keyboard</string>
<string name="action_open_table_file" translatable="false">Open Table File</string>
<string name="view_menu">View</string>
+1
View File
@@ -1,4 +1,5 @@
0.2.8
- Bug fixes
0.2.7 (2025-06-19)
- Added basic binary search