From 4d1b9e58a5ffe11d8bcfc41486e0ea7e021ca436 Mon Sep 17 00:00:00 2001 From: Park-SM Date: Wed, 6 Mar 2024 06:39:59 -0800 Subject: [PATCH] [RangeSlider] Resolve issues that crash when assigning a large value to `valueTo` Resolves https://github.com/material-components/material-components-android/pull/3979 GIT_ORIGIN_REV_ID=d09a42095cda8342b1f2a0fdf3a9ab9899cace45 PiperOrigin-RevId: 613196003 (cherry picked from commit ac77b4cfb5ac15b37240fd455233cbca237e103f) --- .../google/android/material/slider/BaseSlider.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/java/com/google/android/material/slider/BaseSlider.java b/lib/java/com/google/android/material/slider/BaseSlider.java index 3dcbd5e7fd1..737bf15bdfc 100644 --- a/lib/java/com/google/android/material/slider/BaseSlider.java +++ b/lib/java/com/google/android/material/slider/BaseSlider.java @@ -30,6 +30,7 @@ import static java.lang.Math.abs; import static java.lang.Math.max; import static java.lang.Math.min; +import static java.math.MathContext.DECIMAL64; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -101,7 +102,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.math.BigDecimal; -import java.math.MathContext; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -606,14 +606,18 @@ private void validateValueTo() { private boolean valueLandsOnTick(float value) { // Check that the value is a multiple of stepSize given the offset of valueFrom. - return isMultipleOfStepSize(value - valueFrom); + double result = + new BigDecimal(Float.toString(value)) + .subtract(new BigDecimal(Float.toString(valueFrom)), DECIMAL64) + .doubleValue(); + return isMultipleOfStepSize(result); } - private boolean isMultipleOfStepSize(float value) { + private boolean isMultipleOfStepSize(double value) { // We're using BigDecimal here to avoid floating point rounding errors. double result = - new BigDecimal(Float.toString(value)) - .divide(new BigDecimal(Float.toString(stepSize)), MathContext.DECIMAL64) + new BigDecimal(Double.toString(value)) + .divide(new BigDecimal(Float.toString(stepSize)), DECIMAL64) .doubleValue(); // If the result is a whole number, it means the value is a multiple of stepSize.