Guess the MIME type from the display name.

Extends MediaProvider to guess the MIME type from the file extension in
the DISPLAY_NAME if it wasn't able to get it from the DATA column.

Change-Id: Idca6836fbd91ec34383e08f9e7f9280f0e7198ee
Fix: 142468597
Test: atest MediaProviderTest
Test: atest ContentResolverTest
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index f37f881..4ae9599 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -1916,6 +1916,15 @@
                 values.put(MediaColumns.MIME_TYPE, MimeUtils.resolveMimeType(new File(data)));
             }
         }
+        // Extract the MIME type from the display name if we couldn't resolve it from the raw path
+        if (!TextUtils.isEmpty(values.getAsString(MediaColumns.DISPLAY_NAME))) {
+            final String displayName = values.getAsString(MediaColumns.DISPLAY_NAME);
+
+            if (TextUtils.isEmpty(values.getAsString(MediaColumns.MIME_TYPE))) {
+                values.put(
+                        MediaColumns.MIME_TYPE, MimeUtils.resolveMimeType(new File(displayName)));
+            }
+        }
 
         // Give ourselves sane defaults when missing
         if (TextUtils.isEmpty(values.getAsString(MediaColumns.DISPLAY_NAME))) {
diff --git a/tests/src/com/android/providers/media/MediaProviderTest.java b/tests/src/com/android/providers/media/MediaProviderTest.java
index 7473603..d5e6595 100644
--- a/tests/src/com/android/providers/media/MediaProviderTest.java
+++ b/tests/src/com/android/providers/media/MediaProviderTest.java
@@ -562,6 +562,17 @@
     }
 
     @Test
+    public void testEnsureFileColumns_resolvesMimeType() throws Exception {
+        final Uri uri = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
+        final ContentValues values = new ContentValues();
+        values.put(MediaColumns.DISPLAY_NAME, "pngimage.png");
+
+        new MediaProvider().ensureFileColumns(uri, values);
+
+        assertMimetype(values, "image/png");
+    }
+
+    @Test
     public void testRelativePathForInvalidDirectories() throws Exception {
         for (String data : new String[] {
             "/storage/IMG1024.JPG",
@@ -615,6 +626,10 @@
         assertEquals(relativePath, values.get(ImageColumns.RELATIVE_PATH));
     }
 
+    private static void assertMimetype(ContentValues values, String type) {
+        assertEquals(type, values.get(MediaColumns.MIME_TYPE));
+    }
+
     private static boolean isGreylistMatch(String raw) {
         for (Pattern p : MediaProvider.sGreylist) {
             if (p.matcher(raw).matches()) {