blob: 4d941031afb0f5c665b7206ed730485b79a7500a [file] [log] [blame]
package org.robolectric.res;
import java.util.regex.Pattern;
import javax.annotation.Nonnull;
public class AttributeResource {
public static final String ANDROID_NS = "http://schemas.android.com/apk/res/android";
public static final String ANDROID_RES_NS_PREFIX = "http://schemas.android.com/apk/res/";
public static final String RES_AUTO_NS_URI = "http://schemas.android.com/apk/res-auto";
public static final String NULL_VALUE = "@null";
public static final String EMPTY_VALUE = "@empty";
public static final Pattern IS_RESOURCE_REFERENCE = Pattern.compile("^\\s*@");
public final @Nonnull ResName resName;
public final @Nonnull String value;
public final @Nonnull String contextPackageName;
private final Integer referenceResId;
public AttributeResource(@Nonnull ResName resName, @Nonnull String value, @Nonnull String contextPackageName) {
this(resName, value, contextPackageName, null);
}
public AttributeResource(@Nonnull ResName resName, @Nonnull String value, @Nonnull String contextPackageName, Integer referenceResId) {
this.referenceResId = referenceResId;
if (!resName.type.equals("attr")) throw new IllegalStateException("\"" + resName.getFullyQualifiedName() + "\" unexpected");
this.resName = resName;
this.value = value;
this.contextPackageName = contextPackageName;
}
public boolean isResourceReference() {
return isResourceReference(value);
}
public @Nonnull ResName getResourceReference() {
if (!isResourceReference()) throw new RuntimeException("not a resource reference: " + this);
return ResName.qualifyResName(deref(value).replace("+", ""), contextPackageName, "style");
}
public boolean isStyleReference() {
return isStyleReference(value);
}
public ResName getStyleReference() {
if (!isStyleReference()) throw new RuntimeException("not a style reference: " + this);
return ResName.qualifyResName(value.substring(1), contextPackageName, "attr");
}
public boolean isNull() {
return NULL_VALUE.equals(value);
}
public boolean isEmpty() {
return EMPTY_VALUE.equals(value);
}
@Override
public String toString() {
return "Attribute{" +
"name='" + resName + '\'' +
", value='" + value + '\'' +
", contextPackageName='" + contextPackageName + '\'' +
'}';
}
public static boolean isResourceReference(String value) {
return IS_RESOURCE_REFERENCE.matcher(value).find() && !isNull(value);
}
public static @Nonnull ResName getResourceReference(String value, String defPackage, String defType) {
if (!isResourceReference(value)) throw new IllegalArgumentException("not a resource reference: " + value);
return ResName.qualifyResName(deref(value).replace("+", ""), defPackage, defType);
}
private static @Nonnull String deref(@Nonnull String value) {
return value.substring(value.indexOf('@') + 1);
}
public static boolean isStyleReference(String value) {
return value.startsWith("?");
}
public static ResName getStyleReference(String value, String defPackage, String defType) {
if (!isStyleReference(value)) throw new IllegalArgumentException("not a style reference: " + value);
return ResName.qualifyResName(value.substring(1), defPackage, defType);
}
public static boolean isNull(String value) {
return NULL_VALUE.equals(value);
}
public static boolean isEmpty(String value) {
return EMPTY_VALUE.equals(value);
}
public Integer getReferenceResId() {
return referenceResId;
}
}