aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hoisie <hoisie@google.com>2024-04-19 14:00:32 -0700
committerCopybara-Service <copybara-worker@google.com>2024-04-19 14:01:15 -0700
commit2beb59b98890043467d37521162f89373362dd08 (patch)
tree7b24c28297d4ba9d03c95aee3d40f23188c1e124
parent59bc604161f3a72de949ebbeb6f73e76500f4d2d (diff)
downloadrobolectric-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
-rw-r--r--integration_tests/ctesque/src/sharedTest/java/android/view/ViewConfigurationTest.java15
-rw-r--r--robolectric/src/test/java/org/robolectric/shadows/ShadowViewConfigurationTest.java2
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewConfiguration.java20
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);
}
/**