diff --git a/app/src/main/java/com/dimadesu/lifestreamer/ui/BindingAdapters.kt b/app/src/main/java/com/dimadesu/lifestreamer/ui/BindingAdapters.kt index 131d26d..06230f3 100644 --- a/app/src/main/java/com/dimadesu/lifestreamer/ui/BindingAdapters.kt +++ b/app/src/main/java/com/dimadesu/lifestreamer/ui/BindingAdapters.kt @@ -37,4 +37,41 @@ fun setSliderListeners(slider: Slider, attrChange: InverseBindingListener) { slider.addOnChangeListener { _, _, _ -> attrChange.onChange() } +} + +/** + * Custom binding adapter that sets slider value, valueFrom, and valueTo together + * to avoid crashes when the value is outside the default range. + * + * This is needed because cameras with ultra-wide lenses can have zoom ratios < 1.0, + * but the slider's default valueFrom is often 1.0, causing a crash when the value + * is set before the range is updated. + * + * Handles both Float and Integer (Number) values. + */ +@BindingAdapter("android:value", "android:valueFrom", "android:valueTo", requireAll = true) +fun setSliderValueWithRange(slider: Slider, value: Number?, valueFrom: Number?, valueTo: Number?) { + // Skip if any value is null (not yet initialized) + if (value == null || valueFrom == null || valueTo == null) return + + val floatValue = value.toFloat() + val floatFrom = valueFrom.toFloat() + val floatTo = valueTo.toFloat() + + // Skip if range is invalid + if (floatFrom >= floatTo) return + + // Set range first (before value) + if (slider.valueFrom != floatFrom) { + slider.valueFrom = floatFrom + } + if (slider.valueTo != floatTo) { + slider.valueTo = floatTo + } + + // Clamp value to valid range and set it + val clampedValue = floatValue.coerceIn(floatFrom, floatTo) + if (slider.value != clampedValue) { + slider.value = clampedValue + } } \ No newline at end of file