1b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu/*
2b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu * Copyright (C) 2017 The Android Open Source Project
3b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu *
4b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu * Licensed under the Apache License, Version 2.0 (the "License");
5b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu * you may not use this file except in compliance with the License.
6b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu * You may obtain a copy of the License at
7b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu *
8b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu *      http://www.apache.org/licenses/LICENSE-2.0
9b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu *
10b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu * Unless required by applicable law or agreed to in writing, software
11b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu * distributed under the License is distributed on an "AS IS" BASIS,
12b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu * See the License for the specific language governing permissions and
14b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu * limitations under the License.
15b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu */
16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.wear.widget;
17b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu
18b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport static org.junit.Assert.assertEquals;
19e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogduimport static org.junit.Assert.assertNotNull;
20e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogduimport static org.junit.Assert.assertTrue;
21b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport static org.mockito.Matchers.any;
22b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport static org.mockito.Matchers.eq;
23b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport static org.mockito.Mockito.mock;
24b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport static org.mockito.Mockito.times;
25b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport static org.mockito.Mockito.verify;
26b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu
27b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport android.content.Intent;
28b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport android.graphics.Bitmap;
29b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport android.graphics.Canvas;
30b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport android.graphics.ColorFilter;
31b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport android.graphics.Paint;
32b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport android.graphics.Rect;
33b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport android.graphics.RectF;
34b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport android.graphics.drawable.BitmapDrawable;
35923865894873e7f8df77b5b94458ada833fdc7fcAlper Gundogduimport android.os.Build;
3609f5768adbb5e0dd894fae42c948198b36a6aca7Aurimas Liutikasimport android.support.test.filters.SdkSuppress;
37b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport android.support.test.filters.SmallTest;
38b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport android.support.test.rule.ActivityTestRule;
39b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport android.support.test.runner.AndroidJUnit4;
40d75a466859fee504b717c529094e318d1278f831Aurimas Liutikas
41ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.wear.test.R;
42b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu
43b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport org.junit.Before;
44b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport org.junit.Rule;
45b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport org.junit.Test;
46b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport org.junit.runner.RunWith;
47b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogduimport org.mockito.Mock;
48b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu
49b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu/** Tests for {@link RoundedDrawable} */
50b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu@SmallTest
51b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu@RunWith(AndroidJUnit4.class)
52b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdupublic class RoundedDrawableTest {
53b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu
54b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    @Rule
55b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    public final ActivityTestRule<LayoutTestActivity> mActivityRule = new ActivityTestRule<>(
56b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu            LayoutTestActivity.class, true, false);
57b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    private static final int BITMAP_WIDTH = 64;
58b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    private static final int BITMAP_HEIGHT = 32;
59b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu
60b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    private RoundedDrawable mRoundedDrawable;
61b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    private BitmapDrawable mBitmapDrawable;
62b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu
63b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    @Mock
64b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    Canvas mMockCanvas;
65b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu
66b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    @Before
67b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    public void setUp() {
68b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mMockCanvas = mock(Canvas.class);
69b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mActivityRule.launchActivity(new Intent().putExtra(LayoutTestActivity
70b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                        .EXTRA_LAYOUT_RESOURCE_ID,
71ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas                androidx.wear.test.R.layout.rounded_drawable_layout));
72b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable = new RoundedDrawable();
73b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mBitmapDrawable =
74b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                new BitmapDrawable(
75b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                        mActivityRule.getActivity().getResources(),
76b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                        Bitmap.createBitmap(BITMAP_WIDTH, BITMAP_HEIGHT, Bitmap.Config.ARGB_8888));
77b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    }
78b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu
79b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    @Test
80b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    public void colorFilterIsAppliedCorrectly() {
81b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        ColorFilter cf = new ColorFilter();
82b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable.setColorFilter(cf);
83b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        assertEquals(cf, mRoundedDrawable.mPaint.getColorFilter());
84b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    }
85b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu
86b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    @Test
87b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    public void alphaIsAppliedCorrectly() {
88b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        int alpha = 128;
89b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable.setAlpha(alpha);
90b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        assertEquals(alpha, mRoundedDrawable.mPaint.getAlpha());
91b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    }
92b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu
93b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    @Test
94b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    public void radiusIsAppliedCorrectly() {
95b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        int radius = 10;
96b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        Rect bounds = new Rect(0, 0, BITMAP_WIDTH, BITMAP_HEIGHT);
97b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable.setDrawable(mBitmapDrawable);
98b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable.setClipEnabled(true);
99b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable.setRadius(radius);
100b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable.setBounds(bounds);
101b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable.draw(mMockCanvas);
102b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        // One for background and one for the actual drawable, this should be called two times.
103b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        verify(mMockCanvas, times(2))
104b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                .drawRoundRect(
105b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                        eq(new RectF(0, 0, bounds.width(), bounds.height())),
106b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                        eq((float) radius),
107b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                        eq((float) radius),
108b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                        any(Paint.class));
109b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    }
110b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu
111b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    @Test
112b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    public void scalingIsAppliedCorrectly() {
113b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        int radius = 14;
114b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        // 14 px radius should apply 5 px padding due to formula ceil(radius * 1 - 1 / sqrt(2))
115b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        Rect bounds = new Rect(0, 0, BITMAP_WIDTH, BITMAP_HEIGHT);
116b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable.setDrawable(mBitmapDrawable);
117b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable.setClipEnabled(false);
118b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable.setRadius(radius);
119b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable.setBounds(bounds);
120b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        mRoundedDrawable.draw(mMockCanvas);
121b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        assertEquals(BITMAP_WIDTH - 10, mBitmapDrawable.getBounds().width());
122b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        assertEquals(BITMAP_HEIGHT - 10, mBitmapDrawable.getBounds().height());
123b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        assertEquals(bounds.centerX(), mBitmapDrawable.getBounds().centerX());
124b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        assertEquals(bounds.centerY(), mBitmapDrawable.getBounds().centerY());
125b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        // Background should also be drawn
126b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu        verify(mMockCanvas)
127b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                .drawRoundRect(
128b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                        eq(new RectF(0, 0, bounds.width(), bounds.height())),
129b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                        eq((float) radius),
130b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                        eq((float) radius),
131b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu                        any(Paint.class));
132b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu    }
133e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogdu
134e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogdu    @Test
135923865894873e7f8df77b5b94458ada833fdc7fcAlper Gundogdu    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
136e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogdu    public void inflate() {
137923865894873e7f8df77b5b94458ada833fdc7fcAlper Gundogdu        RoundedDrawable roundedDrawable =
138923865894873e7f8df77b5b94458ada833fdc7fcAlper Gundogdu                (RoundedDrawable) mActivityRule.getActivity().getDrawable(
139923865894873e7f8df77b5b94458ada833fdc7fcAlper Gundogdu                        R.drawable.rounded_drawable);
140e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogdu        assertEquals(
141e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogdu                mActivityRule.getActivity().getColor(R.color.rounded_drawable_background_color),
142e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogdu                roundedDrawable.getBackgroundColor());
143e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogdu        assertTrue(roundedDrawable.isClipEnabled());
144e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogdu        assertNotNull(roundedDrawable.getDrawable());
145e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogdu        assertEquals(mActivityRule.getActivity().getResources().getDimensionPixelSize(
146e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogdu                R.dimen.rounded_drawable_radius), roundedDrawable.getRadius());
147e0644b4053f9eecc713a4ba9e276df0eadb1dff9Alper Gundogdu    }
148b3427dc7ffc18caa7ee03db160c5347e98d990d0Alper Gundogdu}
149