blob: e6a450d49d2c5d0f95bcbf4631acb2ae514099c4 [file] [log] [blame]
package com.xtremelabs.robolectric.shadows;
import android.content.res.AssetManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;
import com.xtremelabs.robolectric.Robolectric;
import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;
import com.xtremelabs.robolectric.internal.RealObject;
import com.xtremelabs.robolectric.res.ResourceLoader;
import java.io.InputStream;
import java.util.Locale;
import static com.xtremelabs.robolectric.Robolectric.shadowOf;
/**
* Shadow of {@code Resources} that simulates the loading of resources
*
* @see com.xtremelabs.robolectric.RobolectricTestRunner#RobolectricTestRunner(Class, String, String)
*/
@SuppressWarnings({"UnusedDeclaration"})
@Implements(Resources.class)
public class ShadowResources {
static Resources bind(Resources resources, ResourceLoader resourceLoader) {
ShadowResources shadowResources = shadowOf(resources);
if (shadowResources.resourceLoader != null) throw new RuntimeException("ResourceLoader already set!");
shadowResources.resourceLoader = resourceLoader;
return resources;
}
@RealObject Resources realResources;
private ResourceLoader resourceLoader;
@Implementation
public int getColor(int id) throws Resources.NotFoundException {
return resourceLoader.getColorValue(id);
}
@Implementation
public Configuration getConfiguration() {
Configuration configuration = new Configuration();
configuration.setToDefaults();
return configuration;
}
@Implementation
public String getString(int id) throws Resources.NotFoundException {
return resourceLoader.getStringValue(id);
}
@Implementation
public String getString(int id, Object... formatArgs) throws Resources.NotFoundException {
String raw = getString(id);
return String.format(Locale.ENGLISH, raw, formatArgs);
}
@Implementation
public InputStream openRawResource(int id) throws Resources.NotFoundException {
return resourceLoader.getRawValue(id);
}
@Implementation
public String[] getStringArray(int id) throws Resources.NotFoundException {
String[] arrayValue = resourceLoader.getStringArrayValue(id);
if (arrayValue == null) {
throw new Resources.NotFoundException();
}
return arrayValue;
}
@Implementation
public CharSequence[] getTextArray(int id) throws Resources.NotFoundException {
return getStringArray(id);
}
@Implementation
public CharSequence getText(int id) throws Resources.NotFoundException {
return getString(id);
}
@Implementation
public DisplayMetrics getDisplayMetrics() {
return new DisplayMetrics();
}
@Implementation
public Drawable getDrawable(int drawableResourceId) throws Resources.NotFoundException {
return new BitmapDrawable(BitmapFactory.decodeResource(realResources, drawableResourceId));
}
@Implementation
public float getDimension(int id) throws Resources.NotFoundException {
// todo: get this value from the xml resources and scale it by display metrics [xw 20101011]
if (resourceLoader.dimensions.containsKey(id)) {
return resourceLoader.dimensions.get(id);
}
return id - 0x7f000000;
}
@Implementation
public int getDimensionPixelSize(int id) throws Resources.NotFoundException {
// The int value returned from here is probably going to be handed to TextView.setTextSize(),
// which takes a float. Avoid int-to-float conversion errors by returning a value generated from this
// resource ID but which isn't too big (resource values in R.java are all greater than 0x7f000000).
return (int) getDimension(id);
}
@Implementation
public int getDimensionPixelOffset(int id) throws Resources.NotFoundException {
return (int) getDimension(id);
}
@Implementation
public AssetManager getAssets() {
return ShadowAssetManager.bind(Robolectric.newInstanceOf(AssetManager.class), resourceLoader);
}
/**
* Non-Android accessor that sets the value to be returned by {@link #getDimension(int)}
*
* @param id ID to set the dimension for
* @param value value to be returned
*/
public void setDimension(int id, int value) {
resourceLoader.dimensions.put(id, value);
}
}