blob: 2d5511d40443b21a1a4a834be8d78b2d4d738be7 [file] [log] [blame]
package org.robolectric.res;
import android.content.res.Resources;
import org.jetbrains.annotations.NotNull;
import org.robolectric.res.builder.XmlBlock;
import java.io.InputStream;
public abstract class ResourceLoader {
public abstract TypedResource getValue(@NotNull ResName resName, String qualifiers);
public TypedResource getValue(int resId, String qualifiers) {
ResName resName = getResourceIndex().getResName(resId);
return resName != null ? getValue(resName, qualifiers) : null;
}
protected abstract Plural getPlural(ResName resName, int quantity, String qualifiers);
public Plural getPlural(int resId, int quantity, String qualifiers) {
return getPlural(getResourceIndex().getResName(resId), quantity, qualifiers);
}
public abstract XmlBlock getXml(ResName resName, String qualifiers);
public XmlBlock getXml(int resId, String qualifiers) {
ResName resName = resolveResName(resId, qualifiers);
return resName != null ? getXml(resName, qualifiers) : null;
}
public abstract DrawableNode getDrawableNode(ResName resName, String qualifiers);
public DrawableNode getDrawableNode(int resId, String qualifiers) {
return getDrawableNode(getResourceIndex().getResName(resId), qualifiers);
}
public abstract InputStream getRawValue(ResName resName);
public InputStream getRawValue(int resId) {
return getRawValue(getResourceIndex().getResName(resId));
}
public abstract ResourceIndex getResourceIndex();
public abstract boolean providesFor(String namespace);
private ResName resolveResName(int resId, String qualifiers) {
TypedResource value = getValue(resId, qualifiers);
return resolveResource(value, qualifiers, resId);
}
private ResName resolveResource(TypedResource value, String qualifiers, int resId) {
ResName resName = getResourceIndex().getResName(resId);
while (value != null && value.isReference()) {
String s = value.asString();
if (s.equals("@null") || s.equals("@empty")) {
value = null;
} else {
String refStr = s.substring(1).replace("+", "");
resName = ResName.qualifyResName(refStr, resName);
value = getValue(resName, qualifiers);
}
}
return resName;
}
public TypedResource resolveResourceValue(TypedResource value, String qualifiers, int resId) {
ResName resName = getResourceIndex().getResName(resId);
while (value != null && value.isReference()) {
String s = value.asString();
if (s.equals("@null") || s.equals("@empty")) {
value = null;
} else {
String refStr = s.substring(1).replace("+", "");
resName = ResName.qualifyResName(refStr, resName);
value = getValue(resName, qualifiers);
}
}
return value;
}
}