| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.widget.cts; |
| |
| import com.android.cts.stub.R; |
| |
| import dalvik.annotation.BrokenTest; |
| import dalvik.annotation.TestLevel; |
| import dalvik.annotation.TestTargetClass; |
| import dalvik.annotation.TestTargetNew; |
| import dalvik.annotation.TestTargets; |
| import dalvik.annotation.ToBeFixed; |
| |
| import android.content.Context; |
| import android.content.res.Resources.NotFoundException; |
| import android.graphics.Canvas; |
| import android.graphics.ColorFilter; |
| import android.graphics.drawable.Drawable; |
| import android.os.Parcelable; |
| import android.test.InstrumentationTestCase; |
| import android.view.View; |
| import android.view.animation.AccelerateDecelerateInterpolator; |
| import android.view.animation.CycleInterpolator; |
| import android.view.animation.Interpolator; |
| import android.view.animation.LinearInterpolator; |
| import android.widget.ProgressBar; |
| |
| @TestTargetClass(ProgressBar.class) |
| public class ProgressBarTest extends InstrumentationTestCase { |
| // The target context. |
| private Context mContext; |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| mContext = getInstrumentation().getTargetContext(); |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "ProgressBar", |
| args = {android.content.Context.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "ProgressBar", |
| args = {android.content.Context.class, android.util.AttributeSet.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "ProgressBar", |
| args = {android.content.Context.class, android.util.AttributeSet.class, int.class} |
| ) |
| }) |
| public void testConstructor() { |
| new ProgressBar(mContext); |
| |
| new ProgressBar(mContext, null); |
| |
| new ProgressBar(mContext, null, com.android.internal.R.attr.progressBarStyle); |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "setIndeterminate", |
| args = {boolean.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "isIndeterminate", |
| args = {} |
| ) |
| }) |
| public void testSetIndeterminate() { |
| ProgressBar progressBar = new ProgressBar(mContext); |
| assertTrue(progressBar.isIndeterminate()); |
| |
| progressBar.setIndeterminate(true); |
| assertTrue(progressBar.isIndeterminate()); |
| |
| progressBar.setIndeterminate(false); |
| // because default is Indeterminate only progressBar, can't change the status |
| assertTrue(progressBar.isIndeterminate()); |
| |
| progressBar = new ProgressBar(mContext, null, |
| com.android.internal.R.attr.progressBarStyleHorizontal); |
| assertFalse(progressBar.isIndeterminate()); |
| |
| progressBar.setIndeterminate(true); |
| assertTrue(progressBar.isIndeterminate()); |
| |
| progressBar.setIndeterminate(false); |
| assertFalse(progressBar.isIndeterminate()); |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "getIndeterminateDrawable", |
| args = {} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "setIndeterminateDrawable", |
| args = {android.graphics.drawable.Drawable.class} |
| ) |
| }) |
| public void testAccessIndeterminateDrawable() { |
| ProgressBar progressBar = new ProgressBar(mContext); |
| |
| // set IndeterminateDrawable |
| // normal value |
| MockDrawable mockDrawable = new MockDrawable(); |
| progressBar.setIndeterminateDrawable(mockDrawable); |
| assertSame(mockDrawable, progressBar.getIndeterminateDrawable()); |
| assertFalse(mockDrawable.hasCalledDraw()); |
| progressBar.draw(new Canvas()); |
| assertTrue(mockDrawable.hasCalledDraw()); |
| |
| // exceptional value |
| progressBar.setIndeterminateDrawable(null); |
| assertNull(progressBar.getIndeterminateDrawable()); |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "getProgressDrawable", |
| args = {} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "setProgressDrawable", |
| args = {android.graphics.drawable.Drawable.class} |
| ) |
| }) |
| public void testAccessProgressDrawable() { |
| ProgressBar progressBar = new ProgressBar(mContext, null, |
| com.android.internal.R.attr.progressBarStyleHorizontal); |
| |
| // set ProgressDrawable |
| // normal value |
| MockDrawable mockDrawable = new MockDrawable(); |
| progressBar.setProgressDrawable(mockDrawable); |
| assertSame(mockDrawable, progressBar.getProgressDrawable()); |
| assertFalse(mockDrawable.hasCalledDraw()); |
| progressBar.draw(new Canvas()); |
| assertTrue(mockDrawable.hasCalledDraw()); |
| |
| // exceptional value |
| progressBar.setProgressDrawable(null); |
| assertNull(progressBar.getProgressDrawable()); |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "getProgress", |
| args = {} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "setProgress", |
| args = {int.class} |
| ) |
| }) |
| public void testAccessProgress() { |
| ProgressBar progressBar = new ProgressBar(mContext, null, |
| com.android.internal.R.attr.progressBarStyleHorizontal); |
| assertEquals(0, progressBar.getProgress()); |
| |
| final int maxProgress = progressBar.getMax(); |
| // set Progress |
| // normal value |
| progressBar.setProgress(maxProgress >> 1); |
| assertEquals(maxProgress >> 1, progressBar.getProgress()); |
| |
| // exceptional values |
| progressBar.setProgress(-1); |
| assertEquals(0, progressBar.getProgress()); |
| |
| progressBar.setProgress(maxProgress + 1); |
| assertEquals(maxProgress, progressBar.getProgress()); |
| |
| progressBar.setProgress(Integer.MAX_VALUE); |
| assertEquals(maxProgress, progressBar.getProgress()); |
| |
| // when in indeterminate mode |
| progressBar.setIndeterminate(true); |
| progressBar.setProgress(maxProgress >> 1); |
| assertEquals(0, progressBar.getProgress()); |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "getSecondaryProgress", |
| args = {} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "setSecondaryProgress", |
| args = {int.class} |
| ) |
| }) |
| public void testAccessSecondaryProgress() { |
| ProgressBar progressBar = new ProgressBar(mContext, null, |
| com.android.internal.R.attr.progressBarStyleHorizontal); |
| assertEquals(0, progressBar.getSecondaryProgress()); |
| |
| final int maxProgress = progressBar.getMax(); |
| // set SecondaryProgress |
| // normal value |
| progressBar.setSecondaryProgress(maxProgress >> 1); |
| assertEquals(maxProgress >> 1, progressBar.getSecondaryProgress()); |
| |
| // exceptional value |
| progressBar.setSecondaryProgress(-1); |
| assertEquals(0, progressBar.getSecondaryProgress()); |
| |
| progressBar.setSecondaryProgress(maxProgress + 1); |
| assertEquals(maxProgress, progressBar.getSecondaryProgress()); |
| |
| progressBar.setSecondaryProgress(Integer.MAX_VALUE); |
| assertEquals(maxProgress, progressBar.getSecondaryProgress()); |
| |
| // when in indeterminate mode |
| progressBar.setIndeterminate(true); |
| progressBar.setSecondaryProgress(maxProgress >> 1); |
| assertEquals(0, progressBar.getSecondaryProgress()); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "incrementProgressBy", |
| args = {int.class} |
| ) |
| public void testIncrementProgressBy() { |
| ProgressBar progressBar = new ProgressBar(mContext, null, |
| com.android.internal.R.attr.progressBarStyleHorizontal); |
| |
| // normal value |
| int increment = 1; |
| int oldProgress = progressBar.getProgress(); |
| progressBar.incrementProgressBy(increment); |
| assertEquals(oldProgress + increment, progressBar.getProgress()); |
| |
| increment = progressBar.getMax() >> 1; |
| oldProgress = progressBar.getProgress(); |
| progressBar.incrementProgressBy(increment); |
| assertEquals(oldProgress + increment, progressBar.getProgress()); |
| |
| // exceptional values |
| progressBar.setProgress(0); |
| progressBar.incrementProgressBy(Integer.MAX_VALUE); |
| assertEquals(progressBar.getMax(), progressBar.getProgress()); |
| |
| progressBar.setProgress(0); |
| progressBar.incrementProgressBy(Integer.MIN_VALUE); |
| assertEquals(0, progressBar.getProgress()); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "incrementSecondaryProgressBy", |
| args = {int.class} |
| ) |
| public void testIncrementSecondaryProgressBy() { |
| ProgressBar progressBar = new ProgressBar(mContext, null, |
| com.android.internal.R.attr.progressBarStyleHorizontal); |
| |
| // normal value |
| int increment = 1; |
| int oldSecondaryProgress = progressBar.getSecondaryProgress(); |
| progressBar.incrementSecondaryProgressBy(increment); |
| assertEquals(oldSecondaryProgress + increment, progressBar.getSecondaryProgress()); |
| |
| increment = progressBar.getMax() >> 1; |
| oldSecondaryProgress = progressBar.getSecondaryProgress(); |
| progressBar.incrementSecondaryProgressBy(increment); |
| assertEquals(oldSecondaryProgress + increment, progressBar.getSecondaryProgress()); |
| |
| // exceptional values |
| progressBar.setSecondaryProgress(0); |
| progressBar.incrementSecondaryProgressBy(Integer.MAX_VALUE); |
| assertEquals(progressBar.getMax(), progressBar.getSecondaryProgress()); |
| |
| progressBar.setSecondaryProgress(0); |
| progressBar.incrementSecondaryProgressBy(Integer.MIN_VALUE); |
| assertEquals(0, progressBar.getSecondaryProgress()); |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "setInterpolator", |
| args = {android.view.animation.Interpolator.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "getInterpolator", |
| args = {} |
| ) |
| }) |
| public void testAccessInterpolator() { |
| ProgressBar progressBar = new ProgressBar(mContext, null, |
| com.android.internal.R.attr.progressBarStyle); |
| |
| // default should be LinearInterpolator |
| assertTrue(progressBar.getInterpolator() instanceof LinearInterpolator); |
| |
| // normal value |
| Interpolator i = new AccelerateDecelerateInterpolator(); |
| progressBar.setInterpolator(i); |
| assertEquals(i, progressBar.getInterpolator()); |
| |
| // exceptional value |
| progressBar.setInterpolator(null); |
| assertNull(progressBar.getInterpolator()); |
| |
| // TODO: test whether setInterpolator takes effect? How to get the animation? |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "setInterpolator", |
| args = {android.content.Context.class, int.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "getInterpolator", |
| args = {} |
| ) |
| }) |
| @ToBeFixed(bug = "1695243", explanation = "the javadoc for setInterpolator() is incomplete." + |
| "1. not clear what is supposed to happen if context or resID is exceptional.") |
| @BrokenTest("Initial setInterpolator() call occasionally fails with NPE. context null?") |
| public void testAccessInterpolatorContext() { |
| ProgressBar progressBar = new ProgressBar(mContext, null, |
| com.android.internal.R.attr.progressBarStyle); |
| |
| // default is LinearInterpolator |
| assertTrue(progressBar.getInterpolator() instanceof LinearInterpolator); |
| |
| // normal value |
| progressBar.setInterpolator(mContext.getApplicationContext(), R.anim.move_cycle); |
| assertTrue(progressBar.getInterpolator() instanceof CycleInterpolator); |
| |
| // exceptional value |
| try { |
| progressBar.setInterpolator(null, R.anim.move_ani); |
| fail("Should throw NullPointerException"); |
| } catch (NullPointerException e) { |
| // issue 1695243, not clear what is supposed to happen if context is null. |
| } |
| |
| try { |
| progressBar.setInterpolator(mContext.getApplicationContext(), -1); |
| fail("Should throw NotFoundException"); |
| } catch (NotFoundException e) { |
| // issue 1695243, not clear what is supposed to happen if resID is exceptional. |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "setVisibility", |
| args = {int.class} |
| ) |
| @ToBeFixed(bug = "1695243", explanation = "the javadoc for setVisibility() is incomplete." + |
| "1. not clear what is supposed result if visibility isn't VISIBLE, INVISIBLE or GONE.") |
| public void testSetVisibility() { |
| ProgressBar progressBar = new ProgressBar(mContext, null, |
| com.android.internal.R.attr.progressBarStyleHorizontal); |
| |
| // set visibility |
| // normal value |
| int visibility = View.VISIBLE; |
| progressBar.setVisibility(visibility); |
| assertEquals(visibility, progressBar.getVisibility()); |
| |
| visibility = View.GONE; |
| progressBar.setVisibility(visibility); |
| assertEquals(visibility, progressBar.getVisibility()); |
| |
| // exceptional value |
| visibility = 0xfffffff5; // -11 |
| int mask = 0x0000000C; // View.VISIBILITY_MASK |
| int expected = (progressBar.getVisibility() & ~mask) | (visibility & mask); |
| progressBar.setVisibility(visibility); |
| assertEquals(expected, progressBar.getVisibility()); |
| |
| visibility = 0x7fffffff; // Integer.MAX_VALUE; |
| expected = (progressBar.getVisibility() & ~mask) | (visibility & mask); |
| progressBar.setVisibility(Integer.MAX_VALUE); |
| assertEquals(expected, progressBar.getVisibility()); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "invalidateDrawable", |
| args = {android.graphics.drawable.Drawable.class} |
| ) |
| @ToBeFixed(bug = "1695243", explanation = "the javadoc for invalidateDrawable() is incomplete." + |
| "1. not clear what is supposed to happen if drawable is null.") |
| public void testInvalidateDrawable() { |
| MockProgressBar mockProgressBar = new MockProgressBar(mContext); |
| |
| MockDrawable mockDrawable1 = new MockDrawable(); |
| MockDrawable mockDrawable2 = new MockDrawable(); |
| mockProgressBar.setBackgroundDrawable(mockDrawable1); |
| |
| mockProgressBar.invalidateDrawable(mockDrawable1); |
| assertTrue(mockProgressBar.hasCalledInvalidate()); |
| |
| mockProgressBar.reset(); |
| mockProgressBar.invalidateDrawable(mockDrawable2); |
| assertFalse(mockProgressBar.hasCalledInvalidate()); |
| |
| try { |
| mockProgressBar.invalidateDrawable(null); |
| fail("Should throw NullPointerException"); |
| } catch (NullPointerException e) { |
| // issue 1695243, not clear what is supposed to happen if drawable is null. |
| } |
| |
| mockProgressBar.setIndeterminateDrawable(mockDrawable1); |
| mockProgressBar.setProgressDrawable(mockDrawable2); |
| |
| mockProgressBar.invalidateDrawable(null); |
| assertFalse(mockProgressBar.hasCalledInvalidate()); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "postInvalidate", |
| args = {} |
| ) |
| public void testPostInvalidate() { |
| MockProgressBar mockProgressBar = new MockProgressBar(mContext); |
| mockProgressBar.postInvalidate(); |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "getMax", |
| args = {} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "setMax", |
| args = {int.class} |
| ) |
| }) |
| public void testAccessMax() { |
| ProgressBar progressBar = new ProgressBar(mContext, null, |
| com.android.internal.R.attr.progressBarStyleHorizontal); |
| |
| // set Progress |
| int progress = 10; |
| progressBar.setProgress(progress); |
| |
| // normal value |
| int max = progress + 1; |
| progressBar.setMax(max); |
| assertEquals(max, progressBar.getMax()); |
| assertEquals(progress, progressBar.getProgress()); |
| |
| max = progress - 1; |
| progressBar.setMax(max); |
| assertEquals(max, progressBar.getMax()); |
| assertEquals(max, progressBar.getProgress()); |
| |
| // exceptional values |
| progressBar.setMax(-1); |
| assertEquals(0, progressBar.getMax()); |
| assertEquals(0, progressBar.getProgress()); |
| |
| progressBar.setMax(Integer.MAX_VALUE); |
| assertEquals(Integer.MAX_VALUE, progressBar.getMax()); |
| assertEquals(0, progressBar.getProgress()); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.NOT_NECESSARY, |
| method = "onDraw", |
| args = {android.graphics.Canvas.class} |
| ) |
| public void testOnDraw() { |
| // Do not test, it's controlled by View. Implementation details |
| } |
| |
| private class MockDrawable extends Drawable { |
| private boolean mCalledDraw = false; |
| |
| @Override |
| public void draw(Canvas canvas) { |
| mCalledDraw = true; |
| } |
| |
| @Override |
| public int getOpacity() { |
| return 0; |
| } |
| |
| @Override |
| public void setAlpha(int alpha) { |
| } |
| |
| @Override |
| public void setColorFilter(ColorFilter cf) { |
| } |
| |
| public boolean hasCalledDraw() { |
| return mCalledDraw; |
| } |
| |
| public void reset() { |
| mCalledDraw = false; |
| } |
| |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.NOT_NECESSARY, |
| method = "onMeasure", |
| args = {int.class, int.class} |
| ) |
| public void testOnMeasure() { |
| // onMeasure() is implementation details, do NOT test |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.NOT_NECESSARY, |
| method = "onSizeChanged", |
| args = {int.class, int.class, int.class, int.class} |
| ) |
| public void testOnSizeChange() { |
| // onSizeChanged() is implementation details, do NOT test |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "verifyDrawable", |
| args = {android.graphics.drawable.Drawable.class} |
| ) |
| public void testVerifyDrawable() { |
| MockProgressBar mockProgressBar = new MockProgressBar(mContext); |
| assertTrue(mockProgressBar.verifyDrawable(null)); |
| |
| Drawable d1 = mContext.getResources().getDrawable(R.drawable.blue); |
| Drawable d2 = mContext.getResources().getDrawable(R.drawable.red); |
| Drawable d3 = mContext.getResources().getDrawable(R.drawable.yellow); |
| |
| mockProgressBar.setBackgroundDrawable(d1); |
| assertTrue(mockProgressBar.verifyDrawable(null)); |
| assertTrue(mockProgressBar.verifyDrawable(d1)); |
| assertFalse(mockProgressBar.verifyDrawable(d2)); |
| assertFalse(mockProgressBar.verifyDrawable(d3)); |
| |
| mockProgressBar.setIndeterminateDrawable(d2); |
| assertTrue(mockProgressBar.verifyDrawable(null)); |
| assertTrue(mockProgressBar.verifyDrawable(d1)); |
| assertTrue(mockProgressBar.verifyDrawable(d2)); |
| assertFalse(mockProgressBar.verifyDrawable(d3)); |
| |
| mockProgressBar.setProgressDrawable(d3); |
| assertFalse(mockProgressBar.verifyDrawable(null)); |
| assertTrue(mockProgressBar.verifyDrawable(d1)); |
| assertTrue(mockProgressBar.verifyDrawable(d2)); |
| assertTrue(mockProgressBar.verifyDrawable(d3)); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.NOT_NECESSARY, |
| method = "drawableStateChanged", |
| args = {} |
| ) |
| public void testDrawableStateChanged() { |
| // drawableStateChanged() is implementation details, do NOT test |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "onRestoreInstanceState", |
| args = {android.os.Parcelable.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "onSaveInstanceState", |
| args = {} |
| ) |
| }) |
| public void testOnSaveAndRestoreInstanceState() { |
| ProgressBar progressBar = new ProgressBar(mContext, null, |
| com.android.internal.R.attr.progressBarStyleHorizontal); |
| int oldProgress = 1; |
| int oldSecondaryProgress = progressBar.getMax() - 1; |
| progressBar.setProgress(oldProgress); |
| progressBar.setSecondaryProgress(oldSecondaryProgress); |
| assertEquals(oldProgress, progressBar.getProgress()); |
| assertEquals(oldSecondaryProgress, progressBar.getSecondaryProgress()); |
| |
| Parcelable state = progressBar.onSaveInstanceState(); |
| |
| int newProgress = 2; |
| int newSecondaryProgress = progressBar.getMax() - 2; |
| progressBar.setProgress(newProgress); |
| progressBar.setSecondaryProgress(newSecondaryProgress); |
| assertEquals(newProgress, progressBar.getProgress()); |
| assertEquals(newSecondaryProgress, progressBar.getSecondaryProgress()); |
| |
| progressBar.onRestoreInstanceState(state); |
| assertEquals(oldProgress, progressBar.getProgress()); |
| assertEquals(oldSecondaryProgress, progressBar.getSecondaryProgress()); |
| } |
| |
| /* |
| * Mock class for ProgressBar to test protected methods |
| */ |
| private class MockProgressBar extends ProgressBar { |
| private boolean mCalledInvalidate = false; |
| |
| /** |
| * @param context |
| */ |
| public MockProgressBar(Context context) { |
| super(context); |
| } |
| |
| @Override |
| protected boolean verifyDrawable(Drawable who) { |
| return super.verifyDrawable(who); |
| } |
| |
| @Override |
| protected void onSizeChanged(int w, int h, int oldw, int oldh) { |
| super.onSizeChanged(w, h, oldw, oldh); |
| } |
| |
| @Override |
| protected synchronized void onMeasure(int widthMeasureSpec, |
| int heightMeasureSpec) { |
| super.onMeasure(widthMeasureSpec, heightMeasureSpec); |
| } |
| |
| @Override |
| protected synchronized void onDraw(Canvas canvas) { |
| super.onDraw(canvas); |
| } |
| |
| @Override |
| protected void drawableStateChanged() { |
| super.drawableStateChanged(); |
| } |
| |
| public void invalidate(int l, int t, int r, int b) { |
| mCalledInvalidate = true; |
| super.invalidate(l, t, r, b); |
| } |
| |
| public void invalidate() { |
| mCalledInvalidate = true; |
| super.invalidate(); |
| } |
| |
| public boolean hasCalledInvalidate() { |
| return mCalledInvalidate; |
| } |
| |
| public void reset() { |
| mCalledInvalidate = false; |
| } |
| } |
| } |