ShadowBitmapFactory.java revision 4ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29
1e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevpackage com.xtremelabs.robolectric.shadows;
2e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
3e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport android.content.res.Resources;
4e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport android.graphics.Bitmap;
5e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport android.graphics.BitmapFactory;
6e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport android.graphics.Point;
7e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport android.graphics.Rect;
8e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport android.net.Uri;
9e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport com.xtremelabs.robolectric.Robolectric;
10e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport com.xtremelabs.robolectric.internal.Implementation;
11e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport com.xtremelabs.robolectric.internal.Implements;
12e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport com.xtremelabs.robolectric.util.Join;
13e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
14e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport java.io.InputStream;
15e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport java.util.ArrayList;
16e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport java.util.HashMap;
17e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport java.util.List;
18e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport java.util.Map;
19e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
20e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
21e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev
22e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev@SuppressWarnings({"UnusedDeclaration"})
23e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev@Implements(BitmapFactory.class)
24e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevpublic class ShadowBitmapFactory {
25    private static Map<String, Point> widthAndHeightMap = new HashMap<String, Point>();
26
27    @Implementation
28    public static Bitmap decodeResource(Resources res, int id) {
29        Bitmap bitmap = create("resource:" + getResourceName(id));
30        shadowOf(bitmap).setLoadedFromResourceId(id);
31        return bitmap;
32    }
33
34    private static String getResourceName(int id) {
35        return shadowOf(Robolectric.application).getResourceLoader().getNameForId(id);
36    }
37
38    @Implementation
39    public static Bitmap decodeFile(String pathName) {
40        return create("file:" + pathName);
41    }
42
43    @Implementation
44    public static Bitmap decodeFile(String pathName, BitmapFactory.Options options) {
45        return create("file:" + pathName, options);
46    }
47
48    @Implementation
49    public static Bitmap decodeStream(InputStream is) {
50        return decodeStream(is, null, new BitmapFactory.Options());
51    }
52
53    @Implementation
54    public static Bitmap decodeStream(InputStream is, Rect outPadding, BitmapFactory.Options opts) {
55        return create(is.toString().replaceFirst("stream for ", ""), opts);
56    }
57
58    static Bitmap create(String name) {
59        return create(name, new BitmapFactory.Options());
60    }
61
62    public static Bitmap create(String name, BitmapFactory.Options options) {
63        Bitmap bitmap = Robolectric.newInstanceOf(Bitmap.class);
64        ShadowBitmap shadowBitmap = shadowOf(bitmap);
65        shadowBitmap.appendDescription("Bitmap for " + name);
66
67        String optionsString = stringify(options);
68        if (optionsString.length() > 0) {
69            shadowBitmap.appendDescription(" with options ");
70            shadowBitmap.appendDescription(optionsString);
71        }
72
73        Point widthAndHeight = widthAndHeightMap.get(name);
74        if (widthAndHeight == null) {
75            widthAndHeight = new Point(100, 100);
76        }
77
78        shadowBitmap.setWidth(widthAndHeight.x);
79        shadowBitmap.setHeight(widthAndHeight.y);
80        options.outWidth = widthAndHeight.x;
81        options.outHeight = widthAndHeight.y;
82        return bitmap;
83    }
84
85    public static void provideWidthAndHeightHints(Uri uri, int width, int height) {
86        widthAndHeightMap.put(uri.toString(), new Point(width, height));
87    }
88
89    public static void provideWidthAndHeightHints(int resourceId, int width, int height) {
90        widthAndHeightMap.put("resource:" + getResourceName(resourceId), new Point(width, height));
91    }
92
93    public static void provideWidthAndHeightHints(String file, int width, int height) {
94        widthAndHeightMap.put("file:" + file, new Point(width, height));
95    }
96
97    private static String stringify(BitmapFactory.Options options) {
98        List<String> opts = new ArrayList<String>();
99
100        if (options.inJustDecodeBounds) opts.add("inJustDecodeBounds");
101        if (options.inSampleSize > 1) opts.add("inSampleSize=" + options.inSampleSize);
102
103        return Join.join(", ", opts);
104    }
105
106    public static void reset() {
107        widthAndHeightMap.clear();
108    }
109}
110