ShadowResources.java revision fac8bbf7dfc7904540716be8649b2f5a5c9f6d15
133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
2b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin
3a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowhamimport static com.xtremelabs.robolectric.Robolectric.newInstanceOf;
4a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowhamimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
5a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowham
6a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowhamimport java.io.InputStream;
7a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowhamimport java.lang.reflect.Field;
8a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowhamimport java.util.Locale;
9a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowham
1070a3ec81f0bda52d8388facf562a80e2d16ac96fGonçalo Silvaimport android.content.res.AssetManager;
116b77d40267d9b2d4d1b3e206f7d1bdd60a91d8c8Michael Portuesiimport android.content.res.Configuration;
12b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwinimport android.content.res.Resources;
13ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williamsimport android.content.res.TypedArray;
14b01474a3329222965d31068f5c33e59c6e6aa6a4Josh Lauer & Christian Williamsimport android.graphics.BitmapFactory;
15a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowhamimport android.graphics.drawable.AnimationDrawable;
16b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwinimport android.graphics.drawable.BitmapDrawable;
17a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowhamimport android.graphics.drawable.ColorDrawable;
18b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwinimport android.graphics.drawable.Drawable;
19a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowhamimport android.text.TextUtils;
20ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williamsimport android.util.AttributeSet;
21b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwinimport android.util.DisplayMetrics;
22a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowham
2370a3ec81f0bda52d8388facf562a80e2d16ac96fGonçalo Silvaimport com.xtremelabs.robolectric.Robolectric;
2422c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
2522c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
26f64d95f87eb9715622e3f77eb0b369d60270054cChristian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject;
27f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakkerimport com.xtremelabs.robolectric.res.ResourceExtractor;
283f1d4fe696c2f3efe99b8ef39868c064928efb1aTyler Schultzimport com.xtremelabs.robolectric.res.ResourceLoader;
29b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin
3059d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin/**
3159d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * Shadow of {@code Resources} that simulates the loading of resources
3259d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin *
3359d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * @see com.xtremelabs.robolectric.RobolectricTestRunner#RobolectricTestRunner(Class, String, String)
3459d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin */
35b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin@SuppressWarnings({"UnusedDeclaration"})
36b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin@Implements(Resources.class)
37afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowResources {
38e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard    private float density = 1.0f;
39e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard
4008d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams    static Resources bind(Resources resources, ResourceLoader resourceLoader) {
41a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams        ShadowResources shadowResources = shadowOf(resources);
4203ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz        if (shadowResources.resourceLoader != null) throw new RuntimeException("ResourceLoader already set!");
4303ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz        shadowResources.resourceLoader = resourceLoader;
4408d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams        return resources;
4508d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams    }
4608d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams
47b01474a3329222965d31068f5c33e59c6e6aa6a4Josh Lauer & Christian Williams    @RealObject Resources realResources;
4808d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams    private ResourceLoader resourceLoader;
4908d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams
50de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
51f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker    public  int getIdentifier(String name, String defType, String defPackage) {
52f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker        Integer index = 0;
53f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker
54f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker        ResourceExtractor resourceExtractor = resourceLoader.getResourceExtractor();
55f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker
56f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker        index = resourceExtractor.getResourceId(defType + "/" + name);
57f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker        if (index == null) {
58f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker            return 0;
59f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker        }
60f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker        return index;
61f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker    }
62f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker
63f320a2d3b8075716daf2a80f5a8f7890086fb609Mark Bakker    @Implementation
64b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    public int getColor(int id) throws Resources.NotFoundException {
6525cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz        return resourceLoader.getColorValue(id);
66b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    }
6740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
686b77d40267d9b2d4d1b3e206f7d1bdd60a91d8c8Michael Portuesi    @Implementation
696b77d40267d9b2d4d1b3e206f7d1bdd60a91d8c8Michael Portuesi    public Configuration getConfiguration() {
7040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        Configuration configuration = new Configuration();
7140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        configuration.setToDefaults();
7285af7906879a68c99b1878dac22605fa32454f3fRich Humphrey        if (configuration.locale == null) {
7385af7906879a68c99b1878dac22605fa32454f3fRich Humphrey            configuration.locale = Locale.getDefault();
7485af7906879a68c99b1878dac22605fa32454f3fRich Humphrey        }
7540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return configuration;
766b77d40267d9b2d4d1b3e206f7d1bdd60a91d8c8Michael Portuesi    }
77b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin
78de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
79b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    public String getString(int id) throws Resources.NotFoundException {
8025cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz        return resourceLoader.getStringValue(id);
81b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    }
82b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin
83de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
84b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    public String getString(int id, Object... formatArgs) throws Resources.NotFoundException {
85b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin        String raw = getString(id);
86b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin        return String.format(Locale.ENGLISH, raw, formatArgs);
87b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    }
88b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin
89de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
909daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel    public String getQuantityString(int id, int quantity, Object... formatArgs) throws Resources.NotFoundException {
919daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel        String raw = getQuantityString(id, quantity);
929daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel        return String.format(Locale.ENGLISH, raw, formatArgs);
939daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel    }
949daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel
959daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel    @Implementation
969daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel    public String getQuantityString(int id, int quantity) throws Resources.NotFoundException {
979daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel        return resourceLoader.getPluralStringValue(id, quantity);
989daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel    }
999daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel
1009daa83d905eccca3b027ce27e4a77b3f57441a1eJan Berkel    @Implementation
101b63be1295e9d42211bd466585850db5897222aa1Macarse    public InputStream openRawResource(int id) throws Resources.NotFoundException {
10240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return resourceLoader.getRawValue(id);
103b63be1295e9d42211bd466585850db5897222aa1Macarse    }
10440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
105b63be1295e9d42211bd466585850db5897222aa1Macarse    @Implementation
106b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    public String[] getStringArray(int id) throws Resources.NotFoundException {
10725cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz        String[] arrayValue = resourceLoader.getStringArrayValue(id);
108b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin        if (arrayValue == null) {
109b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin            throw new Resources.NotFoundException();
110b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin        }
111b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin        return arrayValue;
112b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    }
113b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin
114de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
115bd9537bd36434865d4d25ef332bd388d39a51e34Christian Williams & Phil Goodwin    public CharSequence[] getTextArray(int id) throws Resources.NotFoundException {
116bd9537bd36434865d4d25ef332bd388d39a51e34Christian Williams & Phil Goodwin        return getStringArray(id);
117bd9537bd36434865d4d25ef332bd388d39a51e34Christian Williams & Phil Goodwin    }
118bd9537bd36434865d4d25ef332bd388d39a51e34Christian Williams & Phil Goodwin
119bd9537bd36434865d4d25ef332bd388d39a51e34Christian Williams & Phil Goodwin    @Implementation
120b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    public CharSequence getText(int id) throws Resources.NotFoundException {
121b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin        return getString(id);
122b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    }
123b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin
124e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard    public void setDensity(float density) {
125e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard        this.density = density;
126e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard    }
127e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard
128de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
129b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    public DisplayMetrics getDisplayMetrics() {
130e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard        DisplayMetrics displayMetrics = new DisplayMetrics();
131e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard        displayMetrics.density = this.density;
132e02d2608f3fa739dd328c6b44a2122b9dfb73bedLowell Kirsh & Ryan Richard        return displayMetrics;
133b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    }
134b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin
135a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowham	@Implementation
136f1e19869f68b5b04688cc9701c3e2bf73cd35f76Ryan Richard    public Drawable getDrawable(int drawableResourceId) throws Resources.NotFoundException {
137fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham
138fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham		ResourceLoader resLoader = Robolectric.shadowOf( Robolectric.application ).getResourceLoader();
139a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowham
140fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham		// Check if this drawable is an XML drawable
141fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham		Drawable xmlDrawable = resLoader.getXmlDrawable( drawableResourceId );
142fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham		if( xmlDrawable != null ) { return xmlDrawable; }
143a7b64b610c4c404aa6ace2289cd3c41916573b28adriancowham
144fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham		Drawable animDrawable = resLoader.getAnimDrawable( drawableResourceId );
145fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham		if( animDrawable != null ) { return animDrawable; }
146fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham
147fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham		Drawable colorDrawable = resLoader.getColorDrawable( drawableResourceId );
148fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham		if( colorDrawable != null ) { return colorDrawable; }
149b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin
150fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham		return new BitmapDrawable(BitmapFactory.decodeResource(realResources, drawableResourceId));
151fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham    }
152fac8bbf7dfc7904540716be8649b2f5a5c9f6d15adriancowham
153de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
154fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin    public float getDimension(int id) throws Resources.NotFoundException {
155fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin        // todo: get this value from the xml resources and scale it by display metrics [xw 20101011]
15608d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams        if (resourceLoader.dimensions.containsKey(id)) {
15708d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams            return resourceLoader.dimensions.get(id);
158fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin        }
159fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin        return id - 0x7f000000;
160fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin    }
161b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin
162fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin    @Implementation
163fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin    public int getDimensionPixelSize(int id) throws Resources.NotFoundException {
164b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin        // The int value returned from here is probably going to be handed to TextView.setTextSize(),
165b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin        // which takes a float. Avoid int-to-float conversion errors by returning a value generated from this
166b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin        // resource ID but which isn't too big (resource values in R.java are all greater than 0x7f000000).
167b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin
168fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin        return (int) getDimension(id);
169fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin    }
170fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin
171fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin    @Implementation
172fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin    public int getDimensionPixelOffset(int id) throws Resources.NotFoundException {
173fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin        return (int) getDimension(id);
174fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin    }
175fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin
176114296321cba71f8133713306049ce3b411e8563Gonçalo Silva    @Implementation
17740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams    public AssetManager getAssets() {
178a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin        return ShadowAssetManager.bind(Robolectric.newInstanceOf(AssetManager.class), resourceLoader);
179114296321cba71f8133713306049ce3b411e8563Gonçalo Silva    }
180fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin
181ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams    @Implementation
182ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams    public final android.content.res.Resources.Theme newTheme() {
183ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams        return newInstanceOf(Resources.Theme.class);
184ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams    }
185ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams
18659d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin    /**
18759d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     * Non-Android accessor that sets the value to be returned by {@link #getDimension(int)}
18859d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     *
18940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param id    ID to set the dimension for
19059d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     * @param value value to be returned
19159d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     */
192fba19865a86f986189561f961a27f664eb23ce38Chee Wong & Phil Goodwin    public void setDimension(int id, int value) {
19308d5f9aec95a889473eaff1f5d6afefbaa2bd489Christian Williams        resourceLoader.dimensions.put(id, value);
194b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin    }
195ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams
196ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams    @Implements(Resources.Theme.class)
197ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams    public static class ShadowTheme {
198ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams        @Implementation
199ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams        public TypedArray obtainStyledAttributes(int[] attrs) {
200ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams            return obtainStyledAttributes(0, attrs);
201ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams        }
202ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams
203ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams        @Implementation
204ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams        public TypedArray obtainStyledAttributes(int resid, int[] attrs) throws android.content.res.Resources.NotFoundException {
205ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams            return obtainStyledAttributes(null, attrs, 0, 0);
206ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams        }
207ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams
208ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams        @Implementation
209ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams        public TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) {
210ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams            return newInstanceOf(TypedArray.class);
211ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams        }
212ec63d3ad017965dc341bd0ce15f07c65f35b4a90Christian Williams    }
213b63effe7b28319e0430f0baa9b8d1b8ddd3ff307Christian Williams & Phil Goodwin}
214