diff options
Diffstat (limited to 'media')
| -rw-r--r-- | media/java/android/media/MediaFile.java | 12 | ||||
| -rw-r--r-- | media/java/android/media/MediaScanner.java | 28 | ||||
| -rw-r--r-- | media/java/android/media/MtpDatabase.java | 20 | ||||
| -rw-r--r-- | media/libstagefright/StagefrightMediaScanner.cpp | 2 |
4 files changed, 57 insertions, 5 deletions
diff --git a/media/java/android/media/MediaFile.java b/media/java/android/media/MediaFile.java index 381b77a..532a2df 100644 --- a/media/java/android/media/MediaFile.java +++ b/media/java/android/media/MediaFile.java @@ -83,6 +83,11 @@ public class MediaFile { private static final int FIRST_PLAYLIST_FILE_TYPE = FILE_TYPE_M3U; private static final int LAST_PLAYLIST_FILE_TYPE = FILE_TYPE_WPL; + // Drm file types + public static final int FILE_TYPE_FL = 51; + private static final int FIRST_DRM_FILE_TYPE = FILE_TYPE_FL; + private static final int LAST_DRM_FILE_TYPE = FILE_TYPE_FL; + // Other popular file types public static final int FILE_TYPE_TEXT = 100; public static final int FILE_TYPE_HTML = 101; @@ -189,6 +194,8 @@ public class MediaFile { addFileType("PLS", FILE_TYPE_PLS, "audio/x-scpls", MtpConstants.FORMAT_PLS_PLAYLIST); addFileType("WPL", FILE_TYPE_WPL, "application/vnd.ms-wpl", MtpConstants.FORMAT_WPL_PLAYLIST); + addFileType("FL", FILE_TYPE_FL, "application/x-android-drm-fl"); + addFileType("TXT", FILE_TYPE_TEXT, "text/plain", MtpConstants.FORMAT_TEXT); addFileType("HTM", FILE_TYPE_HTML, "text/html", MtpConstants.FORMAT_HTML); addFileType("HTML", FILE_TYPE_HTML, "text/html", MtpConstants.FORMAT_HTML); @@ -222,6 +229,11 @@ public class MediaFile { fileType <= LAST_PLAYLIST_FILE_TYPE); } + public static boolean isDrmFileType(int fileType) { + return (fileType >= FIRST_DRM_FILE_TYPE && + fileType <= LAST_DRM_FILE_TYPE); + } + public static MediaFileType getFileType(String path) { int lastDot = path.lastIndexOf("."); if (lastDot < 0) diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index e5fa0f8..5aabddf 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -26,6 +26,7 @@ import android.content.Context; import android.content.IContentProvider; import android.database.Cursor; import android.database.SQLException; +import android.drm.DrmManagerClient; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Process; @@ -360,6 +361,7 @@ public class MediaScanner private ArrayList<FileCacheEntry> mPlayLists; private HashMap<String, Uri> mGenreCache; + private DrmManagerClient mDrmManagerClient = null; public MediaScanner(Context c) { native_setup(); @@ -447,6 +449,11 @@ public class MediaScanner } } + if (System.getProperty("drm.service.enabled").equals("true") + && MediaFile.isDrmFileType(mFileType)) { + mFileType = getFileTypeFromDrm(path); + } + String key = path; if (mCaseInsensitivePaths) { key = path.toLowerCase(); @@ -874,6 +881,27 @@ public class MediaScanner } } + private int getFileTypeFromDrm(String path) { + if (!System.getProperty("drm.service.enabled").equals("true")) { + return 0; + } + + int resultFileType = 0; + + if (mDrmManagerClient == null) { + mDrmManagerClient = new DrmManagerClient(mContext); + } + + if (mDrmManagerClient.canHandle(path, null)) { + String drmMimetype = mDrmManagerClient.getOriginalMimeType(path); + if (drmMimetype != null) { + mMimeType = drmMimetype; + resultFileType = MediaFile.getFileTypeForMimeType(drmMimetype); + } + } + return resultFileType; + } + }; // end of anonymous MediaScannerClient instance private void prescan(String filePath, boolean prescanFiles) throws RemoteException { diff --git a/media/java/android/media/MtpDatabase.java b/media/java/android/media/MtpDatabase.java index 51647434..57ab3a1 100644 --- a/media/java/android/media/MtpDatabase.java +++ b/media/java/android/media/MtpDatabase.java @@ -23,6 +23,7 @@ import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; +import android.os.Environment; import android.os.RemoteException; import android.provider.MediaStore.Audio; import android.provider.MediaStore.Files; @@ -45,6 +46,7 @@ public class MtpDatabase { private final String mVolumeName; private final Uri mObjectsUri; private final String mMediaStoragePath; + private final String mExternalStoragePath; // true if the database has been modified in the current MTP session private boolean mDatabaseModified; @@ -77,7 +79,6 @@ public class MtpDatabase { Files.FileColumns.DATE_MODIFIED, // 5 }; private static final String ID_WHERE = Files.FileColumns._ID + "=?"; - private static final String PATH_WHERE = Files.FileColumns.DATA + "=?"; private static final String PARENT_WHERE = Files.FileColumns.PARENT + "=?"; private static final String PARENT_FORMAT_WHERE = PARENT_WHERE + " AND " + Files.FileColumns.FORMAT + "=?"; @@ -98,6 +99,7 @@ public class MtpDatabase { mMediaProvider = context.getContentResolver().acquireProvider("media"); mVolumeName = volumeName; mMediaStoragePath = storagePath; + mExternalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath(); mObjectsUri = Files.getMtpObjectsUri(volumeName); mMediaScanner = new MediaScanner(context); openDevicePropertiesDatabase(context); @@ -112,6 +114,16 @@ public class MtpDatabase { } } + private String externalToMediaPath(String path) { + // convert external storage path to media path + if (path != null && mMediaStoragePath != null + && mExternalStoragePath != null + && path.startsWith(mExternalStoragePath)) { + path = mMediaStoragePath + path.substring(mExternalStoragePath.length()); + } + return path; + } + private void openDevicePropertiesDatabase(Context context) { mDevicePropDb = context.openOrCreateDatabase("device-properties", Context.MODE_PRIVATE, null); int version = mDevicePropDb.getVersion(); @@ -482,7 +494,7 @@ public class MtpDatabase { try { c = mMediaProvider.query(mObjectsUri, PATH_PROJECTION, ID_WHERE, whereArgs, null); if (c != null && c.moveToNext()) { - path = c.getString(1); + path = externalToMediaPath(c.getString(1)); } } catch (RemoteException e) { Log.e(TAG, "RemoteException in getObjectFilePath", e); @@ -763,7 +775,7 @@ public class MtpDatabase { return true; } } catch (RemoteException e) { - Log.e(TAG, "RemoteException in getObjectProperty", e); + Log.e(TAG, "RemoteException in getObjectInfo", e); } finally { if (c != null) { c.close(); @@ -786,7 +798,7 @@ public class MtpDatabase { c = mMediaProvider.query(mObjectsUri, PATH_SIZE_PROJECTION, ID_WHERE, new String[] { Integer.toString(handle) }, null); if (c != null && c.moveToNext()) { - String path = c.getString(1); + String path = externalToMediaPath(c.getString(1)); path.getChars(0, path.length(), outFilePath, 0); outFilePath[path.length()] = 0; outFileLength[0] = c.getLong(2); diff --git a/media/libstagefright/StagefrightMediaScanner.cpp b/media/libstagefright/StagefrightMediaScanner.cpp index 1629e9f..6c05e03 100644 --- a/media/libstagefright/StagefrightMediaScanner.cpp +++ b/media/libstagefright/StagefrightMediaScanner.cpp @@ -39,7 +39,7 @@ static bool FileHasAcceptableExtension(const char *extension) { ".mp3", ".mp4", ".m4a", ".3gp", ".3gpp", ".3g2", ".3gpp2", ".mpeg", ".ogg", ".mid", ".smf", ".imy", ".wma", ".aac", ".wav", ".amr", ".midi", ".xmf", ".rtttl", ".rtx", ".ota", - ".mkv", ".mka", ".webm", ".ts" + ".mkv", ".mka", ".webm", ".ts", ".fl" }; static const size_t kNumValidExtensions = sizeof(kValidExtensions) / sizeof(kValidExtensions[0]); |
