diff options
author | Michael Hoisie <hoisie@google.com> | 2024-04-19 14:00:32 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2024-04-19 14:01:15 -0700 |
commit | 2beb59b98890043467d37521162f89373362dd08 (patch) | |
tree | 7b24c28297d4ba9d03c95aee3d40f23188c1e124 | |
parent | 59bc604161f3a72de949ebbeb6f73e76500f4d2d (diff) | |
download | robolectric-2beb59b98890043467d37521162f89373362dd08.tar.gz |
Return the correct value for ViewConfiguration.getScaledOverflingDistance
Previously, the result of ViewConfiguration.getScaledOverflingDistance
was zero. In real Android it is '6' when the density is mdpi (scaling factor
1).
Update ShadowViewConfiguration to set the correct value.
This is part of the effort to eventually remove ShadowViewConfiguration.
PiperOrigin-RevId: 626462942
3 files changed, 32 insertions, 5 deletions
diff --git a/integration_tests/ctesque/src/sharedTest/java/android/view/ViewConfigurationTest.java b/integration_tests/ctesque/src/sharedTest/java/android/view/ViewConfigurationTest.java index 30b81907c..a490b5842 100644 --- a/integration_tests/ctesque/src/sharedTest/java/android/view/ViewConfigurationTest.java +++ b/integration_tests/ctesque/src/sharedTest/java/android/view/ViewConfigurationTest.java @@ -10,6 +10,7 @@ import java.lang.reflect.Method; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; import org.robolectric.annotation.internal.DoNotInstrument; /** Tests that {@link android.view.ViewConfiguration} behavior is consistent with real Android. */ @@ -18,17 +19,17 @@ import org.robolectric.annotation.internal.DoNotInstrument; public final class ViewConfigurationTest { private float density; + private ViewConfiguration viewConfiguration; @Before public void setUp() { density = ApplicationProvider.getApplicationContext().getResources().getDisplayMetrics().density; + viewConfiguration = ViewConfiguration.get(ApplicationProvider.getApplicationContext()); } @Test public void scrollbar_configuration() { - ViewConfiguration viewConfiguration = - ViewConfiguration.get(ApplicationProvider.getApplicationContext()); int scrollBarSize = ViewConfiguration.getScrollBarSize(); int scaledScrollBarSizeDp = pxToDp(viewConfiguration.getScaledScrollBarSize()); if (Build.VERSION.SDK_INT >= O_MR1) { @@ -42,14 +43,20 @@ public final class ViewConfigurationTest { @Test public void isFadingMarqueeEnabled_returnsFalse() throws Exception { - ViewConfiguration viewConfiguration = - ViewConfiguration.get(ApplicationProvider.getApplicationContext()); // isFadingMarqueeEnabled is a '@hide' method. boolean isFadingMarqueeEnabled = callMethod(viewConfiguration, "isFadingMarqueeEnabled", Boolean.class); assertThat(isFadingMarqueeEnabled).isFalse(); } + // Emulators have hdpi density by default, so match this in Robolectric for consistency. + @Config(qualifiers = "hdpi") + @Test + public void overfling_distance() { + assertThat(density).isEqualTo(1.5f); + assertThat(viewConfiguration.getScaledOverflingDistance()).isEqualTo(9); + } + public int pxToDp(int px) { return Math.round(px / density); } diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowViewConfigurationTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowViewConfigurationTest.java index 811ee18af..52e95487c 100644 --- a/robolectric/src/test/java/org/robolectric/shadows/ShadowViewConfigurationTest.java +++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowViewConfigurationTest.java @@ -64,6 +64,7 @@ public class ShadowViewConfigurationTest { // The min value of getScaledMaximumDrawingCacheSize is 480 * 800 * 4. assertEquals(480 * 800 * 4, viewConfiguration.getScaledMaximumDrawingCacheSize()); assertThat(viewConfiguration.isFadingMarqueeEnabled()).isFalse(); + assertThat(viewConfiguration.getScaledOverflingDistance()).isEqualTo(6); } @Test @@ -83,6 +84,7 @@ public class ShadowViewConfigurationTest { assertEquals(24, viewConfiguration.getScaledWindowTouchSlop()); assertEquals(75, viewConfiguration.getScaledMinimumFlingVelocity()); assertEquals(6000, viewConfiguration.getScaledMaximumFlingVelocity()); + assertThat(viewConfiguration.getScaledOverflingDistance()).isEqualTo(9); } @Test diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewConfiguration.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewConfiguration.java index a4c4a6f20..0bab36486 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewConfiguration.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewConfiguration.java @@ -25,6 +25,7 @@ import static android.os.Build.VERSION_CODES.Q; import static org.robolectric.util.reflector.Reflector.reflector; import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; import android.util.DisplayMetrics; import android.view.ViewConfiguration; @@ -70,7 +71,13 @@ public class ShadowViewConfiguration { final Resources resources = context.getResources(); final DisplayMetrics metrics = resources.getDisplayMetrics(); float density = metrics.density; - + final Configuration config = resources.getConfiguration(); + final float sizeAndDensity; + if (config.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_XLARGE)) { + sizeAndDensity = density * 1.5f; + } else { + sizeAndDensity = density; + } edgeSlop = (int) (density * ViewConfiguration.getEdgeSlop() + 0.5f); fadingEdgeLength = (int) (density * ViewConfiguration.getFadingEdgeLength() + 0.5f); minimumFlingVelocity = (int) (density * ViewConfiguration.getMinimumFlingVelocity() + 0.5f); @@ -86,6 +93,10 @@ public class ShadowViewConfiguration { } reflector(ViewConfigurationReflector.class, realViewConfiguration) .setScrollbarSize(scrollbarSize); + int baseOverflingDistance = + reflector(ViewConfigurationReflector.class).getBaseOverflingDistance(); + reflector(ViewConfigurationReflector.class, realViewConfiguration) + .setOverflingDistance((int) (sizeAndDensity * baseOverflingDistance)); touchSlop = (int) (density * TOUCH_SLOP + 0.5f); pagingTouchSlop = (int) (density * PAGING_TOUCH_SLOP + 0.5f); doubleTapSlop = (int) (density * DOUBLE_TAP_SLOP + 0.5f); @@ -208,6 +219,10 @@ public class ShadowViewConfiguration { @ForType(ViewConfiguration.class) interface ViewConfigurationReflector { + @Static + @Accessor("OVERFLING_DISTANCE") + int getBaseOverflingDistance(); + @Accessor("mConstructedWithContext") void setConstructedWithContext(boolean value); @@ -216,6 +231,9 @@ public class ShadowViewConfiguration { @Accessor("mFadingMarqueeEnabled") void setFadingMarqueeEnabled(boolean enableFadingMarquee); + + @Accessor("mOverflingDistance") + void setOverflingDistance(int value); } /** |