1698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov/*
2698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov * Copyright (C) 2015 The Android Open Source Project
3698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov *
4698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License");
5698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov * you may not use this file except in compliance with the License.
6698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov * You may obtain a copy of the License at
7698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov *
8698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov *      http://www.apache.org/licenses/LICENSE-2.0
9698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov *
10698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov * Unless required by applicable law or agreed to in writing, software
11698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS,
12698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov * See the License for the specific language governing permissions and
14698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov * limitations under the License.
15698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov */
16698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikovpackage android.support.v4.content.res;
17698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov
18698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikovimport android.content.res.ColorStateList;
19698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikovimport android.content.res.Resources;
20bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikovimport android.graphics.drawable.Drawable;
21698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikovimport android.os.Build;
22f5ec4487510a0e7226636704860a884f4c1d0ab6Kirill Grouchnikovimport android.support.compat.test.R;
23881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikovimport android.support.test.InstrumentationRegistry;
24bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikovimport android.support.v4.testutils.TestUtils;
25698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikovimport android.test.suitebuilder.annotation.SmallTest;
26cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikovimport android.util.DisplayMetrics;
27881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikovimport org.junit.Before;
28881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikovimport org.junit.Test;
29698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov
30881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikovimport static org.junit.Assert.assertEquals;
31698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov
32881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov@SmallTest
33881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikovpublic class ResourcesCompatTest {
34881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov    private Resources mResources;
35881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov
36881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov    @Before
37881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov    public void setup() {
38881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov        mResources = InstrumentationRegistry.getContext().getResources();
39698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov    }
40698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov
41881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov    @Test
42698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov    public void testGetColor() throws Throwable {
43bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov        assertEquals("Unthemed color load",
44881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getColor(mResources, R.color.text_color, null),
45698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov                0xFFFF8090);
46698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov
47698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov        if (Build.VERSION.SDK_INT >= 23) {
48698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov            // The following tests are only expected to pass on v23+ devices. The result of
49698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov            // calling theme-aware getColor() in pre-v23 is undefined.
50881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov            final Resources.Theme yellowTheme = mResources.newTheme();
51698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov            yellowTheme.applyStyle(R.style.YellowTheme, true);
52cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            assertEquals("Themed yellow color load", 0xFFF0B000,
53881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                    ResourcesCompat.getColor(mResources, R.color.simple_themed_selector,
54881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                            yellowTheme));
55698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov
56881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov            final Resources.Theme lilacTheme = mResources.newTheme();
57698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov            lilacTheme.applyStyle(R.style.LilacTheme, true);
58cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            assertEquals("Themed lilac color load", 0xFFF080F0,
59881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                    ResourcesCompat.getColor(mResources, R.color.simple_themed_selector,
60881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                            lilacTheme));
61698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov        }
62698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov    }
63698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov
64881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov    @Test
65698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov    public void testGetColorStateList() throws Throwable {
66cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        final ColorStateList unthemedColorStateList =
67881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getColorStateList(mResources, R.color.complex_unthemed_selector,
68881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                        null);
69cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        assertEquals("Unthemed color state list load: default", 0xFF70A0C0,
70cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                unthemedColorStateList.getDefaultColor());
71cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        assertEquals("Unthemed color state list load: focused", 0xFF70B0F0,
72698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov                unthemedColorStateList.getColorForState(
73cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        new int[]{android.R.attr.state_focused}, 0));
74cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        assertEquals("Unthemed color state list load: pressed", 0xFF6080B0,
75698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov                unthemedColorStateList.getColorForState(
76cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        new int[]{android.R.attr.state_pressed}, 0));
77698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov
78698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov        if (Build.VERSION.SDK_INT >= 23) {
79698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov            // The following tests are only expected to pass on v23+ devices. The result of
80698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov            // calling theme-aware getColorStateList() in pre-v23 is undefined.
81881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov            final Resources.Theme yellowTheme = mResources.newTheme();
82698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov            yellowTheme.applyStyle(R.style.YellowTheme, true);
83cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            final ColorStateList themedYellowColorStateList =
84881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                    ResourcesCompat.getColorStateList(mResources, R.color.complex_themed_selector,
85698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov                            yellowTheme);
86cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            assertEquals("Themed yellow color state list load: default", 0xFFF0B000,
87cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                    themedYellowColorStateList.getDefaultColor());
88cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            assertEquals("Themed yellow color state list load: focused", 0xFFF0A020,
89698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov                    themedYellowColorStateList.getColorForState(
90cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                            new int[]{android.R.attr.state_focused}, 0));
91cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            assertEquals("Themed yellow color state list load: pressed", 0xFFE0A040,
92698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov                    themedYellowColorStateList.getColorForState(
93cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                            new int[]{android.R.attr.state_pressed}, 0));
94698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov
95881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov            final Resources.Theme lilacTheme = mResources.newTheme();
96698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov            lilacTheme.applyStyle(R.style.LilacTheme, true);
97cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            final ColorStateList themedLilacColorStateList =
98881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                    ResourcesCompat.getColorStateList(mResources, R.color.complex_themed_selector,
99698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov                            lilacTheme);
100cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            assertEquals("Themed lilac color state list load: default", 0xFFF080F0,
101cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                    themedLilacColorStateList.getDefaultColor());
102cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            assertEquals("Themed lilac color state list load: focused", 0xFFF070D0,
103698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov                    themedLilacColorStateList.getColorForState(
104cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                            new int[]{android.R.attr.state_focused}, 0));
105cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            assertEquals("Themed lilac color state list load: pressed", 0xFFE070A0,
106698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov                    themedLilacColorStateList.getColorForState(
107cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                            new int[]{android.R.attr.state_pressed}, 0));
108698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov        }
109698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov    }
110bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov
111881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov    @Test
112bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov    public void testGetDrawable() throws Throwable {
113cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        final Drawable unthemedDrawable =
114881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawable(mResources, R.drawable.test_drawable_red, null);
115bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov        TestUtils.assertAllPixelsOfColor("Unthemed drawable load",
116881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                unthemedDrawable, mResources.getColor(R.color.test_red));
117bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov
118bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov        if (Build.VERSION.SDK_INT >= 23) {
119bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov            // The following tests are only expected to pass on v23+ devices. The result of
120bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov            // calling theme-aware getDrawable() in pre-v23 is undefined.
121881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov            final Resources.Theme yellowTheme = mResources.newTheme();
122bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov            yellowTheme.applyStyle(R.style.YellowTheme, true);
123cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            final Drawable themedYellowDrawable =
124881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                    ResourcesCompat.getDrawable(mResources, R.drawable.themed_drawable,
125881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                            yellowTheme);
126bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov            TestUtils.assertAllPixelsOfColor("Themed yellow drawable load",
127bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov                    themedYellowDrawable, 0xFFF0B000);
128bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov
129881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov            final Resources.Theme lilacTheme = mResources.newTheme();
130bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov            lilacTheme.applyStyle(R.style.LilacTheme, true);
131cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            final Drawable themedLilacDrawable =
132881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                    ResourcesCompat.getDrawable(mResources, R.drawable.themed_drawable, lilacTheme);
133bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov            TestUtils.assertAllPixelsOfColor("Themed lilac drawable load",
134bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov                    themedLilacDrawable, 0xFFF080F0);
135bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov        }
136bc927aa4ec8007a8faaa5672f4b3c7ef59c7e36fKirill Grouchnikov    }
137cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
138881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov    @Test
139cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov    public void testGetDrawableForDensityUnthemed() throws Throwable {
140cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // Density-aware drawable loading for now only works on raw bitmap drawables.
141cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
142cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // Different variants of density_aware_drawable are set up in the following way:
143cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        //    mdpi - 12x12 px which is 12x12 dip
144cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        //    hdpi - 21x21 px which is 14x14 dip
145cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        //   xhdpi - 32x32 px which is 16x16 dip
146cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        //  xxhdpi - 54x54 px which is 18x18 dip
147cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // The tests below (on v15+ devices) are checking that an unthemed density-aware
148cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // loading of raw bitmap drawables returns a drawable with matching intrinsic
149cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // dimensions.
150cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
151cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        final Drawable unthemedDrawableForMediumDensity =
152881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.density_aware_drawable,
153cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        DisplayMetrics.DENSITY_MEDIUM, null);
154cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // For pre-v15 devices we should get a drawable that corresponds to the density of the
155cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // current device. For v15+ devices we should get a drawable that corresponds to the
156cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // density requested in the API call.
157cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        final int expectedSizeForMediumDensity = (Build.VERSION.SDK_INT < 15) ?
158881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                mResources.getDimensionPixelSize(R.dimen.density_aware_size) : 12;
159cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        assertEquals("Unthemed density-aware drawable load: medium width",
160cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                expectedSizeForMediumDensity, unthemedDrawableForMediumDensity.getIntrinsicWidth());
161cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        assertEquals("Unthemed density-aware drawable load: medium height",
162cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                expectedSizeForMediumDensity,
163cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                unthemedDrawableForMediumDensity.getIntrinsicHeight());
164cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
165cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        final Drawable unthemedDrawableForHighDensity =
166881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.density_aware_drawable,
167cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        DisplayMetrics.DENSITY_HIGH, null);
168cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // For pre-v15 devices we should get a drawable that corresponds to the density of the
169cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // current device. For v15+ devices we should get a drawable that corresponds to the
170cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // density requested in the API call.
171cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        final int expectedSizeForHighDensity = (Build.VERSION.SDK_INT < 15) ?
172881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                mResources.getDimensionPixelSize(R.dimen.density_aware_size) : 21;
173cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        assertEquals("Unthemed density-aware drawable load: high width",
174cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                expectedSizeForHighDensity, unthemedDrawableForHighDensity.getIntrinsicWidth());
175cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        assertEquals("Unthemed density-aware drawable load: high height",
176cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                expectedSizeForHighDensity, unthemedDrawableForHighDensity.getIntrinsicHeight());
177cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
178cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        final Drawable unthemedDrawableForXHighDensity =
179881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.density_aware_drawable,
180cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        DisplayMetrics.DENSITY_XHIGH, null);
181cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // For pre-v15 devices we should get a drawable that corresponds to the density of the
182cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // current device. For v15+ devices we should get a drawable that corresponds to the
183cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // density requested in the API call.
184cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        final int expectedSizeForXHighDensity = (Build.VERSION.SDK_INT < 15) ?
185881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                mResources.getDimensionPixelSize(R.dimen.density_aware_size) : 32;
186cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        assertEquals("Unthemed density-aware drawable load: xhigh width",
187cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                expectedSizeForXHighDensity, unthemedDrawableForXHighDensity.getIntrinsicWidth());
188cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        assertEquals("Unthemed density-aware drawable load: xhigh height",
189cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                expectedSizeForXHighDensity, unthemedDrawableForXHighDensity.getIntrinsicHeight());
190cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
191cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        final Drawable unthemedDrawableForXXHighDensity =
192881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.density_aware_drawable,
193cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        DisplayMetrics.DENSITY_XXHIGH, null);
194cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // For pre-v15 devices we should get a drawable that corresponds to the density of the
195cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // current device. For v15+ devices we should get a drawable that corresponds to the
196cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // density requested in the API call.
197cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        final int expectedSizeForXXHighDensity = (Build.VERSION.SDK_INT < 15) ?
198881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                mResources.getDimensionPixelSize(R.dimen.density_aware_size) : 54;
199cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        assertEquals("Unthemed density-aware drawable load: xxhigh width",
200cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                expectedSizeForXXHighDensity, unthemedDrawableForXXHighDensity.getIntrinsicWidth());
201cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        assertEquals("Unthemed density-aware drawable load: xxhigh height",
202cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                expectedSizeForXXHighDensity,
203cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                unthemedDrawableForXXHighDensity.getIntrinsicHeight());
204cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov    }
205cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
206881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov    @Test
207cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov    public void testGetDrawableForDensityThemed() throws Throwable {
208cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        if (Build.VERSION.SDK_INT < 21) {
209cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            // The following tests are only expected to pass on v21+ devices. The result of
210cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            // calling theme-aware getDrawableForDensity() in pre-v21 is undefined.
211cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov            return;
212cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        }
213cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
214cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // Density- and theme-aware drawable loading for now only works partially. This test
215cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // checks only for theming of a tinted bitmap XML drawable, but not correct scaling.
216cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
217cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // Set up the two test themes, yellow and lilac.
218881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov        final Resources.Theme yellowTheme = mResources.newTheme();
219cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        yellowTheme.applyStyle(R.style.YellowTheme, true);
220cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
221881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov        final Resources.Theme lilacTheme = mResources.newTheme();
222cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        lilacTheme.applyStyle(R.style.LilacTheme, true);
223cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
224cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        Drawable themedYellowDrawableForMediumDensity =
225881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
226cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        DisplayMetrics.DENSITY_MEDIUM, yellowTheme);
227cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // We should get a drawable that corresponds to the theme requested in the API call.
228cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : medium color",
229cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                themedYellowDrawableForMediumDensity, 0xFFF0B000);
230cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
231cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        Drawable themedLilacDrawableForMediumDensity =
232881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
233cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        DisplayMetrics.DENSITY_MEDIUM, lilacTheme);
234cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // We should get a drawable that corresponds to the theme requested in the API call.
235cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : medium color",
236cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                themedLilacDrawableForMediumDensity, 0xFFF080F0);
237cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
238cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        Drawable themedYellowDrawableForHighDensity =
239881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
240cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        DisplayMetrics.DENSITY_HIGH, yellowTheme);
241cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // We should get a drawable that corresponds to the theme requested in the API call.
242cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : high color",
243cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                themedYellowDrawableForHighDensity, 0xFFF0B000);
244cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
245cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        Drawable themedLilacDrawableForHighDensity =
246881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
247cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        DisplayMetrics.DENSITY_HIGH, lilacTheme);
248cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // We should get a drawable that corresponds to the theme requested in the API call.
249cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : high color",
250cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                themedLilacDrawableForHighDensity, 0xFFF080F0);
251cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
252cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        Drawable themedYellowDrawableForXHighDensity =
253881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
254cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        DisplayMetrics.DENSITY_XHIGH, yellowTheme);
255cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // We should get a drawable that corresponds to the theme requested in the API call.
256cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : xhigh color",
257cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                themedYellowDrawableForXHighDensity, 0xFFF0B000);
258cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
259cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        Drawable themedLilacDrawableForXHighDensity =
260881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
261cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        DisplayMetrics.DENSITY_XHIGH, lilacTheme);
262cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // We should get a drawable that corresponds to the theme requested in the API call.
263cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : xhigh color",
264cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                themedLilacDrawableForXHighDensity, 0xFFF080F0);
265cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
266cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        Drawable themedYellowDrawableForXXHighDensity =
267881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
268cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        DisplayMetrics.DENSITY_XXHIGH, yellowTheme);
269cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // We should get a drawable that corresponds to the theme requested in the API call.
270cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : xxhigh color",
271cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                themedYellowDrawableForXXHighDensity, 0xFFF0B000);
272cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov
273cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        Drawable themedLilacDrawableForXXHighDensity =
274881c193f64d35ea2a106a2f76c30bd711a971bb1Kirill Grouchnikov                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
275cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                        DisplayMetrics.DENSITY_XXHIGH, lilacTheme);
276cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        // We should get a drawable that corresponds to the theme requested in the API call.
277cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : xxhigh color",
278cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov                themedLilacDrawableForXXHighDensity, 0xFFF080F0);
279cac6006689cab12a5aa2f79ba68fb65467b3d77fKirill Grouchnikov    }
280698fb2ad5c78bfd5eff8b66cfcffd2636e08aa87Kirill Grouchnikov}
281