Fix Android LineEdit editing bugs
This commit is contained in:
@@ -155,12 +155,12 @@ bool DisplayServerAndroid::screen_is_touchscreen(int p_screen) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
void DisplayServerAndroid::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, int p_max_length) {
|
||||
void DisplayServerAndroid::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, int p_max_length, int p_cursor_start, int p_cursor_end) {
|
||||
GodotIOJavaWrapper *godot_io_java = OS_Android::get_singleton()->get_godot_io_java();
|
||||
ERR_FAIL_COND(!godot_io_java);
|
||||
|
||||
if (godot_io_java->has_vk()) {
|
||||
godot_io_java->show_vk(p_existing_text, p_max_length);
|
||||
godot_io_java->show_vk(p_existing_text, p_max_length, p_cursor_start, p_cursor_end);
|
||||
} else {
|
||||
ERR_PRINT("Virtual keyboard not available");
|
||||
}
|
||||
|
||||
@@ -106,7 +106,7 @@ public:
|
||||
virtual int screen_get_dpi(int p_screen = SCREEN_OF_MAIN_WINDOW) const;
|
||||
virtual bool screen_is_touchscreen(int p_screen = SCREEN_OF_MAIN_WINDOW) const;
|
||||
|
||||
virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), int p_max_length = -1);
|
||||
virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), int p_max_length = -1, int p_cursor_start = -1, int p_cursor_end = -1);
|
||||
virtual void virtual_keyboard_hide();
|
||||
virtual int virtual_keyboard_get_height() const;
|
||||
|
||||
|
||||
@@ -460,9 +460,9 @@ public class GodotIO {
|
||||
return (int)(metrics.density * 160f);
|
||||
}
|
||||
|
||||
public void showKeyboard(String p_existing_text, int p_max_input_length) {
|
||||
public void showKeyboard(String p_existing_text, int p_max_input_length, int p_cursor_start, int p_cursor_end) {
|
||||
if (edit != null)
|
||||
edit.showKeyboard(p_existing_text, p_max_input_length);
|
||||
edit.showKeyboard(p_existing_text, p_max_input_length, p_cursor_start, p_cursor_end);
|
||||
|
||||
//InputMethodManager inputMgr = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
//inputMgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
|
||||
|
||||
@@ -58,6 +58,7 @@ public class GodotEditText extends EditText {
|
||||
private GodotTextInputWrapper mInputWrapper;
|
||||
private EditHandler sHandler = new EditHandler(this);
|
||||
private String mOriginText;
|
||||
private int mMaxInputLength;
|
||||
|
||||
private static class EditHandler extends Handler {
|
||||
private final WeakReference<GodotEditText> mEdit;
|
||||
@@ -104,11 +105,18 @@ public class GodotEditText extends EditText {
|
||||
String text = edit.mOriginText;
|
||||
if (edit.requestFocus()) {
|
||||
edit.removeTextChangedListener(edit.mInputWrapper);
|
||||
setMaxInputLength(edit);
|
||||
edit.setText("");
|
||||
edit.append(text);
|
||||
if (msg.arg2 != -1) {
|
||||
edit.setSelection(msg.arg1, msg.arg2);
|
||||
edit.mInputWrapper.setSelection(true);
|
||||
} else {
|
||||
edit.mInputWrapper.setSelection(false);
|
||||
}
|
||||
|
||||
edit.mInputWrapper.setOriginText(text);
|
||||
edit.addTextChangedListener(edit.mInputWrapper);
|
||||
setMaxInputLength(edit, msg.arg1);
|
||||
final InputMethodManager imm = (InputMethodManager)mRenderView.getView().getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.showSoftInput(edit, 0);
|
||||
}
|
||||
@@ -125,14 +133,10 @@ public class GodotEditText extends EditText {
|
||||
}
|
||||
}
|
||||
|
||||
private void setMaxInputLength(EditText p_edit_text, int p_max_input_length) {
|
||||
if (p_max_input_length > 0) {
|
||||
InputFilter[] filters = new InputFilter[1];
|
||||
filters[0] = new InputFilter.LengthFilter(p_max_input_length);
|
||||
p_edit_text.setFilters(filters);
|
||||
} else {
|
||||
p_edit_text.setFilters(new InputFilter[] {});
|
||||
}
|
||||
private void setMaxInputLength(EditText p_edit_text) {
|
||||
InputFilter[] filters = new InputFilter[1];
|
||||
filters[0] = new InputFilter.LengthFilter(this.mMaxInputLength);
|
||||
p_edit_text.setFilters(filters);
|
||||
}
|
||||
|
||||
// ===========================================================
|
||||
@@ -164,13 +168,24 @@ public class GodotEditText extends EditText {
|
||||
// ===========================================================
|
||||
// Methods
|
||||
// ===========================================================
|
||||
public void showKeyboard(String p_existing_text, int p_max_input_length) {
|
||||
mOriginText = p_existing_text;
|
||||
public void showKeyboard(String p_existing_text, int p_max_input_length, int p_cursor_start, int p_cursor_end) {
|
||||
int maxInputLength = (p_max_input_length <= 0) ? Integer.MAX_VALUE : p_max_input_length;
|
||||
if (p_cursor_start == -1) { // cursor position not given
|
||||
this.mOriginText = p_existing_text;
|
||||
this.mMaxInputLength = maxInputLength;
|
||||
} else if (p_cursor_end == -1) { // not text selection
|
||||
this.mOriginText = p_existing_text.substring(0, p_cursor_start);
|
||||
this.mMaxInputLength = maxInputLength - (p_existing_text.length() - p_cursor_start);
|
||||
} else {
|
||||
this.mOriginText = p_existing_text.substring(0, p_cursor_end);
|
||||
this.mMaxInputLength = maxInputLength - (p_existing_text.length() - p_cursor_end);
|
||||
}
|
||||
|
||||
final Message msg = new Message();
|
||||
msg.what = HANDLER_OPEN_IME_KEYBOARD;
|
||||
msg.obj = this;
|
||||
msg.arg1 = p_max_input_length;
|
||||
msg.arg1 = p_cursor_start;
|
||||
msg.arg2 = p_cursor_end;
|
||||
sHandler.sendMessage(msg);
|
||||
}
|
||||
|
||||
|
||||
@@ -53,6 +53,7 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene
|
||||
private final GodotRenderView mRenderView;
|
||||
private final GodotEditText mEdit;
|
||||
private String mOriginText;
|
||||
private boolean mHasSelection;
|
||||
|
||||
// ===========================================================
|
||||
// Constructors
|
||||
@@ -77,6 +78,10 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene
|
||||
mOriginText = originText;
|
||||
}
|
||||
|
||||
public void setSelection(boolean selection) {
|
||||
mHasSelection = selection;
|
||||
}
|
||||
|
||||
// ===========================================================
|
||||
// Methods for/from SuperClass/Interfaces
|
||||
// ===========================================================
|
||||
@@ -95,6 +100,11 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene
|
||||
for (int i = 0; i < count; ++i) {
|
||||
GodotLib.key(KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, 0, true);
|
||||
GodotLib.key(KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, 0, false);
|
||||
|
||||
if (mHasSelection) {
|
||||
mHasSelection = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -53,7 +53,7 @@ GodotIOJavaWrapper::GodotIOJavaWrapper(JNIEnv *p_env, jobject p_godot_io_instanc
|
||||
_get_model = p_env->GetMethodID(cls, "getModel", "()Ljava/lang/String;");
|
||||
_get_screen_DPI = p_env->GetMethodID(cls, "getScreenDPI", "()I");
|
||||
_get_unique_id = p_env->GetMethodID(cls, "getUniqueID", "()Ljava/lang/String;");
|
||||
_show_keyboard = p_env->GetMethodID(cls, "showKeyboard", "(Ljava/lang/String;I)V");
|
||||
_show_keyboard = p_env->GetMethodID(cls, "showKeyboard", "(Ljava/lang/String;III)V");
|
||||
_hide_keyboard = p_env->GetMethodID(cls, "hideKeyboard", "()V");
|
||||
_set_screen_orientation = p_env->GetMethodID(cls, "setScreenOrientation", "(I)V");
|
||||
_get_screen_orientation = p_env->GetMethodID(cls, "getScreenOrientation", "()I");
|
||||
@@ -132,11 +132,11 @@ bool GodotIOJavaWrapper::has_vk() {
|
||||
return (_show_keyboard != 0) && (_hide_keyboard != 0);
|
||||
}
|
||||
|
||||
void GodotIOJavaWrapper::show_vk(const String &p_existing, int p_max_input_length) {
|
||||
void GodotIOJavaWrapper::show_vk(const String &p_existing, int p_max_input_length, int p_cursor_start, int p_cursor_end) {
|
||||
if (_show_keyboard) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
jstring jStr = env->NewStringUTF(p_existing.utf8().get_data());
|
||||
env->CallVoidMethod(godot_io_instance, _show_keyboard, jStr, p_max_input_length);
|
||||
env->CallVoidMethod(godot_io_instance, _show_keyboard, jStr, p_max_input_length, p_cursor_start, p_cursor_end);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ public:
|
||||
int get_screen_dpi();
|
||||
String get_unique_id();
|
||||
bool has_vk();
|
||||
void show_vk(const String &p_existing, int p_max_input_length);
|
||||
void show_vk(const String &p_existing, int p_max_input_length, int p_cursor_start, int p_cursor_end);
|
||||
void hide_vk();
|
||||
int get_vk_height();
|
||||
void set_vk_height(int p_height);
|
||||
|
||||
Reference in New Issue
Block a user