From 1ee192f3144f687d6246d64c3faaedf58e4b9ff8 Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Sat, 31 Dec 2022 18:40:25 +0530 Subject: [PATCH] feat: define interface for IViewAdapterIndex to resolve unresolved references in UI designer --- .idea/compiler.xml | 1 - .../processor/ViewAdapterIndexGenerator.kt | 35 ++++---- .../androidide/annotations/processor/utils.kt | 6 +- .../assets/data/common/tooling-api-all.jar | Bin 16155215 -> 16155215 bytes build.gradle.kts | 4 +- settings.gradle.kts | 1 + uidesigner/build.gradle.kts | 10 +-- .../uidesigner/UIDesignerActivity.kt | 3 +- .../uidesigner/adapters/AddAttrListAdapter.kt | 4 +- .../adapters/ViewAttrListAdapter.kt | 8 +- .../uidesigner/drag/WidgetDragListener.kt | 6 +- .../uidesigner/drag/WidgetTouchListener.kt | 4 +- .../uidesigner/fragments/AddAttrFragment.kt | 4 +- .../fragments/AttrValueEditorFragment.kt | 2 - .../fragments/DesignerWorkspaceFragment.kt | 4 +- .../WorkspaceLayoutInflationHandler.kt | 1 - .../fragments/WorkspaceViewAttrHandler.kt | 8 +- .../WorkspaceViewHierarchyHandler.kt | 12 +-- .../uidesigner/models/UiAttribute.kt | 8 +- .../uidesigner/models/UiViewGroup.kt | 9 +- .../androidide/uidesigner/undo/AttrAction.kt | 3 +- .../uidesigner/undo/AttrAddedAction.kt | 2 +- .../uidesigner/undo/AttrRemovedAction.kt | 2 +- .../uidesigner/undo/AttrUpdatedAction.kt | 2 +- .../androidide/uidesigner/undo/ViewAction.kt | 4 +- .../uidesigner/undo/ViewAddedAction.kt | 2 +- .../uidesigner/undo/ViewMovedAction.kt | 6 +- .../uidesigner/undo/ViewRemovedAction.kt | 4 +- .../androidide/uidesigner/undo/undoUtils.kt | 2 +- .../utils/UiInflaterComponentFactory.kt | 10 +-- .../uidesigner/utils/UiLayoutInflater.kt | 2 +- .../utils/ValueCompletionProvider.kt | 4 +- .../androidide/uidesigner/utils/ViewToXml.kt | 2 +- .../androidide/uidesigner/utils/Widgets.kt | 6 +- .../utils/WorkspaceHierarchyChangeListener.kt | 10 +-- .../viewmodel/WorkspaceViewModel.kt | 4 +- .../uidesigner/views/LayoutHierarchyView.kt | 14 +-- .../harjot/vectormaster/enums/TintMode.java | 11 --- .../androidide/uidesigner/UiDesignerTest.kt | 6 +- xml-inflater/.gitignore | 1 + xml-inflater/build.gradle.kts | 47 ++++++++++ xml-inflater/consumer-rules.pro | 0 xml-inflater/proguard-rules.pro | 21 +++++ xml-inflater/src/main/AndroidManifest.xml | 21 +++++ .../androidide/inflater/AbstractParser.kt | 0 .../inflater/AttributeHandlerScope.kt | 0 .../inflater/DefaultComponentFactory.kt | 0 .../inflater/ForwardingViewGroup.kt | 0 .../itsaky/androidide/inflater/IAttribute.kt | 0 .../androidide/inflater/IComponentFactory.kt | 0 .../androidide/inflater/ILayoutInflater.kt | 0 .../itsaky/androidide/inflater/INamespace.kt | 1 - .../com/itsaky/androidide/inflater/IView.kt | 0 .../androidide/inflater/IViewAdapter.kt | 0 .../androidide/inflater/IViewAdapterIndex.kt | 84 ++++++++++++++++++ .../itsaky/androidide/inflater/IViewGroup.kt | 4 +- .../androidide/inflater/IViewGroupAdapter.kt | 0 .../androidide/inflater/InflateException.kt | 0 .../androidide/inflater/LayoutBehavior.kt | 0 .../inflater/drawable/BitmapDrawableParser.kt | 1 - .../inflater/drawable/ClipDrawableParser.kt | 0 .../drawable/DrawableParserFactory.java | 2 +- .../inflater/drawable/IDrawableParser.kt | 0 .../inflater/drawable/InsetDrawableParser.kt | 0 .../inflater/drawable/LayerListParser.kt | 0 .../inflater/drawable/ScaleDrawableParser.kt | 0 .../inflater/drawable/ShapeDrawableParser.kt | 0 .../inflater/drawable/StateListParser.kt | 0 .../inflater/events/IInflateEventsListener.kt | 0 .../inflater/events/IInflationEvent.kt | 0 .../inflater/events/inflationEvents.kt | 0 .../inflater/internal/AttributeImpl.kt | 0 .../androidide/inflater/internal/ErrorView.kt | 0 .../inflater/internal/ForwardingView.kt | 0 .../internal/ImmutableAttributeImpl.kt | 0 .../internal/ImmutableViewGroupImpl.kt | 0 .../inflater/internal/ImmutableViewImpl.kt | 2 - .../inflater/internal/LayoutFile.kt | 0 .../inflater/internal/LayoutInflaterImpl.kt | 3 +- .../inflater/internal/NamespaceImpl.kt | 0 .../inflater/internal/SingleChildViewGroup.kt | 0 .../inflater/internal/ViewGroupImpl.kt | 0 .../androidide/inflater/internal/ViewImpl.kt | 3 +- .../internal/adapters/AbsListViewAdapter.kt | 0 .../internal/adapters/AbsSeekBarAdapter.kt | 0 .../internal/adapters/AbsSpinnerAdapter.kt | 0 .../adapters/AbsoluteLayoutAdapter.kt | 0 .../internal/adapters/AdapterViewAdapter.kt | 0 .../internal/adapters/AnalogClockAdapter.kt | 0 .../adapters/AutoCompleteTextViewAdapter.kt | 0 .../internal/adapters/ButtonAdapter.kt | 0 .../internal/adapters/CalendarViewAdapter.kt | 0 .../internal/adapters/CheckBoxAdapter.kt | 0 .../adapters/CheckedTextViewAdapter.kt | 0 .../internal/adapters/ChronometerAdapter.kt | 0 .../adapters/CompoundButtonAdapter.kt | 0 .../internal/adapters/DigitalClockAdapter.kt | 0 .../internal/adapters/EditTextAdapter.kt | 0 .../internal/adapters/FrameLayoutAdapter.kt | 0 .../adapters/GestureOverlayViewAdapter.kt | 0 .../internal/adapters/GridLayoutAdapter.kt | 0 .../adapters/HorizontalScrollViewAdapter.kt | 0 .../internal/adapters/ImageButtonAdapter.kt | 0 .../internal/adapters/ImageViewAdapter.kt | 0 .../internal/adapters/LinearLayoutAdapter.kt | 0 .../internal/adapters/ListViewAdapter.kt | 0 .../MultiAutoCompleteTextViewAdapter.kt | 0 .../internal/adapters/NumberPickerAdapter.kt | 0 .../internal/adapters/ProgressBarAdapter.kt | 0 .../adapters/QuickContactBadgeAdapter.kt | 0 .../internal/adapters/RadioButtonAdapter.kt | 0 .../internal/adapters/RadioGroupAdapter.kt | 0 .../internal/adapters/RatingBarAdapter.kt | 0 .../adapters/RelativeLayoutAdapter.kt | 0 .../internal/adapters/ScrollViewAdapter.kt | 0 .../internal/adapters/SeekBarAdapter.kt | 0 .../internal/adapters/SpaceAdapter.kt | 0 .../internal/adapters/SpinnerAdapter.kt | 0 .../internal/adapters/SurfaceViewAdapter.kt | 0 .../internal/adapters/SwitchAdapter.kt | 0 .../internal/adapters/TextClockAdapter.kt | 0 .../internal/adapters/TextViewAdapter.kt | 0 .../internal/adapters/TextureViewAdapter.kt | 0 .../internal/adapters/ToggleButtonAdapter.kt | 0 .../internal/adapters/VideoViewAdapter.kt | 0 .../inflater/internal/adapters/ViewAdapter.kt | 0 .../internal/adapters/ViewGroupAdapter.kt | 0 .../internal/adapters/WebViewAdapter.kt | 0 .../adapters/appcompat/AppCompatTextView.kt | 0 .../inflater/internal/utils/IDTable.kt | 0 .../inflater/internal/utils/TextDrawable.kt | 0 .../inflater/internal/utils/ViewFactory.kt | 0 .../inflater/internal/utils/ViewUtils.kt | 0 .../internal/utils/basicParseUtils.kt | 0 .../inflater/internal/utils/lookup.kt | 0 .../inflater/internal/utils/viewParseUtils.kt | 2 - .../androidide/inflater/models/UiWidget.kt | 4 +- .../inflater/utils/inflaterUtils.kt | 0 .../androidide/inflater/utils/module.kt | 0 .../androidide/inflater/utils/viewUtils.kt | 0 .../inflater}/vectormaster/DefaultValues.java | 19 +++- .../vectormaster/VectorMasterDrawable.java | 29 ++++-- .../vectormaster/VectorMasterView.java | 29 ++++-- .../inflater/vectormaster/enums/TintMode.java | 28 ++++++ .../vectormaster/models/ClipPathModel.java | 23 ++++- .../vectormaster/models/GroupModel.java | 23 ++++- .../vectormaster/models/PathModel.java | 27 ++++-- .../vectormaster/models/VectorModel.java | 21 ++++- .../vectormaster/utilities/Utils.java | 19 +++- .../utilities/legacyparser/PathParser.java | 2 +- .../utilities/parser/ParserHelper.java | 19 +++- .../utilities/parser/PathParser.java | 19 +++- .../androidide/inflater/AdapterIndexTest.kt | 5 +- .../androidide/inflater/ExampleUnitTest.kt | 34 +++++++ .../androidide/inflater/LayoutInflaterTest.kt | 0 .../androidide/inflater/ValueParsersTest.kt | 0 .../androidide/inflater/XmlInflaterTest.kt | 0 .../androidide/inflater/adapterUtils.kt | 0 158 files changed, 545 insertions(+), 174 deletions(-) delete mode 100644 uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/enums/TintMode.java create mode 100644 xml-inflater/.gitignore create mode 100644 xml-inflater/build.gradle.kts create mode 100644 xml-inflater/consumer-rules.pro create mode 100644 xml-inflater/proguard-rules.pro create mode 100644 xml-inflater/src/main/AndroidManifest.xml rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/AbstractParser.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/AttributeHandlerScope.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/DefaultComponentFactory.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/ForwardingViewGroup.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/IAttribute.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/IComponentFactory.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/ILayoutInflater.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/INamespace.kt (97%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/IView.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/IViewAdapter.kt (100%) create mode 100644 xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewAdapterIndex.kt rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/IViewGroup.kt (96%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/IViewGroupAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/InflateException.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/LayoutBehavior.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/drawable/BitmapDrawableParser.kt (98%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/drawable/ClipDrawableParser.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/drawable/DrawableParserFactory.java (96%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/drawable/IDrawableParser.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/drawable/InsetDrawableParser.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/drawable/LayerListParser.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/drawable/ScaleDrawableParser.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/drawable/ShapeDrawableParser.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/drawable/StateListParser.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/events/IInflateEventsListener.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/events/IInflationEvent.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/events/inflationEvents.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/AttributeImpl.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/ErrorView.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/ForwardingView.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableAttributeImpl.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableViewGroupImpl.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableViewImpl.kt (96%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/LayoutFile.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt (99%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/NamespaceImpl.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/SingleChildViewGroup.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/ViewGroupImpl.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/ViewImpl.kt (98%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsListViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsSeekBarAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsSpinnerAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsoluteLayoutAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AdapterViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AnalogClockAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AutoCompleteTextViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ButtonAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CalendarViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CheckBoxAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CheckedTextViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ChronometerAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CompoundButtonAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/DigitalClockAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/EditTextAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/FrameLayoutAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/GestureOverlayViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/GridLayoutAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/HorizontalScrollViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageButtonAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/LinearLayoutAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ListViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/MultiAutoCompleteTextViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/NumberPickerAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ProgressBarAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/QuickContactBadgeAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RadioButtonAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RadioGroupAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RatingBarAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RelativeLayoutAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ScrollViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SeekBarAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpaceAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpinnerAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SurfaceViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SwitchAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextClockAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextureViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ToggleButtonAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/VideoViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewGroupAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/WebViewAdapter.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/adapters/appcompat/AppCompatTextView.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/utils/IDTable.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/utils/TextDrawable.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewUtils.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/utils/basicParseUtils.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/utils/lookup.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/internal/utils/viewParseUtils.kt (96%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/models/UiWidget.kt (96%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/utils/inflaterUtils.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/utils/module.kt (100%) rename {uidesigner => xml-inflater}/src/main/java/com/itsaky/androidide/inflater/utils/viewUtils.kt (100%) rename {uidesigner/src/main/java/com/sdsmdg/harjot => xml-inflater/src/main/java/com/itsaky/androidide/inflater}/vectormaster/DefaultValues.java (71%) rename {uidesigner/src/main/java/com/sdsmdg/harjot => xml-inflater/src/main/java/com/itsaky/androidide/inflater}/vectormaster/VectorMasterDrawable.java (94%) rename {uidesigner/src/main/java/com/sdsmdg/harjot => xml-inflater/src/main/java/com/itsaky/androidide/inflater}/vectormaster/VectorMasterView.java (93%) create mode 100644 xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/enums/TintMode.java rename {uidesigner/src/main/java/com/sdsmdg/harjot => xml-inflater/src/main/java/com/itsaky/androidide/inflater}/vectormaster/models/ClipPathModel.java (67%) rename {uidesigner/src/main/java/com/sdsmdg/harjot => xml-inflater/src/main/java/com/itsaky/androidide/inflater}/vectormaster/models/GroupModel.java (89%) rename {uidesigner/src/main/java/com/sdsmdg/harjot => xml-inflater/src/main/java/com/itsaky/androidide/inflater}/vectormaster/models/PathModel.java (87%) rename {uidesigner/src/main/java/com/sdsmdg/harjot => xml-inflater/src/main/java/com/itsaky/androidide/inflater}/vectormaster/models/VectorModel.java (86%) rename {uidesigner/src/main/java/com/sdsmdg/harjot => xml-inflater/src/main/java/com/itsaky/androidide/inflater}/vectormaster/utilities/Utils.java (78%) rename {uidesigner/src/main/java/com/sdsmdg/harjot => xml-inflater/src/main/java/com/itsaky/androidide/inflater}/vectormaster/utilities/legacyparser/PathParser.java (99%) rename {uidesigner/src/main/java/com/sdsmdg/harjot => xml-inflater/src/main/java/com/itsaky/androidide/inflater}/vectormaster/utilities/parser/ParserHelper.java (91%) rename {uidesigner/src/main/java/com/sdsmdg/harjot => xml-inflater/src/main/java/com/itsaky/androidide/inflater}/vectormaster/utilities/parser/PathParser.java (92%) rename {uidesigner => xml-inflater}/src/test/java/com/itsaky/androidide/inflater/AdapterIndexTest.kt (83%) create mode 100644 xml-inflater/src/test/java/com/itsaky/androidide/inflater/ExampleUnitTest.kt rename {uidesigner => xml-inflater}/src/test/java/com/itsaky/androidide/inflater/LayoutInflaterTest.kt (100%) rename {uidesigner => xml-inflater}/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt (100%) rename {uidesigner => xml-inflater}/src/test/java/com/itsaky/androidide/inflater/XmlInflaterTest.kt (100%) rename {uidesigner => xml-inflater}/src/test/java/com/itsaky/androidide/inflater/adapterUtils.kt (100%) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index d1b013add..026741050 100755 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -94,7 +94,6 @@ - \ No newline at end of file diff --git a/annotation-processors/src/main/java/com/itsaky/androidide/annotations/processor/ViewAdapterIndexGenerator.kt b/annotation-processors/src/main/java/com/itsaky/androidide/annotations/processor/ViewAdapterIndexGenerator.kt index 0aef09d54..22c962bde 100644 --- a/annotation-processors/src/main/java/com/itsaky/androidide/annotations/processor/ViewAdapterIndexGenerator.kt +++ b/annotation-processors/src/main/java/com/itsaky/androidide/annotations/processor/ViewAdapterIndexGenerator.kt @@ -49,7 +49,7 @@ import javax.tools.Diagnostic.Kind.ERROR class ViewAdapterIndexGenerator { private val indexClassBuilder = - TypeSpec.classBuilder(INDEX_CLASS_NAME).addModifiers(PUBLIC, FINAL) + TypeSpec.classBuilder(INDEX_CLASS_NAME).addModifiers(PUBLIC, FINAL).addSuperinterface(viewAdapterInterface) private val indexAddStatements = CodeBlock.builder() fun init(env: ProcessingEnvironment) { @@ -77,12 +77,20 @@ class ViewAdapterIndexGenerator { ) ) - addUninstantiableConstructor(indexClassBuilder) + addPrivateConstructor(indexClassBuilder) + + val indexImpl = ClassName.get(INDEX_PACKAGE_NAME, INDEX_CLASS_NAME) + indexClassBuilder.addField( + FieldSpec.builder(indexImpl, "INSTANCE", PUBLIC, STATIC, FINAL) + .initializer("new \$T()", indexImpl) + .build() + ) indexClassBuilder.addMethod( MethodSpec.methodBuilder("getAdapter") + .addAnnotation(Override::class.java) .addAnnotation(ClassName.get("androidx.annotation", "Nullable")) - .addModifiers(PUBLIC, STATIC) + .addModifiers(PUBLIC) .addParameter(String::class.java, "view", FINAL) .returns(adapterType) .addStatement("var adapter = \$L.get(\$L)", INDEX_MAP_FIELD, "view") @@ -92,11 +100,12 @@ class ViewAdapterIndexGenerator { .addStatement("return adapter") .build() ) - + indexClassBuilder.addMethod( MethodSpec.methodBuilder("getViewAdapter") + .addAnnotation(Override::class.java) .addAnnotation(ClassName.get("androidx.annotation", "Nullable")) - .addModifiers(PUBLIC, STATIC) + .addModifiers(PUBLIC) .addParameter(String::class.java, "view", FINAL) .returns(adapterType) .addStatement("return \$L.get(\$L)", INDEX_MAP_FIELD, "view") @@ -138,8 +147,9 @@ class ViewAdapterIndexGenerator { indexClassBuilder.addMethod( MethodSpec.methodBuilder("getWidgetProviders") + .addAnnotation(Override::class.java) .addAnnotation(nonNull) - .addModifiers(PUBLIC, STATIC) + .addModifiers(PUBLIC) .returns(listOfViewAdapters) .addParameter(groupParam) .addStatement("return \$L.get(group)", INDEX_PROVIDER_MAP_FIELD) @@ -224,17 +234,8 @@ class ViewAdapterIndexGenerator { file.build().writeTo(generatedDir) } - private fun addUninstantiableConstructor(builder: TypeSpec.Builder) { - builder.addMethod( - MethodSpec.constructorBuilder() - .addModifiers(PRIVATE) - .addStatement( - "throw new \$T(\$S)", - UnsupportedOperationException::class.java, - "This class cannot be instantiated." - ) - .build() - ) + private fun addPrivateConstructor(builder: TypeSpec.Builder) { + builder.addMethod(MethodSpec.constructorBuilder().addModifiers(PRIVATE).build()) } private fun getViewTypeName( diff --git a/annotation-processors/src/main/java/com/itsaky/androidide/annotations/processor/utils.kt b/annotation-processors/src/main/java/com/itsaky/androidide/annotations/processor/utils.kt index b373d9ddf..d840cb86c 100644 --- a/annotation-processors/src/main/java/com/itsaky/androidide/annotations/processor/utils.kt +++ b/annotation-processors/src/main/java/com/itsaky/androidide/annotations/processor/utils.kt @@ -17,6 +17,7 @@ package com.itsaky.androidide.annotations.processor +import com.squareup.javapoet.ClassName import javax.annotation.processing.ProcessingEnvironment import javax.lang.model.element.TypeElement import javax.lang.model.type.TypeMirror @@ -31,13 +32,16 @@ const val ADAPTER_BASE_CLASS = "$ADAPTER_BASE_CLASS_PCK.$ADAPTER_BASE_CLASS_NAME const val ADAPTER_FUNC_CREATE_WIDGET = "createUiWidgets" const val INDEX_PACKAGE_NAME = "com.itsaky.androidide.inflater.internal" -const val INDEX_CLASS_NAME = "ViewAdapterIndex" +const val INDEX_CLASS_NAME = "ViewAdapterIndexImpl" const val INDEX_MAP_FIELD = "adapterMap" const val INDEX_PROVIDER_MAP_FIELD = "widgetProviders" const val METHOD_SET_SUPERCLASS_HIERARCHY = "setSuperclassHierarchy" const val METHOD_SET_MODULE = "setModuleNamespace" +val viewAdapterInterface: ClassName = + ClassName.get("com.itsaky.androidide.inflater", "IViewAdapterIndex") + private var adapterElement: TypeElement? = null private var viewElement: TypeElement? = null diff --git a/app/src/main/assets/data/common/tooling-api-all.jar b/app/src/main/assets/data/common/tooling-api-all.jar index 7e03dd91408dcaab6b20c2671b9ce018435c2d80..a9167232fb1f2280f36c281b84c6d4255850f290 100644 GIT binary patch delta 75281 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

S4ytOe;1M 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 delta 75281 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 VkC>Aq|3^+S9T!BePqT*D{0~cNBwqjk diff --git a/build.gradle.kts b/build.gradle.kts index a4ac64300..6e606d6cb 100755 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -27,7 +27,9 @@ plugins { alias(libs.plugins.kotlin) apply false } -buildscript { dependencies { classpath("com.google.android.gms:oss-licenses-plugin:0.10.6") } } +buildscript { dependencies { classpath("com.google.android.gms:oss-licenses-plugin:0.10.6") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21") +} } fun Project.configureBaseExtension() { extensions.findByType(BaseExtension::class)?.run { diff --git a/settings.gradle.kts b/settings.gradle.kts index 4dc85849a..1b1fe1b8e 100755 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -56,6 +56,7 @@ include( ":shared", ":treeview", ":uidesigner", + ":xml-inflater", ":gradle-plugin", diff --git a/uidesigner/build.gradle.kts b/uidesigner/build.gradle.kts index eba6683a0..f77d8ddb7 100644 --- a/uidesigner/build.gradle.kts +++ b/uidesigner/build.gradle.kts @@ -10,8 +10,6 @@ android { dependencies { - kapt(projects.annotationProcessors) - implementation(libs.androidx.appcompat) implementation(libs.androidx.ktx) implementation(libs.androidx.fragment.ktx) @@ -32,14 +30,8 @@ dependencies { implementation(projects.lsp.api) implementation(projects.lsp.xml) implementation(projects.resources) + implementation(projects.xmlInflater) - implementation(projects.subprojects.aaptcompiler) - implementation(projects.subprojects.projects) - implementation(projects.subprojects.xmlUtils) - - - testImplementation(projects.subprojects.projects) - testImplementation(projects.subprojects.toolingApiTesting) testImplementation(libs.tests.junit) testImplementation(libs.tests.google.truth) testImplementation(libs.tests.robolectric) diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/UIDesignerActivity.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/UIDesignerActivity.kt index 3c5b2a54b..61750ea2f 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/UIDesignerActivity.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/UIDesignerActivity.kt @@ -29,7 +29,6 @@ import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.view.menu.MenuBuilder import androidx.core.view.GravityCompat import androidx.fragment.app.Fragment -import androidx.navigation.fragment.NavHostFragment import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.ActionItem.Location.UI_DESIGNER_TOOLBAR import com.itsaky.androidide.actions.ActionsRegistry @@ -183,7 +182,7 @@ class UIDesignerActivity : BaseIDEActivity() { return workspace } - fun setupHierarchy(view: IView) { + fun setupHierarchy(view: com.itsaky.androidide.inflater.IView) { binding?.hierarchy?.setupWithView(view) { workspace()?.showViewInfo(it) } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/AddAttrListAdapter.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/AddAttrListAdapter.kt index 17b5bfe03..432735198 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/AddAttrListAdapter.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/AddAttrListAdapter.kt @@ -31,8 +31,8 @@ import com.itsaky.androidide.uidesigner.databinding.LayoutAddAttrItemBinding * @author Akash Yadav */ class AddAttrListAdapter( - private val attributes: List, - private val onClick: (IAttribute) -> Unit = {} + private val attributes: List, + private val onClick: (com.itsaky.androidide.inflater.IAttribute) -> Unit = {} ) : RecyclerView.Adapter() { class VH(val binding: LayoutAddAttrItemBinding) : RecyclerView.ViewHolder(binding.root) diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/ViewAttrListAdapter.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/ViewAttrListAdapter.kt index 0766accfe..275e2070a 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/ViewAttrListAdapter.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/ViewAttrListAdapter.kt @@ -40,10 +40,10 @@ import com.itsaky.androidide.utils.DialogUtils * @author Akash Yadav */ internal class ViewAttrListAdapter( - attributes: List, + attributes: List, private val viewModel: WorkspaceViewModel?, - private val onDeleteAttr: (IAttribute) -> Boolean, - private val onClick: (IAttribute) -> Unit + private val onDeleteAttr: (com.itsaky.androidide.inflater.IAttribute) -> Boolean, + private val onClick: (com.itsaky.androidide.inflater.IAttribute) -> Unit ) : RecyclerView.Adapter() { private val attributes = attributes.sortedBy { it.name }.toMutableList() @@ -78,7 +78,7 @@ internal class ViewAttrListAdapter( val viewModel = this.viewModel ?: return@setOnClickListener val attrUpdateListener = object : SingleAttributeChangeListener() { - override fun onAttributeUpdated(view: IView, attribute: IAttribute, oldValue: String) { + override fun onAttributeUpdated(view: com.itsaky.androidide.inflater.IView, attribute: com.itsaky.androidide.inflater.IAttribute, oldValue: String) { binding.attrValue.text = attribute.value } } 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 index 9583979f6..246fbd9a2 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetDragListener.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetDragListener.kt @@ -36,7 +36,7 @@ import kotlin.math.min */ internal class WidgetDragListener( val view: UiViewGroup, - private val placeholder: IView, + private val placeholder: com.itsaky.androidide.inflater.IView, private val touchSlop: Int ) : View.OnDragListener { @@ -49,7 +49,7 @@ internal class WidgetDragListener( val name = when (val data = event.localState) { - is IView -> data.name + is com.itsaky.androidide.inflater.IView -> data.name is UiWidget -> data.name else -> throw IllegalArgumentException("A local state of UiWidget or IView is expected") } @@ -92,7 +92,7 @@ internal class WidgetDragListener( DragEvent.ACTION_DROP -> { val child = when (val data = event.localState) { - is IView -> { + is com.itsaky.androidide.inflater.IView -> { data.removeFromParent() data } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetTouchListener.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetTouchListener.kt index c5f1af98d..6833ba611 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetTouchListener.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetTouchListener.kt @@ -34,9 +34,9 @@ import com.itsaky.androidide.uidesigner.fragments.DesignerWorkspaceFragment * @author Akash Yadav */ internal class WidgetTouchListener( - private val view: IView, + private val view: com.itsaky.androidide.inflater.IView, context: Context, - private val onClick: (IView) -> Boolean = { false } + private val onClick: (com.itsaky.androidide.inflater.IView) -> Boolean = { false } ) : OnTouchListener { private var touchedView: View? = null diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/AddAttrFragment.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/AddAttrFragment.kt index f99c5a26b..39e6d83f7 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/AddAttrFragment.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/AddAttrFragment.kt @@ -24,8 +24,8 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController -import com.itsaky.androidide.inflater.internal.ViewAdapterIndex import com.itsaky.androidide.inflater.utils.newAttribute +import com.itsaky.androidide.inflater.viewAdapter import com.itsaky.androidide.uidesigner.R import com.itsaky.androidide.uidesigner.R.string import com.itsaky.androidide.uidesigner.adapters.AddAttrListAdapter @@ -83,7 +83,7 @@ class AddAttrFragment : Fragment() { private fun showAttrs() { val binding = this.binding ?: return val view = viewModel.view ?: return - val adapter = ViewAdapterIndex.getAdapter(view.name) ?: return + val adapter = view.viewAdapter ?: return val attributes = adapter.supportedAttributes.filterNot { view.hasAttribute(it.namespace.uri, it.name) } binding.attrList.adapter = diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/AttrValueEditorFragment.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/AttrValueEditorFragment.kt index 1331cf355..759da9186 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/AttrValueEditorFragment.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/AttrValueEditorFragment.kt @@ -27,10 +27,8 @@ import android.widget.ArrayAdapter import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import com.itsaky.androidide.inflater.internal.ViewImpl -import com.itsaky.androidide.inflater.utils.newAttribute import com.itsaky.androidide.uidesigner.databinding.LayoutAttrValueEditorBinding import com.itsaky.androidide.uidesigner.databinding.LayoutViewInfoHeaderBinding -import com.itsaky.androidide.uidesigner.models.UiAttribute import com.itsaky.androidide.uidesigner.utils.ValueCompletionProvider import com.itsaky.androidide.uidesigner.viewmodel.WorkspaceViewModel 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 77aab7574..2be73ad7e 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 @@ -142,7 +142,7 @@ class DesignerWorkspaceFragment : BaseFragment() { this.inflater.close() } - internal fun setupView(view: IView) { + internal fun setupView(view: com.itsaky.androidide.inflater.IView) { if (view is CommonUiView && !view.needSetup) { return } @@ -171,7 +171,7 @@ class DesignerWorkspaceFragment : BaseFragment() { } } - internal fun showViewInfo(view: IView) { + internal fun showViewInfo(view: com.itsaky.androidide.inflater.IView) { viewModel.view = view viewInfo.show(childFragmentManager, ViewInfoSheet.TAG) } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceLayoutInflationHandler.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceLayoutInflationHandler.kt index 0800db31e..3494e2248 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceLayoutInflationHandler.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceLayoutInflationHandler.kt @@ -23,7 +23,6 @@ import com.itsaky.androidide.inflater.events.InflationFinishEvent import com.itsaky.androidide.inflater.events.InflationStartEvent import com.itsaky.androidide.inflater.events.OnInflateViewEvent import com.itsaky.androidide.inflater.internal.ViewImpl -import com.itsaky.androidide.uidesigner.UIDesignerActivity /** * Handles layout inflation events in [DesignerWorkspaceFragment]. diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceViewAttrHandler.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceViewAttrHandler.kt index 77a98ba08..6537e4395 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceViewAttrHandler.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceViewAttrHandler.kt @@ -29,7 +29,7 @@ import com.itsaky.androidide.uidesigner.undo.AttrUpdatedAction * * @author Akash Yadav */ -internal class WorkspaceViewAttrHandler : IView.AttributeChangeListener { +internal class WorkspaceViewAttrHandler : com.itsaky.androidide.inflater.IView.AttributeChangeListener { private var fragment: DesignerWorkspaceFragment? = null @@ -41,17 +41,17 @@ internal class WorkspaceViewAttrHandler : IView.AttributeChangeListener { this.fragment = null } - override fun onAttributeAdded(view: IView, attribute: IAttribute) { + override fun onAttributeAdded(view: com.itsaky.androidide.inflater.IView, attribute: com.itsaky.androidide.inflater.IAttribute) { val frag = this.fragment ?: return frag.undoManager.push(AttrAddedAction(view = view, attr = attribute as UiAttribute)) } - override fun onAttributeRemoved(view: IView, attribute: IAttribute) { + override fun onAttributeRemoved(view: com.itsaky.androidide.inflater.IView, attribute: com.itsaky.androidide.inflater.IAttribute) { val frag = this.fragment ?: return frag.undoManager.push(AttrRemovedAction(view = view, attr = attribute as UiAttribute)) } - override fun onAttributeUpdated(view: IView, attribute: IAttribute, oldValue: String) { + override fun onAttributeUpdated(view: com.itsaky.androidide.inflater.IView, attribute: com.itsaky.androidide.inflater.IAttribute, oldValue: String) { val frag = this.fragment ?: return frag.undoManager.push( AttrUpdatedAction( diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceViewHierarchyHandler.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceViewHierarchyHandler.kt index 5a5ca6c1e..546d6d7d1 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceViewHierarchyHandler.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceViewHierarchyHandler.kt @@ -34,7 +34,7 @@ import com.itsaky.androidide.uidesigner.viewmodel.WorkspaceViewModel * * @author Akash Yadav */ -internal class WorkspaceViewHierarchyHandler : IViewGroup.SingleOnHierarchyChangeListener() { +internal class WorkspaceViewHierarchyHandler : com.itsaky.androidide.inflater.IViewGroup.SingleOnHierarchyChangeListener() { private var fragment: DesignerWorkspaceFragment? = null @@ -54,7 +54,7 @@ internal class WorkspaceViewHierarchyHandler : IViewGroup.SingleOnHierarchyChang ) } - private fun pushAction(view: IView, parent: IViewGroup, index: Int, added: Boolean) { + private fun pushAction(view: com.itsaky.androidide.inflater.IView, parent: com.itsaky.androidide.inflater.IViewGroup, index: Int, added: Boolean) { val frag = this.fragment ?: return if (view is PlaceholderView) { return @@ -77,15 +77,15 @@ internal class WorkspaceViewHierarchyHandler : IViewGroup.SingleOnHierarchyChang frag.requireActivity().invalidateOptionsMenu() } - override fun beforeViewAdded(group: IViewGroup, view: IView, index: Int) { + override fun beforeViewAdded(group: com.itsaky.androidide.inflater.IViewGroup, view: com.itsaky.androidide.inflater.IView, index: Int) { animateLayoutChange() } - override fun beforeViewRemoved(group: IViewGroup, view: IView, index: Int) { + override fun beforeViewRemoved(group: com.itsaky.androidide.inflater.IViewGroup, view: com.itsaky.androidide.inflater.IView, index: Int) { animateLayoutChange() } - override fun onViewAdded(group: IViewGroup, view: IView, index: Int) { + override fun onViewAdded(group: com.itsaky.androidide.inflater.IViewGroup, view: com.itsaky.androidide.inflater.IView, index: Int) { val frag = this.fragment ?: return if (!frag.isInflating && view !is PlaceholderView) { // when the inflation process is in progress, setupView method will be called @@ -103,7 +103,7 @@ internal class WorkspaceViewHierarchyHandler : IViewGroup.SingleOnHierarchyChang pushAction(view, group, index, true) } - override fun onViewRemoved(group: IViewGroup, view: IView, index: Int) { + override fun onViewRemoved(group: com.itsaky.androidide.inflater.IViewGroup, view: com.itsaky.androidide.inflater.IView, index: Int) { val frag = this.fragment ?: return if (frag.workspaceView.viewGroup.childCount == 0) { frag.viewModel.errText = frag.getString(R.string.msg_empty_ui_layout) diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/models/UiAttribute.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/models/UiAttribute.kt index 397d24192..9a34f830c 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/models/UiAttribute.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/models/UiAttribute.kt @@ -19,11 +19,10 @@ package com.itsaky.androidide.uidesigner.models import android.os.Parcelable import com.itsaky.androidide.inflater.IAttribute -import com.itsaky.androidide.inflater.INamespace import com.itsaky.androidide.inflater.IView import com.itsaky.androidide.inflater.internal.AttributeImpl import com.itsaky.androidide.inflater.internal.NamespaceImpl -import com.itsaky.androidide.inflater.internal.ViewAdapterIndex +import com.itsaky.androidide.inflater.viewAdapter import kotlinx.parcelize.Parcelize /** @@ -35,7 +34,8 @@ import kotlinx.parcelize.Parcelize open class UiAttribute @JvmOverloads constructor( - override val namespace: NamespaceImpl = INamespace.ANDROID as NamespaceImpl, + override val namespace: NamespaceImpl = + com.itsaky.androidide.inflater.INamespace.ANDROID as NamespaceImpl, override val name: String, override var value: String, internal var isRequired: Boolean = false @@ -48,7 +48,7 @@ constructor( companion object { @JvmStatic fun isRequired(view: IView, attribute: IAttribute): Boolean { - val adapter = ViewAdapterIndex.getAdapter(view.name) ?: return false + val adapter = view.viewAdapter ?: return false return adapter.isRequiredAttribute(attribute) } } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/models/UiViewGroup.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/models/UiViewGroup.kt index 9c18fac3b..31788ab69 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/models/UiViewGroup.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/models/UiViewGroup.kt @@ -25,8 +25,8 @@ import com.itsaky.androidide.inflater.LayoutBehavior.HORIZONTAL import com.itsaky.androidide.inflater.LayoutBehavior.TOP_LEFT import com.itsaky.androidide.inflater.LayoutBehavior.VERTICAL import com.itsaky.androidide.inflater.internal.LayoutFile -import com.itsaky.androidide.inflater.internal.ViewAdapterIndex import com.itsaky.androidide.inflater.internal.ViewGroupImpl +import com.itsaky.androidide.inflater.viewAdapter /** * Extension of [IView] for the UI Designer. @@ -47,13 +47,12 @@ internal class UiViewGroup(file: LayoutFile, name: String, view: ViewGroup) : if (childCount == 0) { return 0 } - val adapter = - ViewAdapterIndex.getAdapter(name) - + val adapter = viewAdapter + if (adapter !is IViewGroupAdapter) { return childCount } - + return when (adapter.getLayoutBehavior(this)) { TOP_LEFT -> childCount VERTICAL -> computeViewIndexVertically(x, y) diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrAction.kt index d9fa4fea5..440797168 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrAction.kt @@ -19,14 +19,13 @@ package com.itsaky.androidide.uidesigner.undo import com.itsaky.androidide.inflater.IView import com.itsaky.androidide.uidesigner.models.UiAttribute -import com.itsaky.androidide.utils.ILogger /** * [UndoManager] action related to view attributes. * * @author Akash Yadav */ -internal abstract class AttrAction(protected val view: IView, protected val attr: UiAttribute) : +internal abstract class AttrAction(protected val view: com.itsaky.androidide.inflater.IView, protected val attr: UiAttribute) : IUiAction { override fun toString(): String { diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrAddedAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrAddedAction.kt index a8a0630c0..4f1d32175 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrAddedAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrAddedAction.kt @@ -25,7 +25,7 @@ import com.itsaky.androidide.uidesigner.models.UiAttribute * * @author Akash Yadav */ -internal class AttrAddedAction(view: IView, attr: UiAttribute) : +internal class AttrAddedAction(view: com.itsaky.androidide.inflater.IView, attr: UiAttribute) : AttrAction(view, attr.copyAttr(view = view) as UiAttribute) { override fun undo() { diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrRemovedAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrRemovedAction.kt index cac0e0464..083b8c96e 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrRemovedAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrRemovedAction.kt @@ -25,7 +25,7 @@ import com.itsaky.androidide.uidesigner.models.UiAttribute * * @author Akash Yadav */ -internal class AttrRemovedAction(view: IView, attr: UiAttribute) : +internal class AttrRemovedAction(view: com.itsaky.androidide.inflater.IView, attr: UiAttribute) : AttrAction(view, attr.copyAttr(view = view) as UiAttribute) { override fun undo() { diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrUpdatedAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrUpdatedAction.kt index b8a141019..954e5f213 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrUpdatedAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrUpdatedAction.kt @@ -25,7 +25,7 @@ import com.itsaky.androidide.uidesigner.models.UiAttribute * * @author Akash Yadav */ -internal class AttrUpdatedAction(view: IView, attr: UiAttribute, private val oldValue: String) : +internal class AttrUpdatedAction(view: com.itsaky.androidide.inflater.IView, attr: UiAttribute, private val oldValue: String) : AttrAction(view, attr) { override fun undo() { diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAction.kt index 37e9b6b26..d083ac9f7 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAction.kt @@ -31,7 +31,7 @@ import com.itsaky.androidide.inflater.IViewGroup abstract class ViewAction @JvmOverloads constructor( - val child: IView, - val parent: IViewGroup, + val child: com.itsaky.androidide.inflater.IView, + val parent: com.itsaky.androidide.inflater.IViewGroup, var index: Int = parent.indexOfChild(child) ) : IUiAction diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAddedAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAddedAction.kt index 14500a0c9..972e92c53 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAddedAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAddedAction.kt @@ -27,7 +27,7 @@ import com.itsaky.androidide.inflater.IViewGroup */ class ViewAddedAction @JvmOverloads -constructor(view: IView, parent: IViewGroup, index: Int = parent.indexOfChild(view)) : +constructor(view: com.itsaky.androidide.inflater.IView, parent: com.itsaky.androidide.inflater.IViewGroup, index: Int = parent.indexOfChild(view)) : ViewAction(view, parent, index) { override fun undo() { diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewMovedAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewMovedAction.kt index a4a47060a..36da04ca6 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewMovedAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewMovedAction.kt @@ -26,9 +26,9 @@ import com.itsaky.androidide.inflater.IViewGroup * @author Akash Yadav */ class ViewMovedAction( - private val child: IView, - private val fromParent: IViewGroup, - private val toParent: IViewGroup, + private val child: com.itsaky.androidide.inflater.IView, + private val fromParent: com.itsaky.androidide.inflater.IViewGroup, + private val toParent: com.itsaky.androidide.inflater.IViewGroup, private val fromIndex: Int, private val toIndex: Int ) : IUiAction { diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewRemovedAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewRemovedAction.kt index f1d626e30..608294eec 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewRemovedAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewRemovedAction.kt @@ -19,15 +19,13 @@ package com.itsaky.androidide.uidesigner.undo import com.itsaky.androidide.inflater.IView import com.itsaky.androidide.inflater.IViewGroup -import kotlin.math.max -import kotlin.math.min /** * Represents the action when the user removes a view from a view group. * * @author Akash Yadav */ -class ViewRemovedAction(child: IView, parent: IViewGroup, index: Int) : +class ViewRemovedAction(child: com.itsaky.androidide.inflater.IView, parent: com.itsaky.androidide.inflater.IViewGroup, index: Int) : ViewAction(child, parent, index) { override fun undo() { diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/undoUtils.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/undoUtils.kt index 3a52c2312..6b4ad8ebc 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/undoUtils.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/undoUtils.kt @@ -21,6 +21,6 @@ import com.itsaky.androidide.inflater.IViewGroup import kotlin.math.max import kotlin.math.min -internal fun IViewGroup.validateIndex(index: Int) : Int { +internal fun com.itsaky.androidide.inflater.IViewGroup.validateIndex(index: Int) : Int { return min(max(0, index), childCount) } \ No newline at end of file diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/UiInflaterComponentFactory.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/UiInflaterComponentFactory.kt index 8ce3e4021..e4af4ac2d 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/UiInflaterComponentFactory.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/UiInflaterComponentFactory.kt @@ -34,9 +34,9 @@ import com.itsaky.androidide.uidesigner.models.UiViewGroup * * @author Akash Yadav */ -open class UiInflaterComponentFactory : IComponentFactory { +open class UiInflaterComponentFactory : com.itsaky.androidide.inflater.IComponentFactory { - override fun createView(file: LayoutFile, name: String, view: View): IView { + override fun createView(file: LayoutFile, name: String, view: View): com.itsaky.androidide.inflater.IView { if (view is ViewGroup) { return UiViewGroup(file, name, view) } @@ -44,11 +44,11 @@ open class UiInflaterComponentFactory : IComponentFactory { } override fun createAttr( - view: IView, - namespace: INamespace, + view: com.itsaky.androidide.inflater.IView, + namespace: com.itsaky.androidide.inflater.INamespace, name: String, value: String - ): IAttribute { + ): com.itsaky.androidide.inflater.IAttribute { return UiAttribute(namespace = namespace as NamespaceImpl, name = name, value = value).apply { isRequired = UiAttribute.isRequired(view, this) } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/UiLayoutInflater.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/UiLayoutInflater.kt index 9577a24cc..588119dba 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/UiLayoutInflater.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/UiLayoutInflater.kt @@ -30,6 +30,6 @@ class UiLayoutInflater : LayoutInflaterImpl() { init { this.componentFactory = UiInflaterComponentFactory() - Lookup.DEFAULT.update(ILayoutInflater.LOOKUP_KEY, this) + Lookup.DEFAULT.update(com.itsaky.androidide.inflater.ILayoutInflater.LOOKUP_KEY, this) } } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ValueCompletionProvider.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ValueCompletionProvider.kt index 1151a28dd..8b9eb7c9f 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ValueCompletionProvider.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ValueCompletionProvider.kt @@ -37,7 +37,7 @@ import java.io.File internal class ValueCompletionProvider( private val file: File, private val view: ViewImpl, - private val attribute: IAttribute, + private val attribute: com.itsaky.androidide.inflater.IAttribute, private val onComplete: (List) -> Unit ) : SingleTextWatcher() { @@ -72,7 +72,7 @@ internal class ValueCompletionProvider( private val log = ILogger.newInstance("CompletionThread") var prefix: String = "" - var attribute: IAttribute? = null + var attribute: com.itsaky.androidide.inflater.IAttribute? = null fun cancel() { interrupt() diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ViewToXml.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ViewToXml.kt index 2737482c0..87826d6e9 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ViewToXml.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ViewToXml.kt @@ -114,7 +114,7 @@ object ViewToXml { addSingleAttribute("${attr.namespace.prefix}:${attr.name}", attr.value, true) } - if (view is IViewGroup) { + if (view is com.itsaky.androidide.inflater.IViewGroup) { closeStartElement() diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/Widgets.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/Widgets.kt index 9a4f8de49..97e4f8413 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/Widgets.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/Widgets.kt @@ -19,7 +19,7 @@ package com.itsaky.androidide.uidesigner.utils import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner.Group.LAYOUTS import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner.Group.WIDGETS -import com.itsaky.androidide.inflater.internal.ViewAdapterIndex +import com.itsaky.androidide.inflater.IViewAdapterIndex import com.itsaky.androidide.inflater.internal.utils.simpleName import com.itsaky.androidide.uidesigner.R.string import com.itsaky.androidide.uidesigner.models.UiWidgetCategory @@ -45,7 +45,7 @@ internal object Widgets { return@apply } this.widgets = - ViewAdapterIndex.getWidgetProviders(WIDGETS) + IViewAdapterIndex.instance.getWidgetProviders(WIDGETS) .flatMap { it.getUiWidgets() } .sortedBy { it.name.simpleName() } } @@ -58,7 +58,7 @@ internal object Widgets { } this.widgets = - ViewAdapterIndex.getWidgetProviders(LAYOUTS) + IViewAdapterIndex.instance.getWidgetProviders(LAYOUTS) .flatMap { it.getUiWidgets() } .sortedBy { it.name.simpleName() } } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/WorkspaceHierarchyChangeListener.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/WorkspaceHierarchyChangeListener.kt index 8c5f1c380..6321c652b 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/WorkspaceHierarchyChangeListener.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/WorkspaceHierarchyChangeListener.kt @@ -17,16 +17,8 @@ package com.itsaky.androidide.uidesigner.utils -import androidx.transition.ChangeBounds -import androidx.transition.TransitionManager -import com.itsaky.androidide.inflater.IView import com.itsaky.androidide.inflater.IViewGroup -import com.itsaky.androidide.inflater.viewGroup -import com.itsaky.androidide.uidesigner.R -import com.itsaky.androidide.uidesigner.fragments.DesignerWorkspaceFragment -import com.itsaky.androidide.uidesigner.models.PlaceholderView import com.itsaky.androidide.uidesigner.models.UiViewGroup -import com.itsaky.androidide.uidesigner.undo.ViewMovedAction import com.itsaky.androidide.uidesigner.viewmodel.WorkspaceViewModel /** @@ -37,7 +29,7 @@ import com.itsaky.androidide.uidesigner.viewmodel.WorkspaceViewModel internal class WorkspaceHierarchyChangeListener( private val viewModel: WorkspaceViewModel, private val workspaceView: UiViewGroup -) : IViewGroup.SingleOnHierarchyChangeListener() { +) : com.itsaky.androidide.inflater.IViewGroup.SingleOnHierarchyChangeListener() { } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/viewmodel/WorkspaceViewModel.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/viewmodel/WorkspaceViewModel.kt index 51071370f..a42c87e3d 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/viewmodel/WorkspaceViewModel.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/viewmodel/WorkspaceViewModel.kt @@ -28,7 +28,7 @@ internal class WorkspaceViewModel : ViewModel() { internal val _drawerOpened = MutableLiveData(false) internal val _errText = MutableLiveData("") internal val _workspaceScreen = MutableLiveData(SCREEN_WORKSPACE) - internal val _view = MutableLiveData(null) + internal val _view = MutableLiveData(null) internal val _selectedAttr = MutableLiveData(null) internal val _addAttrMode = MutableLiveData(false) internal val _undoManager = MutableLiveData(UndoManager()) @@ -68,7 +68,7 @@ internal class WorkspaceViewModel : ViewModel() { _workspaceScreen.value = value } - var view: IView? + var view: com.itsaky.androidide.inflater.IView? get() = this._view.value set(value) { this._view.value = value diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/views/LayoutHierarchyView.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/views/LayoutHierarchyView.kt index 4d26bef58..6ee1c51a9 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/views/LayoutHierarchyView.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/views/LayoutHierarchyView.kt @@ -50,8 +50,8 @@ constructor( defStyleRes: Int = 0 ) : LinearLayout(context, attrs, defStyleAttr, defStyleRes) { - private val textToIView = mutableMapOf() - private var onClick: ((IView) -> Unit)? = null + private val textToIView = mutableMapOf() + private var onClick: ((com.itsaky.androidide.inflater.IView) -> Unit)? = null private val clickListener = OnClickListener { view -> onClick?.let { click -> textToIView[view]?.let(click) } @@ -70,7 +70,7 @@ constructor( paint.isAntiAlias = true } - fun setupWithView(view: IView, onClick: ((IView) -> Unit)? = null) { + fun setupWithView(view: com.itsaky.androidide.inflater.IView, onClick: ((com.itsaky.androidide.inflater.IView) -> Unit)? = null) { removeAllViews() textToIView.clear() @@ -78,7 +78,7 @@ constructor( addViews(view, 1) } - private fun addViews(view: IView, depth: Int) { + private fun addViews(view: com.itsaky.androidide.inflater.IView, depth: Int) { val text = HierarchyText(context, depth, dp16).apply { this.text = view.tag @@ -86,7 +86,7 @@ constructor( } addView(text) - if (view is IViewGroup) { + if (view is com.itsaky.androidide.inflater.IViewGroup) { text.childCount = computeChildCount(view) view.forEach { addViews(it, depth + 1) } } @@ -94,10 +94,10 @@ constructor( textToIView[text] = view } - private fun computeChildCount(view: IViewGroup): Int { + private fun computeChildCount(view: com.itsaky.androidide.inflater.IViewGroup): Int { var count = view.childCount view.forEachIndexed { index, child -> - if (index != view.childCount - 1 && child is IViewGroup) { + if (index != view.childCount - 1 && child is com.itsaky.androidide.inflater.IViewGroup) { count += computeChildCount(child) } } diff --git a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/enums/TintMode.java b/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/enums/TintMode.java deleted file mode 100644 index 4742c74ca..000000000 --- a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/enums/TintMode.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sdsmdg.harjot.vectormaster.enums; - -/** Created by Harjot on 20-Jun-17. */ -public enum TintMode { - ADD, - MULTIPLY, - SCREEN, - SRC_ATOP, - SCR_IN, - SRC_OVER -} diff --git a/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/UiDesignerTest.kt b/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/UiDesignerTest.kt index ae7bdc10c..23d071ec6 100644 --- a/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/UiDesignerTest.kt +++ b/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/UiDesignerTest.kt @@ -45,7 +45,7 @@ fun requiresActivity(initComponentFactory: Boolean = true, block: AppCompatActiv activity.block() } -fun Context.createLayout(parent: IViewGroup? = null): ViewGroupImpl { +fun Context.createLayout(parent: com.itsaky.androidide.inflater.IViewGroup? = null): ViewGroupImpl { return ViewGroupImpl( LayoutFile(File(""), ""), LinearLayout::class.qualifiedName!!, @@ -54,12 +54,12 @@ fun Context.createLayout(parent: IViewGroup? = null): ViewGroupImpl { .apply { parent?.let { applyLayoutParams(it) } } } -fun Context.createView(parent: IViewGroup? = null): ViewImpl { +fun Context.createView(parent: com.itsaky.androidide.inflater.IViewGroup? = null): ViewImpl { return ViewImpl(LayoutFile(File(""), ""), View::class.qualifiedName!!, View(this)).apply { parent?.let { applyLayoutParams(it) } } } -fun ViewImpl.applyLayoutParams(parent: IViewGroup) { +fun ViewImpl.applyLayoutParams(parent: com.itsaky.androidide.inflater.IViewGroup) { view.layoutParams = ViewFactory.generateLayoutParams(parent.viewGroup) } diff --git a/xml-inflater/.gitignore b/xml-inflater/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/xml-inflater/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/xml-inflater/build.gradle.kts b/xml-inflater/build.gradle.kts new file mode 100644 index 000000000..fd14ca0f2 --- /dev/null +++ b/xml-inflater/build.gradle.kts @@ -0,0 +1,47 @@ +/* + * 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 . + */ + +plugins { + id("com.android.library") + id("kotlin-android") + id("kotlin-kapt") + id("kotlin-parcelize") +} + +android { namespace = "com.itsaky.androidide.inflater" } + +dependencies { + + kapt(projects.annotationProcessors) + + implementation(libs.androidx.appcompat) + implementation(libs.common.kotlin) + implementation(libs.common.utilcode) + + implementation(projects.annotations) + implementation(projects.common) + implementation(projects.subprojects.aaptcompiler) + implementation(projects.subprojects.projects) + implementation(projects.subprojects.xmlUtils) + implementation(projects.resources) + + testImplementation(projects.subprojects.projects) + testImplementation(projects.subprojects.toolingApiTesting) + testImplementation(libs.tests.junit) + testImplementation(libs.tests.google.truth) + testImplementation(libs.tests.robolectric) +} diff --git a/xml-inflater/consumer-rules.pro b/xml-inflater/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/xml-inflater/proguard-rules.pro b/xml-inflater/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/xml-inflater/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/xml-inflater/src/main/AndroidManifest.xml b/xml-inflater/src/main/AndroidManifest.xml new file mode 100644 index 000000000..e62e7b210 --- /dev/null +++ b/xml-inflater/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/AbstractParser.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/AbstractParser.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/AbstractParser.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/AbstractParser.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/AttributeHandlerScope.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/AttributeHandlerScope.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/AttributeHandlerScope.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/AttributeHandlerScope.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/DefaultComponentFactory.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/DefaultComponentFactory.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/DefaultComponentFactory.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/DefaultComponentFactory.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/ForwardingViewGroup.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/ForwardingViewGroup.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/ForwardingViewGroup.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/ForwardingViewGroup.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/IAttribute.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IAttribute.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/IAttribute.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/IAttribute.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/IComponentFactory.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IComponentFactory.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/IComponentFactory.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/IComponentFactory.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/ILayoutInflater.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/ILayoutInflater.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/ILayoutInflater.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/ILayoutInflater.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/INamespace.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/INamespace.kt similarity index 97% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/INamespace.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/INamespace.kt index 191544d2f..b955f3240 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/inflater/INamespace.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/INamespace.kt @@ -20,7 +20,6 @@ package com.itsaky.androidide.inflater import com.android.SdkConstants.ANDROID_NS_NAME import com.android.SdkConstants.ANDROID_URI import com.itsaky.androidide.inflater.internal.NamespaceImpl -import kotlinx.parcelize.RawValue /** * An XML namespace declaration. diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/IView.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IView.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/IView.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/IView.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/IViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/IViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewAdapter.kt diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewAdapterIndex.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewAdapterIndex.kt new file mode 100644 index 000000000..df7d891f8 --- /dev/null +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewAdapterIndex.kt @@ -0,0 +1,84 @@ +/* + * 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 + +import android.view.View +import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner +import com.itsaky.androidide.inflater.internal.ViewAdapterIndexImpl + +/** + * Provides access to all view adapters. + * + * @author Akash Yadav + */ +interface IViewAdapterIndex { + + companion object { + @JvmField val instance: IViewAdapterIndex = ViewAdapterIndexImpl.INSTANCE + } + + /** + * Get the adapter for the given fully qualified view name. + * + * @param view The fully qualified name of the view class. + * @return The [IViewAdapter] for the given view name. If no adapter is found for the given view + * name, returns adapter for `android.view.View` if available or `null`. + */ + fun getAdapter(view: String): IViewAdapter<*>? + + /** + * Get the adapter for the given view. + * + * @param view The fully qualified name of the view. + * @return The view adapter instance or `null` if not found. + */ + fun getViewAdapter(view: String): IViewAdapter<*> + + /** + * Get the view adapters which provide widgets to the UI designer. + * + * @param group The group to get widget providers for. + * @return The widget providers for the [group]. + */ + fun getWidgetProviders(group: IncludeInDesigner.Group) : List> +} + +/** + * Get the adapter for the given fully qualified view name. + * + * @param view The fully qualified name of the view class. + * @return The [IViewAdapter] for the given view name. If no adapter is found for the given view + * name, returns adapter for `android.view.View` if available or `null`. + */ +fun getAdapter(view: String): IViewAdapter<*>? { + return IViewAdapterIndex.instance.getAdapter(view) +} + +/** + * Get the adapter for the given view. + * + * @param view The fully qualified name of the view. + * @return The view adapter instance or `null` if not found. + */ +fun getViewAdapter(view: String): IViewAdapter<*> { + return IViewAdapterIndex.instance.getViewAdapter(view) +} + +/** The view adapter for this view. */ +val IView.viewAdapter: IViewAdapter? + get() = IViewAdapterIndex.instance.getAdapter(this.name) diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/IViewGroup.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewGroup.kt similarity index 96% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/IViewGroup.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewGroup.kt index cabc33275..14654592f 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/inflater/IViewGroup.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewGroup.kt @@ -17,8 +17,6 @@ package com.itsaky.androidide.inflater -import com.itsaky.androidide.inflater.internal.ViewAdapterIndex - /** * Inflated model for a [ViewGroup][android.view.ViewGroup]. * @@ -54,7 +52,7 @@ interface IViewGroup : IView, Iterable { */ fun canAcceptChild(name: String): Boolean { return canModifyChildViews() && - (ViewAdapterIndex.getAdapter(this.name) as? IViewGroupAdapter)?.canAcceptChild(this, name) == true + (this.viewAdapter as? IViewGroupAdapter)?.canAcceptChild(this, name) == true } /** diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/IViewGroupAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewGroupAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/IViewGroupAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/IViewGroupAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/InflateException.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/InflateException.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/InflateException.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/InflateException.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/LayoutBehavior.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/LayoutBehavior.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/LayoutBehavior.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/LayoutBehavior.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/BitmapDrawableParser.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/BitmapDrawableParser.kt similarity index 98% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/BitmapDrawableParser.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/BitmapDrawableParser.kt index 66bcfee12..a7c958ddb 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/BitmapDrawableParser.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/BitmapDrawableParser.kt @@ -26,7 +26,6 @@ import android.graphics.Shader.TileMode.MIRROR import android.graphics.Shader.TileMode.REPEAT import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable -import com.itsaky.androidide.app.BaseApplication import com.itsaky.androidide.inflater.InflateException import org.jetbrains.annotations.Contract import org.xmlpull.v1.XmlPullParser diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/ClipDrawableParser.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/ClipDrawableParser.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/ClipDrawableParser.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/ClipDrawableParser.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/DrawableParserFactory.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/DrawableParserFactory.java similarity index 96% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/DrawableParserFactory.java rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/DrawableParserFactory.java index fbe117001..e78dc6e6c 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/DrawableParserFactory.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/DrawableParserFactory.java @@ -29,7 +29,7 @@ import androidx.annotation.Nullable; import com.blankj.utilcode.util.FileIOUtils; import com.blankj.utilcode.util.ImageUtils; import com.itsaky.androidide.utils.ILogger; -import com.sdsmdg.harjot.vectormaster.VectorMasterDrawable; +import com.itsaky.androidide.inflater.vectormaster.VectorMasterDrawable; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/IDrawableParser.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/IDrawableParser.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/IDrawableParser.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/IDrawableParser.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/InsetDrawableParser.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/InsetDrawableParser.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/InsetDrawableParser.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/InsetDrawableParser.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/LayerListParser.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/LayerListParser.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/LayerListParser.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/LayerListParser.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/ScaleDrawableParser.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/ScaleDrawableParser.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/ScaleDrawableParser.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/ScaleDrawableParser.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/ShapeDrawableParser.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/ShapeDrawableParser.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/ShapeDrawableParser.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/ShapeDrawableParser.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/StateListParser.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/StateListParser.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/drawable/StateListParser.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/StateListParser.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/events/IInflateEventsListener.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/events/IInflateEventsListener.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/events/IInflateEventsListener.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/events/IInflateEventsListener.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/events/IInflationEvent.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/events/IInflationEvent.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/events/IInflationEvent.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/events/IInflationEvent.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/events/inflationEvents.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/events/inflationEvents.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/events/inflationEvents.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/events/inflationEvents.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/AttributeImpl.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/AttributeImpl.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/AttributeImpl.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/AttributeImpl.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ErrorView.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ErrorView.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ErrorView.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ErrorView.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ForwardingView.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ForwardingView.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ForwardingView.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ForwardingView.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableAttributeImpl.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableAttributeImpl.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableAttributeImpl.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableAttributeImpl.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableViewGroupImpl.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableViewGroupImpl.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableViewGroupImpl.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableViewGroupImpl.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableViewImpl.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableViewImpl.kt similarity index 96% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableViewImpl.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableViewImpl.kt index e4999ef9d..3feb1b43c 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableViewImpl.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ImmutableViewImpl.kt @@ -17,11 +17,9 @@ package com.itsaky.androidide.inflater.internal -import android.view.View import com.itsaky.androidide.inflater.IAttribute import com.itsaky.androidide.inflater.IView import com.itsaky.androidide.inflater.IView.AttributeChangeListener -import com.itsaky.androidide.inflater.IViewGroup /** * An immutable implementation of [IView]. diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/LayoutFile.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutFile.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/LayoutFile.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutFile.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt similarity index 99% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt index ceda79c1c..98434231a 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt @@ -54,6 +54,7 @@ import com.itsaky.androidide.inflater.internal.utils.parseLayoutReference import com.itsaky.androidide.inflater.utils.endParse import com.itsaky.androidide.inflater.utils.isParsing import com.itsaky.androidide.inflater.utils.startParse +import com.itsaky.androidide.inflater.viewAdapter import com.itsaky.androidide.lookup.Lookup import com.itsaky.androidide.projects.ProjectManager import com.itsaky.androidide.projects.api.AndroidModule @@ -225,7 +226,7 @@ open class LayoutInflaterImpl : ILayoutInflater { ) { val parentView = parent.view as ViewGroup val adapter = - ViewAdapterIndex.getAdapter(view.name) + view.viewAdapter ?: throw InflateException("No attribute adapter found for view ${view.name}") view.view.layoutParams = generateLayoutParams(parentView) diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/NamespaceImpl.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/NamespaceImpl.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/NamespaceImpl.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/NamespaceImpl.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/SingleChildViewGroup.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/SingleChildViewGroup.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/SingleChildViewGroup.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/SingleChildViewGroup.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ViewGroupImpl.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ViewGroupImpl.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ViewGroupImpl.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ViewGroupImpl.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ViewImpl.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ViewImpl.kt similarity index 98% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ViewImpl.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ViewImpl.kt index bb9a02008..9ac4441bb 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/ViewImpl.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ViewImpl.kt @@ -28,6 +28,7 @@ import com.itsaky.androidide.inflater.IViewGroup import com.itsaky.androidide.inflater.internal.utils.simpleName import com.itsaky.androidide.inflater.internal.utils.tagName import com.itsaky.androidide.inflater.utils.newAttribute +import com.itsaky.androidide.inflater.viewAdapter import com.itsaky.androidide.resources.R.drawable import com.itsaky.androidide.utils.ILogger @@ -112,7 +113,7 @@ constructor( } override fun applyAttribute(attribute: IAttribute) { - val adapter = ViewAdapterIndex.getAdapter(name) + val adapter = viewAdapter if (adapter == null) { log.warn("No attribute adapter found for view $name") return diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsListViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsListViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsListViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsListViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsSeekBarAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsSeekBarAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsSeekBarAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsSeekBarAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsSpinnerAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsSpinnerAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsSpinnerAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsSpinnerAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsoluteLayoutAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsoluteLayoutAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsoluteLayoutAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AbsoluteLayoutAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AdapterViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AdapterViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AdapterViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AdapterViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AnalogClockAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AnalogClockAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AnalogClockAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AnalogClockAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AutoCompleteTextViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AutoCompleteTextViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AutoCompleteTextViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AutoCompleteTextViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ButtonAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ButtonAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ButtonAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ButtonAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CalendarViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CalendarViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CalendarViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CalendarViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CheckBoxAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CheckBoxAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CheckBoxAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CheckBoxAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CheckedTextViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CheckedTextViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CheckedTextViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CheckedTextViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ChronometerAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ChronometerAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ChronometerAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ChronometerAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CompoundButtonAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CompoundButtonAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CompoundButtonAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/CompoundButtonAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/DigitalClockAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/DigitalClockAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/DigitalClockAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/DigitalClockAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/EditTextAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/EditTextAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/EditTextAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/EditTextAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/FrameLayoutAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/FrameLayoutAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/FrameLayoutAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/FrameLayoutAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/GestureOverlayViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/GestureOverlayViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/GestureOverlayViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/GestureOverlayViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/GridLayoutAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/GridLayoutAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/GridLayoutAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/GridLayoutAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/HorizontalScrollViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/HorizontalScrollViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/HorizontalScrollViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/HorizontalScrollViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageButtonAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageButtonAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageButtonAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageButtonAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/LinearLayoutAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/LinearLayoutAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/LinearLayoutAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/LinearLayoutAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ListViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ListViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ListViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ListViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/MultiAutoCompleteTextViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/MultiAutoCompleteTextViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/MultiAutoCompleteTextViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/MultiAutoCompleteTextViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/NumberPickerAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/NumberPickerAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/NumberPickerAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/NumberPickerAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ProgressBarAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ProgressBarAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ProgressBarAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ProgressBarAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/QuickContactBadgeAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/QuickContactBadgeAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/QuickContactBadgeAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/QuickContactBadgeAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RadioButtonAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RadioButtonAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RadioButtonAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RadioButtonAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RadioGroupAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RadioGroupAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RadioGroupAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RadioGroupAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RatingBarAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RatingBarAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RatingBarAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RatingBarAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RelativeLayoutAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RelativeLayoutAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RelativeLayoutAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/RelativeLayoutAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ScrollViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ScrollViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ScrollViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ScrollViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SeekBarAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SeekBarAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SeekBarAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SeekBarAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpaceAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpaceAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpaceAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpaceAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpinnerAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpinnerAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpinnerAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpinnerAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SurfaceViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SurfaceViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SurfaceViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SurfaceViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SwitchAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SwitchAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SwitchAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SwitchAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextClockAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextClockAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextClockAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextClockAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextViewAdapter.kt diff --git a/uidesigner/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 similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextureViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/TextureViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ToggleButtonAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ToggleButtonAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ToggleButtonAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ToggleButtonAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/VideoViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/VideoViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/VideoViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/VideoViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewGroupAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewGroupAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewGroupAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewGroupAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/WebViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/WebViewAdapter.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/WebViewAdapter.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/WebViewAdapter.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/appcompat/AppCompatTextView.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/appcompat/AppCompatTextView.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/adapters/appcompat/AppCompatTextView.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/appcompat/AppCompatTextView.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/IDTable.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/IDTable.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/IDTable.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/IDTable.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/TextDrawable.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/TextDrawable.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/TextDrawable.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/TextDrawable.kt diff --git a/uidesigner/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 similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewUtils.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewUtils.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewUtils.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewUtils.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/basicParseUtils.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/basicParseUtils.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/basicParseUtils.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/basicParseUtils.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/lookup.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/lookup.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/lookup.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/lookup.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/viewParseUtils.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/viewParseUtils.kt similarity index 96% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/viewParseUtils.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/viewParseUtils.kt index 8fb287b1b..5a463d028 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/inflater/internal/utils/viewParseUtils.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/viewParseUtils.kt @@ -19,8 +19,6 @@ package com.itsaky.androidide.inflater.internal.utils import android.graphics.PorterDuff import android.view.View -import com.android.aaptcompiler.AaptResourceType.ID -import com.itsaky.androidide.inflater.internal.ViewImpl @JvmOverloads fun parseId(resName: String, value: String, def: Int = 0): Int { diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/models/UiWidget.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/models/UiWidget.kt similarity index 96% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/models/UiWidget.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/models/UiWidget.kt index 21b1bce18..d6fd6d126 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/inflater/models/UiWidget.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/models/UiWidget.kt @@ -27,12 +27,12 @@ import com.blankj.utilcode.util.SizeUtils import com.itsaky.androidide.inflater.IView import com.itsaky.androidide.inflater.IViewGroup import com.itsaky.androidide.inflater.internal.LayoutFile -import com.itsaky.androidide.inflater.internal.ViewAdapterIndex.getAdapter import com.itsaky.androidide.inflater.internal.ViewGroupImpl import com.itsaky.androidide.inflater.internal.ViewImpl import com.itsaky.androidide.inflater.internal.utils.ViewFactory import com.itsaky.androidide.inflater.internal.utils.ViewFactory.generateLayoutParams import com.itsaky.androidide.inflater.utils.lookupComponentFactory +import com.itsaky.androidide.inflater.viewAdapter open class UiWidget(val name: String, @StringRes val label: Int, @DrawableRes val icon: Int) { @@ -60,7 +60,7 @@ open class UiWidget(val name: String, @StringRes val label: Int, @DrawableRes va view.view.layoutParams = generateLayoutParams(parent) val adapter = - getAdapter(view.name) + view.viewAdapter ?: throw IllegalStateException("No attribute adapter found for '${view.name}'") adapter.applyBasic(view) return view diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/utils/inflaterUtils.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/utils/inflaterUtils.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/utils/inflaterUtils.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/utils/inflaterUtils.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/utils/module.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/utils/module.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/utils/module.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/utils/module.kt diff --git a/uidesigner/src/main/java/com/itsaky/androidide/inflater/utils/viewUtils.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/utils/viewUtils.kt similarity index 100% rename from uidesigner/src/main/java/com/itsaky/androidide/inflater/utils/viewUtils.kt rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/utils/viewUtils.kt diff --git a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/DefaultValues.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/DefaultValues.java similarity index 71% rename from uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/DefaultValues.java rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/DefaultValues.java index 9e051f6e5..d9a00151d 100644 --- a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/DefaultValues.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/DefaultValues.java @@ -1,4 +1,21 @@ -package com.sdsmdg.harjot.vectormaster; +/* + * 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.vectormaster; import android.graphics.Color; import android.graphics.Paint; diff --git a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/VectorMasterDrawable.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterDrawable.java similarity index 94% rename from uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/VectorMasterDrawable.java rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterDrawable.java index 91aa56bbe..7a8785dce 100644 --- a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/VectorMasterDrawable.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterDrawable.java @@ -1,4 +1,21 @@ -package com.sdsmdg.harjot.vectormaster; +/* + * 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.vectormaster; import android.content.Context; import android.graphics.Canvas; @@ -12,11 +29,11 @@ import android.graphics.drawable.Drawable; import androidx.annotation.NonNull; import com.blankj.utilcode.util.FileIOUtils; -import com.sdsmdg.harjot.vectormaster.models.ClipPathModel; -import com.sdsmdg.harjot.vectormaster.models.GroupModel; -import com.sdsmdg.harjot.vectormaster.models.PathModel; -import com.sdsmdg.harjot.vectormaster.models.VectorModel; -import com.sdsmdg.harjot.vectormaster.utilities.Utils; +import com.itsaky.androidide.inflater.vectormaster.models.GroupModel; +import com.itsaky.androidide.inflater.vectormaster.models.ClipPathModel; +import com.itsaky.androidide.inflater.vectormaster.models.PathModel; +import com.itsaky.androidide.inflater.vectormaster.models.VectorModel; +import com.itsaky.androidide.inflater.vectormaster.utilities.Utils; import org.jetbrains.annotations.Contract; import org.xmlpull.v1.XmlPullParser; diff --git a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/VectorMasterView.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterView.java similarity index 93% rename from uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/VectorMasterView.java rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterView.java index 1d8e42daf..d345c65bd 100644 --- a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/VectorMasterView.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterView.java @@ -1,4 +1,21 @@ -package com.sdsmdg.harjot.vectormaster; +/* + * 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.vectormaster; import android.annotation.SuppressLint; import android.content.Context; @@ -10,12 +27,12 @@ import android.graphics.Path; import android.util.AttributeSet; import android.view.View; +import com.itsaky.androidide.inflater.vectormaster.models.GroupModel; import com.itsaky.androidide.resources.R; -import com.sdsmdg.harjot.vectormaster.models.ClipPathModel; -import com.sdsmdg.harjot.vectormaster.models.GroupModel; -import com.sdsmdg.harjot.vectormaster.models.PathModel; -import com.sdsmdg.harjot.vectormaster.models.VectorModel; -import com.sdsmdg.harjot.vectormaster.utilities.Utils; +import com.itsaky.androidide.inflater.vectormaster.models.ClipPathModel; +import com.itsaky.androidide.inflater.vectormaster.models.PathModel; +import com.itsaky.androidide.inflater.vectormaster.models.VectorModel; +import com.itsaky.androidide.inflater.vectormaster.utilities.Utils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/enums/TintMode.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/enums/TintMode.java new file mode 100644 index 000000000..b32f4b135 --- /dev/null +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/enums/TintMode.java @@ -0,0 +1,28 @@ +/* + * 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.vectormaster.enums; + +/** Created by Harjot on 20-Jun-17. */ +public enum TintMode { + ADD, + MULTIPLY, + SCREEN, + SRC_ATOP, + SCR_IN, + SRC_OVER +} diff --git a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/models/ClipPathModel.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/ClipPathModel.java similarity index 67% rename from uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/models/ClipPathModel.java rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/ClipPathModel.java index c2eedb868..100c9c45d 100644 --- a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/models/ClipPathModel.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/ClipPathModel.java @@ -1,4 +1,21 @@ -package com.sdsmdg.harjot.vectormaster.models; +/* + * 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.vectormaster.models; import android.graphics.Matrix; import android.graphics.Paint; @@ -7,7 +24,7 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; -import com.sdsmdg.harjot.vectormaster.utilities.parser.PathParser; +import com.itsaky.androidide.inflater.vectormaster.utilities.parser.PathParser; public class ClipPathModel { private String name; @@ -29,7 +46,7 @@ public class ClipPathModel { public void buildPath(boolean useLegacyParser) { if (useLegacyParser) { originalPath = - com.sdsmdg.harjot.vectormaster.utilities.legacyparser.PathParser.createPathFromPathData( + com.itsaky.androidide.inflater.vectormaster.utilities.legacyparser.PathParser.createPathFromPathData( pathData); } else { originalPath = PathParser.doPath(pathData); diff --git a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/models/GroupModel.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/GroupModel.java similarity index 89% rename from uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/models/GroupModel.java rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/GroupModel.java index 1441491fc..546102873 100644 --- a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/models/GroupModel.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/GroupModel.java @@ -1,10 +1,27 @@ -package com.sdsmdg.harjot.vectormaster.models; +/* + * 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.vectormaster.models; import android.graphics.Canvas; import android.graphics.Matrix; -import com.sdsmdg.harjot.vectormaster.DefaultValues; -import com.sdsmdg.harjot.vectormaster.utilities.Utils; +import com.itsaky.androidide.inflater.vectormaster.DefaultValues; +import com.itsaky.androidide.inflater.vectormaster.utilities.Utils; import java.util.ArrayList; diff --git a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/models/PathModel.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/PathModel.java similarity index 87% rename from uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/models/PathModel.java rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/PathModel.java index d4ac4f252..b25d8927a 100644 --- a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/models/PathModel.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/PathModel.java @@ -1,4 +1,21 @@ -package com.sdsmdg.harjot.vectormaster.models; +/* + * 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.vectormaster.models; import android.graphics.Color; import android.graphics.Matrix; @@ -7,9 +24,9 @@ import android.graphics.Path; import android.graphics.PathMeasure; import android.graphics.RectF; -import com.sdsmdg.harjot.vectormaster.DefaultValues; -import com.sdsmdg.harjot.vectormaster.utilities.Utils; -import com.sdsmdg.harjot.vectormaster.utilities.parser.PathParser; +import com.itsaky.androidide.inflater.vectormaster.DefaultValues; +import com.itsaky.androidide.inflater.vectormaster.utilities.Utils; +import com.itsaky.androidide.inflater.vectormaster.utilities.parser.PathParser; public class PathModel { @@ -91,7 +108,7 @@ public class PathModel { public void buildPath(boolean useLegacyParser) { if (useLegacyParser) { originalPath = - com.sdsmdg.harjot.vectormaster.utilities.legacyparser.PathParser.createPathFromPathData( + com.itsaky.androidide.inflater.vectormaster.utilities.legacyparser.PathParser.createPathFromPathData( pathData); } else { originalPath = PathParser.doPath(pathData); diff --git a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/models/VectorModel.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/VectorModel.java similarity index 86% rename from uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/models/VectorModel.java rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/VectorModel.java index d7055403d..61d5e629a 100644 --- a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/models/VectorModel.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/VectorModel.java @@ -1,11 +1,28 @@ -package com.sdsmdg.harjot.vectormaster.models; +/* + * 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.vectormaster.models; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Path; -import com.sdsmdg.harjot.vectormaster.enums.TintMode; +import com.itsaky.androidide.inflater.vectormaster.enums.TintMode; import java.util.ArrayList; diff --git a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/utilities/Utils.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/Utils.java similarity index 78% rename from uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/utilities/Utils.java rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/Utils.java index d8db0a418..b37e23f62 100644 --- a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/utilities/Utils.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/Utils.java @@ -1,4 +1,21 @@ -package com.sdsmdg.harjot.vectormaster.utilities; +/* + * 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.vectormaster.utilities; import android.content.res.Resources; import android.graphics.Color; diff --git a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/utilities/legacyparser/PathParser.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/legacyparser/PathParser.java similarity index 99% rename from uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/utilities/legacyparser/PathParser.java rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/legacyparser/PathParser.java index 0b66972d4..bcb7a86b6 100644 --- a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/utilities/legacyparser/PathParser.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/legacyparser/PathParser.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with AndroidIDE. If not, see . */ -package com.sdsmdg.harjot.vectormaster.utilities.legacyparser; +package com.itsaky.androidide.inflater.vectormaster.utilities.legacyparser; import android.graphics.Path; diff --git a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/utilities/parser/ParserHelper.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/parser/ParserHelper.java similarity index 91% rename from uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/utilities/parser/ParserHelper.java rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/parser/ParserHelper.java index 46c791d58..811a4b278 100644 --- a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/utilities/parser/ParserHelper.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/parser/ParserHelper.java @@ -1,4 +1,21 @@ -package com.sdsmdg.harjot.vectormaster.utilities.parser; +/* + * 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.vectormaster.utilities.parser; /* diff --git a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/utilities/parser/PathParser.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/parser/PathParser.java similarity index 92% rename from uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/utilities/parser/PathParser.java rename to xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/parser/PathParser.java index 7ba0d147e..7a03f649d 100644 --- a/uidesigner/src/main/java/com/sdsmdg/harjot/vectormaster/utilities/parser/PathParser.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/parser/PathParser.java @@ -1,4 +1,21 @@ -package com.sdsmdg.harjot.vectormaster.utilities.parser; +/* + * 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.vectormaster.utilities.parser; import android.graphics.Path; import android.graphics.RectF; diff --git a/uidesigner/src/test/java/com/itsaky/androidide/inflater/AdapterIndexTest.kt b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/AdapterIndexTest.kt similarity index 83% rename from uidesigner/src/test/java/com/itsaky/androidide/inflater/AdapterIndexTest.kt rename to xml-inflater/src/test/java/com/itsaky/androidide/inflater/AdapterIndexTest.kt index 5bc70e15a..0cd82d43b 100644 --- a/uidesigner/src/test/java/com/itsaky/androidide/inflater/AdapterIndexTest.kt +++ b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/AdapterIndexTest.kt @@ -20,7 +20,6 @@ package com.itsaky.androidide.inflater import android.view.* import android.widget.* import com.google.common.truth.Truth.assertThat -import com.itsaky.androidide.inflater.internal.ViewAdapterIndex import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner @@ -32,12 +31,12 @@ class AdapterIndexTest { @Test fun `verify instances of adapters`() { viewToAdapter.forEach { - ViewAdapterIndex.getViewAdapter(it.key.qualifiedName).apply { + getViewAdapter(it.key.qualifiedName!!).apply { assertThat(this).isNotNull() assertThat(this).isInstanceOf(it.value.java) } } - abstractViews.forEach { assertThat(ViewAdapterIndex.getViewAdapter(it.qualifiedName)).isNull() } + abstractViews.forEach { assertThat(getViewAdapter(it.qualifiedName!!)).isNull() } } } diff --git a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ExampleUnitTest.kt b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ExampleUnitTest.kt new file mode 100644 index 000000000..bcb187e38 --- /dev/null +++ b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ExampleUnitTest.kt @@ -0,0 +1,34 @@ +/* + * 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 + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/uidesigner/src/test/java/com/itsaky/androidide/inflater/LayoutInflaterTest.kt b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/LayoutInflaterTest.kt similarity index 100% rename from uidesigner/src/test/java/com/itsaky/androidide/inflater/LayoutInflaterTest.kt rename to xml-inflater/src/test/java/com/itsaky/androidide/inflater/LayoutInflaterTest.kt diff --git a/uidesigner/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt similarity index 100% rename from uidesigner/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt rename to xml-inflater/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt diff --git a/uidesigner/src/test/java/com/itsaky/androidide/inflater/XmlInflaterTest.kt b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/XmlInflaterTest.kt similarity index 100% rename from uidesigner/src/test/java/com/itsaky/androidide/inflater/XmlInflaterTest.kt rename to xml-inflater/src/test/java/com/itsaky/androidide/inflater/XmlInflaterTest.kt diff --git a/uidesigner/src/test/java/com/itsaky/androidide/inflater/adapterUtils.kt b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/adapterUtils.kt similarity index 100% rename from uidesigner/src/test/java/com/itsaky/androidide/inflater/adapterUtils.kt rename to xml-inflater/src/test/java/com/itsaky/androidide/inflater/adapterUtils.kt