19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2018 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *       http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage androidx.core.graphics.drawable
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap.Config
209b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Liimport android.graphics.Color
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.BitmapDrawable
229b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Liimport android.graphics.drawable.ColorDrawable
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.test.InstrumentationRegistry
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport androidx.core.graphics.createBitmap
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.junit.Assert.assertEquals
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.junit.Test
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass DrawableTest {
29a696f5d667227365da732481770767dcb330dd23Mathias Agopian    private val context = InstrumentationRegistry.getContext()
3030771b773393596812b6cfd2a4ddf490c43437aaWu-cheng Li    private val resources = context.resources
31fd6f39e147dc077139a41b9c2a4039fbaa20224eJamie Gennis
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test fun bitmapDrawableNoSizeNoConfig() {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        val original = createBitmap(10, 10).apply {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            eraseColor(Color.RED)
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        val drawable = BitmapDrawable(resources, original)
37bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
38bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        val bitmap = drawable.toBitmap()
39bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(10, bitmap.width)
40df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main        assertEquals(10, bitmap.height)
41bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(Config.ARGB_8888, bitmap.config)
427478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li        assertEquals(Color.RED, bitmap.getPixel(5, 5))
43df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    }
44df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main
45bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    @Test fun bitmapDrawableNoSizeRetainedConfig() {
467478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li        val original = createBitmap(10, 10).apply {
47df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main            eraseColor(Color.RED)
48df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main        }
49df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main        val drawable = BitmapDrawable(resources, original)
50df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main
51df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main        val bitmap = drawable.toBitmap(config = Config.ARGB_8888)
52bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(10, bitmap.width)
53bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(10, bitmap.height)
54bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(Config.ARGB_8888, bitmap.config)
55341ff13689dfe822b598e626272ac2e80041b482Dan Egnor        assertEquals(Color.RED, bitmap.getPixel(5, 5))
56bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
57bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
58bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    @Test fun bitmapDrawableNoSizeDifferentConfig() {
59bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        val original = createBitmap(10, 10).apply {
60bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            eraseColor(Color.RED)
61bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
62bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        val drawable = BitmapDrawable(resources, original)
63bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
64bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        val bitmap = drawable.toBitmap(config = Config.ARGB_8888)
65bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(10, bitmap.width)
66bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(10, bitmap.height)
67bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(Config.ARGB_8888, bitmap.config)
68bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(Color.RED, bitmap.getPixel(5, 5))
69bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
70bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
71bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    @Test fun bitmapDrawableDifferentSizeNoConfig() {
72bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        val original = createBitmap(10, 10).apply {
73bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            eraseColor(Color.RED)
74bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
75bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        val drawable = BitmapDrawable(resources, original)
76bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
77bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        val bitmap = drawable.toBitmap(20, 20)
78bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(20, bitmap.width)
79bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(20, bitmap.height)
80bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(Config.ARGB_8888, bitmap.config)
81bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(Color.RED, bitmap.getPixel(10, 10))
82bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
83bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
84bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    @Test fun bitmapDrawableDifferentSizeDifferentConfig() {
85bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        val original = createBitmap(10, 10).apply {
86bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            eraseColor(Color.RED)
87bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
88bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        val drawable = BitmapDrawable(resources, original)
89bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
90bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        val bitmap = drawable.toBitmap(20, 20, Config.ARGB_8888)
91bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(20, bitmap.width)
92bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(20, bitmap.height)
93bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(Config.ARGB_8888, bitmap.config)
94bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(Color.RED, bitmap.getPixel(10, 10))
95bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
96bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
97bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    @Test fun drawableNoConfig() {
98bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        val drawable = object : ColorDrawable(Color.RED) {
99bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            override fun getIntrinsicWidth() = 10
100bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor            override fun getIntrinsicHeight() = 10
101bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        }
102bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
103bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        val bitmap = drawable.toBitmap()
104bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(10, bitmap.width)
105bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(10, bitmap.height)
106bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor        assertEquals(Config.ARGB_8888, bitmap.config)
107341ff13689dfe822b598e626272ac2e80041b482Dan Egnor        assertEquals(Color.RED, bitmap.getPixel(5, 5))
108bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor    }
109bfcbeffc54e93b1c2e2d95fdc301786df4376d6fDan Egnor
110df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main    @Test fun drawableConfig() {
111df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main        val drawable = object : ColorDrawable(Color.RED) {
112df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main            override fun getIntrinsicWidth() = 10
1137478ea6848c0059e65a4089b4ec2ff4158520870Wu-cheng Li            override fun getIntrinsicHeight() = 10
114df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main        }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        val bitmap = drawable.toBitmap(config = Config.RGB_565)
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(10, bitmap.width)
1189b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        assertEquals(10, bitmap.height)
119d2c2929c94bec68741b85f4174e11307fb65157fWu-cheng Li        assertEquals(Config.RGB_565, bitmap.config)
120da83f4674a564007baac03db062a289c8158d940Benny Wong        assertEquals(Color.RED, bitmap.getPixel(5, 5))
121da83f4674a564007baac03db062a289c8158d940Benny Wong    }
122da83f4674a564007baac03db062a289c8158d940Benny Wong
123da83f4674a564007baac03db062a289c8158d940Benny Wong    @Test fun drawableSize() {
124da83f4674a564007baac03db062a289c8158d940Benny Wong        val drawable = object : ColorDrawable(Color.RED) {
125da83f4674a564007baac03db062a289c8158d940Benny Wong            override fun getIntrinsicWidth() = 10
126da83f4674a564007baac03db062a289c8158d940Benny Wong            override fun getIntrinsicHeight() = 10
127da83f4674a564007baac03db062a289c8158d940Benny Wong        }
128da83f4674a564007baac03db062a289c8158d940Benny Wong
129da83f4674a564007baac03db062a289c8158d940Benny Wong        val bitmap = drawable.toBitmap(20, 20)
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(20, bitmap.width)
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(20, bitmap.height)
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Config.ARGB_8888, bitmap.config)
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Color.RED, bitmap.getPixel(10, 10))
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test fun oldBoundsRestored() {
137e8b26e197f7c5e4acbdf8a5cd3f014fbc242c8abDave Sparks        val drawable = object : ColorDrawable(Color.RED) {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            override fun getIntrinsicWidth() = 10
1393f4639a6611222ae1ae5493de49213250d292139Wu-cheng Li            override fun getIntrinsicHeight() = 10
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        drawable.setBounds(2, 2, 8, 8)
14294927dffce1626898b59579dfc5af53b5de8cef6Andrew Harp
1439b6a8ab8221f2df20c32711b0f1e4f301165fac2Wu-cheng Li        val bitmap = drawable.toBitmap()
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(10, bitmap.width)
145341ff13689dfe822b598e626272ac2e80041b482Dan Egnor        assertEquals(10, bitmap.height)
146e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang
147e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        assertEquals(2, drawable.bounds.left)
148e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        assertEquals(2, drawable.bounds.top)
149e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        assertEquals(8, drawable.bounds.right)
150341ff13689dfe822b598e626272ac2e80041b482Dan Egnor        assertEquals(8, drawable.bounds.bottom)
151b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    }
152b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang
153b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    @Test fun updateBoundsTest() {
154b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        val drawable = object : ColorDrawable(Color.RED) {
155b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang            override fun getIntrinsicWidth() = 10
156b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang            override fun getIntrinsicHeight() = 10
157b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        }
158b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        drawable.setBounds(0, 0, 10, 10)
1597836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li
1607836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li        drawable.updateBounds(1, 2, 3, 4)
1617836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li
162b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang        assertEquals(1, drawable.bounds.left)
1637836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li        assertEquals(2, drawable.bounds.top)
1647836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li        assertEquals(3, drawable.bounds.right)
1657836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li        assertEquals(4, drawable.bounds.bottom)
1667836660f5eb45b7b7e1f5119face65c80e2ade17Wu-cheng Li    }
167b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang}
168b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang