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