From 775d9a24ac26f3469a1527219c24bbd030c87dfd Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Fri, 25 Nov 2022 14:12:38 +0530 Subject: [PATCH] implement UiWidget.createView() --- images/icon.png | Bin 20881 -> 34465 bytes .../uidesigner/drag/WidgetDragListener.kt | 30 ++++++++++++++ .../fragments/DesignerWorkspaceFragment.kt | 7 +--- .../androidide/uidesigner/models/UiWidget.kt | 20 ++++++++- .../uidesigner/utils/ForwardingViewGroup.kt | 27 +++++++++++++ .../inflater/internal/LayoutInflaterImpl.kt | 10 +---- .../inflater/internal/utils/ViewFactory.kt | 38 ++++++++++++++++++ 7 files changed, 116 insertions(+), 16 deletions(-) create mode 100644 uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetDragListener.kt create mode 100644 uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ForwardingViewGroup.kt create mode 100644 xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt diff --git a/images/icon.png b/images/icon.png index 61f27734d8dc73c065f351ba128a7956e00269ff..cb5bd4be72b31d3a8b0a813d3ba4171e479eae07 100644 GIT binary patch literal 34465 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 literal 20881 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 diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetDragListener.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetDragListener.kt new file mode 100644 index 000000000..fb34bf6fa --- /dev/null +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetDragListener.kt @@ -0,0 +1,30 @@ +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.uidesigner.drag + +import android.view.DragEvent +import android.view.View + +/** + * @author Akash Yadav + */ +class WidgetDragListener : View.OnDragListener { + override fun onDrag(v: View, event: DragEvent): Boolean { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/DesignerWorkspaceFragment.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/DesignerWorkspaceFragment.kt index fa082bbbf..61ddba1d1 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/DesignerWorkspaceFragment.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/DesignerWorkspaceFragment.kt @@ -27,7 +27,6 @@ import com.itsaky.androidide.fragments.BaseFragment import com.itsaky.androidide.inflater.IInflateEventsListener import com.itsaky.androidide.inflater.ILayoutInflater import com.itsaky.androidide.inflater.OnInflateViewEvent -import com.itsaky.androidide.inflater.internal.utils.startParse import com.itsaky.androidide.uidesigner.UIDesignerActivity import com.itsaky.androidide.uidesigner.databinding.FragmentDesignerWorkspaceBinding import com.itsaky.androidide.uidesigner.databinding.LayoutDesignerErrorBinding @@ -94,11 +93,7 @@ class DesignerWorkspaceFragment : BaseFragment() { super.onDestroyView() this.binding = null } - - private fun createErrorView(@StringRes message: Int): View { - return createErrorView(getString(message)) - } - + private fun createErrorView(message: String): View { return LayoutDesignerErrorBinding.inflate(layoutInflater).let { it.root.text = message diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/models/UiWidget.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/models/UiWidget.kt index 613f15619..aaf51c880 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/models/UiWidget.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/models/UiWidget.kt @@ -17,10 +17,16 @@ package com.itsaky.androidide.uidesigner.models +import android.content.Context import android.view.View +import android.view.ViewGroup import androidx.annotation.DrawableRes import androidx.annotation.StringRes import com.itsaky.androidide.inflater.IView +import com.itsaky.androidide.inflater.internal.LayoutFile +import com.itsaky.androidide.inflater.internal.ViewGroupImpl +import com.itsaky.androidide.inflater.internal.ViewImpl +import com.itsaky.androidide.inflater.internal.utils.ViewFactory open class UiWidget(val name: String, @StringRes val label: Int, @DrawableRes val icon: Int) { constructor( @@ -29,8 +35,18 @@ open class UiWidget(val name: String, @StringRes val label: Int, @DrawableRes va @DrawableRes icon: Int ) : this(klass.name, label, icon) - fun createView(): IView { - TODO() + /** + * Creates an [IView] for this widget. + * + * @param context The context that will be used for creating (View)[android.view.View] instance. + * @param layoutFile The layout file that is being edited. + */ + fun createView(context: Context, layoutFile: LayoutFile): IView { + val v = ViewFactory.createViewInstance(name, context) + if (v is ViewGroup) { + return ViewGroupImpl(layoutFile, name, v) + } + return ViewImpl(layoutFile, name, v) } override fun equals(other: Any?): Boolean { diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ForwardingViewGroup.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ForwardingViewGroup.kt new file mode 100644 index 000000000..68d1d1df9 --- /dev/null +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ForwardingViewGroup.kt @@ -0,0 +1,27 @@ +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.uidesigner.utils + +import com.itsaky.androidide.inflater.IViewGroup + +/** + * An [IViewGroup] implementation that forwards all calls to [src]. + * + * @author Akash Yadav + */ +class ForwardingViewGroup(val src: IViewGroup) : IViewGroup by src diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt index 95b0249cf..61cd740c4 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt @@ -17,7 +17,6 @@ package com.itsaky.androidide.inflater.internal -import android.content.Context import android.view.View import android.view.ViewGroup import android.view.ViewGroup.LayoutParams @@ -45,6 +44,7 @@ import com.itsaky.androidide.inflater.InflationStartEvent import com.itsaky.androidide.inflater.OnApplyAttributeEvent import com.itsaky.androidide.inflater.OnInflateViewEvent import com.itsaky.androidide.inflater.internal.utils.IDTable +import com.itsaky.androidide.inflater.internal.utils.ViewFactory.createViewInstance import com.itsaky.androidide.inflater.internal.utils.endParse import com.itsaky.androidide.inflater.internal.utils.isParsing import com.itsaky.androidide.inflater.internal.utils.parseLayoutReference @@ -282,7 +282,7 @@ open class LayoutInflaterImpl : ILayoutInflater() { widgets: WidgetTable, ): IView { return try { - val v = createViewInstance(widget, parent) + val v = createViewInstance(widget.qualifiedName, parent.context) if (v is ViewGroup) { return ViewGroupImpl(currentLayoutFile, widget.qualifiedName, v) } @@ -351,12 +351,6 @@ open class LayoutInflaterImpl : ILayoutInflater() { return processor to module } - private fun createViewInstance(widget: Widget, parent: ViewGroup): View { - val klass = javaClass.classLoader!!.loadClass(widget.qualifiedName) - val constructor = klass.getConstructor(Context::class.java) - return constructor.newInstance(parent.context) as View - } - private fun onCreateUnsupportedView(message: String, parent: ViewGroup): IView { return ErrorView(currentLayoutFile, parent.context, message) } 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 new file mode 100644 index 000000000..ac418a3ac --- /dev/null +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt @@ -0,0 +1,38 @@ +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.inflater.internal.utils + +import android.content.Context +import android.view.View +import com.itsaky.androidide.utils.ILogger + +/** @author Akash Yadav */ +object ViewFactory { + private val log = ILogger.newInstance("ViewFactory") + + fun createViewInstance(name: String, context: Context): View { + return try { + val klass = javaClass.classLoader!!.loadClass(name) + val constructor = klass.getConstructor(Context::class.java) + constructor.newInstance(context) as View + } catch (err: Throwable) { + log.error(err) + throw RuntimeException(err) + } + } +}