aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hoisie <hoisie@google.com>2024-04-22 10:06:13 -0700
committerCopybara-Service <copybara-worker@google.com>2024-04-22 10:07:00 -0700
commitcf26305eee97a511071b71b5693e81a8924981ab (patch)
tree5ede90031cc69141a6dcc5a5654f8df0780591f5
parent2beb59b98890043467d37521162f89373362dd08 (diff)
downloadrobolectric-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.java32
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewConfiguration.java27
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"));
}
/**