DrawableCompatTest.java revision 754cb29c50f09a83251dd4bb633ba445b2411adb
1bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper/*
202be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * Copyright (C) 2016 The Android Open Source Project
302be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper *
402be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * Licensed under the Apache License, Version 2.0 (the "License");
502be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * you may not use this file except in compliance with the License.
602be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * You may obtain a copy of the License at
702be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper *
87f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper *      http://www.apache.org/licenses/LICENSE-2.0
902be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper *
1002be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * Unless required by applicable law or agreed to in writing, software
1102be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * distributed under the License is distributed on an "AS IS" BASIS,
1202be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1302be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * See the License for the specific language governing permissions and
1402be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper * limitations under the License.
1502be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper */
1602be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper
1702be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperpackage android.support.v4.graphics;
1802be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper
1902be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.junit.Assert.assertEquals;
2002be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.junit.Assert.assertNotNull;
2102be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.junit.Assert.assertNotSame;
2202be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.junit.Assert.assertSame;
2302be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.mockito.Mockito.mock;
2402be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.mockito.Mockito.times;
2502be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport static org.mockito.Mockito.verify;
2602be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper
2702be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport android.content.res.ColorStateList;
2802be6631beae8afa7140f6eece45333e91d22e4fKyleJHarperimport android.graphics.Color;
290d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarperimport android.graphics.PorterDuff;
300d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarperimport android.graphics.Rect;
317f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport android.graphics.drawable.Drawable;
327f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport android.graphics.drawable.GradientDrawable;
337f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport android.os.Build;
347f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport android.support.test.filters.SmallTest;
357f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport android.support.test.runner.AndroidJUnit4;
367f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport android.support.v4.graphics.drawable.DrawableCompat;
377f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper
387f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport org.junit.Test;
397f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperimport org.junit.runner.RunWith;
407f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper
417f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper@RunWith(AndroidJUnit4.class)
427f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper@SmallTest
437f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarperpublic class DrawableCompatTest {
447f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper    @Test
457f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper    public void testDrawableWrap() {
467f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper        final Drawable original = new GradientDrawable();
477f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper        final Drawable wrappedDrawable = DrawableCompat.wrap(original);
487f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper
497f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper        if (Build.VERSION.SDK_INT < 23) {
507f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper            assertNotSame(original, wrappedDrawable);
517f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper        } else {
52bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper            assertSame(original, wrappedDrawable);
53bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        }
540d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper    }
55bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper
56bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper    @Test
57bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper    public void testDrawableUnwrap() {
58bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        final Drawable original = new GradientDrawable();
59bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        final Drawable wrappedDrawable = DrawableCompat.wrap(original);
60bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        assertSame(original, DrawableCompat.unwrap(wrappedDrawable));
61bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper    }
62bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper
63bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper    @Test
640d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper    public void testDrawableChangeBoundsCopy() {
650d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper        final Rect bounds = new Rect(0, 0, 10, 10);
660d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper
67bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        final Drawable drawable = new GradientDrawable();
6867b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper
69bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        final Drawable wrapper = DrawableCompat.wrap(drawable);
700d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper        wrapper.setBounds(bounds);
71bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper
72bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        // Assert that the bounds were given to the original drawable
73bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        assertEquals(bounds, drawable.getBounds());
74bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper    }
750d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper
7667b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper    @Test
7767b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper    public void testWrapCopiesDrawableState() {
7867b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper        final Rect bounds = new Rect(0, 0, 10, 10);
7967b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper
807f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper        // Create a drawable and set some bounds
817f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper        final Drawable drawable = new GradientDrawable();
8202be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper        drawable.setBounds(bounds);
8367b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper
84bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        // Now wrap it
85bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        final Drawable wrapper = DrawableCompat.wrap(drawable);
86bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper
87bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        // Assert that the bounds were copied to the wrapper
88bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        assertEquals(bounds, wrapper.getBounds());
89bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper    }
90bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper
91bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper    @Test
92bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper    public void testDrawableWrapOnlyWrapsOnce() {
93bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        final Drawable wrappedDrawable = DrawableCompat.wrap(new GradientDrawable());
94bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        assertSame(wrappedDrawable, DrawableCompat.wrap(wrappedDrawable));
95bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper    }
96bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper
97bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper    @Test
98bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper    public void testWrapMutatedDrawableHasConstantState() {
99bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        // First create a Drawable, and mutated it so that it has a constant state
100bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        Drawable drawable = new GradientDrawable();
101bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        drawable = drawable.mutate();
102bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        assertNotNull(drawable.getConstantState());
103bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper
104bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        // Now wrap and assert that the wrapper also returns a constant state
10502be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper        final Drawable wrapper = DrawableCompat.wrap(drawable);
106bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        assertNotNull(wrapper.getConstantState());
10767b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper    }
108bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper
1097f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper    @Test
1107f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper    public void testWrappedDrawableHasCallbackSet() {
1117f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper        // First create a Drawable
1127f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper        final Drawable drawable = new GradientDrawable();
1137f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper
1147f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper        // Now wrap it and set a mock as the wrapper's callback
1157f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper        final Drawable wrapper = DrawableCompat.wrap(drawable);
1167f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper        final Drawable.Callback mockCallback = mock(Drawable.Callback.class);
1177f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper        wrapper.setCallback(mockCallback);
1187f96babc4bfa295ebe5abe3d2f1194f880c38769KyleJHarper
11967b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper        // Now make the wrapped drawable invalidate itself
120bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        drawable.invalidateSelf();
12102be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper
122bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper        // ...and verify that the wrapper calls to be invalidated
12367b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper        verify(mockCallback, times(1)).invalidateDrawable(wrapper);
12467b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper    }
125bdd9143e02f60680ddb225fc84370b849b56d1caKyleJHarper
1260d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper    @Test
1270d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper    public void testDoesNotWrapTintAwareDrawable() {
12867b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper        final TestTintAwareDrawable tintAwareDrawable = new TestTintAwareDrawable();
12967b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper        final Drawable wrapped = DrawableCompat.wrap(tintAwareDrawable);
13067b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper        // Assert that the tint aware drawable was not wrapped
13102be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper        assertSame(tintAwareDrawable, wrapped);
13267b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper    }
13302be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper
13402be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper    @Test
13502be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper    public void testTintAwareDrawableGetsTintCallsDirectly() {
13602be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper        final TestTintAwareDrawable d = mock(TestTintAwareDrawable.class);
1370d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper
13867b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper        final ColorStateList tint = ColorStateList.valueOf(Color.BLACK);
13967b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper        final PorterDuff.Mode tintMode = PorterDuff.Mode.DST;
14067b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper
14167b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper        // Now set the tint list and mode using DrawableCompat
14267b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper        DrawableCompat.setTintList(d, tint);
14367b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper        DrawableCompat.setTintMode(d, tintMode);
14402be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper
14567b3a24707750d2f09d278cd46439ad6d94b93cbKyleJHarper        // Verify that the calls were directly on to the TintAwareDrawable
14602be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper        verify(d).setTintList(tint);
14702be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper        verify(d).setTintMode(tintMode);
14802be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper    }
14902be6631beae8afa7140f6eece45333e91d22e4fKyleJHarper
1500d25185671ddbd23d91b814cfd55dd2bc3d9e8d6KyleJHarper}