diff --git a/recompose-ast/src/main/kotlin/recompose/ast/viewgroup/FrameLayoutNode.kt b/recompose-ast/src/main/kotlin/recompose/ast/viewgroup/FrameLayoutNode.kt new file mode 100644 index 0000000..8d16e7a --- /dev/null +++ b/recompose-ast/src/main/kotlin/recompose/ast/viewgroup/FrameLayoutNode.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2020 Sebastian Kaspari + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package recompose.ast.viewgroup + +import recompose.ast.ViewGroupNode +import recompose.ast.attributes.ViewAttributes +import recompose.ast.attributes.ViewGroupAttributes +import recompose.visitor.Visitor + +/** + * Data classs holding value of a parsed `FrameLayout` + * + * https://developer.android.com/reference/android/widget/FrameLayout + */ +data class FrameLayoutNode( + override val viewGroup: ViewGroupAttributes, + override val view: ViewAttributes, +) : ViewGroupNode { + override fun accept(visitor: Visitor) = visitor.visitFrameLayout(this) +} diff --git a/recompose-ast/src/main/kotlin/recompose/visitor/Visitor.kt b/recompose-ast/src/main/kotlin/recompose/visitor/Visitor.kt index 58aedba..7bf0e49 100644 --- a/recompose-ast/src/main/kotlin/recompose/visitor/Visitor.kt +++ b/recompose-ast/src/main/kotlin/recompose/visitor/Visitor.kt @@ -25,6 +25,7 @@ import recompose.ast.view.TextViewNode import recompose.ast.view.ViewNode import recompose.ast.viewgroup.CardViewNode import recompose.ast.viewgroup.ConstraintLayoutNode +import recompose.ast.viewgroup.FrameLayoutNode import recompose.ast.viewgroup.LinearLayoutNode import recompose.ast.viewgroup.UnknownNode @@ -41,6 +42,7 @@ interface Visitor { fun visitCardView(node: CardViewNode) fun visitImageView(node: ImageViewNode) fun visitLinearLayout(node: LinearLayoutNode) + fun visitFrameLayout(node: FrameLayoutNode) fun visitCheckBox(node: CheckBoxNode) fun visitConstraintLayout(node: ConstraintLayoutNode) fun visitUnknown(node: UnknownNode) diff --git a/recompose-composer/src/main/kotlin/recompose/composer/visitor/ComposingVisitor.kt b/recompose-composer/src/main/kotlin/recompose/composer/visitor/ComposingVisitor.kt index d3ef8ec..5f523c8 100644 --- a/recompose-composer/src/main/kotlin/recompose/composer/visitor/ComposingVisitor.kt +++ b/recompose-composer/src/main/kotlin/recompose/composer/visitor/ComposingVisitor.kt @@ -26,6 +26,7 @@ import recompose.ast.view.TextViewNode import recompose.ast.view.ViewNode import recompose.ast.viewgroup.CardViewNode import recompose.ast.viewgroup.ConstraintLayoutNode +import recompose.ast.viewgroup.FrameLayoutNode import recompose.ast.viewgroup.LinearLayoutNode import recompose.ast.viewgroup.UnknownNode import recompose.composer.ext.findChains @@ -172,6 +173,13 @@ internal class ComposingVisitor : Visitor { } } + override fun visitFrameLayout(node: FrameLayoutNode) { + val rowModifier = ModifierBuilder(node) + writer.writeCall(name = "Box", parameters = listOf(rowModifier.toCallParameter())) { + node.viewGroup.children.forEach { it.accept(this@ComposingVisitor) } + } + } + override fun visitConstraintLayout(node: ConstraintLayoutNode) { val modifier = ModifierBuilder(node) diff --git a/recompose-composer/src/main/kotlin/recompose/composer/writer/ParameterValue.kt b/recompose-composer/src/main/kotlin/recompose/composer/writer/ParameterValue.kt index 9f65b4c..1c998ba 100644 --- a/recompose-composer/src/main/kotlin/recompose/composer/writer/ParameterValue.kt +++ b/recompose-composer/src/main/kotlin/recompose/composer/writer/ParameterValue.kt @@ -22,7 +22,7 @@ import recompose.ast.values.InputType import recompose.ast.values.Size /** - * Sealed class for types of parameter values that a passed to a `Composable`. + * Sealed class for types of parameter values that are passed to a `Composable`. */ internal sealed class ParameterValue { class RawValue( diff --git a/recompose-composer/src/test/kotlin/recompose/composer/ComposerTest.kt b/recompose-composer/src/test/kotlin/recompose/composer/ComposerTest.kt index bbda17f..20366ef 100644 --- a/recompose-composer/src/test/kotlin/recompose/composer/ComposerTest.kt +++ b/recompose-composer/src/test/kotlin/recompose/composer/ComposerTest.kt @@ -300,4 +300,19 @@ class ComposerTest { """.trimIndent() ) } + + @Test + fun `FrameLayout with TextView and Button`() { + assertComposing( + fileName = "framelayout-textview-button.xml", + """ + Box(modifier = Modifier.fillMaxWidth().fillMaxHeight().padding(16.dp)) { + Text(text = "Center", fontSize = 20.sp, modifier = Modifier.fillMaxWidth().fillMaxHeight()) + Button(onClick = {}, modifier = Modifier.fillMaxWidth()) { + Text(text = "Button", textAlign = TextAlign.Center) + } + } + """.trimIndent() + ) + } } diff --git a/recompose-parser/src/main/kotlin/recompose/parser/xml/View.kt b/recompose-parser/src/main/kotlin/recompose/parser/xml/View.kt index 4b04a0a..58a0cfc 100644 --- a/recompose-parser/src/main/kotlin/recompose/parser/xml/View.kt +++ b/recompose-parser/src/main/kotlin/recompose/parser/xml/View.kt @@ -34,6 +34,7 @@ import recompose.parser.xml.view.imageView import recompose.parser.xml.view.textView import recompose.parser.xml.view.view import recompose.parser.xml.viewgroup.constraintLayout +import recompose.parser.xml.viewgroup.frameLayout import recompose.parser.xml.viewgroup.linearLayout import recompose.parser.xml.viewgroup.unknown @@ -46,6 +47,7 @@ internal fun XmlPullParser.node(): Node { return when (name) { // ViewGroupNode "LinearLayout" -> linearLayout() + "FrameLayout" -> frameLayout() // ViewNode "View" -> view() diff --git a/recompose-parser/src/main/kotlin/recompose/parser/xml/viewgroup/FrameLayout.kt b/recompose-parser/src/main/kotlin/recompose/parser/xml/viewgroup/FrameLayout.kt new file mode 100644 index 0000000..a57f5bb --- /dev/null +++ b/recompose-parser/src/main/kotlin/recompose/parser/xml/viewgroup/FrameLayout.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2020 Sebastian Kaspari + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package recompose.parser.xml.viewgroup + +import org.xmlpull.v1.XmlPullParser +import recompose.ast.viewgroup.FrameLayoutNode +import recompose.parser.xml.viewAttributes +import recompose.parser.xml.viewGroupAttributes + +/** + * Parses a ` element. + * + * https://developer.android.com/reference/android/widget/FrameLayout + */ +fun XmlPullParser.frameLayout(): FrameLayoutNode { + return FrameLayoutNode( + view = viewAttributes(), + viewGroup = viewGroupAttributes() + ) +} diff --git a/recompose-parser/src/test/kotlin/recompose/parser/ParserTest.kt b/recompose-parser/src/test/kotlin/recompose/parser/ParserTest.kt index 82a7ced..cfc10be 100644 --- a/recompose-parser/src/test/kotlin/recompose/parser/ParserTest.kt +++ b/recompose-parser/src/test/kotlin/recompose/parser/ParserTest.kt @@ -36,6 +36,7 @@ import recompose.ast.view.TextViewNode import recompose.ast.view.ViewNode import recompose.ast.viewgroup.CardViewNode import recompose.ast.viewgroup.ConstraintLayoutNode +import recompose.ast.viewgroup.FrameLayoutNode import recompose.ast.viewgroup.LinearLayoutNode import recompose.test.utils.assertAST @@ -418,4 +419,42 @@ class ParserTest { ) ) } + + @Test + fun `FrameLayout with TextView and Button`() { + assertAST( + fileName = "framelayout-textview-button.xml", + Layout( + listOf( + FrameLayoutNode( + view = ViewAttributes( + width = LayoutSize.MatchParent, + height = LayoutSize.MatchParent, + padding = Padding(all = Size.Dp(16)) + ), + viewGroup = ViewGroupAttributes( + children = listOf( + TextViewNode( + view = ViewAttributes( + width = LayoutSize.MatchParent, + height = LayoutSize.MatchParent + ), + text = "Center", + textSize = Size.Sp(20) + ), + ButtonNode( + view = ViewAttributes( + width = LayoutSize.MatchParent, + height = LayoutSize.WrapContent + ), + text = "Button" + ) + ) + + ) + ) + ) + ) + ) + } } diff --git a/recompose-test/src/main/resources/framelayout-textview-button.xml b/recompose-test/src/main/resources/framelayout-textview-button.xml new file mode 100644 index 0000000..095a707 --- /dev/null +++ b/recompose-test/src/main/resources/framelayout-textview-button.xml @@ -0,0 +1,20 @@ + + + + +