diff --git a/src/api-impl-jni/generated_headers/android_view_View.h b/src/api-impl-jni/generated_headers/android_view_View.h index 08632e9d..c40a8801 100644 --- a/src/api-impl-jni/generated_headers/android_view_View.h +++ b/src/api-impl-jni/generated_headers/android_view_View.h @@ -415,6 +415,14 @@ JNIEXPORT jboolean JNICALL Java_android_view_View_nativeIsFocused JNIEXPORT jboolean JNICALL Java_android_view_View_native_1getMatrix (JNIEnv *, jobject, jlong, jlong); +/* + * Class: android_view_View + * Method: nativeIsAttachedToWindow + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_android_view_View_nativeIsAttachedToWindow + (JNIEnv *, jobject, jlong); + /* * Class: android_view_View * Method: native_keep_screen_on diff --git a/src/api-impl-jni/handle_cache.c b/src/api-impl-jni/handle_cache.c index 765f6ccd..39c7f771 100644 --- a/src/api-impl-jni/handle_cache.c +++ b/src/api-impl-jni/handle_cache.c @@ -85,6 +85,8 @@ void set_up_handle_cache(JNIEnv *env) handle_cache.view.getAllSuperClasses = _METHOD(handle_cache.view.class, "getAllSuperClasses", "()Ljava/lang/String;"); handle_cache.view.dispatchKeyEvent = _METHOD(handle_cache.view.class, "dispatchKeyEvent", "(Landroid/view/KeyEvent;)Z"); handle_cache.view.onKeyDown = _METHOD(handle_cache.view.class, "onKeyDown", "(ILandroid/view/KeyEvent;)Z"); + handle_cache.view.onAttachedToWindow = _METHOD(handle_cache.view.class, "onAttachedToWindow", "()V"); + handle_cache.view.onDetachedFromWindow = _METHOD(handle_cache.view.class, "onDetachedFromWindow", "()V"); handle_cache.view_group.class = _REF((*env)->FindClass(env, "android/view/ViewGroup")); handle_cache.view_group.dispatchTouchEvent = _METHOD(handle_cache.view_group.class, "dispatchTouchEvent", "(Landroid/view/MotionEvent;)Z"); diff --git a/src/api-impl-jni/handle_cache.h b/src/api-impl-jni/handle_cache.h index 1adbb03c..4903af1f 100644 --- a/src/api-impl-jni/handle_cache.h +++ b/src/api-impl-jni/handle_cache.h @@ -84,6 +84,8 @@ struct handle_cache { jmethodID getAllSuperClasses; jmethodID dispatchKeyEvent; jmethodID onKeyDown; + jmethodID onAttachedToWindow; + jmethodID onDetachedFromWindow; } view; struct { jclass class; diff --git a/src/api-impl-jni/views/android_view_View.c b/src/api-impl-jni/views/android_view_View.c index 3b766d2d..9792ea15 100644 --- a/src/api-impl-jni/views/android_view_View.c +++ b/src/api-impl-jni/views/android_view_View.c @@ -505,6 +505,13 @@ static void java_widget_class_init(JavaWidgetClass *class) { } G_DEFINE_TYPE(JavaWidget, java_widget, GTK_TYPE_WIDGET) +static void java_method_cb(WrapperWidget *wrapper, jmethodID method) { + JNIEnv *env = get_jni_env(); + (*env)->CallVoidMethod(env, wrapper->jobj, method); + if ((*env)->ExceptionCheck(env)) + (*env)->ExceptionDescribe(env); +} + JNIEXPORT jlong JNICALL Java_android_view_View_native_1constructor(JNIEnv *env, jobject this, jobject context, jobject attrs) { WrapperWidget *wrapper = g_object_ref(WRAPPER_WIDGET(wrapper_widget_new())); @@ -527,6 +534,11 @@ JNIEXPORT jlong JNICALL Java_android_view_View_native_1constructor(JNIEnv *env, gtk_widget_add_controller(widget, controller); } + if (_METHOD(class, "onAttachedToWindow", "()V") != handle_cache.view.onAttachedToWindow) + g_signal_connect(wrapper, "map", G_CALLBACK(java_method_cb), handle_cache.view.onAttachedToWindow); + if (_METHOD(class, "onDetachedFromWindow", "()V") != handle_cache.view.onDetachedFromWindow) + g_signal_connect(wrapper, "unmap", G_CALLBACK(java_method_cb), handle_cache.view.onDetachedFromWindow); + return _INTPTR(widget); } @@ -841,3 +853,9 @@ JNIEXPORT void JNICALL Java_android_view_View_native_1keep_1screen_1on(JNIEnv *e g_object_set_data(G_OBJECT(widget), "keep-screen-on-cookie", GINT_TO_POINTER(cookie)); } } + +JNIEXPORT jboolean JNICALL Java_android_view_View_nativeIsAttachedToWindow(JNIEnv *env, jobject this, jlong widget_ptr) +{ + GtkWidget *widget = GTK_WIDGET(_PTR(widget_ptr)); + return gtk_widget_get_mapped(widget); +} diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index 56ae606e..3b2b1496 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -841,8 +841,6 @@ public class View implements Drawable.Callback { private int scrollX = 0; private int scrollY = 0; - private boolean attachedToWindow = false; - public long widget; // pointer private int oldWidthMeasureSpec = -1; @@ -1836,7 +1834,10 @@ public class View implements Drawable.Callback { public void setPaddingRelative(int start, int top, int end, int bottom) {} - public boolean isAttachedToWindow() {return attachedToWindow;} + private native boolean nativeIsAttachedToWindow(long widget); + public boolean isAttachedToWindow() { + return nativeIsAttachedToWindow(widget); + } public void requestApplyInsets() {} @@ -1910,34 +1911,13 @@ public class View implements Drawable.Callback { private boolean keepScreenOn = false; private static native void native_keep_screen_on(long widget, boolean keepScreenOn); public void setKeepScreenOn(boolean screenOn) { - if (attachedToWindow && keepScreenOn != screenOn) + if (isAttachedToWindow() && keepScreenOn != screenOn) native_keep_screen_on(widget, screenOn); keepScreenOn = screenOn; } - protected void onAttachedToWindow () { - attachedToWindow = true; - if (onAttachStateChangeListener != null) { - onAttachStateChangeListener.onViewAttachedToWindow(this); - } - if (keepScreenOn) - native_keep_screen_on(widget, true); - } - protected void onDetachedFromWindow() { - if (onAttachStateChangeListener != null) { - onAttachStateChangeListener.onViewDetachedFromWindow(this); - } - if (keepScreenOn) - native_keep_screen_on(widget, false); - } - - void detachFromWindowInternal() { - onDetachedFromWindow(); - attachedToWindow = false; - } - public void attachToWindowInternal() { - onAttachedToWindow(); - } + protected void onAttachedToWindow() {} + protected void onDetachedFromWindow() {} public void setLayerType(int layerType, Paint paint) {} diff --git a/src/api-impl/android/view/ViewGroup.java b/src/api-impl/android/view/ViewGroup.java index c24ffb64..2ae6244a 100644 --- a/src/api-impl/android/view/ViewGroup.java +++ b/src/api-impl/android/view/ViewGroup.java @@ -77,8 +77,6 @@ public class ViewGroup extends View implements ViewParent, ViewManager { index = children.size(); children.add(index, child); native_addView(widget, child.widget, index, params); - if (isAttachedToWindow()) - child.onAttachedToWindow(); if (onHierarchyChangeListener != null) onHierarchyChangeListener.onChildViewAdded(this, child); @@ -111,8 +109,6 @@ public class ViewGroup extends View implements ViewParent, ViewManager { child.parent = null; children.remove(child); native_removeView(widget, child.widget); - if (isAttachedToWindow()) - child.detachFromWindowInternal(); if (onHierarchyChangeListener != null) { onHierarchyChangeListener.onChildViewRemoved(this, child); } @@ -136,8 +132,6 @@ public class ViewGroup extends View implements ViewParent, ViewManager { child.parent = null; it.remove(); native_removeView(widget, child.widget); - if (isAttachedToWindow()) - child.detachFromWindowInternal(); if (onHierarchyChangeListener != null) { onHierarchyChangeListener.onChildViewRemoved(this, child); } @@ -169,8 +163,6 @@ public class ViewGroup extends View implements ViewParent, ViewManager { return; child.parent = null; native_removeView(widget, child.widget); - if (isAttachedToWindow()) - child.detachFromWindowInternal(); if (onHierarchyChangeListener != null) { onHierarchyChangeListener.onChildViewRemoved(this, child); } @@ -363,22 +355,6 @@ public class ViewGroup extends View implements ViewParent, ViewManager { public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {} - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - for (View child: children) { - child.onAttachedToWindow(); - } - } - - @Override - protected void detachFromWindowInternal() { - super.detachFromWindowInternal(); - for (View child: children) { - child.detachFromWindowInternal(); - } - } - protected boolean isChildrenDrawingOrderEnabled() { return false; } @Override diff --git a/src/api-impl/android/view/Window.java b/src/api-impl/android/view/Window.java index eaa44d28..2d3d9ba3 100644 --- a/src/api-impl/android/view/Window.java +++ b/src/api-impl/android/view/Window.java @@ -39,7 +39,6 @@ public class Window { this.context = context; decorView = new FrameLayout(context); decorView.setId(android.R.id.content); - decorView.onAttachedToWindow(); } public void addFlags(int flags) {} diff --git a/src/api-impl/android/widget/PopupWindow.java b/src/api-impl/android/widget/PopupWindow.java index 4573cbf2..faf1246d 100644 --- a/src/api-impl/android/widget/PopupWindow.java +++ b/src/api-impl/android/widget/PopupWindow.java @@ -74,7 +74,6 @@ public class PopupWindow { contentView = view; if (contentView != null) { contentView.setBackground(getBackground()); - contentView.attachToWindowInternal(); } native_setContentView(popover, view == null ? 0 : view.widget); }