Add test case for Api coverage

add test case testGetDocumentThumbnail into DocumentsContractTest.

Test: atest DocumentsContractTest#testGetDocumentThumbnail
Change-Id: I162af1a51d7148f6b6058422d5432f890e765c5b
Merged-In: I162af1a51d7148f6b6058422d5432f890e765c5b
Fix: 129200262
(cherry picked from commit 554ea2efe7938c7bf4ea52b0a42ad94920ee2e2d)
diff --git a/tests/tests/provider/src/android/provider/cts/DocumentsContractTest.java b/tests/tests/provider/src/android/provider/cts/DocumentsContractTest.java
index 89b231d..0f23543 100644
--- a/tests/tests/provider/src/android/provider/cts/DocumentsContractTest.java
+++ b/tests/tests/provider/src/android/provider/cts/DocumentsContractTest.java
@@ -61,6 +61,9 @@
 import android.content.res.AssetFileDescriptor;
 import android.database.Cursor;
 import android.database.MatrixCursor;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
 import android.graphics.Point;
 import android.net.Uri;
 import android.os.Bundle;
@@ -77,6 +80,8 @@
 import org.junit.runner.RunWith;
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -420,4 +425,55 @@
         assertEquals(res, mResolver.query(buildSearchDocumentsUri(AUTHORITY, DOC_RED, "moo"), null,
                 Bundle.EMPTY, null));
     }
+
+    @Test
+    public void testGetDocumentThumbnail() throws Exception {
+        // create file and image
+        final String testImagePath =
+                InstrumentationRegistry.getTargetContext().getExternalCacheDir().getPath()
+                        + "/testimage.jpg";
+        final int imageSize = 128;
+        final int thumbnailSize = 32;
+        File file = new File(testImagePath);
+        try (FileOutputStream out = new FileOutputStream(file)) {
+            writeImage(imageSize, imageSize, Color.RED, out);
+        }
+
+        final AssetFileDescriptor res = new AssetFileDescriptor(
+                ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY),
+                0, AssetFileDescriptor.UNKNOWN_LENGTH);
+        final Point size = new Point(thumbnailSize, thumbnailSize);
+        final Bundle opts = new Bundle();
+        opts.putParcelable(ContentResolver.EXTRA_SIZE, size);
+
+        doReturn(res).when(mProvider).openDocumentThumbnail(DOC_RED, size, null);
+        Bitmap bitmap = DocumentsContract.getDocumentThumbnail(mResolver, URI_RED, size, null);
+
+        // A provider may return a thumbnail of a different size, but never more than double the
+        // requested size.
+        assertFalse(bitmap.getWidth() > thumbnailSize * 2);
+        assertFalse(bitmap.getHeight() > thumbnailSize * 2);
+        assertColorMostlyEquals(Color.RED,
+                bitmap.getPixel(bitmap.getWidth() / 2, bitmap.getHeight() / 2));
+
+        // clean up
+        file.delete();
+        bitmap.recycle();
+    }
+
+    private static void writeImage(int width, int height, int color, OutputStream out) {
+        final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+        final Canvas canvas = new Canvas(bitmap);
+        canvas.drawColor(color);
+        bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
+    }
+
+    /**
+     * Since thumbnails might be bounced through a compression pass, we're okay
+     * if they're mostly equal.
+     */
+    private static void assertColorMostlyEquals(int expected, int actual) {
+        assertEquals(Integer.toHexString(expected & 0xF0F0F0F0),
+                Integer.toHexString(actual & 0xF0F0F0F0));
+    }
 }