public static Optional<String> getLocaleName(LanguageTargeting languageTargeting) { if (languageTargeting.getValueList().isEmpty()) { return Optional.empty(); } return Optional.of(Iterables.getOnlyElement(languageTargeting.getValueList())); }
@Override public boolean matchesTargeting(LanguageTargeting targetingValue) { if (targetingValue.equals(LanguageTargeting.getDefaultInstance())) { return true; } if (targetingValue.getValueCount() > 0) { // We return all positive matches, so we don't look at alternatives. Set<String> targetingLanguages = ImmutableSet.copyOf(targetingValue.getValueList()); return !Sets.intersection(targetingLanguages, deviceLanguages).isEmpty(); } else { // Fallback split has only alternatives set. Match the fallback iff the alternative languages // don't fully cover languages of the device. // The rationale is that if alternatives only partially cover the device languages, then // removing language(s) from the device can cause the app to start using the fallback // directory. But it would be confusing for the user if removal of a language triggered // download of additional language split(s). Therefore the fallback split should be present // from the beginning. Set<String> alternativeLanguages = ImmutableSet.copyOf(targetingValue.getAlternativesList()); return !alternativeLanguages.containsAll(deviceLanguages); } }
private ImmutableList<ModuleSplit> processSplitApkVariant(Collection<ModuleSplit> splits) { SplitsProtoXmlBuilder splitsProtoXmlBuilder = new SplitsProtoXmlBuilder(); for (ModuleSplit split : splits) { String splitId = split.getAndroidManifest().getSplitId().orElse(""); for (String language : split.getApkTargeting().getLanguageTargeting().getValueList()) { splitsProtoXmlBuilder.addLanguageMapping(split.getModuleName(), language, splitId); } } XmlNode splitsXmlContent = splitsProtoXmlBuilder.build(); ImmutableList.Builder<ModuleSplit> result = new ImmutableList.Builder<>(); for (ModuleSplit split : splits) { if (split.isMasterSplit() && split.isBaseModuleSplit()) { result.add(injectSplitsXml(split, splitsXmlContent)); } else { result.add(split); } } return result.build(); }
if (!languageTargeting.getValueList().isEmpty()) { languageTargeting.getValueList().forEach(suffixJoiner::add); } else if (!languageTargeting.getAlternativesList().isEmpty()) { suffixJoiner.add("other_lang");
/** Moves targeting values to the alternatives. */ public static AssetsDirectoryTargeting toAlternativeTargeting( AssetsDirectoryTargeting targeting) { AssetsDirectoryTargeting.Builder alternativeTargeting = AssetsDirectoryTargeting.newBuilder(); if (targeting.hasTextureCompressionFormat()) { alternativeTargeting .getTextureCompressionFormatBuilder() .addAllAlternatives(targeting.getTextureCompressionFormat().getValueList()); } if (targeting.hasGraphicsApi()) { alternativeTargeting .getGraphicsApiBuilder() .addAllAlternatives(targeting.getGraphicsApi().getValueList()); } if (targeting.hasAbi()) { alternativeTargeting.getAbiBuilder().addAllAlternatives(targeting.getAbi().getValueList()); } if (targeting.hasLanguage()) { alternativeTargeting .getLanguageBuilder() .addAllAlternatives(targeting.getLanguage().getValueList()); } return alternativeTargeting.build(); }
DeviceSpecFromTargetingBuilder setSupportedLocales(LanguageTargeting languageTargeting) { if (!languageTargeting.equals(LanguageTargeting.getDefaultInstance())) { deviceSpec.addSupportedLocales(Iterables.getOnlyElement(languageTargeting.getValueList())); } return this; }