@Override protected void checkDeviceCompatibleInternal(AbiTargeting targeting) { if (targeting.equals(AbiTargeting.getDefaultInstance())) { return; } ImmutableSet<String> valuesAndAlternativesSet = Streams.concat( targeting.getValueList().stream() .map(Abi::getAlias) .map(AbiName::fromProto) .map(AbiName::getPlatformName), targeting.getAlternativesList().stream() .map(Abi::getAlias) .map(AbiName::fromProto) .map(AbiName::getPlatformName)) .collect(toImmutableSet()); ImmutableSet<String> deviceAbis = getDeviceSpec().getSupportedAbisList().stream().collect(toImmutableSet()); SetView<String> intersection = Sets.intersection(valuesAndAlternativesSet, deviceAbis); if (intersection.isEmpty()) { throw CommandExecutionException.builder() .withMessage( "The app doesn't support ABI architectures of the device. " + "Device ABIs: %s, app ABIs: %s.", getDeviceSpec().getSupportedAbisList(), valuesAndAlternativesSet) .build(); } }
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(); }
private ImmutableSet<AbiAlias> deviceAbiAliases() { return getDeviceSpec().getSupportedAbisList().stream() .map( abi -> AbiName.fromPlatformName(abi) .orElseThrow( () -> ValidationException.builder() .withMessage("Unrecognized ABI '%s' in device spec.", abi) .build()) .toProto()) .collect(toImmutableSet()); } }
@Test public void prefersAbisLocalesViaActivityManager() { FakeDevice fakeDevice = FakeDevice.fromDeviceSpec( "id1", DeviceState.ONLINE, mergeSpecs(sdkVersion(27), locales("en-US"), density(560), abis("armv64-v8a"))); fakeDevice.injectShellCommandOutput( "am get-config", () -> Joiner.on('\n') .join( ImmutableList.of( "abi: arm64-v8a,armeabi-v7a,armeabi", "config: mcc234-mnc15-en-rGB,in-rID,pl-rPL-ldltr-sw411dp-w411dp-h746dp-" + "normal-long-notround-lowdr-widecg-port-notnight-560dpi-finger-" + "keysexposed-nokeys-navhidden-nonav-v27"))); FakeAdbServer fakeAdbServer = new FakeAdbServer( /* hasInitialDeviceList= */ true, /* devices= */ ImmutableList.of(fakeDevice)); fakeAdbServer.init(Paths.get("path/to/adb")); DeviceAnalyzer analyzer = new DeviceAnalyzer(fakeAdbServer); DeviceSpec deviceSpec = analyzer.getDeviceSpec(Optional.empty()); assertThat(deviceSpec.getSupportedAbisList()) .containsExactly("arm64-v8a", "armeabi-v7a", "armeabi") .inOrder(); assertThat(deviceSpec.getSupportedLocalesList()) .containsExactly("en-GB", "in-ID", "pl-PL") .inOrder(); }
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().getSupportedAbisList().isEmpty(); }
public static boolean isAbiMissing(DeviceSpec deviceSpec) { return deviceSpec.getSupportedAbisList().isEmpty(); }
@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"); }
@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"); }
@Override protected boolean isDeviceDimensionPresent() { return !getDeviceSpec().getSupportedAbisList().isEmpty(); } }
@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"); }
@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"); }