From 757d689689c511c905ea5c32618a62808d9326b0 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Fri, 29 Dec 2023 11:05:05 +0100 Subject: [PATCH] unify View construction and measurement No longer allow constructing Views without Context. Lets have only one onMeasure() method to unify behaviour --- .../views/android_view_ViewGroup.c | 8 ++++-- .../android/gesture/GestureOverlayView.java | 1 + src/api-impl/android/view/View.java | 7 ++--- src/api-impl/android/view/ViewGroup.java | 28 +++---------------- src/api-impl/android/view/Window.java | 3 +- src/api-impl/android/widget/ImageView.java | 22 +++++++-------- src/api-impl/android/widget/TextView.java | 10 +------ 7 files changed, 25 insertions(+), 54 deletions(-) diff --git a/src/api-impl-jni/views/android_view_ViewGroup.c b/src/api-impl-jni/views/android_view_ViewGroup.c index 043d7679..5dda98b8 100644 --- a/src/api-impl-jni/views/android_view_ViewGroup.c +++ b/src/api-impl-jni/views/android_view_ViewGroup.c @@ -42,17 +42,19 @@ JNIEXPORT jlong JNICALL Java_android_view_ViewGroup_native_1constructor(JNIEnv * wrapper_widget_set_child(WRAPPER_WIDGET(wrapper), box); wrapper_widget_set_jobject(WRAPPER_WIDGET(wrapper), env, this); - const char *name = _CSTRING((*env)->CallObjectMethod(env, _CLASS(this), + jclass class = _CLASS(this); + const char *name = _CSTRING((*env)->CallObjectMethod(env, class, _METHOD((*env)->FindClass(env, "java/lang/Class"), "getName", "()Ljava/lang/String;"))); gtk_widget_set_name(box, name); /* this should better match default android behavior */ gtk_widget_set_overflow(wrapper, GTK_OVERFLOW_HIDDEN); - jmethodID measure_method = _METHOD(_CLASS(this), "onMeasure", "(II)V"); - jmethodID layout_method = _METHOD(_CLASS(this), "onLayout", "(ZIIII)V"); + jmethodID measure_method = _METHOD(class, "onMeasure", "(II)V"); + jmethodID layout_method = _METHOD(class, "onLayout", "(ZIIII)V"); if (measure_method != handle_cache.view.onMeasure || layout_method != handle_cache.view.onLayout) { gtk_widget_set_layout_manager(box, android_layout_new(_REF(this))); + (*env)->SetBooleanField(env, this, _FIELD_ID(class, "haveCustomMeasure", "Z"), true); } if (_METHOD(_CLASS(this), "onGenericMotionEvent", "(Landroid/view/MotionEvent;)Z") != handle_cache.view.onGenericMotionEvent) { GtkEventController *controller = gtk_event_controller_scroll_new(GTK_EVENT_CONTROLLER_SCROLL_VERTICAL); diff --git a/src/api-impl/android/gesture/GestureOverlayView.java b/src/api-impl/android/gesture/GestureOverlayView.java index 0755625e..86debe26 100644 --- a/src/api-impl/android/gesture/GestureOverlayView.java +++ b/src/api-impl/android/gesture/GestureOverlayView.java @@ -6,6 +6,7 @@ import android.view.ViewGroup; public class GestureOverlayView extends ViewGroup { public GestureOverlayView(Context context) { + super(context); } public void setGestureStrokeType(int type) { diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index cbc2222a..91347f93 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -814,14 +814,11 @@ public class View extends Object { private int oldWidth; private int oldHeight; private boolean haveCustomMeasure; + protected boolean haveComplexMeasure = false; private int visibility = View.VISIBLE; private float alpha = 1.0f; - public View() { - this(Context.this_application); - } // FIXME - public View(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -970,7 +967,7 @@ public class View extends Object { if (haveCustomMeasure) // calling native_measure here would create infinite loop setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec), getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec)); else - native_measure(widget, widthMeasureSpec, heightMeasureSpec, false); + native_measure(widget, widthMeasureSpec, heightMeasureSpec, haveComplexMeasure); } public void setPressed(boolean pressed) { diff --git a/src/api-impl/android/view/ViewGroup.java b/src/api-impl/android/view/ViewGroup.java index 0a61ae8b..f2f159bf 100644 --- a/src/api-impl/android/view/ViewGroup.java +++ b/src/api-impl/android/view/ViewGroup.java @@ -12,38 +12,23 @@ public class ViewGroup extends View implements ViewParent, ViewManager { public int id; public ArrayList children; - public ViewGroup() { - children = new ArrayList(); - } - public ViewGroup(Context context) { - super(context); - - children = new ArrayList(); + this(context, null); } public ViewGroup(Context context, AttributeSet attrs) { - super(context, attrs); - - children = new ArrayList(); + this(context, attrs, 0); } public ViewGroup(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs); - - children = new ArrayList(); + this(context, attrs, defStyleAttr, 0); } public ViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr); children = new ArrayList(); - } - - public ViewGroup(int _id) { // FIXME - children = new ArrayList(); - - id = _id; + haveComplexMeasure = true; } public void addView(View child) { @@ -128,11 +113,6 @@ public class ViewGroup extends View implements ViewParent, ViewManager { removeView(child); } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - native_measure(widget, widthMeasureSpec, heightMeasureSpec, true); - } - @Override protected native long native_constructor(Context context, AttributeSet attrs); protected native void native_addView(long widget, long child, int index, LayoutParams params); diff --git a/src/api-impl/android/view/Window.java b/src/api-impl/android/view/Window.java index 806414a5..1d9e8cc7 100644 --- a/src/api-impl/android/view/Window.java +++ b/src/api-impl/android/view/Window.java @@ -1,5 +1,6 @@ package android.view; +import android.content.Context; import android.view.SurfaceHolder; public class Window { @@ -49,7 +50,7 @@ public class Window { public View getDecorView() { if (contentView != null) return contentView; - return new View(); // FIXME: this can probably backfire + return new View(Context.this_application); // FIXME: this can probably backfire } private native void set_widget_as_root(long native_window, long widget); diff --git a/src/api-impl/android/widget/ImageView.java b/src/api-impl/android/widget/ImageView.java index 6938c11c..885d2a85 100644 --- a/src/api-impl/android/widget/ImageView.java +++ b/src/api-impl/android/widget/ImageView.java @@ -17,26 +17,24 @@ public class ImageView extends View { private ScaleType scaleType = ScaleType.FIT_CENTER; public ImageView(Context context, AttributeSet attrs) { - super(context, attrs); - - if (attrs != null) { - int resource = attrs.getAttributeResourceValue("http://schemas.android.com/apk/res/android", "src", 0); - if (resource != 0) - setImageResource(resource); - } + this(context, attrs, 0); } public ImageView(Context context) { - super(context); + this(context, null); } public ImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - native_measure(widget, widthMeasureSpec, heightMeasureSpec, true); + haveComplexMeasure = true; + if (attrs != null) { + int resid = attrs.getAttributeResourceValue("http://schemas.android.com/apk/res/android", "src", 0); + if (resid != 0 && !getResources().getString(resid).endsWith(".xml")) { + bitmap = BitmapFactory.decodeResource(getResources(), resid); + native_setPixbuf(bitmap.pixbuf); + } + } } @Override diff --git a/src/api-impl/android/widget/TextView.java b/src/api-impl/android/widget/TextView.java index 8b0ae407..7be472d5 100644 --- a/src/api-impl/android/widget/TextView.java +++ b/src/api-impl/android/widget/TextView.java @@ -22,10 +22,6 @@ import android.view.View; public class TextView extends View { public String text; - public TextView(int _id) { // FIXME - id = _id; - } - public TextView(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -50,6 +46,7 @@ public class TextView extends View { } a.recycle(); } + haveComplexMeasure = true; } @Override @@ -71,11 +68,6 @@ public class TextView extends View { setText(getContext().getResources().getText(resId)); } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - native_measure(widget, widthMeasureSpec, heightMeasureSpec, true); - } - private native final void native_set_markup(int bool); public native final void native_setText(String text);