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