1 package android.view; 2 3 import static android.os.Build.VERSION_CODES.O_MR1; 4 import static com.google.common.truth.Truth.assertThat; 5 6 import android.content.res.Configuration; 7 import android.content.res.Resources; 8 import android.os.Build; 9 import android.util.DisplayMetrics; 10 import androidx.test.core.app.ApplicationProvider; 11 import androidx.test.ext.junit.runners.AndroidJUnit4; 12 import java.lang.reflect.Method; 13 import org.junit.Before; 14 import org.junit.Test; 15 import org.junit.runner.RunWith; 16 import org.robolectric.annotation.Config; 17 18 /** Tests that {@link android.view.ViewConfiguration} behavior is consistent with real Android. */ 19 @RunWith(AndroidJUnit4.class) 20 public final class ViewConfigurationTest { 21 22 private float density; 23 private ViewConfiguration viewConfiguration; 24 25 @Before setUp()26 public void setUp() { 27 Resources resources = ApplicationProvider.getApplicationContext().getResources(); 28 DisplayMetrics metrics = resources.getDisplayMetrics(); 29 metrics.density = 1.5f; 30 metrics.densityDpi = 240; 31 metrics.setTo(metrics); 32 Configuration configuration = resources.getConfiguration(); 33 configuration.densityDpi = 240; 34 configuration.setTo(configuration); 35 resources.updateConfiguration(configuration, metrics); 36 density = 37 ApplicationProvider.getApplicationContext().getResources().getDisplayMetrics().density; 38 viewConfiguration = ViewConfiguration.get(ApplicationProvider.getApplicationContext()); 39 } 40 41 @Test scrollbar_configuration()42 public void scrollbar_configuration() { 43 int scrollBarSize = ViewConfiguration.getScrollBarSize(); 44 int scaledScrollBarSizeDp = pxToDp(viewConfiguration.getScaledScrollBarSize()); 45 if (Build.VERSION.SDK_INT >= O_MR1) { 46 assertThat(scrollBarSize).isEqualTo(4); 47 assertThat(scaledScrollBarSizeDp).isEqualTo(4); 48 } else { 49 assertThat(scrollBarSize).isEqualTo(10); 50 assertThat(scaledScrollBarSizeDp).isEqualTo(10); 51 } 52 } 53 54 @Test isFadingMarqueeEnabled_returnsFalse()55 public void isFadingMarqueeEnabled_returnsFalse() throws Exception { 56 // isFadingMarqueeEnabled is a '@hide' method. 57 boolean isFadingMarqueeEnabled = 58 callMethod(viewConfiguration, "isFadingMarqueeEnabled", Boolean.class); 59 assertThat(isFadingMarqueeEnabled).isFalse(); 60 } 61 62 @Config(qualifiers = "hdpi") 63 @Test overfling_distance()64 public void overfling_distance() { 65 assertThat(density).isEqualTo(1.5f); 66 assertThat(viewConfiguration.getScaledOverflingDistance()).isEqualTo(9); 67 } 68 pxToDp(int px)69 public int pxToDp(int px) { 70 return Math.round(px / density); 71 } 72 callMethod(Object obj, String methodName, Class<T> returnType)73 public <T> T callMethod(Object obj, String methodName, Class<T> returnType) throws Exception { 74 Method method = obj.getClass().getMethod(methodName); 75 return returnType.cast(method.invoke(obj)); 76 } 77 } 78