MTP: Fix problems with modification dates for folders and non-media files

Also removed an unnecessary parameter to MtpDatabase.endSendobject()

BUG: 3352142

Change-Id: I6fd812dcba4814956bc8bc1cbd6bd5c868197790
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index 8929393..10c9a9a 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -1177,7 +1177,8 @@
             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 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 @@
                 // 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 ac476ff..d348e8b 100644
--- a/media/java/android/mtp/MtpDatabase.java
+++ b/media/java/android/mtp/MtpDatabase.java
@@ -185,7 +185,7 @@
         }
     }
 
-    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 @@
                     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 8f9b8a2..9abf6a2 100644
--- a/media/jni/android_mtp_MtpDatabase.cpp
+++ b/media/jni/android_mtp_MtpDatabase.cpp
@@ -99,7 +99,6 @@
     virtual void                    endSendObject(const char* path,
                                             MtpObjectHandle handle,
                                             MtpObjectFormat format,
-                                            int64_t actualSize,
                                             bool succeeded);
 
     virtual MtpObjectHandleList*    getObjectList(MtpStorageID storageID,
@@ -236,11 +235,11 @@
 }
 
 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 @@
         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 6dcb931..4d9a1ae 100644
--- a/media/mtp/MtpDatabase.h
+++ b/media/mtp/MtpDatabase.h
@@ -42,7 +42,6 @@
     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 236cd0a..b1bd145 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -700,6 +700,9 @@
         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 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 @@
             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;