diff options
author | Michael Hoisie <hoisie@google.com> | 2024-04-22 10:06:13 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2024-04-22 10:07:00 -0700 |
commit | cf26305eee97a511071b71b5693e81a8924981ab (patch) | |
tree | 5ede90031cc69141a6dcc5a5654f8df0780591f5 | |
parent | 2beb59b98890043467d37521162f89373362dd08 (diff) | |
download | robolectric-cf26305eee97a511071b71b5693e81a8924981ab.tar.gz |
Return the correct value in ViewConfiguration.getScaledMinimumScalingSpan
Previously, Robolectric was returning an incorrect value ('0') when
ViewConfiguration.getScaledMinimumScalingSpan was called. This affects
calculations when triggering pinch-and-spread-to-zoom actions.
The real value is defined as '27mm' by default and '32mm' for large
screen devices.
Also add a transient, short-lived system property to allow tests to opt-in
to the incorrect behavior.
PiperOrigin-RevId: 627074303
-rw-r--r-- | robolectric/src/test/java/org/robolectric/shadows/ShadowViewConfigurationTest.java | 32 | ||||
-rw-r--r-- | shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewConfiguration.java | 27 |
2 files changed, 54 insertions, 5 deletions
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowViewConfigurationTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowViewConfigurationTest.java index 52e95487c..4e3e77824 100644 --- a/robolectric/src/test/java/org/robolectric/shadows/ShadowViewConfigurationTest.java +++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowViewConfigurationTest.java @@ -1,6 +1,7 @@ package org.robolectric.shadows; import static android.os.Build.VERSION_CODES.O_MR1; +import static android.os.Build.VERSION_CODES.Q; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.robolectric.Shadows.shadowOf; @@ -19,15 +20,16 @@ import org.robolectric.annotation.Config; public class ShadowViewConfigurationTest { private Application context; + private ViewConfiguration viewConfiguration; @Before public void setUp() throws Exception { context = ApplicationProvider.getApplicationContext(); + viewConfiguration = ViewConfiguration.get(context); } @Test public void methodsShouldReturnAndroidConstants() { - ViewConfiguration viewConfiguration = ViewConfiguration.get(context); // Most of the constants here are private statics from ViewConfiguration circa Jelly Bean: // https://cs.android.com/android/platform/superproject/+/android-4.1.1_r1:frameworks/base/core/java/android/view/ViewConfiguration.java final int expectedScrollBarSize = RuntimeEnvironment.getApiLevel() >= O_MR1 ? 4 : 10; @@ -65,6 +67,9 @@ public class ShadowViewConfigurationTest { assertEquals(480 * 800 * 4, viewConfiguration.getScaledMaximumDrawingCacheSize()); assertThat(viewConfiguration.isFadingMarqueeEnabled()).isFalse(); assertThat(viewConfiguration.getScaledOverflingDistance()).isEqualTo(6); + if (RuntimeEnvironment.getApiLevel() >= Q) { + assertThat(viewConfiguration.getScaledMinimumScalingSpan()).isEqualTo(170); + } } @Test @@ -73,7 +78,6 @@ public class ShadowViewConfigurationTest { // Most of the constants here are private statics from ViewConfiguration circa Jelly Bean: // https://cs.android.com/android/platform/superproject/+/android-4.1.1_r1:frameworks/base/core/java/android/view/ViewConfiguration.java // They are multiplied by the scaling factor 1.5 for HDPI. - ViewConfiguration viewConfiguration = ViewConfiguration.get(context); final int expectedScaledScrollBarSize = RuntimeEnvironment.getApiLevel() >= O_MR1 ? 6 : 15; assertEquals(expectedScaledScrollBarSize, viewConfiguration.getScaledScrollBarSize()); assertEquals(18, viewConfiguration.getScaledFadingEdgeLength()); @@ -85,11 +89,13 @@ public class ShadowViewConfigurationTest { assertEquals(75, viewConfiguration.getScaledMinimumFlingVelocity()); assertEquals(6000, viewConfiguration.getScaledMaximumFlingVelocity()); assertThat(viewConfiguration.getScaledOverflingDistance()).isEqualTo(9); + if (RuntimeEnvironment.getApiLevel() >= Q) { + assertThat(viewConfiguration.getScaledMinimumScalingSpan()).isEqualTo(255); + } } @Test public void testHasPermanentMenuKey() { - ViewConfiguration viewConfiguration = ViewConfiguration.get(context); assertThat(viewConfiguration.hasPermanentMenuKey()).isTrue(); ShadowViewConfiguration shadowViewConfiguration = shadowOf(viewConfiguration); @@ -100,7 +106,6 @@ public class ShadowViewConfigurationTest { @Config(qualifiers = "w420dp-h800dp-xxxhdpi") @Test public void getScaledMaximumFlingVelocity_scalesWithDisplaySize() { - ViewConfiguration viewConfiguration = ViewConfiguration.get(context); int expected = 4 * (4 * 420) * (4 * 800); assertThat(viewConfiguration.getScaledMaximumDrawingCacheSize()).isEqualTo(expected); } @@ -108,8 +113,25 @@ public class ShadowViewConfigurationTest { @Config(qualifiers = "w100dp-h500dp") @Test public void getScaledMaximumFlingVelocity_minValue() { - ViewConfiguration viewConfiguration = ViewConfiguration.get(context); int expected = 480 * 800 * 4; // The min value assertThat(viewConfiguration.getScaledMaximumDrawingCacheSize()).isEqualTo(expected); } + + @Config(minSdk = Q, qualifiers = "w600dp-h800dp") + @Test + public void getScaledMinimumScalingSpan_largeScreen() { + assertThat(viewConfiguration.getScaledMinimumScalingSpan()).isEqualTo(202); + } + + @Config(minSdk = Q) + @Test + public void getScaledMinimumScalingSpan_usePreviousBug() { + System.setProperty("robolectric.useRealMinScalingSpan", "false"); + try { + ViewConfiguration viewConfiguration = ViewConfiguration.get(context); + assertThat(viewConfiguration.getScaledMinimumScalingSpan()).isEqualTo(0); + } finally { + System.clearProperty("robolectric.useRealMinScalingSpan"); + } + } } 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 0bab36486..1456266f8 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewConfiguration.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewConfiguration.java @@ -112,6 +112,15 @@ public class ShadowViewConfiguration { reflector(AndroidInternalBoolReflector.class).getEnableFadingMarquee()); reflector(ViewConfigurationReflector.class, realViewConfiguration) .setFadingMarqueeEnabled(enableFadingMarquee); + if (RuntimeEnvironment.getApiLevel() >= Q) { + int minScalingSpan = + useRealMinScalingSpan() + ? resources.getDimensionPixelSize( + reflector(AndroidInternalDimenReflector.class).getConfigMinScalingSpan()) + : 0; + reflector(ViewConfigurationReflector.class, realViewConfiguration) + .setMinScalingSpan(minScalingSpan); + } } @Implementation @@ -234,6 +243,9 @@ public class ShadowViewConfiguration { @Accessor("mOverflingDistance") void setOverflingDistance(int value); + + @Accessor("mMinScalingSpan") + void setMinScalingSpan(int minScalingSpan); } /** @@ -247,6 +259,21 @@ public class ShadowViewConfiguration { @Static @Accessor("config_scrollbarSize") int getConfigScrollbarSize(); + + @Static + @Accessor("config_minScalingSpan") + int getConfigMinScalingSpan(); + } + + /** + * Due to overzealous shadowing, the return value of {@link + * ViewConfiguration#getScaledMinimumScalingSpan} was previously 0, when it should be around 170 + * for an mdpi display with density factor 1. This issue has been fixed, but there may be tests + * that emit touch events to trigger pinching/spreading that rely on the previous incorrect + * behavior. These tests have an option to use a system property to enable this previous bug. + */ + private static boolean useRealMinScalingSpan() { + return Boolean.parseBoolean(System.getProperty("robolectric.useRealMinScalingSpan", "true")); } /** |