1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.widget.cts; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertFalse; 21 import static org.junit.Assert.assertNull; 22 import static org.junit.Assert.assertSame; 23 import static org.junit.Assert.assertTrue; 24 import static org.mockito.Matchers.any; 25 import static org.mockito.Matchers.anyInt; 26 import static org.mockito.Mockito.atLeastOnce; 27 import static org.mockito.Mockito.never; 28 import static org.mockito.Mockito.reset; 29 import static org.mockito.Mockito.spy; 30 import static org.mockito.Mockito.times; 31 import static org.mockito.Mockito.verify; 32 33 import android.content.Context; 34 import android.content.res.ColorStateList; 35 import android.graphics.BlendMode; 36 import android.graphics.Canvas; 37 import android.graphics.Color; 38 import android.graphics.PorterDuff; 39 import android.graphics.drawable.ColorDrawable; 40 import android.graphics.drawable.Drawable; 41 import android.os.Parcelable; 42 import android.util.AttributeSet; 43 import android.view.View; 44 import android.view.animation.AccelerateDecelerateInterpolator; 45 import android.view.animation.AccelerateInterpolator; 46 import android.view.animation.Interpolator; 47 import android.view.animation.LinearInterpolator; 48 import android.widget.ProgressBar; 49 import android.widget.cts.util.TestUtils; 50 51 import androidx.test.annotation.UiThreadTest; 52 import androidx.test.filters.SmallTest; 53 import androidx.test.rule.ActivityTestRule; 54 import androidx.test.runner.AndroidJUnit4; 55 56 import org.junit.Before; 57 import org.junit.Rule; 58 import org.junit.Test; 59 import org.junit.runner.RunWith; 60 61 @SmallTest 62 @RunWith(AndroidJUnit4.class) 63 public class ProgressBarTest { 64 private ProgressBarCtsActivity mActivity; 65 private ProgressBar mProgressBar; 66 private ProgressBar mProgressBarHorizontal; 67 68 @Rule 69 public ActivityTestRule<ProgressBarCtsActivity> mActivityRule = 70 new ActivityTestRule<>(ProgressBarCtsActivity.class); 71 72 @Before 73 public void setup() { 74 mActivity = mActivityRule.getActivity(); 75 mProgressBar = (ProgressBar) mActivity.findViewById(R.id.progress); 76 mProgressBarHorizontal = (ProgressBar) mActivity.findViewById(R.id.progress_horizontal); 77 } 78 79 @Test 80 public void testConstructor() { 81 new ProgressBar(mActivity); 82 83 new ProgressBar(mActivity, null); 84 85 new ProgressBar(mActivity, null, android.R.attr.progressBarStyle); 86 87 new ProgressBar(mActivity, null, android.R.attr.progressBarStyleHorizontal); 88 89 new ProgressBar(mActivity, null, android.R.attr.progressBarStyleInverse); 90 91 new ProgressBar(mActivity, null, android.R.attr.progressBarStyleLarge); 92 93 new ProgressBar(mActivity, null, android.R.attr.progressBarStyleLargeInverse); 94 95 new ProgressBar(mActivity, null, android.R.attr.progressBarStyleSmall); 96 97 new ProgressBar(mActivity, null, android.R.attr.progressBarStyleSmallInverse); 98 99 new ProgressBar(mActivity, null, android.R.attr.progressBarStyleSmallTitle); 100 101 new ProgressBar(mActivity, null, 0, android.R.style.Widget_DeviceDefault_Light_ProgressBar); 102 103 new ProgressBar(mActivity, null, 0, 104 android.R.style.Widget_DeviceDefault_Light_ProgressBar_Horizontal); 105 106 new ProgressBar(mActivity, null, 0, 107 android.R.style.Widget_DeviceDefault_Light_ProgressBar_Inverse); 108 109 new ProgressBar(mActivity, null, 0, 110 android.R.style.Widget_DeviceDefault_Light_ProgressBar_Large); 111 112 new ProgressBar(mActivity, null, 0, 113 android.R.style.Widget_DeviceDefault_Light_ProgressBar_Large_Inverse); 114 115 new ProgressBar(mActivity, null, 0, 116 android.R.style.Widget_DeviceDefault_Light_ProgressBar_Small); 117 118 new ProgressBar(mActivity, null, 0, 119 android.R.style.Widget_DeviceDefault_Light_ProgressBar_Small_Inverse); 120 121 new ProgressBar(mActivity, null, 0, 122 android.R.style.Widget_DeviceDefault_Light_ProgressBar_Small_Title); 123 124 new ProgressBar(mActivity, null, 0, android.R.style.Widget_Material_Light_ProgressBar); 125 126 new ProgressBar(mActivity, null, 0, 127 android.R.style.Widget_Material_Light_ProgressBar_Horizontal); 128 129 new ProgressBar(mActivity, null, 0, 130 android.R.style.Widget_Material_Light_ProgressBar_Inverse); 131 132 new ProgressBar(mActivity, null, 0, 133 android.R.style.Widget_Material_Light_ProgressBar_Large); 134 135 new ProgressBar(mActivity, null, 0, 136 android.R.style.Widget_Material_Light_ProgressBar_Large_Inverse); 137 138 new ProgressBar(mActivity, null, 0, 139 android.R.style.Widget_Material_Light_ProgressBar_Small); 140 141 new ProgressBar(mActivity, null, 0, 142 android.R.style.Widget_Material_Light_ProgressBar_Small_Inverse); 143 144 new ProgressBar(mActivity, null, 0, 145 android.R.style.Widget_Material_Light_ProgressBar_Small_Title); 146 } 147 148 @UiThreadTest 149 @Test 150 public void testSetIndeterminate() { 151 assertTrue(mProgressBar.isIndeterminate()); 152 153 mProgressBar.setIndeterminate(true); 154 assertTrue(mProgressBar.isIndeterminate()); 155 156 mProgressBar.setIndeterminate(false); 157 // because default is Indeterminate only progressBar, can't change the status 158 assertTrue(mProgressBar.isIndeterminate()); 159 160 assertFalse(mProgressBarHorizontal.isIndeterminate()); 161 162 mProgressBarHorizontal.setIndeterminate(true); 163 assertTrue(mProgressBarHorizontal.isIndeterminate()); 164 165 mProgressBarHorizontal.setIndeterminate(false); 166 assertFalse(mProgressBarHorizontal.isIndeterminate()); 167 } 168 169 @UiThreadTest 170 @Test 171 public void testQueryAnimationState() { 172 assertTrue(mProgressBar.isAnimating()); 173 assertFalse(mProgressBarHorizontal.isAnimating()); 174 175 mProgressBarHorizontal.setIndeterminate(true); 176 assertTrue(mProgressBarHorizontal.isAnimating()); 177 178 mProgressBarHorizontal.setIndeterminate(false); 179 assertFalse(mProgressBarHorizontal.isAnimating()); 180 181 mProgressBar.setVisibility(View.GONE); 182 assertFalse(mProgressBar.isAnimating()); 183 mProgressBar.setVisibility(View.INVISIBLE); 184 assertFalse(mProgressBar.isAnimating()); 185 mProgressBar.setVisibility(View.VISIBLE); 186 assertTrue(mProgressBar.isAnimating()); 187 } 188 189 @UiThreadTest 190 @Test 191 public void testAccessIndeterminateDrawable() { 192 // set IndeterminateDrawable 193 // normal value 194 Drawable mockProgressDrawable = spy(new ColorDrawable(Color.YELLOW)); 195 mProgressBar.setIndeterminateDrawable(mockProgressDrawable); 196 assertSame(mockProgressDrawable, mProgressBar.getIndeterminateDrawable()); 197 verify(mockProgressDrawable, never()).draw(any(Canvas.class)); 198 mProgressBar.draw(new Canvas()); 199 verify(mockProgressDrawable, atLeastOnce()).draw(any(Canvas.class)); 200 201 // exceptional value 202 mProgressBar.setIndeterminateDrawable(null); 203 assertNull(mProgressBar.getIndeterminateDrawable()); 204 } 205 206 @UiThreadTest 207 @Test 208 public void testAccessProgressDrawable() { 209 // set ProgressDrawable 210 // normal value 211 Drawable mockProgressDrawable = spy(new ColorDrawable(Color.BLUE)); 212 mProgressBarHorizontal.setProgressDrawable(mockProgressDrawable); 213 assertSame(mockProgressDrawable, mProgressBarHorizontal.getProgressDrawable()); 214 verify(mockProgressDrawable, never()).draw(any(Canvas.class)); 215 mProgressBarHorizontal.draw(new Canvas()); 216 verify(mockProgressDrawable, atLeastOnce()).draw(any(Canvas.class)); 217 218 // exceptional value 219 mProgressBarHorizontal.setProgressDrawable(null); 220 assertNull(mProgressBarHorizontal.getProgressDrawable()); 221 } 222 223 @UiThreadTest 224 @Test 225 public void testAccessCurrentDrawable() { 226 final Drawable progressDrawable = new ColorDrawable(Color.BLUE); 227 final Drawable indeterminateDrawable = new ColorDrawable(Color.RED); 228 mProgressBarHorizontal.setProgressDrawable(progressDrawable); 229 mProgressBarHorizontal.setIndeterminateDrawable(indeterminateDrawable); 230 231 mProgressBarHorizontal.setIndeterminate(false); 232 assertSame(progressDrawable, mProgressBarHorizontal.getCurrentDrawable()); 233 mProgressBarHorizontal.setIndeterminate(true); 234 assertSame(indeterminateDrawable, mProgressBarHorizontal.getCurrentDrawable()); 235 } 236 237 @UiThreadTest 238 @Test 239 public void testAccessProgress() { 240 assertEquals(0, mProgressBarHorizontal.getProgress()); 241 242 final int maxProgress = mProgressBarHorizontal.getMax(); 243 // set Progress 244 // normal value 245 mProgressBarHorizontal.setProgress(maxProgress >> 1); 246 assertEquals(maxProgress >> 1, mProgressBarHorizontal.getProgress()); 247 248 // exceptional values 249 mProgressBarHorizontal.setProgress(-1); 250 assertEquals(0, mProgressBarHorizontal.getProgress()); 251 252 mProgressBarHorizontal.setProgress(maxProgress + 1); 253 assertEquals(maxProgress, mProgressBarHorizontal.getProgress()); 254 255 mProgressBarHorizontal.setProgress(Integer.MAX_VALUE); 256 assertEquals(maxProgress, mProgressBarHorizontal.getProgress()); 257 258 mProgressBarHorizontal.setProgress(0, true); 259 assertEquals(0, mProgressBarHorizontal.getProgress()); 260 261 // when in indeterminate mode 262 mProgressBarHorizontal.setIndeterminate(true); 263 mProgressBarHorizontal.setProgress(maxProgress >> 1); 264 assertEquals(0, mProgressBarHorizontal.getProgress()); 265 } 266 267 @UiThreadTest 268 @Test 269 public void testAccessSecondaryProgress() { 270 assertEquals(0, mProgressBarHorizontal.getSecondaryProgress()); 271 272 final int maxProgress = mProgressBarHorizontal.getMax(); 273 // set SecondaryProgress 274 // normal value 275 mProgressBarHorizontal.setSecondaryProgress(maxProgress >> 1); 276 assertEquals(maxProgress >> 1, mProgressBarHorizontal.getSecondaryProgress()); 277 278 // exceptional value 279 mProgressBarHorizontal.setSecondaryProgress(-1); 280 assertEquals(0, mProgressBarHorizontal.getSecondaryProgress()); 281 282 mProgressBarHorizontal.setSecondaryProgress(maxProgress + 1); 283 assertEquals(maxProgress, mProgressBarHorizontal.getSecondaryProgress()); 284 285 mProgressBarHorizontal.setSecondaryProgress(Integer.MAX_VALUE); 286 assertEquals(maxProgress, mProgressBarHorizontal.getSecondaryProgress()); 287 288 // when in indeterminate mode 289 mProgressBarHorizontal.setIndeterminate(true); 290 mProgressBarHorizontal.setSecondaryProgress(maxProgress >> 1); 291 assertEquals(0, mProgressBarHorizontal.getSecondaryProgress()); 292 } 293 294 @UiThreadTest 295 @Test 296 public void testIncrementProgressBy() { 297 // normal value 298 int increment = 1; 299 int oldProgress = mProgressBarHorizontal.getProgress(); 300 mProgressBarHorizontal.incrementProgressBy(increment); 301 assertEquals(oldProgress + increment, mProgressBarHorizontal.getProgress()); 302 303 increment = mProgressBarHorizontal.getMax() >> 1; 304 oldProgress = mProgressBarHorizontal.getProgress(); 305 mProgressBarHorizontal.incrementProgressBy(increment); 306 assertEquals(oldProgress + increment, mProgressBarHorizontal.getProgress()); 307 308 // exceptional values 309 mProgressBarHorizontal.setProgress(0); 310 mProgressBarHorizontal.incrementProgressBy(Integer.MAX_VALUE); 311 assertEquals(mProgressBarHorizontal.getMax(), mProgressBarHorizontal.getProgress()); 312 313 mProgressBarHorizontal.setProgress(0); 314 mProgressBarHorizontal.incrementProgressBy(Integer.MIN_VALUE); 315 assertEquals(0, mProgressBarHorizontal.getProgress()); 316 } 317 318 @UiThreadTest 319 @Test 320 public void testIncrementSecondaryProgressBy() { 321 // normal value 322 int increment = 1; 323 int oldSecondaryProgress = mProgressBarHorizontal.getSecondaryProgress(); 324 mProgressBarHorizontal.incrementSecondaryProgressBy(increment); 325 assertEquals(oldSecondaryProgress + increment, 326 mProgressBarHorizontal.getSecondaryProgress()); 327 328 increment = mProgressBarHorizontal.getMax() >> 1; 329 oldSecondaryProgress = mProgressBarHorizontal.getSecondaryProgress(); 330 mProgressBarHorizontal.incrementSecondaryProgressBy(increment); 331 assertEquals(oldSecondaryProgress + increment, 332 mProgressBarHorizontal.getSecondaryProgress()); 333 334 // exceptional values 335 mProgressBarHorizontal.setSecondaryProgress(0); 336 mProgressBarHorizontal.incrementSecondaryProgressBy(Integer.MAX_VALUE); 337 assertEquals(mProgressBarHorizontal.getMax(), 338 mProgressBarHorizontal.getSecondaryProgress()); 339 340 mProgressBarHorizontal.setSecondaryProgress(0); 341 mProgressBarHorizontal.incrementSecondaryProgressBy(Integer.MIN_VALUE); 342 assertEquals(0, mProgressBarHorizontal.getSecondaryProgress()); 343 } 344 345 @UiThreadTest 346 @Test 347 public void testAccessInterpolator() { 348 // default should be LinearInterpolator 349 assertTrue(mProgressBar.getInterpolator() instanceof LinearInterpolator); 350 351 Interpolator interpolator = new AccelerateDecelerateInterpolator(); 352 mProgressBar.setInterpolator(interpolator); 353 assertEquals(interpolator, mProgressBar.getInterpolator()); 354 355 mProgressBar.setInterpolator(mActivity, android.R.anim.accelerate_interpolator); 356 assertTrue(mProgressBar.getInterpolator() instanceof AccelerateInterpolator); 357 } 358 359 @UiThreadTest 360 @Test 361 public void testSetVisibility() { 362 // set visibility 363 // normal value 364 int visibility = View.VISIBLE; 365 mProgressBarHorizontal.setVisibility(visibility); 366 assertEquals(visibility, mProgressBarHorizontal.getVisibility()); 367 368 visibility = View.GONE; 369 mProgressBarHorizontal.setVisibility(visibility); 370 assertEquals(visibility, mProgressBarHorizontal.getVisibility()); 371 372 // exceptional value 373 visibility = 0xfffffff5; // -11 374 int mask = 0x0000000C; // View.VISIBILITY_MASK 375 int expected = (mProgressBarHorizontal.getVisibility() & ~mask) | (visibility & mask); 376 mProgressBarHorizontal.setVisibility(visibility); 377 assertEquals(expected, mProgressBarHorizontal.getVisibility()); 378 379 visibility = 0x7fffffff; // Integer.MAX_VALUE; 380 expected = (mProgressBarHorizontal.getVisibility() & ~mask) | (visibility & mask); 381 mProgressBarHorizontal.setVisibility(Integer.MAX_VALUE); 382 assertEquals(expected, mProgressBarHorizontal.getVisibility()); 383 } 384 385 @UiThreadTest 386 @Test 387 public void testInvalidateDrawable() { 388 ProgressBar mockProgressBar = spy(new ProgressBar(mActivity)); 389 390 Drawable mockDrawable1 = spy(new ColorDrawable(Color.RED)); 391 Drawable mockDrawable2 = spy(new ColorDrawable(Color.GREEN)); 392 mockProgressBar.setBackgroundDrawable(mockDrawable1); 393 394 mockProgressBar.invalidateDrawable(mockDrawable1); 395 verify(mockProgressBar, atLeastOnce()).invalidate(anyInt(), anyInt(), anyInt(), anyInt()); 396 397 reset(mockProgressBar); 398 mockProgressBar.invalidateDrawable(mockDrawable2); 399 verify(mockProgressBar, never()).invalidate(anyInt(), anyInt(), anyInt(), anyInt()); 400 401 mockProgressBar.setIndeterminateDrawable(mockDrawable1); 402 mockProgressBar.setProgressDrawable(mockDrawable2); 403 } 404 405 @UiThreadTest 406 @Test 407 public void testPostInvalidate() { 408 mProgressBarHorizontal.postInvalidate(); 409 } 410 411 @UiThreadTest 412 @Test 413 public void testAccessMax() { 414 // set Progress 415 int progress = 10; 416 mProgressBarHorizontal.setProgress(progress); 417 418 // normal value 419 int max = progress + 1; 420 mProgressBarHorizontal.setMax(max); 421 assertEquals(max, mProgressBarHorizontal.getMax()); 422 assertEquals(progress, mProgressBarHorizontal.getProgress()); 423 424 max = progress - 1; 425 mProgressBarHorizontal.setMax(max); 426 assertEquals(max, mProgressBarHorizontal.getMax()); 427 assertEquals(max, mProgressBarHorizontal.getProgress()); 428 429 // exceptional values 430 mProgressBarHorizontal.setMax(-1); 431 assertEquals(0, mProgressBarHorizontal.getMax()); 432 assertEquals(0, mProgressBarHorizontal.getProgress()); 433 434 mProgressBarHorizontal.setMax(Integer.MAX_VALUE); 435 assertEquals(Integer.MAX_VALUE, mProgressBarHorizontal.getMax()); 436 assertEquals(0, mProgressBarHorizontal.getProgress()); 437 } 438 439 @UiThreadTest 440 @Test 441 public void testProgressTint() { 442 ProgressBar tintedProgressBar = (ProgressBar) mActivity.findViewById(R.id.progress_tint); 443 444 assertEquals("Progress tint inflated correctly", 445 Color.WHITE, tintedProgressBar.getProgressTintList().getDefaultColor()); 446 assertEquals("Progress tint mode inflated correctly", 447 PorterDuff.Mode.SRC_OVER, tintedProgressBar.getProgressTintMode()); 448 449 assertEquals("Progress background tint inflated correctly", 450 Color.WHITE, tintedProgressBar.getProgressBackgroundTintList().getDefaultColor()); 451 assertEquals("Progress background tint mode inflated correctly", 452 PorterDuff.Mode.SRC_OVER, tintedProgressBar.getProgressBackgroundTintMode()); 453 454 assertEquals("Secondary progress tint inflated correctly", 455 Color.WHITE, tintedProgressBar.getSecondaryProgressTintList().getDefaultColor()); 456 assertEquals("Secondary progress tint mode inflated correctly", 457 PorterDuff.Mode.SRC_OVER, tintedProgressBar.getSecondaryProgressTintMode()); 458 459 Drawable mockProgressDrawable = spy(new ColorDrawable(Color.BLACK)); 460 461 mProgressBar.setProgressDrawable(mockProgressDrawable); 462 // No progress tint applied by default 463 verify(mockProgressDrawable, never()).setTintList(any(ColorStateList.class)); 464 465 mProgressBar.setProgressBackgroundTintList(ColorStateList.valueOf(Color.WHITE)); 466 // Progress background tint not applied when layer missing 467 verify(mockProgressDrawable, never()).setTintList(any(ColorStateList.class)); 468 469 mProgressBar.setSecondaryProgressTintList(ColorStateList.valueOf(Color.WHITE)); 470 // Secondary progress tint not applied when layer missing 471 verify(mockProgressDrawable, never()).setTintList(any(ColorStateList.class)); 472 473 mProgressBar.setProgressTintList(ColorStateList.valueOf(Color.WHITE)); 474 // Progress tint applied when setProgressTintList() called after setProgress() 475 verify(mockProgressDrawable, times(1)).setTintList(TestUtils.colorStateListOf(Color.WHITE)); 476 477 mProgressBar.setProgressBackgroundTintMode(PorterDuff.Mode.DST_OVER); 478 assertEquals(PorterDuff.Mode.DST_OVER, mProgressBar.getProgressBackgroundTintMode()); 479 480 mProgressBar.setSecondaryProgressTintMode(PorterDuff.Mode.DST_IN); 481 assertEquals(PorterDuff.Mode.DST_IN, mProgressBar.getSecondaryProgressTintMode()); 482 483 mProgressBar.setProgressTintMode(PorterDuff.Mode.DST_ATOP); 484 assertEquals(PorterDuff.Mode.DST_ATOP, mProgressBar.getProgressTintMode()); 485 486 reset(mockProgressDrawable); 487 mProgressBar.setProgressDrawable(null); 488 mProgressBar.setProgressDrawable(mockProgressDrawable); 489 // Progress tint applied when setProgressTintList() called before setProgress() 490 verify(mockProgressDrawable, times(1)).setTintList(TestUtils.colorStateListOf(Color.WHITE)); 491 } 492 493 @UiThreadTest 494 @Test 495 public void testProgressTintBlendMode() { 496 ProgressBar tintedProgressBar = (ProgressBar) mActivity.findViewById(R.id.progress_tint); 497 498 assertEquals("Progress tint inflated correctly", 499 Color.WHITE, tintedProgressBar.getProgressTintList().getDefaultColor()); 500 assertEquals("Progress tint mode inflated correctly", 501 BlendMode.SRC_OVER, tintedProgressBar.getProgressTintBlendMode()); 502 503 assertEquals("Progress background tint inflated correctly", 504 Color.WHITE, tintedProgressBar.getProgressBackgroundTintList().getDefaultColor()); 505 assertEquals("Progress background tint mode inflated correctly", 506 BlendMode.SRC_OVER, tintedProgressBar.getProgressBackgroundTintBlendMode()); 507 508 assertEquals("Secondary progress tint inflated correctly", 509 Color.WHITE, tintedProgressBar.getSecondaryProgressTintList().getDefaultColor()); 510 assertEquals("Secondary progress tint mode inflated correctly", 511 BlendMode.SRC_OVER, tintedProgressBar.getSecondaryProgressTintBlendMode()); 512 513 Drawable mockProgressDrawable = spy(new ColorDrawable(Color.BLACK)); 514 515 mProgressBar.setProgressDrawable(mockProgressDrawable); 516 // No progress tint applied by default 517 verify(mockProgressDrawable, never()).setTintList(any(ColorStateList.class)); 518 519 mProgressBar.setProgressBackgroundTintList(ColorStateList.valueOf(Color.WHITE)); 520 // Progress background tint not applied when layer missing 521 verify(mockProgressDrawable, never()).setTintList(any(ColorStateList.class)); 522 523 mProgressBar.setSecondaryProgressTintList(ColorStateList.valueOf(Color.WHITE)); 524 // Secondary progress tint not applied when layer missing 525 verify(mockProgressDrawable, never()).setTintList(any(ColorStateList.class)); 526 527 mProgressBar.setProgressTintList(ColorStateList.valueOf(Color.WHITE)); 528 // Progress tint applied when setProgressTintList() called after setProgress() 529 verify(mockProgressDrawable, times(1)).setTintList(TestUtils.colorStateListOf(Color.WHITE)); 530 531 mProgressBar.setProgressBackgroundTintBlendMode(BlendMode.DST_OVER); 532 assertEquals(BlendMode.DST_OVER, mProgressBar.getProgressBackgroundTintBlendMode()); 533 534 mProgressBar.setSecondaryProgressTintBlendMode(BlendMode.DST_IN); 535 assertEquals(BlendMode.DST_IN, mProgressBar.getSecondaryProgressTintBlendMode()); 536 537 mProgressBar.setProgressTintBlendMode(BlendMode.DST_ATOP); 538 assertEquals(BlendMode.DST_ATOP, mProgressBar.getProgressTintBlendMode()); 539 540 reset(mockProgressDrawable); 541 mProgressBar.setProgressDrawable(null); 542 mProgressBar.setProgressDrawable(mockProgressDrawable); 543 // Progress tint applied when setProgressTintList() called before setProgress() 544 verify(mockProgressDrawable, times(1)).setTintList(TestUtils.colorStateListOf(Color.WHITE)); 545 } 546 547 @UiThreadTest 548 @Test 549 public void testIndeterminateTint() { 550 ProgressBar tintedProgressBar = 551 (ProgressBar) mActivity.findViewById(R.id.indeterminate_tint); 552 553 assertEquals("Indeterminate tint inflated correctly", 554 Color.WHITE, tintedProgressBar.getIndeterminateTintList().getDefaultColor()); 555 assertEquals("Indeterminate tint mode inflated correctly", 556 PorterDuff.Mode.SRC_OVER, tintedProgressBar.getIndeterminateTintMode()); 557 558 Drawable mockIndeterminateDrawable = spy(new ColorDrawable(Color.MAGENTA)); 559 560 mProgressBar.setIndeterminateDrawable(mockIndeterminateDrawable); 561 // No indeterminate tint applied by default 562 verify(mockIndeterminateDrawable, never()).setTintList(any(ColorStateList.class)); 563 564 mProgressBar.setIndeterminateTintList(ColorStateList.valueOf(Color.RED)); 565 // Indeterminate tint applied when setIndeterminateTintList() called after 566 // setIndeterminate() 567 verify(mockIndeterminateDrawable, times(1)).setTintList( 568 TestUtils.colorStateListOf(Color.RED)); 569 570 mProgressBar.setIndeterminateTintMode(PorterDuff.Mode.LIGHTEN); 571 assertEquals(PorterDuff.Mode.LIGHTEN, mProgressBar.getIndeterminateTintMode()); 572 573 reset(mockIndeterminateDrawable); 574 mProgressBar.setIndeterminateDrawable(null); 575 mProgressBar.setIndeterminateDrawable(mockIndeterminateDrawable); 576 // Indeterminate tint applied when setIndeterminateTintList() called before 577 // setIndeterminate() 578 verify(mockIndeterminateDrawable, times(1)).setTintList( 579 TestUtils.colorStateListOf(Color.RED)); 580 } 581 582 @UiThreadTest 583 @Test 584 public void testIndeterminateTintBlendMode() { 585 ProgressBar tintedProgressBar = 586 (ProgressBar) mActivity.findViewById(R.id.indeterminate_tint); 587 588 assertEquals("Indeterminate tint inflated correctly", 589 Color.WHITE, tintedProgressBar.getIndeterminateTintList().getDefaultColor()); 590 assertEquals("Indeterminate tint mode inflated correctly", 591 BlendMode.SRC_OVER, tintedProgressBar.getIndeterminateTintBlendMode()); 592 593 Drawable mockIndeterminateDrawable = spy(new ColorDrawable(Color.MAGENTA)); 594 595 mProgressBar.setIndeterminateDrawable(mockIndeterminateDrawable); 596 // No indeterminate tint applied by default 597 verify(mockIndeterminateDrawable, never()).setTintList(any(ColorStateList.class)); 598 599 mProgressBar.setIndeterminateTintList(ColorStateList.valueOf(Color.RED)); 600 // Indeterminate tint applied when setIndeterminateTintList() called after 601 // setIndeterminate() 602 verify(mockIndeterminateDrawable, times(1)).setTintList( 603 TestUtils.colorStateListOf(Color.RED)); 604 605 mProgressBar.setIndeterminateTintBlendMode(BlendMode.LIGHTEN); 606 assertEquals(BlendMode.LIGHTEN, mProgressBar.getIndeterminateTintBlendMode()); 607 608 reset(mockIndeterminateDrawable); 609 mProgressBar.setIndeterminateDrawable(null); 610 mProgressBar.setIndeterminateDrawable(mockIndeterminateDrawable); 611 // Indeterminate tint applied when setIndeterminateTintList() called before 612 // setIndeterminate() 613 verify(mockIndeterminateDrawable, times(1)).setTintList( 614 TestUtils.colorStateListOf(Color.RED)); 615 } 616 617 @UiThreadTest 618 @Test 619 public void testVerifyDrawable() { 620 MockProgressBar mockProgressBar = 621 (MockProgressBar) mActivity.findViewById(R.id.progress_custom); 622 623 Drawable d1 = mActivity.getDrawable(R.drawable.blue); 624 Drawable d2 = mActivity.getDrawable(R.drawable.red); 625 Drawable d3 = mActivity.getDrawable(R.drawable.yellow); 626 627 mockProgressBar.setBackgroundDrawable(d1); 628 assertTrue(mockProgressBar.verifyDrawable(d1)); 629 assertFalse(mockProgressBar.verifyDrawable(d2)); 630 assertFalse(mockProgressBar.verifyDrawable(d3)); 631 632 mockProgressBar.setIndeterminateDrawable(d2); 633 assertTrue(mockProgressBar.verifyDrawable(d1)); 634 assertTrue(mockProgressBar.verifyDrawable(d2)); 635 assertFalse(mockProgressBar.verifyDrawable(d3)); 636 637 mockProgressBar.setProgressDrawable(d3); 638 assertTrue(mockProgressBar.verifyDrawable(d1)); 639 assertTrue(mockProgressBar.verifyDrawable(d2)); 640 assertTrue(mockProgressBar.verifyDrawable(d3)); 641 } 642 643 @UiThreadTest 644 @Test 645 public void testOnSaveAndRestoreInstanceState() { 646 int oldProgress = 1; 647 int oldSecondaryProgress = mProgressBarHorizontal.getMax() - 1; 648 mProgressBarHorizontal.setProgress(oldProgress); 649 mProgressBarHorizontal.setSecondaryProgress(oldSecondaryProgress); 650 assertEquals(oldProgress, mProgressBarHorizontal.getProgress()); 651 assertEquals(oldSecondaryProgress, mProgressBarHorizontal.getSecondaryProgress()); 652 653 Parcelable state = mProgressBarHorizontal.onSaveInstanceState(); 654 655 int newProgress = 2; 656 int newSecondaryProgress = mProgressBarHorizontal.getMax() - 2; 657 mProgressBarHorizontal.setProgress(newProgress); 658 mProgressBarHorizontal.setSecondaryProgress(newSecondaryProgress); 659 assertEquals(newProgress, mProgressBarHorizontal.getProgress()); 660 assertEquals(newSecondaryProgress, mProgressBarHorizontal.getSecondaryProgress()); 661 662 mProgressBarHorizontal.onRestoreInstanceState(state); 663 assertEquals(oldProgress, mProgressBarHorizontal.getProgress()); 664 assertEquals(oldSecondaryProgress, mProgressBarHorizontal.getSecondaryProgress()); 665 } 666 667 @UiThreadTest 668 @Test 669 public void testGetAndSetMinWidth() { 670 final int minWidth = 20; 671 mProgressBar.setMinWidth(minWidth); 672 assertEquals(minWidth, mProgressBar.getMinWidth()); 673 } 674 675 @UiThreadTest 676 @Test 677 public void testGetAndSetMaxWidth() { 678 final int maxWidth = 20; 679 mProgressBar.setMaxWidth(maxWidth); 680 assertEquals(maxWidth, mProgressBar.getMaxWidth()); 681 } 682 683 @UiThreadTest 684 @Test 685 public void testGetAndSetMinHeight() { 686 final int minHeight = 20; 687 mProgressBar.setMinHeight(minHeight); 688 assertEquals(minHeight, mProgressBar.getMinHeight()); 689 } 690 691 @UiThreadTest 692 @Test 693 public void testGetAndSetMaxHeight() { 694 final int maxHeight = 20; 695 mProgressBar.setMaxHeight(maxHeight); 696 assertEquals(maxHeight, mProgressBar.getMaxHeight()); 697 } 698 699 /* 700 * Mock class for ProgressBar to test protected methods 701 */ 702 public static class MockProgressBar extends ProgressBar { 703 public MockProgressBar(Context context) { 704 super(context); 705 } 706 707 public MockProgressBar(Context context, AttributeSet attrs) { 708 super(context, attrs); 709 } 710 711 @Override 712 protected boolean verifyDrawable(Drawable who) { 713 return super.verifyDrawable(who); 714 } 715 } 716 } 717