From 9c454accca1c576f654647e25632731e55881d7d Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Mon, 27 Jan 2025 18:16:25 +0100 Subject: [PATCH] make LayoutInflater instances persistent per Context Also implement LayoutInfater.cloneInContext() and support mutipe View factories at once. This is needed, so that androidx can repace all normal Views with appcompat Views, which is needed for proper tint color support. --- src/api-impl/android/app/Activity.java | 2 +- src/api-impl/android/content/Context.java | 3 ++- src/api-impl/android/view/LayoutInflater.java | 17 ++++++++++++++--- src/api-impl/android/widget/ArrayAdapter.java | 2 +- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/api-impl/android/app/Activity.java b/src/api-impl/android/app/Activity.java index 929d8a4b..92040f2a 100644 --- a/src/api-impl/android/app/Activity.java +++ b/src/api-impl/android/app/Activity.java @@ -407,7 +407,7 @@ public class Activity extends ContextThemeWrapper implements Window.Callback, La } public LayoutInflater getLayoutInflater() { - return new LayoutInflater(this); + return (LayoutInflater)getSystemService("layout_inflater"); } public boolean isChangingConfigurations() {return false;} diff --git a/src/api-impl/android/content/Context.java b/src/api-impl/android/content/Context.java index 670a46ab..1016b076 100644 --- a/src/api-impl/android/content/Context.java +++ b/src/api-impl/android/content/Context.java @@ -87,6 +87,7 @@ public class Context extends Object { public static PackageManager package_manager; public /*← FIXME?*/ static Application this_application; + private LayoutInflater layout_inflater = new LayoutInflater(this); File data_dir = null; File prefs_dir = null; @@ -219,7 +220,7 @@ public class Context extends Object { case "accessibility": return new AccessibilityManager(); case "layout_inflater": - return new LayoutInflater(this); + return layout_inflater; case "wifi": return new WifiManager(); case "bluetooth": diff --git a/src/api-impl/android/view/LayoutInflater.java b/src/api-impl/android/view/LayoutInflater.java index 34edd25c..3a0257b4 100644 --- a/src/api-impl/android/view/LayoutInflater.java +++ b/src/api-impl/android/view/LayoutInflater.java @@ -24,6 +24,8 @@ import android.util.Slog; import android.util.Xml; import java.io.FileReader; import java.lang.reflect.Constructor; +import java.util.LinkedList; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; @@ -46,6 +48,7 @@ public class LayoutInflater { private Factory2 mFactory2; private Context context; + private LinkedList factories = new LinkedList<>(); public LayoutInflater(Context context) { this.context = context; @@ -63,10 +66,11 @@ public class LayoutInflater { public void setFactory2(Factory2 factory) { this.mFactory2 = factory; + factories.addFirst(factory); } public static LayoutInflater from(Context context) { - return new LayoutInflater(context); + return (LayoutInflater)context.getSystemService("layout_inflater"); } public final View createView(String name, String prefix, AttributeSet attrs) throws Exception { @@ -121,7 +125,12 @@ public class LayoutInflater { View view = null; - if (context instanceof Factory2) { + for (Factory2 factory : factories) { + view = factory.onCreateView(parent, name, context, attrs); + if (view != null) + break; + } + if (view == null && context instanceof Factory2) { view = ((Factory2)context).onCreateView(parent, name, context, attrs); } if (view == null && -1 == name.indexOf('.')) { @@ -332,7 +341,9 @@ public class LayoutInflater { } public LayoutInflater cloneInContext(Context context) { - return this; + LayoutInflater inflater = new LayoutInflater(context); + inflater.factories.addAll(factories); + return inflater; } public Context getContext() { diff --git a/src/api-impl/android/widget/ArrayAdapter.java b/src/api-impl/android/widget/ArrayAdapter.java index caaa9681..728e4118 100644 --- a/src/api-impl/android/widget/ArrayAdapter.java +++ b/src/api-impl/android/widget/ArrayAdapter.java @@ -282,7 +282,7 @@ public class ArrayAdapter extends BaseAdapter /*implements Filterable*/ { } private void init(Context context, int resource, int textViewResourceId, List objects) { mContext = context; - mInflater = new LayoutInflater(context); + mInflater = (LayoutInflater)context.getSystemService("layout_inflater"); mResource = mDropDownResource = resource; mObjects = objects; mFieldId = textViewResourceId;