Don't change extensions for explicitly set download locations.
Jeff Davidson [Tue, 30 Aug 2011 19:48:57 +0000 (12:48 -0700)]
This regression from GB was introduced by 38f1711910715538d6b64e505fe8fb9a0cd40475,
which was intended to allow duplicate downloads of the same file, adding -<n> to
the end of file names.  As a side effect, this also activated extension validation
logic, which adds/changes an extension to match the Mimetype.

This change keeps the unique filename logic but prevents extension changes when an
explicit filename is set.  Thus, it is still possible for the actual download
location to differ from the requested one, but only if the file already exists.

Bug: 5196436
Change-Id: I198dc2a819c5d839a05b72c25e0830d889a9c5a3

src/com/android/providers/downloads/Helpers.java

index cc7311d..359f6fa 100644 (file)
@@ -97,18 +97,28 @@ public class Helpers {
         return path;
     }
 
-    static String getFullPath(String filename, String mimeType, int destination,
-        File base) throws StopRequestException {
-        // Split filename between base and extension
-        // Add an extension if filename does not have one
+    static String getFullPath(String filename, String mimeType, int destination, File base)
+            throws StopRequestException {
         String extension = null;
         int dotIndex = filename.lastIndexOf('.');
         boolean missingExtension = dotIndex < 0 || dotIndex < filename.lastIndexOf('/');
-        if (missingExtension) {
-            extension = chooseExtensionFromMimeType(mimeType, true);
+        if (destination == Downloads.Impl.DESTINATION_FILE_URI) {
+            // Destination is explicitly set - do not change the extension
+            if (missingExtension) {
+                extension = "";
+            } else {
+                extension = filename.substring(dotIndex);
+                filename = filename.substring(0, dotIndex);
+            }
         } else {
-            extension = chooseExtensionFromFilename(mimeType, destination, filename, dotIndex);
-            filename = filename.substring(0, dotIndex);
+            // Split filename between base and extension
+            // Add an extension if filename does not have one
+            if (missingExtension) {
+                extension = chooseExtensionFromMimeType(mimeType, true);
+            } else {
+                extension = chooseExtensionFromFilename(mimeType, destination, filename, dotIndex);
+                filename = filename.substring(0, dotIndex);
+            }
         }
 
         boolean recoveryDir = Constants.RECOVERY_DIRECTORY.equalsIgnoreCase(filename + extension);