Fixes for android TV keyboard handling
This commit is contained in:
@@ -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 {
|
||||
|
||||
-2
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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,4 +1,5 @@
|
||||
0.2.8
|
||||
- Bug fixes
|
||||
|
||||
0.2.7 (2025-06-19)
|
||||
- Added basic binary search
|
||||
|
||||
Reference in New Issue
Block a user