133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows; 2b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin 370a3ec81f0bda52d8388facf562a80e2d16ac96fGonçalo Silvaimport android.content.res.AssetManager; 46b77d40267d9b2d4d1b3e206f7d1bdd60a91d8c8Michael Portuesiimport android.content.res.Configuration; 5b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwinimport android.content.res.Resources; 6ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williamsimport android.content.res.TypedArray; 7b01474a3329222965d31068f5c33e59c6e6aa6a4Josh Lauer & Christian Williamsimport android.graphics.BitmapFactory; 8b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwinimport android.graphics.drawable.BitmapDrawable; 9b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwinimport android.graphics.drawable.Drawable; 10ea277a780371ce94fb402f7853daefc3a8580f0cMichael Portuesiimport android.graphics.drawable.NinePatchDrawable; 11ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williamsimport android.util.AttributeSet; 12b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwinimport android.util.DisplayMetrics; 136ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xuimport android.util.TypedValue; 14e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wuimport android.view.Display; 1570a3ec81f0bda52d8388facf562a80e2d16ac96fGonçalo Silvaimport com.xtremelabs.robolectric.Robolectric; 1622c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation; 1722c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements; 18f64d95f87eb9715622e3f77eb0b369d60270054cChristian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject; 19f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakkerimport com.xtremelabs.robolectric.res.ResourceExtractor; 203f1d4fe696c2f3efe99b8ef39868c064928efb1aTyler Schultzimport com.xtremelabs.robolectric.res.ResourceLoader; 21b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin 22e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wuimport java.io.InputStream; 236ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xuimport java.util.HashMap; 24e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wuimport java.util.Locale; 25e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wu 26e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wuimport static com.xtremelabs.robolectric.Robolectric.newInstanceOf; 27e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wuimport static com.xtremelabs.robolectric.Robolectric.shadowOf; 28e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wu 2959d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin/** 3059d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * Shadow of {@code Resources} that simulates the loading of resources 3159d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * 3259d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * @see com.xtremelabs.robolectric.RobolectricTestRunner#RobolectricTestRunner(Class, String, String) 3359d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin */ 34b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin@SuppressWarnings({"UnusedDeclaration"}) 35b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin@Implements(Resources.class) 36afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowResources { 37e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard private float density = 1.0f; 38cc86c1d752c8e2f2e0c45b7083bd290a85061400Chris Van Vranken Configuration configuration = null; 39e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wu private DisplayMetrics displayMetrics; 409931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante private Display display; 41e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wu 4208d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams static Resources bind(Resources resources, ResourceLoader resourceLoader) { 43a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams ShadowResources shadowResources = shadowOf(resources); 4403ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz if (shadowResources.resourceLoader != null) throw new RuntimeException("ResourceLoader already set!"); 4503ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz shadowResources.resourceLoader = resourceLoader; 4608d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams return resources; 4708d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams } 4808d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams 499931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante @RealObject 509931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante Resources realResources; 5108d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams private ResourceLoader resourceLoader; 5208d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams 53de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 549931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante public int getIdentifier(String name, String defType, String defPackage) { 55f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker Integer index = 0; 569931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 57f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker ResourceExtractor resourceExtractor = resourceLoader.getResourceExtractor(); 589931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 59f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker index = resourceExtractor.getResourceId(defType + "/" + name); 60f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker if (index == null) { 61f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker return 0; 62f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker } 63f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker return index; 64f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker } 659931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 66f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker @Implementation 67b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin public int getColor(int id) throws Resources.NotFoundException { 6825cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz return resourceLoader.getColorValue(id); 69b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin } 709931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 716b77d40267d9b2d4d1b3e206f7d1bdd60a91d8c8Michael Portuesi @Implementation 726b77d40267d9b2d4d1b3e206f7d1bdd60a91d8c8Michael Portuesi public Configuration getConfiguration() { 739931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante if (configuration == null) { 749931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante configuration = new Configuration(); 759931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante configuration.setToDefaults(); 769931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante } 7785af7906879a68c99b1878dac22605fa32454f3fRich Humphrey if (configuration.locale == null) { 7885af7906879a68c99b1878dac22605fa32454f3fRich Humphrey configuration.locale = Locale.getDefault(); 7985af7906879a68c99b1878dac22605fa32454f3fRich Humphrey } 8040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams return configuration; 816b77d40267d9b2d4d1b3e206f7d1bdd60a91d8c8Michael Portuesi } 82b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin 83de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 84b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin public String getString(int id) throws Resources.NotFoundException { 8525cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz return resourceLoader.getStringValue(id); 86b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin } 87b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin 88de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 89b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin public String getString(int id, Object... formatArgs) throws Resources.NotFoundException { 90b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin String raw = getString(id); 91b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin return String.format(Locale.ENGLISH, raw, formatArgs); 92b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin } 93b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin 94de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 959daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel public String getQuantityString(int id, int quantity, Object... formatArgs) throws Resources.NotFoundException { 969daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel String raw = getQuantityString(id, quantity); 979daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel return String.format(Locale.ENGLISH, raw, formatArgs); 989daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel } 999daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel 1009daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel @Implementation 1019daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel public String getQuantityString(int id, int quantity) throws Resources.NotFoundException { 1029daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel return resourceLoader.getPluralStringValue(id, quantity); 1039daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel } 1049daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel 1059daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel @Implementation 106b63be1295e9d42211bd466585850db5897222aa1Macarse public InputStream openRawResource(int id) throws Resources.NotFoundException { 10740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams return resourceLoader.getRawValue(id); 108b63be1295e9d42211bd466585850db5897222aa1Macarse } 10940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams 110b63be1295e9d42211bd466585850db5897222aa1Macarse @Implementation 111b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin public String[] getStringArray(int id) throws Resources.NotFoundException { 11225cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz String[] arrayValue = resourceLoader.getStringArrayValue(id); 113b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin if (arrayValue == null) { 114b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin throw new Resources.NotFoundException(); 115b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin } 116b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin return arrayValue; 117b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin } 118b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin 119de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 120bd9537bd36434865d4d25ef332bd388d39a51e34Christian Williams & Phil Goodwin public CharSequence[] getTextArray(int id) throws Resources.NotFoundException { 121bd9537bd36434865d4d25ef332bd388d39a51e34Christian Williams & Phil Goodwin return getStringArray(id); 122bd9537bd36434865d4d25ef332bd388d39a51e34Christian Williams & Phil Goodwin } 123bd9537bd36434865d4d25ef332bd388d39a51e34Christian Williams & Phil Goodwin 124bd9537bd36434865d4d25ef332bd388d39a51e34Christian Williams & Phil Goodwin @Implementation 125b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin public CharSequence getText(int id) throws Resources.NotFoundException { 126b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin return getString(id); 127b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin } 128fde330c24db2b7905368ac9d790787f250f7ecc7Jon Boekenoogen 129e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard public void setDensity(float density) { 130e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard this.density = density; 131e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard } 132e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard 1339931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante public void setDisplay(Display display) { 1349931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante this.display = display; 1359931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante displayMetrics = null; 1369931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante } 1379931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 138de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 139b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin public DisplayMetrics getDisplayMetrics() { 140e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wu if (displayMetrics == null) { 1419931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante if (display == null) { 1429931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante display = Robolectric.newInstanceOf(Display.class); 1439931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante } 1449931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 145e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wu displayMetrics = new DisplayMetrics(); 146e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wu display.getMetrics(displayMetrics); 147e07511e1e736d9deba522ab8d58ffabcc67d274bRick Kawala & Wei Wu } 148e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard displayMetrics.density = this.density; 149e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard return displayMetrics; 150b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin } 151b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin 1529931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante @Implementation 153f1e19869f68b5b04688cc9701c3e2bf73cd35f76Ryan Richard public Drawable getDrawable(int drawableResourceId) throws Resources.NotFoundException { 154fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham 1559931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante ResourceLoader resLoader = Robolectric.shadowOf(Robolectric.application).getResourceLoader(); 1569931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 1579931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante Drawable xmlDrawable = resLoader.getXmlDrawable(drawableResourceId); 1589931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante if (xmlDrawable != null) { 1599931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante return xmlDrawable; 1609931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante } 1619931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 1629931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante Drawable animDrawable = resLoader.getAnimDrawable(drawableResourceId); 1639931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante if (animDrawable != null) { 1649931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante return animDrawable; 1659931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante } 1669931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 1679931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante Drawable colorDrawable = resLoader.getColorDrawable(drawableResourceId); 1689931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante if (colorDrawable != null) { 1699931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante return colorDrawable; 1709931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante } 171fde330c24db2b7905368ac9d790787f250f7ecc7Jon Boekenoogen 172ea277a780371ce94fb402f7853daefc3a8580f0cMichael Portuesi if (resLoader.isNinePatchDrawable(drawableResourceId)) { 173ea277a780371ce94fb402f7853daefc3a8580f0cMichael Portuesi return new NinePatchDrawable(realResources, null); 174ea277a780371ce94fb402f7853daefc3a8580f0cMichael Portuesi } 1759931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 176fde330c24db2b7905368ac9d790787f250f7ecc7Jon Boekenoogen return new BitmapDrawable(realResources, BitmapFactory.decodeResource(realResources, drawableResourceId)); 1779931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante } 1789931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante 179de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 180fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin public float getDimension(int id) throws Resources.NotFoundException { 1819472d8faeb0c6fa20529234e7e2a7ebf967d1f32Michael Portuesi return resourceLoader.getDimenValue(id); 182fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin } 183b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin 184fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin @Implementation 18548f3d7b9a3f4a9f3b719782cae007edac11ed454Wenhui Yao public int getInteger(int id) throws Resources.NotFoundException { 18648f3d7b9a3f4a9f3b719782cae007edac11ed454Wenhui Yao return resourceLoader.getIntegerValue( id ); 18748f3d7b9a3f4a9f3b719782cae007edac11ed454Wenhui Yao } 188fde330c24db2b7905368ac9d790787f250f7ecc7Jon Boekenoogen 18948f3d7b9a3f4a9f3b719782cae007edac11ed454Wenhui Yao @Implementation 190fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin public int getDimensionPixelSize(int id) throws Resources.NotFoundException { 191b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin // The int value returned from here is probably going to be handed to TextView.setTextSize(), 192b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin // which takes a float. Avoid int-to-float conversion errors by returning a value generated from this 193b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin // resource ID but which isn't too big (resource values in R.java are all greater than 0x7f000000). 194b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin 195fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin return (int) getDimension(id); 196fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin } 197fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin 198fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin @Implementation 199fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin public int getDimensionPixelOffset(int id) throws Resources.NotFoundException { 200fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin return (int) getDimension(id); 201fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin } 202fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin 203114296321cba71f8133713306049ce3b411e8563Gonçalo Silva @Implementation 20440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams public AssetManager getAssets() { 205a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin return ShadowAssetManager.bind(Robolectric.newInstanceOf(AssetManager.class), resourceLoader); 206114296321cba71f8133713306049ce3b411e8563Gonçalo Silva } 207fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin 208ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams @Implementation 209ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams public final android.content.res.Resources.Theme newTheme() { 210ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams return newInstanceOf(Resources.Theme.class); 211ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams } 212ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams 213ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams @Implements(Resources.Theme.class) 214ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams public static class ShadowTheme { 2156ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu HashMap<Integer, TypedValue> attrMap = new HashMap<Integer, TypedValue>(); 2166ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu 217ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams @Implementation 218ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams public TypedArray obtainStyledAttributes(int[] attrs) { 219ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams return obtainStyledAttributes(0, attrs); 220ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams } 221ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams 222ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams @Implementation 223ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams public TypedArray obtainStyledAttributes(int resid, int[] attrs) throws android.content.res.Resources.NotFoundException { 224ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams return obtainStyledAttributes(null, attrs, 0, 0); 225ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams } 226ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams 227ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams @Implementation 228ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams public TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) { 229ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams return newInstanceOf(TypedArray.class); 230ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams } 2316ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu 2326ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu @Implementation 2336ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu public boolean resolveAttribute (int resid, TypedValue outValue, boolean resolveRefs) { 2346ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu TypedValue foundValue = attrMap.get(resid); 2356ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu if (foundValue != null) { 2366ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu outValue.setTo(foundValue); 2376ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu return true; 2386ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu } 2396ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu return false; 2406ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu } 2416ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu 2426ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu public void setAttribue(int attrId, TypedValue value) { 2436ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu attrMap.put(attrId, value); 2446ddbf372cd1301a3f23e7ad834ab7c4e32c6c698Zhihong Xu } 245ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams } 246b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin} 247