Merge "Increase CTS coverage for ColorStateListDrawable"
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ColorStateListDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ColorStateListDrawableTest.java
index 7487e55..5218a4fd 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ColorStateListDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ColorStateListDrawableTest.java
@@ -18,15 +18,21 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import android.R;
 import android.content.res.ColorStateList;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.LightingColorFilter;
 import android.graphics.PixelFormat;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.ColorStateListDrawable;
 import android.graphics.drawable.Drawable;
+import android.os.SystemClock;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
@@ -78,6 +84,15 @@
     }
 
     @Test
+    public void testHasFocusStateSpecified() {
+        assertFalse(mDrawable.hasFocusStateSpecified());
+        final int[][] state = new int[][]{new int[]{1}, new int[]{2, R.attr.state_focused}};
+        final int[] colors = new int[]{Color.MAGENTA, Color.CYAN};
+        mDrawable.setColorStateList(new ColorStateList(state, colors));
+        assertTrue(mDrawable.hasFocusStateSpecified());
+    }
+
+    @Test
     public void testAlpha() {
         int transBlue = (Color.BLUE & 0xFFFFFF) | 127 << 24;
         mDrawable.setColorStateList(ColorStateList.valueOf(transBlue));
@@ -99,6 +114,31 @@
     }
 
     @Test
+    public void testColorFilter() {
+        final ColorDrawable colorDrawable = (ColorDrawable) mDrawable.getCurrent();
+        final ColorFilter colorFilter = new LightingColorFilter(Color.GRAY, Color.GREEN);
+
+        assertNull(mDrawable.getColorFilter());
+        mDrawable.setColorFilter(colorFilter);
+        assertEquals(colorFilter, mDrawable.getColorFilter());
+    }
+
+    @Test
+    public void testColorStateListAccess() {
+        final ColorStateListDrawable cslDrawable = new ColorStateListDrawable();
+        final ColorDrawable colorDrawable = (ColorDrawable) cslDrawable.getCurrent();
+        assertNotNull(cslDrawable.getColorStateList());
+        assertEquals(
+                colorDrawable.getColor(),
+                cslDrawable
+                        .getColorStateList()
+                        .getColorForState(cslDrawable.getState(), Color.YELLOW));
+
+        cslDrawable.setColorStateList(mColorStateList);
+        assertEquals(mColorStateList, cslDrawable.getColorStateList());
+    }
+
+    @Test
     public void testSetState() {
         ColorDrawable colorDrawable = (ColorDrawable) mDrawable.getCurrent();
         assertEquals(colorDrawable.getColor(), mColorStateList.getDefaultColor());
@@ -114,4 +154,79 @@
         assertEquals(mDrawable.mutate(), mDrawable);
         assertNotEquals(mDrawable.getConstantState(), oldState);
     }
+
+    @Test
+    public void testInvalidationCallbackProxy() {
+        final TestCallback callback = new TestCallback();
+        mDrawable.setCallback(callback);
+
+        callback.mInvalidatedDrawable = null;
+        mDrawable.invalidateSelf();
+        assertEquals(mDrawable, callback.mInvalidatedDrawable);
+
+        callback.mInvalidatedDrawable = null;
+        mDrawable.getCurrent().invalidateSelf();
+        assertEquals(mDrawable, callback.mInvalidatedDrawable);
+    }
+
+    @Test
+    public void testScheduleCallbackProxy() {
+        final Runnable runnable = new NoOpRunnable();
+        final long scheduledTime = SystemClock.uptimeMillis() + 100;
+        final TestCallback callback = new TestCallback();
+        mDrawable.setCallback(callback);
+
+        mDrawable.getCurrent().scheduleSelf(runnable, scheduledTime);
+        assertEquals(mDrawable, callback.mScheduledDrawable);
+        assertEquals(runnable, callback.mScheduledRunnable);
+        assertEquals(scheduledTime, callback.mScheduledTime);
+    }
+
+    @Test
+    public void testUnscheduleCallbackProxy() {
+        final Runnable runnable = new NoOpRunnable();
+        final TestCallback callback = new TestCallback();
+        mDrawable.setCallback(callback);
+
+        mDrawable.getCurrent().unscheduleSelf(runnable);
+
+        assertEquals(mDrawable, callback.mUnscheduledDrawable);
+        assertEquals(runnable, callback.mUnscheduledRunnable);
+    }
+
+    private final class TestCallback implements Drawable.Callback {
+        private Drawable mInvalidatedDrawable;
+        private Drawable mScheduledDrawable;
+        private Drawable mUnscheduledDrawable;
+
+        private Runnable mScheduledRunnable;
+        private Runnable mUnscheduledRunnable;
+
+        private long mScheduledTime;
+
+        @Override
+        public void invalidateDrawable(Drawable who) {
+            mInvalidatedDrawable = who;
+        }
+
+        @Override
+        public void scheduleDrawable(Drawable who, Runnable what, long when) {
+            mScheduledDrawable = who;
+            mScheduledRunnable = what;
+            mScheduledTime = when;
+        }
+
+        @Override
+        public void unscheduleDrawable(Drawable who, Runnable what) {
+            mUnscheduledDrawable = who;
+            mUnscheduledRunnable = what;
+        }
+    }
+
+    private final class NoOpRunnable implements Runnable {
+        @Override
+        public void run() {
+
+        }
+    }
 }