diff options
| -rw-r--r-- | media/java/android/media/MediaScanner.java | 25 | ||||
| -rw-r--r-- | media/java/android/mtp/MtpDatabase.java | 14 | ||||
| -rw-r--r-- | media/jni/android_mtp_MtpDatabase.cpp | 7 | ||||
| -rw-r--r-- | media/mtp/MtpDatabase.h | 1 | ||||
| -rw-r--r-- | media/mtp/MtpServer.cpp | 13 |
5 files changed, 25 insertions, 35 deletions
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index 892939387210..10c9a9a99f5a 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -1177,7 +1177,8 @@ public class MediaScanner long lastModifiedSeconds = file.lastModified() / 1000; // always scan the file, so we can return the content://media Uri for existing files - return mClient.doScanFile(path, mimeType, lastModifiedSeconds, file.length(),false, true); + return mClient.doScanFile(path, mimeType, lastModifiedSeconds, file.length(), + false, true); } catch (RemoteException e) { Log.e(TAG, "RemoteException in MediaScanner.scanFile()", e); return null; @@ -1185,17 +1186,30 @@ public class MediaScanner } public void scanMtpFile(String path, String volumeName, int objectHandle, int format) { + initialize(volumeName); MediaFile.MediaFileType mediaFileType = MediaFile.getFileType(path); int fileType = (mediaFileType == null ? 0 : mediaFileType.fileType); + File file = new File(path); + long lastModifiedSeconds = file.lastModified() / 1000; if (!MediaFile.isAudioFileType(fileType) && !MediaFile.isVideoFileType(fileType) && !MediaFile.isImageFileType(fileType) && !MediaFile.isPlayListFileType(fileType)) { - // nothing to do + + // no need to use the media scanner, but we need to update last modified and file size + ContentValues values = new ContentValues(); + values.put(Files.FileColumns.SIZE, file.length()); + values.put(Files.FileColumns.DATE_MODIFIED, lastModifiedSeconds); + try { + String[] whereArgs = new String[] { Integer.toString(objectHandle) }; + mMediaProvider.update(Files.getMtpObjectsUri(volumeName), values, "_id=?", + whereArgs); + } catch (RemoteException e) { + Log.e(TAG, "RemoteException in scanMtpFile", e); + } return; } mMtpObjectHandle = objectHandle; - initialize(volumeName); try { if (MediaFile.isPlayListFileType(fileType)) { // build file cache so we can look up tracks in the playlist @@ -1213,11 +1227,6 @@ public class MediaScanner // MTP will create a file entry for us so we don't want to do it in prescan prescan(path, false); - File file = new File(path); - - // lastModified is in milliseconds on Files. - long lastModifiedSeconds = file.lastModified() / 1000; - // always scan the file, so we can return the content://media Uri for existing files mClient.doScanFile(path, mediaFileType.mimeType, lastModifiedSeconds, file.length(), (format == MtpConstants.FORMAT_ASSOCIATION), true); diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index ac476ffe5eb3..d348e8bf7586 100644 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -185,7 +185,7 @@ public class MtpDatabase { } } - private void endSendObject(String path, int handle, int format, long actualSize, boolean succeeded) { + private void endSendObject(String path, int handle, int format, boolean succeeded) { if (succeeded) { // handle abstract playlists separately // they do not exist in the file system so don't use the media scanner here @@ -208,18 +208,6 @@ public class MtpDatabase { Log.e(TAG, "RemoteException in endSendObject", e); } } else { - if (actualSize >= 0) { - // update size if necessary - ContentValues values = new ContentValues(); - values.put(Files.FileColumns.SIZE, actualSize); - try { - String[] whereArgs = new String[] { Integer.toString(handle) }; - mMediaProvider.update(mObjectsUri, values, ID_WHERE, whereArgs); - } catch (RemoteException e) { - Log.e(TAG, "RemoteException in mMediaProvider.update", e); - } - } - mMediaScanner.scanMtpFile(path, mVolumeName, handle, format); } } else { diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp index 8f9b8a2b0c6e..9abf6a241dd7 100644 --- a/media/jni/android_mtp_MtpDatabase.cpp +++ b/media/jni/android_mtp_MtpDatabase.cpp @@ -99,7 +99,6 @@ public: virtual void endSendObject(const char* path, MtpObjectHandle handle, MtpObjectFormat format, - int64_t actualSize, bool succeeded); virtual MtpObjectHandleList* getObjectList(MtpStorageID storageID, @@ -236,11 +235,11 @@ MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path, } void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, - MtpObjectFormat format, int64_t actualSize, bool succeeded) { + MtpObjectFormat format, bool succeeded) { JNIEnv* env = AndroidRuntime::getJNIEnv(); jstring pathStr = env->NewStringUTF(path); env->CallVoidMethod(mDatabase, method_endSendObject, pathStr, - (jint)handle, (jint)format, (jlong)actualSize, (jboolean)succeeded); + (jint)handle, (jint)format, (jboolean)succeeded); if (pathStr) env->DeleteLocalRef(pathStr); @@ -1094,7 +1093,7 @@ int register_android_mtp_MtpDatabase(JNIEnv *env) LOGE("Can't find beginSendObject"); return -1; } - method_endSendObject = env->GetMethodID(clazz, "endSendObject", "(Ljava/lang/String;IIJZ)V"); + method_endSendObject = env->GetMethodID(clazz, "endSendObject", "(Ljava/lang/String;IIZ)V"); if (method_endSendObject == NULL) { LOGE("Can't find endSendObject"); return -1; diff --git a/media/mtp/MtpDatabase.h b/media/mtp/MtpDatabase.h index 6dcb931ad1cf..4d9a1ae3d6a4 100644 --- a/media/mtp/MtpDatabase.h +++ b/media/mtp/MtpDatabase.h @@ -42,7 +42,6 @@ public: virtual void endSendObject(const char* path, MtpObjectHandle handle, MtpObjectFormat format, - int64_t size, bool succeeded) = 0; virtual MtpObjectHandleList* getObjectList(MtpStorageID storageID, diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp index 236cd0a4502e..b1bd145f6d8e 100644 --- a/media/mtp/MtpServer.cpp +++ b/media/mtp/MtpServer.cpp @@ -700,6 +700,9 @@ MtpResponseCode MtpServer::doSendObjectInfo() { if (ret && ret != -EEXIST) return MTP_RESPONSE_GENERAL_ERROR; chown((const char *)path, getuid(), mFileGroup); + + // SendObject does not get sent for directories, so call endSendObject here instead + mDatabase->endSendObject(path, handle, MTP_FORMAT_ASSOCIATION, MTP_RESPONSE_OK); } else { mSendObjectFilePath = path; // save the handle for the SendObject call, which should follow @@ -718,7 +721,6 @@ MtpResponseCode MtpServer::doSendObject() { MtpResponseCode result = MTP_RESPONSE_OK; mode_t mask; int ret; - uint64_t actualSize = -1; if (mSendObjectHandle == kInvalidObjectHandle) { LOGE("Expected SendObjectInfo before SendObject"); @@ -761,18 +763,11 @@ MtpResponseCode MtpServer::doSendObject() { result = MTP_RESPONSE_TRANSACTION_CANCELLED; else result = MTP_RESPONSE_GENERAL_ERROR; - } else if (mSendObjectFileSize == 0xFFFFFFFF) { - // actual size is likely > 4 gig so stat the file to compute actual length - struct stat s; - if (lstat(mSendObjectFilePath, &s) == 0) { - actualSize = s.st_size; - LOGD("actualSize: %lld\n", actualSize); - } } done: mDatabase->endSendObject(mSendObjectFilePath, mSendObjectHandle, mSendObjectFormat, - actualSize, result == MTP_RESPONSE_OK); + result == MTP_RESPONSE_OK); mSendObjectHandle = kInvalidObjectHandle; mSendObjectFormat = 0; return result; |