diff options
| -rw-r--r-- | packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java | 12 | ||||
| -rw-r--r-- | packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java | 39 |
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); } |