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