Merge "Support grayscale bitmap" into mnc-dev
diff --git a/v4/kitkat/android/support/v4/print/PrintHelperKitkat.java b/v4/kitkat/android/support/v4/print/PrintHelperKitkat.java
index b827b1f..091d5a4 100644
--- a/v4/kitkat/android/support/v4/print/PrintHelperKitkat.java
+++ b/v4/kitkat/android/support/v4/print/PrintHelperKitkat.java
@@ -18,8 +18,13 @@
 
 import android.content.Context;
 import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
 import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
 import android.graphics.Matrix;
+import android.graphics.Paint;
 import android.graphics.RectF;
 import android.graphics.pdf.PdfDocument.Page;
 import android.net.Uri;
@@ -208,16 +213,20 @@
                                         WriteResultCallback writeResultCallback) {
                         PrintedPdfDocument pdfDocument = new PrintedPdfDocument(mContext,
                                 mAttributes);
+
+                        Bitmap maybeGrayscale = convertBitmapForColorMode(bitmap,
+                                mAttributes.getColorMode());
                         try {
                             Page page = pdfDocument.startPage(1);
 
                             RectF content = new RectF(page.getInfo().getContentRect());
 
-                            Matrix matrix = getMatrix(bitmap.getWidth(), bitmap.getHeight(),
+                            Matrix matrix = getMatrix(
+                                    maybeGrayscale.getWidth(), maybeGrayscale.getHeight(),
                                     content, fittingMode);
 
                             // Draw the bitmap.
-                            page.getCanvas().drawBitmap(bitmap, matrix, null);
+                            page.getCanvas().drawBitmap(maybeGrayscale, matrix, null);
 
                             // Finish the page.
                             pdfDocument.finishPage(page);
@@ -245,6 +254,10 @@
                                     /* ignore */
                                 }
                             }
+                            // If we created a new instance for grayscaling, then recycle it here.
+                            if (maybeGrayscale != bitmap) {
+                                maybeGrayscale.recycle();
+                            }
                         }
                     }
 
@@ -401,6 +414,10 @@
                 if (callback != null) {
                     callback.onFinish();
                 }
+                if (mBitmap != null) {
+                    mBitmap.recycle();
+                    mBitmap = null;
+                }
             }
 
             @Override
@@ -409,6 +426,8 @@
                                 WriteResultCallback writeResultCallback) {
                 PrintedPdfDocument pdfDocument = new PrintedPdfDocument(mContext,
                         mAttributes);
+                Bitmap maybeGrayscale = convertBitmapForColorMode(mBitmap,
+                        mAttributes.getColorMode());
                 try {
 
                     Page page = pdfDocument.startPage(1);
@@ -419,7 +438,7 @@
                             content, fittingMode);
 
                     // Draw the bitmap.
-                    page.getCanvas().drawBitmap(mBitmap, matrix, null);
+                    page.getCanvas().drawBitmap(maybeGrayscale, matrix, null);
 
                     // Finish the page.
                     pdfDocument.finishPage(page);
@@ -447,6 +466,10 @@
                             /* ignore */
                         }
                     }
+                    // If we created a new instance for grayscaling, then recycle it here.
+                    if (maybeGrayscale != mBitmap) {
+                        maybeGrayscale.recycle();
+                    }
                 }
             }
         };
@@ -541,4 +564,23 @@
             }
         }
     }
+
+    private Bitmap convertBitmapForColorMode(Bitmap original, int colorMode) {
+        if (colorMode != COLOR_MODE_MONOCHROME) {
+            return original;
+        }
+        // Create a grayscale bitmap
+        Bitmap grayscale = Bitmap.createBitmap(original.getWidth(), original.getHeight(),
+                Config.ARGB_8888);
+        Canvas c = new Canvas(grayscale);
+        Paint p = new Paint();
+        ColorMatrix cm = new ColorMatrix();
+        cm.setSaturation(0);
+        ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
+        p.setColorFilter(f);
+        c.drawBitmap(original, 0, 0, p);
+        c.setBitmap(null);
+
+        return grayscale;
+    }
 }
\ No newline at end of file