implement EditText.removeTextChangedListener()

This commit is contained in:
Julian Winkler
2024-07-20 22:04:37 +02:00
parent 72c47703b9
commit 45801d8f17
3 changed files with 41 additions and 9 deletions

View File

@@ -223,6 +223,14 @@ JNIEXPORT jstring JNICALL Java_android_widget_EditText_native_1getText
JNIEXPORT void JNICALL Java_android_widget_EditText_native_1addTextChangedListener JNIEXPORT void JNICALL Java_android_widget_EditText_native_1addTextChangedListener
(JNIEnv *, jobject, jlong, jobject); (JNIEnv *, jobject, jlong, jobject);
/*
* Class: android_widget_EditText
* Method: native_removeTextChangedListener
* Signature: (JLandroid/text/TextWatcher;)V
*/
JNIEXPORT void JNICALL Java_android_widget_EditText_native_1removeTextChangedListener
(JNIEnv *, jobject, jlong, jobject);
/* /*
* Class: android_widget_EditText * Class: android_widget_EditText
* Method: native_setOnEditorActionListener * Method: native_setOnEditorActionListener

View File

@@ -29,25 +29,43 @@ struct changed_callback_data {
jmethodID getText; jmethodID getText;
}; };
static void changed_cb(GtkEditable* self, struct changed_callback_data *d) { static void changed_cb(GtkEditable* self, jobject listener) {
JNIEnv *env = get_jni_env(); JNIEnv *env = get_jni_env();
jobject text = (*env)->CallObjectMethod(env, d->this, d->getText); const char *text = gtk_editable_get_text(self);
(*env)->CallVoidMethod(env, d->listener, d->listener_method, text); jclass spannable_string_builder = (*env)->FindClass(env, "android/text/SpannableStringBuilder");
jmethodID spannable_string_builder_constructor = _METHOD(spannable_string_builder, "<init>", "(Ljava/lang/CharSequence;)V");
jobject text_obj = (*env)->NewObject(env, spannable_string_builder, spannable_string_builder_constructor, _JSTRING(text));
jmethodID listener_method = _METHOD(_CLASS(listener), "afterTextChanged", "(Landroid/text/Editable;)V");
(*env)->CallVoidMethod(env, listener, listener_method, text_obj);
if((*env)->ExceptionCheck(env)) if((*env)->ExceptionCheck(env))
(*env)->ExceptionDescribe(env); (*env)->ExceptionDescribe(env);
} }
JNIEXPORT void JNICALL Java_android_widget_EditText_native_1addTextChangedListener(JNIEnv *env, jobject this, jlong widget_ptr, jobject listener) { JNIEXPORT void JNICALL Java_android_widget_EditText_native_1addTextChangedListener(JNIEnv *env, jobject this, jlong widget_ptr, jobject listener) {
GtkEntry *entry = GTK_ENTRY(_PTR(widget_ptr)); GtkEntry *entry = GTK_ENTRY(_PTR(widget_ptr));
listener = _REF(listener);
struct changed_callback_data *callback_data = malloc(sizeof(struct changed_callback_data)); GList *listeners = g_object_get_data(G_OBJECT(entry), "text_changed_listeners");
callback_data->this = _REF(this); listeners = g_list_append(listeners, listener);
callback_data->listener = _REF(listener); g_object_set_data(G_OBJECT(entry), "text_changed_listeners", listeners);
callback_data->listener_method = _METHOD(_CLASS(listener), "afterTextChanged", "(Landroid/text/Editable;)V"); g_signal_connect(GTK_EDITABLE(entry), "changed", G_CALLBACK(changed_cb), listener);
callback_data->getText = _METHOD(_CLASS(this), "getText", "()Landroid/text/Editable;"); }
g_signal_connect(GTK_EDITABLE(entry), "changed", G_CALLBACK(changed_cb), callback_data); JNIEXPORT void JNICALL Java_android_widget_EditText_native_1removeTextChangedListener(JNIEnv *env, jobject this, jlong widget_ptr, jobject listener) {
GtkEntry *entry = GTK_ENTRY(_PTR(widget_ptr));
GList *listeners = g_object_get_data(G_OBJECT(entry), "text_changed_listeners");
GList *l;
for (l = listeners; l != NULL; l = l->next) {
if ((*env)->IsSameObject(env, l->data, listener)) {
g_signal_handlers_disconnect_by_func(GTK_EDITABLE(entry), changed_cb, l->data);
_UNREF(l->data);
listeners = g_list_delete_link(listeners, l);
break;
}
}
g_object_set_data(G_OBJECT(entry), "text_changed_listeners", listeners);
} }
#define IME_ACTION_SEARCH 3 #define IME_ACTION_SEARCH 3

View File

@@ -20,6 +20,7 @@ public class EditText extends TextView {
protected native long native_constructor(Context context, AttributeSet attrs); protected native long native_constructor(Context context, AttributeSet attrs);
protected native String native_getText(long widget); protected native String native_getText(long widget);
protected native void native_addTextChangedListener(long widget, TextWatcher watcher); protected native void native_addTextChangedListener(long widget, TextWatcher watcher);
protected native void native_removeTextChangedListener(long widget, TextWatcher watcher);
protected native void native_setOnEditorActionListener(long widget, OnEditorActionListener l); protected native void native_setOnEditorActionListener(long widget, OnEditorActionListener l);
protected native void native_setText(long widget, String text); protected native void native_setText(long widget, String text);
@@ -38,6 +39,11 @@ public class EditText extends TextView {
@Override @Override
public void setTextSize(float size) {} public void setTextSize(float size) {}
@Override
public void removeTextChangedListener(TextWatcher watcher) {
native_removeTextChangedListener(widget, watcher);
}
@Override @Override
public void addTextChangedListener(TextWatcher watcher) { public void addTextChangedListener(TextWatcher watcher) {
native_addTextChangedListener(widget, watcher); native_addTextChangedListener(widget, watcher);