Keycode 67 handling

This commit is contained in:
downthecrop 2023-12-17 01:34:13 -08:00
parent 6f969cb7d7
commit fa697c6a75
2 changed files with 55 additions and 100 deletions

View file

@ -23,6 +23,7 @@ import net.kdt.pojavlaunch.utils.KeyEncoder;
*/ */
public class TouchCharInput extends androidx.appcompat.widget.AppCompatEditText { public class TouchCharInput extends androidx.appcompat.widget.AppCompatEditText {
public static final String TEXT_FILLER = " "; public static final String TEXT_FILLER = " ";
public static boolean softKeyboardIsActive = false;
public TouchCharInput(@NonNull Context context) { public TouchCharInput(@NonNull Context context) {
this(context, null); this(context, null);
} }
@ -49,7 +50,7 @@ public class TouchCharInput extends androidx.appcompat.widget.AppCompatEditText
Log.i("TouchCharInput","New Event (before/after)!: "+ lengthBefore + " : " + lengthAfter); Log.i("TouchCharInput","New Event (before/after)!: "+ lengthBefore + " : " + lengthAfter);
boolean isBackSpace = (lengthBefore > lengthAfter); boolean isBackSpace = (lengthBefore > lengthAfter);
if(isBackSpace) { if(isBackSpace) {
KeyEncoder.sendEncodedChar(KeyEncoder.backspaceUnicode,KeyEncoder.backspaceUnicode); KeyEncoder.sendUnicodeBackspace();
return; return;
} }
char c = text.charAt(text.length()-1); char c = text.charAt(text.length()-1);
@ -115,6 +116,7 @@ public class TouchCharInput extends androidx.appcompat.widget.AppCompatEditText
/** Regain ability to exist, take focus and have some text being input */ /** Regain ability to exist, take focus and have some text being input */
public void enable(){ public void enable(){
softKeyboardIsActive = true;
setEnabled(true); setEnabled(true);
setFocusable(true); setFocusable(true);
setVisibility(VISIBLE); setVisibility(VISIBLE);
@ -123,6 +125,7 @@ public class TouchCharInput extends androidx.appcompat.widget.AppCompatEditText
/** Lose ability to exist, take focus and have some text being input */ /** Lose ability to exist, take focus and have some text being input */
public void disable(){ public void disable(){
softKeyboardIsActive = false;
clear(); clear();
setVisibility(GONE); setVisibility(GONE);
clearFocus(); clearFocus();

View file

@ -1,110 +1,62 @@
package net.kdt.pojavlaunch.utils; package net.kdt.pojavlaunch.utils;
import net.kdt.pojavlaunch.AWTInputBridge; import net.kdt.pojavlaunch.AWTInputBridge;
import net.kdt.pojavlaunch.customcontrols.keyboard.TouchCharInput;
/* import java.util.HashMap;
About Key Events. Because the Android Spec doesn't require import java.util.Map;
soft keyboards to dispatch key events not all keyboard implementations
across Android will trigger these actions.
Currently we use the following function to translate keycodes for
special character, capital letters, and digits.
keycode 123 (F12) is used as a single digit capslock button which
when sent to the miniclient before a char will act accordingly.
*/
public class KeyEncoder { public class KeyEncoder {
static String specialChars = "/*!@#$%^&*()\"{}_[+:;=-_]'|\\?/<>,."; private static final Map<Character, Character> specialCharMap = createSpecialCharMap();
static char modifier = 123; private static final char MODIFIER = 123; // F12 key as a modifier for caps lock
static char backspaceAndroid = 67; private static final char BACKSPACE_ANDROID = 67;
public static char backspaceUnicode = 8; private static final char BACKSPACE_UNICODE = 8;
public static void sendEncodedChar(int keyCode, char iC){ // Initialize the mapping of special characters to their respective keys
System.out.println(keyCode); private static Map<Character, Character> createSpecialCharMap() {
if(keyCode == backspaceAndroid){ Map<Character, Character> map = new HashMap<>();
AWTInputBridge.sendKey(backspaceUnicode,backspaceUnicode); map.put('!', '1');
} else if(specialChars.contains(""+iC)){ map.put('@', '2');
// Send special character to client map.put('#', '3');
char c = iC; map.put('$', '4');
switch(c){ map.put('%', '5');
case '!': map.put('^', '6');
c = '1'; map.put('&', '7');
break; map.put('*', '8');
case '@': map.put('(', '9');
c = '2'; map.put(')', '0');
break; map.put('_', '-');
case '#': map.put('+', '=');
c = '3'; map.put('{', '[');
break; map.put('}', ']');
case '$': map.put(':', ';');
c = '4'; map.put('"', '\'');
break; map.put('<', ',');
case '%': map.put('>', '.');
c = '5'; map.put('?', '/');
break; map.put('|', '\\');
case '^': return map;
c = '6';
break;
case '&':
c = '7';
break;
case '*':
c = '8';
break;
case '(':
c = '9';
break;
case ')':
c = '0';
break;
case '_':
c = '-';
break;
case '+':
c = '=';
break;
case '{':
c = '[';
break;
case '}':
c = ']';
break;
case ':':
c = ';';
break;
case '"':
c = '\'';
break;
case '<':
c = ',';
break;
case '>':
c = '.';
break;
case '?':
c = '/';
break;
case '|':
c = '\\';
break;
} }
if(c != iC){
AWTInputBridge.sendKey(modifier,modifier); public static void sendUnicodeBackspace(){
AWTInputBridge.sendKey(BACKSPACE_UNICODE, BACKSPACE_UNICODE);
} }
public static void sendEncodedChar(int keyCode, char c) {
if (keyCode == BACKSPACE_ANDROID && !TouchCharInput.softKeyboardIsActive) {
sendUnicodeBackspace();
} else if (specialCharMap.containsKey(c)) {
AWTInputBridge.sendKey(specialCharMap.get(c), specialCharMap.get(c));
} else if (Character.isDigit(c)) {
AWTInputBridge.sendKey(c, c);
} else if (Character.isLowerCase(c)){
AWTInputBridge.sendKey(Character.toUpperCase(c),Character.toUpperCase(c));
} else if (Character.isUpperCase(c)) {
AWTInputBridge.sendKey(MODIFIER, MODIFIER);
AWTInputBridge.sendKey(c, c); AWTInputBridge.sendKey(c, c);
} else if(Character.isDigit(iC)){
AWTInputBridge.sendKey(iC,iC);
} else if (iC == Character.toUpperCase(iC)){
// We send F12 as a modifier to avoid needing to worry about shift.
// Client takes this modifier and does a toUpperCase().
AWTInputBridge.sendKey(modifier,modifier);
AWTInputBridge.sendKey(Character.toUpperCase(iC),Character.toUpperCase(iC));
} else if(iC == Character.toLowerCase(iC)){
AWTInputBridge.sendKey(Character.toUpperCase(iC),Character.toUpperCase(iC));
} else { } else {
AWTInputBridge.sendKey(iC,keyCode); AWTInputBridge.sendKey(c, keyCode);
} }
} }
} }