summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java12
-rw-r--r--packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java39
2 files changed, 50 insertions, 1 deletions
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java
index 72ad2f6a629e..8c73211cccf1 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java
@@ -830,11 +830,21 @@ class MtpDatabase {
if (info.getFormat() == MtpConstants.FORMAT_ASSOCIATION) {
return DocumentsContract.Document.MIME_TYPE_DIR;
}
+
final String formatCodeMimeType = MediaFile.getMimeTypeForFormatCode(info.getFormat());
+ final String mediaFileMimeType = MediaFile.getMimeTypeForFile(info.getName());
+
+ // Format code can be mapped with multiple mime types, e.g. FORMAT_MPEG is mapped with
+ // audio/mp4 and video/mp4.
+ // As file extension contains more information than format code, returns mime type obtained
+ // from file extension if it is consistent with format code.
+ if (mediaFileMimeType != null &&
+ MediaFile.getFormatCode("", mediaFileMimeType) == info.getFormat()) {
+ return mediaFileMimeType;
+ }
if (formatCodeMimeType != null) {
return formatCodeMimeType;
}
- final String mediaFileMimeType = MediaFile.getMimeTypeForFile(info.getName());
if (mediaFileMimeType != null) {
return mediaFileMimeType;
}
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java
index e49a93594edb..b74069ae36bb 100644
--- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java
@@ -17,6 +17,8 @@
package com.android.mtp;
import android.database.Cursor;
+import android.media.MediaFile;
+import android.media.MediaFile.MediaFileType;
import android.mtp.MtpConstants;
import android.mtp.MtpObjectInfo;
import android.net.Uri;
@@ -1081,6 +1083,43 @@ public class MtpDatabaseTest extends AndroidTestCase {
}
}
+ public void testFormatCodeForMpeg() throws FileNotFoundException {
+ addTestDevice();
+ addTestStorage("1");
+ mDatabase.getMapper().startAddingDocuments("2");
+ mDatabase.getMapper().putChildDocuments(0, "2", OPERATIONS_SUPPORTED, new MtpObjectInfo[] {
+ createDocument(100, "audio.m4a", MtpConstants.FORMAT_MPEG, 1000),
+ createDocument(101, "video.m4v", MtpConstants.FORMAT_MPEG, 1000),
+ createDocument(102, "unknown.mp4", MtpConstants.FORMAT_MPEG, 1000),
+ createDocument(103, "inconsistent.txt", MtpConstants.FORMAT_MPEG, 1000),
+ createDocument(104, "noext", MtpConstants.FORMAT_UNDEFINED, 1000),
+ });
+ mDatabase.getMapper().stopAddingDocuments("2");
+ try (final Cursor cursor = mDatabase.queryChildDocuments(
+ strings(COLUMN_DISPLAY_NAME, COLUMN_MIME_TYPE),
+ "2")) {
+ assertEquals(5, cursor.getCount());
+ cursor.moveToNext();
+ assertEquals("audio.m4a", cursor.getString(0));
+ assertEquals("audio/mp4", cursor.getString(1));
+ cursor.moveToNext();
+ assertEquals("video.m4v", cursor.getString(0));
+ assertEquals("video/mp4", cursor.getString(1));
+ cursor.moveToNext();
+ // Assume that the file is video as we don't have any hints to find out if the file is
+ // video or audio.
+ assertEquals("unknown.mp4", cursor.getString(0));
+ assertEquals("video/mp4", cursor.getString(1));
+ // Don't return mime type that is inconsistent with format code.
+ cursor.moveToNext();
+ assertEquals("inconsistent.txt", cursor.getString(0));
+ assertEquals("video/mp4", cursor.getString(1));
+ cursor.moveToNext();
+ assertEquals("noext", cursor.getString(0));
+ assertEquals("application/octet-stream", cursor.getString(1));
+ }
+ }
+
private void addTestDevice() throws FileNotFoundException {
TestUtil.addTestDevice(mDatabase);
}