From 9bc06cfacbe67ea26529f8172f3a93902f12d5ee Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Thu, 20 Jul 2023 14:03:57 +0530 Subject: [PATCH] fix(xml-inflater): use custom TextureView when inflating XML layout (#1129) --- .../itsaky/androidide/inflater/IViewAdapter.kt | 12 ++++++++++++ .../internal/adapters/TextureViewAdapter.kt | 9 +++++++++ .../inflater/internal/utils/ViewFactory.kt | 17 ++++++++++++++--- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewAdapter.kt index 9824f3894..c98a437fa 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewAdapter.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewAdapter.kt @@ -17,6 +17,7 @@ package com.itsaky.androidide.inflater +import android.content.Context import android.view.View import com.android.SdkConstants import com.itsaky.androidide.inflater.internal.AttributeImpl @@ -222,4 +223,15 @@ abstract class IViewAdapter : AbstractParser() { protected open fun postCreateAttrHandlers( handlers: MutableMap.() -> Unit>) { } + + /** + * A hook that can be used by subclasses to create view instances for the given view [name]. + * + * @param name The fully qualified class name of the view to create. + * @param context The Android context. + * @return The view instance, or `null`. + */ + open fun onCreateView(name: String, context: Context): View? { + return null + } } diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextureViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextureViewAdapter.kt index 853e515c9..89f399593 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextureViewAdapter.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextureViewAdapter.kt @@ -17,7 +17,9 @@ package com.itsaky.androidide.inflater.internal.adapters +import android.content.Context import android.view.TextureView +import android.view.View import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner.Group.WIDGETS import com.itsaky.androidide.inflater.AttributeHandlerScope @@ -49,4 +51,11 @@ open class TextureViewAdapter : ViewAdapter() { drawable.ic_widget_textureview) ) } + + override fun onCreateView(name: String, context: Context): View? { + if (name == TextureView::class.java.name) { + return DesignerTextureView(context) + } + return super.onCreateView(name, context) + } } diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt index bad0f2cb1..eb4fd48f8 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt @@ -22,15 +22,26 @@ import android.view.View import android.view.ViewGroup import android.view.ViewGroup.LayoutParams import com.itsaky.androidide.inflater.InflateException +import com.itsaky.androidide.inflater.internal.ViewAdapterIndexImpl import com.itsaky.androidide.utils.ILogger import java.lang.reflect.Method /** @author Akash Yadav */ object ViewFactory { + private val log = ILogger.newInstance("ViewFactory") fun createViewInstance(name: String, context: Context): View { + val adapter = ViewAdapterIndexImpl.INSTANCE.getViewAdapter(name) return try { + if (adapter != null) { + // Check if adapter can create the view instance + val view = adapter.onCreateView(name, context) + if (view != null) { + return view + } + } + val klass = javaClass.classLoader!!.loadClass(name) val constructor = klass.getConstructor(Context::class.java) constructor.newInstance(context) as View @@ -39,8 +50,8 @@ object ViewFactory { throw RuntimeException(err) } } - - fun generateLayoutParams(parent: ViewGroup) : LayoutParams { + + fun generateLayoutParams(parent: ViewGroup): LayoutParams { return try { var clazz: Class = parent.javaClass var method: Method? @@ -51,7 +62,7 @@ object ViewFactory { } catch (e: Throwable) { /* ignored */ } - + clazz = clazz.superclass } if (method != null) {