add sample for using colorfilters
diff --git a/samples/ApiDemos/AndroidManifest.xml b/samples/ApiDemos/AndroidManifest.xml
index fb34afa..9d25512 100644
--- a/samples/ApiDemos/AndroidManifest.xml
+++ b/samples/ApiDemos/AndroidManifest.xml
@@ -1562,6 +1562,13 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".graphics.ColorFilters" android:label="Graphics/ColorFilters">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
         <activity android:name=".graphics.CreateBitmap" android:label="Graphics/CreateBitmap">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/samples/ApiDemos/res/drawable/btn_check_off.png b/samples/ApiDemos/res/drawable/btn_check_off.png
new file mode 100644
index 0000000..56d3861
--- /dev/null
+++ b/samples/ApiDemos/res/drawable/btn_check_off.png
Binary files differ
diff --git a/samples/ApiDemos/res/drawable/btn_check_on.png b/samples/ApiDemos/res/drawable/btn_check_on.png
new file mode 100644
index 0000000..791ac1d
--- /dev/null
+++ b/samples/ApiDemos/res/drawable/btn_check_on.png
Binary files differ
diff --git a/samples/ApiDemos/res/drawable/btn_circle_normal.png b/samples/ApiDemos/res/drawable/btn_circle_normal.png
new file mode 100644
index 0000000..fc5af1c
--- /dev/null
+++ b/samples/ApiDemos/res/drawable/btn_circle_normal.png
Binary files differ
diff --git a/samples/ApiDemos/res/drawable/btn_default_normal.9.png b/samples/ApiDemos/res/drawable/btn_default_normal.9.png
new file mode 100644
index 0000000..a2d5ccd
--- /dev/null
+++ b/samples/ApiDemos/res/drawable/btn_default_normal.9.png
Binary files differ
diff --git a/samples/ApiDemos/src/com/example/android/apis/graphics/ColorFilters.java b/samples/ApiDemos/src/com/example/android/apis/graphics/ColorFilters.java
new file mode 100644
index 0000000..92d18ba
--- /dev/null
+++ b/samples/ApiDemos/src/com/example/android/apis/graphics/ColorFilters.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2009 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 com.example.android.apis.graphics;
+
+import com.example.android.apis.R;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.*;
+import android.graphics.drawable.*;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.*;
+
+public class ColorFilters extends GraphicsActivity {
+    
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(new SampleView(this));
+        
+    }
+    
+    private static class SampleView extends View {
+        private Activity mActivity;
+        private Drawable mDrawable;
+        private Drawable[] mDrawables;
+        private Paint mPaint;
+        private Paint mPaint2;
+        private float mPaintTextOffset;
+        private int[] mColors;
+        private PorterDuff.Mode[] mModes;
+        private int mModeIndex;
+
+        private static void addToTheRight(Drawable curr, Drawable prev) {
+            Rect r = prev.getBounds();
+            int x = r.right + 12;
+            int center = (r.top + r.bottom) >> 1;
+            int h = curr.getIntrinsicHeight();
+            int y = center - (h >> 1);
+            
+            curr.setBounds(x, y, x + curr.getIntrinsicWidth(), y + h);
+        }
+
+        public SampleView(Activity activity) {
+            super(activity);
+            mActivity = activity;
+            Context context = activity;
+            setFocusable(true);
+            
+            mDrawable = context.getResources().getDrawable(R.drawable.btn_default_normal);
+            mDrawable.setBounds(0, 0, 150, 48);
+            mDrawable.setDither(true);
+
+            int[] resIDs = new int[] {
+                R.drawable.btn_circle_normal,
+                R.drawable.btn_check_off,
+                R.drawable.btn_check_on
+            };
+            mDrawables = new Drawable[resIDs.length];
+            Drawable prev = mDrawable;
+            for (int i = 0; i < resIDs.length; i++) {
+                mDrawables[i] = context.getResources().getDrawable(resIDs[i]);
+                mDrawables[i].setDither(true);
+                addToTheRight(mDrawables[i], prev);
+                prev = mDrawables[i];
+            }
+
+            mPaint = new Paint();
+            mPaint.setAntiAlias(true);
+            mPaint.setTextSize(16);
+            mPaint.setTextAlign(Paint.Align.CENTER);
+            
+            mPaint2 = new Paint(mPaint);
+            mPaint2.setAlpha(64);
+            
+            Paint.FontMetrics fm = mPaint.getFontMetrics();
+            mPaintTextOffset = (fm.descent + fm.ascent) * 0.5f;
+            
+            mColors = new int[] {
+                0,
+                0xCC0000FF,
+                0x880000FF,
+                0x440000FF,
+                0xFFCCCCFF,
+                0xFF8888FF,
+                0xFF4444FF,
+            };
+
+            mModes = new PorterDuff.Mode[] {
+                PorterDuff.Mode.SRC_ATOP,
+                PorterDuff.Mode.MULTIPLY,
+            };
+            mModeIndex = 0;
+            
+            updateTitle();
+        }
+        
+        private void swapPaintColors() {
+            if (mPaint.getColor() == 0xFF000000) {
+                mPaint.setColor(0xFFFFFFFF);
+                mPaint2.setColor(0xFF000000);
+            } else {
+                mPaint.setColor(0xFF000000);
+                mPaint2.setColor(0xFFFFFFFF);
+            }
+            mPaint2.setAlpha(64);
+        }
+        
+        private void updateTitle() {
+            mActivity.setTitle(mModes[mModeIndex].toString());
+        }
+        
+        private void drawSample(Canvas canvas, ColorFilter filter) {
+            Rect r = mDrawable.getBounds();
+            float x = (r.left + r.right) * 0.5f;
+            float y = (r.top + r.bottom) * 0.5f - mPaintTextOffset;
+
+            mDrawable.setColorFilter(filter);
+            mDrawable.draw(canvas);
+            canvas.drawText("Label", x+1, y+1, mPaint2);
+            canvas.drawText("Label", x, y, mPaint);
+            
+            for (Drawable dr : mDrawables) {
+                dr.setColorFilter(filter);
+                dr.draw(canvas);
+            }
+        }
+        
+        @Override protected void onDraw(Canvas canvas) {
+            canvas.drawColor(0xFFCCCCCC);            
+
+            canvas.translate(8, 12);
+            for (int color : mColors) {
+                ColorFilter filter;
+                if (color == 0) {
+                    filter = null;
+                } else {
+                    filter = new PorterDuffColorFilter(color,
+                                                       mModes[mModeIndex]);
+                }
+                drawSample(canvas, filter);
+                canvas.translate(0, 55);
+            }
+        }
+
+        @Override
+        public boolean onTouchEvent(MotionEvent event) {
+            float x = event.getX();
+            float y = event.getY();
+            switch (event.getAction()) {
+                case MotionEvent.ACTION_DOWN:
+                    break;
+                case MotionEvent.ACTION_MOVE:
+                    break;
+                case MotionEvent.ACTION_UP:
+                    // update mode every other time we change paint colors
+                    if (mPaint.getColor() == 0xFFFFFFFF) {
+                        mModeIndex = (mModeIndex + 1) % mModes.length;
+                        updateTitle();
+                    }
+                    swapPaintColors();
+                    invalidate();
+                    break;
+            }
+            return true;
+        }
+    }
+}
+