From eaafdfadac2f4fa764f79f0243a2273976525e42 Mon Sep 17 00:00:00 2001 From: arsenosov Date: Tue, 20 Dec 2022 20:08:00 +0300 Subject: [PATCH] Added min sizes to android Added min sizes --- .../core/view2/divs/BaseDivViewExtensions.kt | 23 +++++++++++++++++++ .../div/core/view2/divs/DivBaseBinder.kt | 18 +++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/BaseDivViewExtensions.kt b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/BaseDivViewExtensions.kt index 270aee58b..18401bfe0 100644 --- a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/BaseDivViewExtensions.kt +++ b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/BaseDivViewExtensions.kt @@ -69,6 +69,7 @@ import com.yandex.div2.DivShapeDrawable import com.yandex.div2.DivSize import com.yandex.div2.DivSizeUnit import com.yandex.div2.DivVisibilityAction +import com.yandex.div2.DivWrapContentSize import kotlin.math.roundToInt internal fun View.applyPaddings(insets: DivEdgeInsets?, resolver: ExpressionResolver) { @@ -139,6 +140,14 @@ internal fun DivFixedSize.toPx(metrics: DisplayMetrics, resolver: ExpressionReso } } +internal fun DivWrapContentSize.ConstraintSize.toPx(metrics: DisplayMetrics, resolver: ExpressionResolver): Int { + return when (unit.evaluate(resolver)) { + DivSizeUnit.DP -> value.evaluate(resolver).dpToPx(metrics) + DivSizeUnit.SP -> value.evaluate(resolver).spToPx(metrics) + DivSizeUnit.PX -> value.evaluate(resolver) + } +} + internal fun DivFixedSize.toPxF( metrics: DisplayMetrics, resolver: ExpressionResolver @@ -176,6 +185,13 @@ internal fun View.applyHeight(div: DivBase, resolver: ExpressionResolver) { applyTransform(div, resolver) } +internal fun View.applyMinHeight(minHeight: DivWrapContentSize.ConstraintSize?, resolver: ExpressionResolver) { + val heightValue = minHeight?.toPx(resources.displayMetrics, resolver) ?: 0 + if (minimumHeight != heightValue) { + minimumHeight = heightValue + } +} + internal fun View.applyWidth(div: DivBase, resolver: ExpressionResolver) { val width = div.width.toLayoutParamsSize(resources.displayMetrics, resolver) if (layoutParams.width != width) { @@ -185,6 +201,13 @@ internal fun View.applyWidth(div: DivBase, resolver: ExpressionResolver) { applyTransform(div, resolver) } +internal fun View.applyMinWidth(minWidth: DivWrapContentSize.ConstraintSize?, resolver: ExpressionResolver) { + val widthValue = minWidth?.toPx(resources.displayMetrics, resolver) ?: 0 + if (minimumWidth != widthValue) { + minimumWidth = widthValue + } +} + internal fun View.applyTransform( div: DivBase, resolver: ExpressionResolver, diff --git a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/DivBaseBinder.kt b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/DivBaseBinder.kt index bcd6e7fd6..d6d52cdb0 100644 --- a/client/android/div/src/main/java/com/yandex/div/core/view2/divs/DivBaseBinder.kt +++ b/client/android/div/src/main/java/com/yandex/div/core/view2/divs/DivBaseBinder.kt @@ -183,6 +183,15 @@ internal class DivBaseBinder @Inject constructor( is DivSize.WrapContent -> { if (width.value.constrained?.evaluate(resolver) == true) { (layoutParams as? LinearContainerLayout.LayoutParams)?.weight = 1f + } else { + applyMinWidth(width.value.minSize, resolver) + + subscriber.addSubscription(width.value.minSize?.value?.observe(resolver) { + applyMinWidth(width.value.minSize, resolver) + } ?: Disposable.NULL) + subscriber.addSubscription(width.value.minSize?.unit?.observe(resolver) { + applyMinWidth(width.value.minSize, resolver) + } ?: Disposable.NULL) } } else -> Unit @@ -201,6 +210,15 @@ internal class DivBaseBinder @Inject constructor( is DivSize.WrapContent -> { if (height.value.constrained?.evaluate(resolver) == true) { (layoutParams as? LinearContainerLayout.LayoutParams)?.weight = 1f + } else { + applyMinHeight(height.value.minSize, resolver) + + subscriber.addSubscription(height.value.minSize?.value?.observe(resolver) { + applyMinHeight(height.value.minSize, resolver) + } ?: Disposable.NULL) + subscriber.addSubscription(height.value.minSize?.unit?.observe(resolver) { + applyMinHeight(height.value.minSize, resolver) + } ?: Disposable.NULL) } } else -> Unit