summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
Diffstat (limited to 'media')
-rw-r--r--media/java/android/media/MediaFile.java12
-rw-r--r--media/java/android/media/MediaScanner.java28
-rw-r--r--media/java/android/media/MtpDatabase.java20
-rw-r--r--media/libstagefright/StagefrightMediaScanner.cpp2
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]);