package org.jf.dexlib2;
import com.google.common.collect.ImmutableSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.StringJoiner;
public enum HiddenApiRestriction {
WHITELIST(0, "whitelist", false),
GREYLIST(1, "greylist", false),
BLACKLIST(2, "blacklist", false),
GREYLIST_MAX_O(3, "greylist-max-o", false),
GREYLIST_MAX_P(4, "greylist-max-p", false),
GREYLIST_MAX_Q(5, "greylist-max-q", false),
CORE_PLATFORM_API(8, "core-platform-api", true);
private static final HiddenApiRestriction[] hiddenApiFlags = new HiddenApiRestriction[] {
WHITELIST,
GREYLIST,
BLACKLIST,
GREYLIST_MAX_O,
GREYLIST_MAX_P,
GREYLIST_MAX_Q
};
private static final HiddenApiRestriction[] domainSpecificApiFlags = new HiddenApiRestriction[] {
CORE_PLATFORM_API
};
private static final Map<String, HiddenApiRestriction> hiddenApiRestrictionsByName;
static {
hiddenApiRestrictionsByName = new HashMap<>();
for (HiddenApiRestriction hiddenApiRestriction : HiddenApiRestriction.values()) {
hiddenApiRestrictionsByName.put(hiddenApiRestriction.toString(), hiddenApiRestriction);
}
}
private static final int HIDDENAPI_FLAG_MASK = 0x7;
private final int value;
private final String name;
private final boolean isDomainSpecificApiFlag;
HiddenApiRestriction(int value, String name, boolean isDomainSpecificApiFlag) {
this.value = value;
this.name = name;
this.isDomainSpecificApiFlag = isDomainSpecificApiFlag;
}
public String toString() {
return name;
}
public int getValue() {
return value;
}
public boolean isSet(int value) {
if (isDomainSpecificApiFlag) {
return (value & ~HIDDENAPI_FLAG_MASK) == this.value;
} else {
return (value & HIDDENAPI_FLAG_MASK) == this.value;
}
}
public boolean isDomainSpecificApiFlag() {
return isDomainSpecificApiFlag;
}
public static Set<HiddenApiRestriction> getAllFlags(int value) {
HiddenApiRestriction normalRestriction = hiddenApiFlags[value & HIDDENAPI_FLAG_MASK];
int domainSpecificPart = (value & ~HIDDENAPI_FLAG_MASK);
if (domainSpecificPart == 0) {
return ImmutableSet.of(normalRestriction);
}
return ImmutableSet.of(normalRestriction, domainSpecificApiFlags[(domainSpecificPart >> 3) - 1]);
}
public static String formatHiddenRestrictions(int value) {
StringJoiner joiner = new StringJoiner("|");
for (HiddenApiRestriction hiddenApiRestriction : getAllFlags(value)) {
joiner.add(hiddenApiRestriction.toString());
}
return joiner.toString();
}
public static int combineFlags(Iterable<HiddenApiRestriction> flags) {
boolean gotHiddenApiFlag = false;
boolean gotDomainSpecificApiFlag = false;
int value = 0;
for (HiddenApiRestriction flag : flags) {
if (flag.isDomainSpecificApiFlag) {
if (gotDomainSpecificApiFlag) {
throw new IllegalArgumentException(
"Cannot combine multiple flags for domain-specific api restrictions");
}
gotDomainSpecificApiFlag = true;
value += flag.value;
} else {
if (gotHiddenApiFlag) {
throw new IllegalArgumentException(
"Cannot combine multiple flags for hidden api restrictions");
}
gotHiddenApiFlag = true;
value += flag.value;
}
}
return value;
}
public static HiddenApiRestriction forName(String name) {
return hiddenApiRestrictionsByName.get(name);
}
}