@Override public boolean matchesTargeting(ScreenDensityTargeting targeting) { ImmutableList<ScreenDensity> allDensities = ImmutableList.<ScreenDensity>builder() .addAll(targeting.getValueList()) .addAll(targeting.getAlternativesList()) .build(); if (allDensities.isEmpty()) { return true; } int bestMatchingDensity = new ScreenDensitySelector() .selectBestDensity( Iterables.transform(allDensities, ResourcesUtils::convertToDpi), getDeviceSpec().getScreenDensity()); return targeting .getValueList() .stream() .map(ResourcesUtils::convertToDpi) .anyMatch(isEqual(bestMatchingDensity)); }
private SizeConfiguration mergeWithDeviceSpec( SizeConfiguration getSizeConfiguration, DeviceSpec deviceSpec) { ImmutableSet<Dimension> dimensions = getSizeRequest.getDimensions(); SizeConfiguration.Builder mergedSizeConfiguration = getSizeConfiguration.toBuilder(); if (dimensions.contains(ABI) && !isAbiMissing(deviceSpec)) { mergedSizeConfiguration.setAbi(COMMA_JOINER.join(deviceSpec.getSupportedAbisList())); } if (dimensions.contains(SCREEN_DENSITY) && !isScreenDensityMissing(deviceSpec)) { mergedSizeConfiguration.setScreenDensity(Integer.toString(deviceSpec.getScreenDensity())); } if (dimensions.contains(LANGUAGE) && !isLocalesMissing(deviceSpec)) { mergedSizeConfiguration.setLocale(COMMA_JOINER.join(deviceSpec.getSupportedLocalesList())); } if (dimensions.contains(SDK) && !isSdkVersionMissing(deviceSpec)) { mergedSizeConfiguration.setSdkVersion(String.format("%d", deviceSpec.getSdkVersion())); } return mergedSizeConfiguration.build(); }
@Test public void noDeviceId_oneConnectedDevice_sdk21_fine() { FakeAdbServer fakeAdbServer = new FakeAdbServer( /* hasInitialDeviceList= */ true, /* devices= */ ImmutableList.of( createUsbEnabledDevice("a", /* sdkVersion= */ 21, "fr-CA"))); fakeAdbServer.init(Paths.get("path/to/adb")); DeviceSpec spec = new DeviceAnalyzer(fakeAdbServer).getDeviceSpec(Optional.empty()); assertThat(spec.getScreenDensity()).isEqualTo(480); assertThat(spec.getSupportedAbisList()).containsExactly("armeabi"); assertThat(spec.getSdkVersion()).isEqualTo(21); assertThat(spec.getSupportedLocalesList()).containsExactly("fr-CA"); }
deviceSpec.getSdkVersion(), ImmutableList.copyOf(deviceSpec.getSupportedAbisList()), deviceSpec.getScreenDensity(), ImmutableList.copyOf(deviceSpec.getDeviceFeaturesList()), properties);
private static void validateDeviceSpec(DeviceSpec deviceSpec, boolean canSkipFields) { if (deviceSpec.getSdkVersion() < 0 || (!canSkipFields && deviceSpec.getSdkVersion() == 0)) { throw ValidationException.builder() .withMessage( "Device spec SDK version (%d) should be set to a strictly positive number.", deviceSpec.getSdkVersion()) .build(); } if (deviceSpec.getScreenDensity() < 0 || (!canSkipFields && deviceSpec.getScreenDensity() == 0)) { throw ValidationException.builder() .withMessage( "Device spec screen density (%d) should be set to a strictly positive number.", deviceSpec.getScreenDensity()) .build(); } if (!canSkipFields) { if (deviceSpec.getSupportedAbisList().isEmpty()) { throw new ValidationException("Device spec supported ABI list is empty."); } if (deviceSpec.getSupportedLocalesList().isEmpty()) { throw new ValidationException("Device spec supported locales list is empty."); } } }
@Test public void activityManagerFails_propertiesFallback() { FakeDevice fakeDevice = FakeDevice.fromDeviceSpec( "id1", DeviceState.ONLINE, mergeSpecs(sdkVersion(26), locales("de-DE"), density(480), abis("armeabi"))); fakeDevice.injectShellCommandOutput("am get-config", () -> "error"); FakeAdbServer fakeAdbServer = new FakeAdbServer( /* hasInitialDeviceList= */ true, /* devices= */ ImmutableList.of(fakeDevice)); fakeAdbServer.init(Paths.get("path/to/adb")); DeviceSpec spec = new DeviceAnalyzer(fakeAdbServer).getDeviceSpec(Optional.empty()); assertThat(spec.getScreenDensity()).isEqualTo(480); assertThat(spec.getSupportedAbisList()).containsExactly("armeabi"); assertThat(spec.getSdkVersion()).isEqualTo(26); assertThat(spec.getSupportedLocalesList()).containsExactly("de-DE"); }
@Test public void activityManagerFails_noProperties_defaultLocaleFallback() { // It creates no properties, hence locale fetch via properties should also fall back. FakeDevice fakeDevice = createDeviceWithNoProperties("a", /* sdkVersion= */ 26, /* locale= */ "de-DE"); fakeDevice.injectShellCommandOutput("am get-config", () -> "error"); FakeAdbServer fakeAdbServer = new FakeAdbServer( /* hasInitialDeviceList= */ true, /* devices= */ ImmutableList.of(fakeDevice)); fakeAdbServer.init(Paths.get("path/to/adb")); DeviceSpec spec = new DeviceAnalyzer(fakeAdbServer).getDeviceSpec(Optional.empty()); assertThat(spec.getScreenDensity()).isEqualTo(480); assertThat(spec.getSupportedAbisList()).containsExactly("armeabi"); assertThat(spec.getSdkVersion()).isEqualTo(26); // We couldn't detect locale so we expect to fallback to en-US. assertThat(spec.getSupportedLocalesList()).containsExactly("en-US"); }
@Test public void deviceId_multipleConnectedDevices_match() { FakeAdbServer fakeAdbServer = new FakeAdbServer( /* hasInitialDeviceList= */ true, /* devices= */ ImmutableList.of( createUsbEnabledDevice("a"), createUsbEnabledDevice("b", /* sdkVersion= */ 23, /* locale= */ "pt-BR"))); fakeAdbServer.init(Paths.get("path/to/adb")); DeviceSpec spec = new DeviceAnalyzer(fakeAdbServer).getDeviceSpec(Optional.of("b")); assertThat(spec.getScreenDensity()).isEqualTo(480); assertThat(spec.getSupportedAbisList()).containsExactly("armeabi"); assertThat(spec.getSdkVersion()).isEqualTo(23); assertThat(spec.getSupportedLocalesList()).containsExactly("pt-BR"); }
@Test public void noDeviceId_oneConnectedDevice_sdk19_fallBack() { FakeAdbServer fakeAdbServer = new FakeAdbServer( /* hasInitialDeviceList= */ true, /* devices= */ ImmutableList.of( createDeviceWithNoProperties("a", /* sdkVersion= */ 19, /* locale= */ "de-DE"))); fakeAdbServer.init(Paths.get("path/to/adb")); DeviceSpec spec = new DeviceAnalyzer(fakeAdbServer).getDeviceSpec(Optional.empty()); assertThat(spec.getScreenDensity()).isEqualTo(480); assertThat(spec.getSupportedAbisList()).containsExactly("armeabi"); assertThat(spec.getSdkVersion()).isEqualTo(19); // We couldn't detect locale so we expect to fallback to en-US. assertThat(spec.getSupportedLocalesList()).containsExactly("en-US"); }
@Test public void noDeviceId_oneConnectedDevice_sdk26_fine() { FakeAdbServer fakeAdbServer = new FakeAdbServer( /* hasInitialDeviceList= */ true, /* devices= */ ImmutableList.of( createUsbEnabledDevice("a", /* sdkVersion= */ 26, /* locale= */ "pt-PT"))); fakeAdbServer.init(Paths.get("path/to/adb")); DeviceSpec spec = new DeviceAnalyzer(fakeAdbServer).getDeviceSpec(Optional.empty()); assertThat(spec.getScreenDensity()).isEqualTo(480); assertThat(spec.getSupportedAbisList()).containsExactly("armeabi"); assertThat(spec.getSdkVersion()).isEqualTo(26); assertThat(spec.getSupportedLocalesList()).containsExactly("pt-PT"); }
@Override protected boolean isDeviceDimensionPresent() { return getDeviceSpec().getScreenDensity() != 0; }
public static boolean isScreenDensityMissing(DeviceSpec deviceSpec) { return deviceSpec.getScreenDensity() == 0; }
@Test public void parsePartialDeviceSpec_acceptZeroSdk() throws Exception { DeviceSpec deviceSpec = DeviceSpecParser.parsePartialDeviceSpec( TestData.openReader("testdata/device/invalid_spec_sdk_zero.json")); assertThat(deviceSpec.getSupportedAbisList()).containsExactly("armeabi-v7a"); assertThat(deviceSpec.getScreenDensity()).isEqualTo(411); assertThat(deviceSpec.getSdkVersion()).isEqualTo(0); assertThat(deviceSpec.getSupportedLocalesList()).containsExactly("en-US", "es-US"); }
@Test public void parsePartialDeviceSpec_acceptEmptyLocaleList() throws Exception { DeviceSpec deviceSpec = DeviceSpecParser.parsePartialDeviceSpec( TestData.openReader("testdata/device/invalid_spec_locales_empty.json")); assertThat(deviceSpec.getSupportedAbisList()).containsExactly("armeabi-v7a"); assertThat(deviceSpec.getScreenDensity()).isEqualTo(411); assertThat(deviceSpec.getSdkVersion()).isEqualTo(24); assertThat(deviceSpec.getSupportedLocalesList()).isEmpty(); }
@Test public void parsesCorrectDeviceSpecFile_parsePartialDeviceSpec_Succeeds() throws Exception { DeviceSpec deviceSpec = DeviceSpecParser.parsePartialDeviceSpec( TestData.openReader("testdata/device/pixel2_spec.json")); assertThat(deviceSpec.getSupportedAbisList()) .containsExactly("arm64-v8a", "armeabi-v7a", "armeabi"); assertThat(deviceSpec.getScreenDensity()).isEqualTo(560); assertThat(deviceSpec.getSdkVersion()).isEqualTo(26); assertThat(deviceSpec.getSupportedLocalesList()).containsExactly("en-GB"); }
@Test public void parsesCorrectDeviceSpecFile() throws Exception { DeviceSpec deviceSpec = DeviceSpecParser.parseDeviceSpec(TestData.openReader("testdata/device/pixel2_spec.json")); assertThat(deviceSpec.getSupportedAbisList()) .containsExactly("arm64-v8a", "armeabi-v7a", "armeabi"); assertThat(deviceSpec.getScreenDensity()).isEqualTo(560); assertThat(deviceSpec.getSdkVersion()).isEqualTo(26); assertThat(deviceSpec.getSupportedLocalesList()).containsExactly("en-GB"); }
@Test public void parsePartialDeviceSpec_acceptZeroDensity() throws Exception { DeviceSpec deviceSpec = DeviceSpecParser.parsePartialDeviceSpec( TestData.openReader("testdata/device/invalid_spec_density_zero.json")); assertThat(deviceSpec.getSupportedAbisList()).containsExactly("armeabi-v7a"); assertThat(deviceSpec.getScreenDensity()).isEqualTo(0); assertThat(deviceSpec.getSdkVersion()).isEqualTo(23); assertThat(deviceSpec.getSupportedLocalesList()).containsExactly("en-US", "es-US"); }
@Test public void parsePartialDeviceSpec_acceptEmptyAbi() throws Exception { DeviceSpec deviceSpec = DeviceSpecParser.parsePartialDeviceSpec( TestData.openReader("testdata/device/invalid_spec_abi_empty.json")); assertThat(deviceSpec.getSupportedAbisList()).isEmpty(); assertThat(deviceSpec.getScreenDensity()).isEqualTo(411); assertThat(deviceSpec.getSdkVersion()).isEqualTo(1); assertThat(deviceSpec.getSupportedLocalesList()).containsExactly("en-US", "es-US"); }