From e19572ccb5e7963eee9dd1cca150ee752a850e4a Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Wed, 20 Jul 2011 08:37:40 -0700 Subject: [PATCH] MediaScanner: Do separate bulk inserts for different media types This should fix a bunch of problems introduced in the original bulk insert implementation Also reverted two changes that are no longer necessary: Revert "MediaScanner: Add virtual NO_MEDIA column to fix support for .nomedia files" This reverts commit 92e1314ad9ddbacfb806405e9aceeea4a8aae19f. Revert "MediaScanner: fix breakage in updates" This reverts commit 45aaa2a345292bb6d600822db602f25e261c0e50. Change-Id: Ibed66393467761c2c1ce48deb09bcac505b7d221 --- core/java/android/provider/MediaStore.java | 7 --- media/java/android/media/MediaScanner.java | 75 +++++++++++++++++++----------- 2 files changed, 49 insertions(+), 33 deletions(-) diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index f3bcedb35740..f799af343f02 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -283,13 +283,6 @@ public final class MediaStore { */ public static final String IS_DRM = "is_drm"; - /** - * Used by the media scanner to suppress files from being processed as media files. - * - *

Type: INTEGER (boolean)

- * @hide - */ - public static final String NO_MEDIA = "no_media"; } /** diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index 8c8569a7488e..a8ac510259d4 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -372,8 +372,14 @@ public class MediaScanner private class FileInserter { - ContentValues[] mValues = new ContentValues[1000]; - int mIndex = 0; + private final Uri mUri; + private final ContentValues[] mValues; + private int mIndex; + + public FileInserter(Uri uri, int count) { + mUri = uri; + mValues = new ContentValues[count]; + } public Uri insert(ContentValues values) { if (mIndex == mValues.length) { @@ -389,13 +395,17 @@ public class MediaScanner mValues[mIndex++] = null; } try { - mMediaProvider.bulkInsert(mFilesUri, mValues); + mMediaProvider.bulkInsert(mUri, mValues); } catch (RemoteException e) { Log.e(TAG, "RemoteException in FileInserter.flush()", e); } mIndex = 0; } } + + private FileInserter mAudioInserter; + private FileInserter mVideoInserter; + private FileInserter mImageInserter; private FileInserter mFileInserter; // hashes file path to FileCacheEntry. @@ -707,9 +717,7 @@ public class MediaScanner map.put(MediaStore.MediaColumns.MIME_TYPE, mMimeType); map.put(MediaStore.MediaColumns.IS_DRM, mIsDrm); - if (mNoMedia) { - map.put(MediaStore.MediaColumns.NO_MEDIA, true); - } else { + if (!mNoMedia) { if (MediaFile.isVideoFileType(mFileType)) { map.put(Video.Media.ARTIST, (mArtist != null && mArtist.length() > 0 ? mArtist : MediaStore.UNKNOWN_STRING)); @@ -837,23 +845,35 @@ public class MediaScanner } } - // For inserts we always use the file URI so we can insert in bulk. - // For updates we compute the URI based on the media type. Uri tableUri = mFilesUri; + FileInserter inserter = mFileInserter; + if (!mNoMedia) { + if (MediaFile.isVideoFileType(mFileType)) { + tableUri = mVideoUri; + inserter = mVideoInserter; + } else if (MediaFile.isImageFileType(mFileType)) { + tableUri = mImagesUri; + inserter = mImageInserter; + } else if (MediaFile.isAudioFileType(mFileType)) { + tableUri = mAudioUri; + inserter = mAudioInserter; + } + } Uri result = null; if (rowId == 0) { if (mMtpObjectHandle != 0) { values.put(MediaStore.MediaColumns.MEDIA_SCANNER_NEW_OBJECT_ID, mMtpObjectHandle); } - int format = entry.mFormat; - if (format == 0) { - format = MediaFile.getFormatCode(entry.mPath, mMimeType); + if (tableUri == mFilesUri) { + int format = entry.mFormat; + if (format == 0) { + format = MediaFile.getFormatCode(entry.mPath, mMimeType); + } + values.put(Files.FileColumns.FORMAT, format); } - values.put(Files.FileColumns.FORMAT, format); - // new file, insert it - if (mFileInserter != null) { - result = mFileInserter.insert(values); + if (inserter != null) { + result = inserter.insert(values); } else { result = mMediaProvider.insert(tableUri, values); } @@ -863,16 +883,6 @@ public class MediaScanner entry.mRowId = rowId; } } else { - if (!mNoMedia) { - if (MediaFile.isVideoFileType(mFileType)) { - tableUri = mVideoUri; - } else if (MediaFile.isImageFileType(mFileType)) { - tableUri = mImagesUri; - } else if (MediaFile.isAudioFileType(mFileType)) { - tableUri = mAudioUri; - } - } - // updated file result = ContentUris.withAppendedId(tableUri, rowId); // path should never change, and we want to avoid replacing mixed cased paths @@ -1200,12 +1210,25 @@ public class MediaScanner initialize(volumeName); prescan(null, true); long prescan = System.currentTimeMillis(); - mFileInserter = new FileInserter(); + + // create FileInserters for bulk inserts + mAudioInserter = new FileInserter(mAudioUri, 500); + mVideoInserter = new FileInserter(mVideoUri, 500); + mImageInserter = new FileInserter(mImagesUri, 500); + mFileInserter = new FileInserter(mFilesUri, 500); for (int i = 0; i < directories.length; i++) { processDirectory(directories[i], mClient); } + + // flush remaining inserts + mAudioInserter.flush(); + mVideoInserter.flush(); + mImageInserter.flush(); mFileInserter.flush(); + mAudioInserter = null; + mVideoInserter = null; + mImageInserter = null; mFileInserter = null; long scan = System.currentTimeMillis(); -- 2.11.0