Skip to content

Commit

Permalink
Merge pull request #15 from sanyuankexie/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
LukeXeon authored Nov 15, 2019
2 parents 4d2542b + faa93c9 commit 393a46d
Show file tree
Hide file tree
Showing 25 changed files with 298 additions and 214 deletions.
9 changes: 4 additions & 5 deletions core/src/main/java/com/guet/flexbox/DynamicBoxSpec.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,19 @@
import com.facebook.litho.annotations.OnEvent;
import com.facebook.litho.annotations.Param;
import com.facebook.litho.annotations.Prop;
import com.guet.flexbox.build.DataBinding;
import com.guet.flexbox.build.Transform;
import com.guet.flexbox.build.DataContext;

@LayoutSpec
final class DynamicBoxSpec {

@OnCreateLayout
static Component onCreateLayout(ComponentContext componentContext,
@Prop(optional = true) Object bind,
@Prop(optional = true) DataBinding dataBinding,
@Prop(optional = true) DataContext dataContext,
@Prop NodeInfo layout) {
return Transform.Companion.createLayout(
return DataContext.createLayout(
componentContext,
dataBinding != null ? dataBinding : DataBinding.create(bind),
dataContext != null ? dataContext : new DataContext(bind),
layout
);
}
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/com/guet/flexbox/build/Behavior.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ internal abstract class Behavior : Transform {

final override fun transform(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
nodeInfo: NodeInfo,
upperVisibility: Int
): List<Component> {
Expand All @@ -26,7 +26,7 @@ internal abstract class Behavior : Transform {

protected abstract fun onApply(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>,
children: List<NodeInfo>,
upperVisibility: Int
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,22 @@ package com.guet.flexbox.build
import android.content.res.Resources
import android.graphics.Color
import android.graphics.Color.parseColor
import android.graphics.drawable.GradientDrawable
import android.graphics.drawable.GradientDrawable.Orientation
import androidx.annotation.ColorInt
import androidx.annotation.RestrictTo
import com.facebook.litho.Component
import com.facebook.litho.ComponentContext
import com.facebook.litho.drawable.ComparableGradientDrawable
import com.guet.flexbox.NodeInfo
import com.guet.flexbox.el.ELException
import com.guet.flexbox.el.ELManager
import java.lang.reflect.Modifier

class DataBinding private constructor(data: Any?) {
class DataContext(data: Any?) {

private val el = ELManager()

init {
el.addELResolver(JsonELResolver)
functions.forEach {
el.mapFunction(it.first, it.second.name, it.second)
}
Expand Down Expand Up @@ -72,30 +75,31 @@ class DataBinding private constructor(data: Any?) {
companion object {

@JvmStatic
fun create(data: Any?): DataBinding {
return DataBinding(data)
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
fun createLayout(
c: ComponentContext,
dataBinding: DataContext,
root: NodeInfo
): Component {
return c.createFromElement(dataBinding, root).single()
}

internal val colorMap by lazy {
@Suppress("UNCHECKED_CAST")
HashMap((Color::class.java
.getDeclaredField("sColorNameMap")
.apply { isAccessible = true }
.get(null) as Map<String, Int>))
}

internal val functions by lazy {
Functions::class.java.declaredMethods
.filter {
it.modifiers.let { mod ->
Modifier.isPublic(mod) && Modifier.isStatic(mod)
} && it.isAnnotationPresent(Prefix::class.java)
}.map {
it.apply { it.isAccessible = true }
}.map {
it.getAnnotation(Prefix::class.java).value to it
}.toTypedArray()
}
@Suppress("UNCHECKED_CAST")
internal val colorMap = HashMap((Color::class.java
.getDeclaredField("sColorNameMap")
.apply { isAccessible = true }
.get(null) as Map<String, Int>))

internal val functions = Functions::class.java.declaredMethods
.filter {
it.modifiers.let { mod ->
Modifier.isPublic(mod) && Modifier.isStatic(mod)
} && it.isAnnotationPresent(Prefix::class.java)
}.map {
it.apply { it.isAccessible = true }
}.map {
it.getAnnotation(Prefix::class.java).value to it
}.toTypedArray()
}

internal object Functions {
Expand All @@ -118,8 +122,8 @@ class DataBinding private constructor(data: Any?) {
fun gradient(
orientation: Orientation,
vararg colors: String
): GradientDrawable {
return GradientDrawable(orientation, colors.map {
): ComparableGradientDrawable {
return ComparableGradientDrawable(orientation, colors.map {
parseColor(it)
}.toIntArray())
}
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/com/guet/flexbox/build/EmptyFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ import com.facebook.litho.widget.EmptyComponent
internal object EmptyFactory : WidgetFactory<EmptyComponent.Builder>() {
override fun onCreateWidget(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>?,
visibility: Int
): EmptyComponent.Builder {
return EmptyComponent.create(c)
}

override fun calculateVisibility(
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>?,
upperVisibility: Int): Int {
val value = super.calculateVisibility(dataBinding, attrs, upperVisibility)
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/com/guet/flexbox/build/FlexFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ internal object FlexFactory : WidgetFactory<Component.ContainerBuilder<*>>() {

override fun onCreateWidget(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>?,
visibility: Int
): Component.ContainerBuilder<*> {
Expand Down Expand Up @@ -101,7 +101,7 @@ internal object FlexFactory : WidgetFactory<Component.ContainerBuilder<*>>() {
override fun onInstallChildren(
owner: Component.ContainerBuilder<*>,
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>?,
children: List<Component>?,
visibility: Int
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/com/guet/flexbox/build/ForBehavior.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import java.util.*
internal object ForBehavior : Behavior() {
override fun onApply(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>,
children: List<NodeInfo>,
upperVisibility: Int
Expand All @@ -19,7 +19,7 @@ internal object ForBehavior : Behavior() {
return (from..to).map {
return@map dataBinding.scope(Collections.singletonMap(name, it)) {
children.map { item ->
Transform.createFromElement(c, dataBinding, item, upperVisibility)
c.createFromElement(dataBinding, item, upperVisibility)
}.flatten()
}
}.flatten()
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/com/guet/flexbox/build/ForEachBehavior.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import java.util.*
internal object ForEachBehavior : Behavior() {
override fun onApply(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>,
children: List<NodeInfo>,
upperVisibility: Int
Expand All @@ -18,7 +18,7 @@ internal object ForEachBehavior : Behavior() {
return items.map { item ->
dataBinding.scope(Collections.singletonMap(name, item)) {
children.map {
Transform.createFromElement(c, dataBinding, it, upperVisibility)
c.createFromElement(dataBinding, it, upperVisibility)
}.flatten()
}
}.flatten()
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/com/guet/flexbox/build/FrameFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ internal object FrameFactory : WidgetFactory<Row.Builder>(), ThreadFactory {

override fun onCreateWidget(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>?,
visibility: Int
): Row.Builder {
Expand All @@ -36,7 +36,7 @@ internal object FrameFactory : WidgetFactory<Row.Builder>(), ThreadFactory {
override fun onInstallChildren(
owner: Row.Builder,
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>?,
children: List<Component>?,
visibility: Int) {
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/com/guet/flexbox/build/IfBehavior.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ import com.guet.flexbox.NodeInfo
internal object IfBehavior : Behavior() {
override fun onApply(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>,
children: List<NodeInfo>,
upperVisibility: Int
): List<Component> {
return if (dataBinding.requestValue("test", attrs)) {
return children.map {
Transform.createFromElement(c, dataBinding, it, upperVisibility)
c.createFromElement(dataBinding, it, upperVisibility)
}.flatten()
} else {
emptyList()
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/com/guet/flexbox/build/ImageFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ internal object ImageFactory : WidgetFactory<NetworkImage.Builder>() {

override fun onCreateWidget(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>?,
visibility: Int
): NetworkImage.Builder {
Expand Down
24 changes: 11 additions & 13 deletions core/src/main/java/com/guet/flexbox/build/NativeFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ package com.guet.flexbox.build

import android.content.Context
import android.graphics.Outline
import android.util.LruCache
import android.view.View
import android.view.ViewGroup
import android.view.ViewOutlineProvider
Expand All @@ -19,34 +18,33 @@ internal object NativeFactory : WidgetFactory<ViewCompatComponent.Builder<View>>

override fun onCreateWidget(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>?,
visibility: Int
): ViewCompatComponent.Builder<View> {
if (attrs != null) {
val type = dataBinding.tryGetValue(attrs["type"], "")
if (type.isNotEmpty()) {
val view = ViewTypeCache[type]
val view = viewTypeCache.getOrPut(type) {
val viewType = Class.forName(type)
if (View::class.java.isAssignableFrom(viewType)) {
return@getOrPut ReflectViewCreator(viewType.getConstructor(Context::class.java))
} else {
throw IllegalStateException("$type is not as 'View' type")
}
}
val radius = dataBinding.tryGetValue(attrs["borderRadius"], 0f)
val va = ViewAdapter(visibility, radius)
return ViewCompatComponent.get(view, type)
.create(c)
.viewBinder(va)
}
}

throw IllegalArgumentException("can not found View type")
}

internal object ViewTypeCache : LruCache<String, ReflectViewCreator>(32) {
override fun create(key: String): ReflectViewCreator {
val viewType = Class.forName(key)
if (View::class.java.isAssignableFrom(viewType)) {
return ReflectViewCreator(viewType.getConstructor(Context::class.java))
} else {
throw IllegalArgumentException("$key is not as 'View' type")
}
}
}
private val viewTypeCache = HashMap<String, ReflectViewCreator>(32)

internal class ReflectViewCreator(private val constructor: Constructor<*>) : ViewCreator<View> {
override fun createView(c: Context, parent: ViewGroup?): View {
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/com/guet/flexbox/build/ScrollerFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ internal object ScrollerFactory : WidgetFactory<Component.Builder<*>>() {

override fun onCreateWidget(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>?,
visibility: Int
): Component.Builder<*> {
Expand All @@ -46,7 +46,7 @@ internal object ScrollerFactory : WidgetFactory<Component.Builder<*>>() {
override fun onInstallChildren(
owner: Component.Builder<*>,
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>?,
children: List<Component>?,
visibility: Int
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/com/guet/flexbox/build/TextFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ internal object TextFactory : WidgetFactory<Text.Builder>() {

override fun onCreateWidget(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>?,
visibility: Int
): Text.Builder {
Expand All @@ -78,7 +78,7 @@ internal object TextFactory : WidgetFactory<Text.Builder>() {
override fun onLoadStyles(
owner: Text.Builder,
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
attrs: Map<String, String>?,
visibility: Int
) {
Expand Down
42 changes: 1 addition & 41 deletions core/src/main/java/com/guet/flexbox/build/Transform.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.guet.flexbox.build

import android.view.View
import androidx.annotation.RestrictTo
import com.facebook.litho.Component
import com.facebook.litho.ComponentContext
import com.guet.flexbox.NodeInfo
Expand All @@ -10,47 +8,9 @@ internal interface Transform {

fun transform(
c: ComponentContext,
dataBinding: DataBinding,
dataBinding: DataContext,
nodeInfo: NodeInfo,
upperVisibility: Int
): List<Component>

companion object {

@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
fun createLayout(
context: ComponentContext,
dataBinding: DataBinding,
root: NodeInfo
): Component {
return createFromElement(context, dataBinding, root).single()
}

internal fun createFromElement(
context: ComponentContext,
dataBinding: DataBinding,
element: NodeInfo,
upperVisibility: Int = View.VISIBLE
): List<Component> {
return transforms[element.type]?.transform(
context,
dataBinding,
element,
upperVisibility
) ?: emptyList()
}

private val transforms = mapOf(
"Image" to ImageFactory,
"Flex" to FlexFactory,
"Text" to TextFactory,
"Frame" to FrameFactory,
"Native" to NativeFactory,
"Scroller" to ScrollerFactory,
"Empty" to EmptyFactory,
"for" to ForBehavior,
"foreach" to ForEachBehavior,
"if" to IfBehavior
)
}
}
Loading

0 comments on commit 393a46d

Please sign in to comment.