private ImmutableSet<ScreenDensityTargeting> getAllScreenDensityTargetings( ImmutableList<ApkDescription> apkDescriptions) { ImmutableSet.Builder<ScreenDensityTargeting> screenDensityTargetingOptions = ImmutableSet.builder(); if (isScreenDensityMissing(getSizeRequest.getDeviceSpec())) { screenDensityTargetingOptions.addAll( apkDescriptions.stream() .map(ApkDescription::getTargeting) .filter(ApkTargeting::hasScreenDensityTargeting) .map(ApkTargeting::getScreenDensityTargeting) .collect(ImmutableSet.toImmutableSet())); } // Adding default targeting (if targetings are empty) to help computing the cartesian product // across all targetings. return screenDensityTargetingOptions.build().isEmpty() ? ImmutableSet.of(ScreenDensityTargeting.getDefaultInstance()) : screenDensityTargetingOptions.build(); }
.getValueList() .forEach( value ->
.toBuilder() .setScreenDensityTargeting( ScreenDensityTargeting.newBuilder() .addValue(toScreenDensity(density)) .addAllAlternatives(
shard.getApkTargeting().getScreenDensityTargeting().getValue(0).getDensityAlias(); switch (density) { case LDPI:
.getApkTargeting() .getScreenDensityTargeting() .getValueList() .get(0) .getDensityAlias();
.getApkTargeting() .getScreenDensityTargeting() .getValue(0) .getDensityAlias()) { case LDPI:
.getApkTargeting() .getScreenDensityTargeting() .getValue(0) .getDensityAlias()) { case LDPI:
.getApkTargeting() .getScreenDensityTargeting() .getValueList() .contains(toScreenDensity(DensityAlias.MDPI))) { assertThat(shard.getResourceTable().get())
assertThat(fatShard.getApkTargeting().getAbiTargeting()) .isEqualTo(abiTargeting(X86, ImmutableSet.of(ARMEABI))); assertThat(fatShard.getApkTargeting().getScreenDensityTargeting().getValueList()) .containsExactly(toScreenDensity(DensityAlias.MDPI)); assertThat(fatShard.getVariantTargeting()).isEqualToDefaultInstance();
ModuleSplit moduleSplit = moduleSplits.get(0); assertThat(moduleSplit.getApkTargeting().getAbiTargeting()).isEqualTo(abiTargeting(X86)); assertThat(moduleSplit.getApkTargeting().getScreenDensityTargeting().getValueList()) .containsExactly(toScreenDensity(DensityAlias.MDPI)); assertThat(moduleSplits.stream().map(ModuleSplit::getSplitType).collect(toImmutableSet()))
assertThat(fatShard.getApkTargeting().getScreenDensityTargeting().getValueList()) .containsExactly(toScreenDensity(DensityAlias.MDPI)); assertThat(fatShard.getVariantTargeting()).isEqualToDefaultInstance();
@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)); }
@Test public void deviceSpecFromTargetingBuilder_setScreenDensity() { assertThat( new DeviceSpecFromTargetingBuilder(DeviceSpec.getDefaultInstance()) .setScreenDensity(ScreenDensityTargeting.getDefaultInstance()) .build()) .isEqualToDefaultInstance(); assertThat( new DeviceSpecFromTargetingBuilder(DeviceSpec.getDefaultInstance()) .setScreenDensity(screenDensityTargeting(XXHDPI)) .build()) .isEqualTo(density(480)); assertThat( new DeviceSpecFromTargetingBuilder(DeviceSpec.getDefaultInstance()) .setScreenDensity(screenDensityTargeting(LDPI, ImmutableSet.of(MDPI))) .build()) .isEqualTo(density(120)); }
@Test public void notPossibleToTargetMultipleDimensions() { String fakeAssetPath = "testModule/assets/secret.txt"; ModuleSplit.Builder builder = ModuleSplit.builder() .setModuleName(BundleModuleName.create("testModule")) .setEntries(ImmutableList.of(InMemoryModuleEntry.ofFile(fakeAssetPath, DUMMY_CONTENT))) .setVariantTargeting(lPlusVariantTargeting()) .setApkTargeting( ApkTargeting.newBuilder() .setAbiTargeting( AbiTargeting.newBuilder().addValue(Abi.newBuilder().setAlias(AbiAlias.X86))) .setScreenDensityTargeting( ScreenDensityTargeting.newBuilder() .addValue( ScreenDensity.newBuilder().setDensityAlias(DensityAlias.HDPI))) .build()); assertThrows(IllegalStateException.class, () -> builder.build()); }
public static Optional<Integer> getScreenDensityDpi( ScreenDensityTargeting screenDensityTargeting) { if (screenDensityTargeting.getValueList().isEmpty()) { return Optional.empty(); } ScreenDensity densityTargeting = screenDensityTargeting.getValueList().stream() // For now we only support one value in ScreenDensityTargeting. .collect(MoreCollectors.onlyElement()); return Optional.of( densityTargeting.getDensityOneofCase().equals(DENSITY_ALIAS) ? DENSITY_ALIAS_TO_DPI_MAP.get(densityTargeting.getDensityAlias()) : densityTargeting.getDensityDpi()); } }
@Test public void getScreenDensity_defaultScreenDensity() { assertThat(getScreenDensityName(ScreenDensityTargeting.getDefaultInstance())).isEmpty(); }
@Override protected ImmutableList<ScreenDensity> getValues(VariantTargeting targeting) { return ImmutableList.copyOf(targeting.getScreenDensityTargeting().getValueList()); }
/** Extracts screen density alternatives from the targeting. */ public static ImmutableSet<ScreenDensity> densityAlternatives(ApkTargeting targeting) { return ImmutableSet.copyOf(targeting.getScreenDensityTargeting().getAlternativesList()); }
/** Extracts screen density values from the targeting. */ public static ImmutableSet<ScreenDensity> densityValues(ApkTargeting targeting) { return ImmutableSet.copyOf(targeting.getScreenDensityTargeting().getValueList()); }
public static Optional<String> getScreenDensityName( ScreenDensityTargeting screenDensityTargeting) { if (screenDensityTargeting.getValueList().isEmpty()) { return Optional.empty(); } ScreenDensity screenDensity = Iterables.getOnlyElement(screenDensityTargeting.getValueList()); return Optional.of( screenDensity.getDensityOneofCase().equals(DENSITY_ALIAS) ? screenDensity.getDensityAlias().name() : Integer.toString(screenDensity.getDensityDpi())); }