diff options
| author | 2020-06-22 17:37:54 -0600 | |
|---|---|---|
| committer | 2020-06-23 07:13:13 -0600 | |
| commit | 83aaf908a6eba49fcf0205aa7ed6a6430b00c35e (patch) | |
| tree | 8be53b47c54700ec72257ad0bb216eded42ec92a | |
| parent | 2020f93a13f740814dcdc465b1f3364608da677e (diff) | |
Override MIME type to match MediaStore behavior.
Internally, DownloadManager synchronizes its contents with MediaStore,
which relies heavily on using file extensions to determine MIME types.
To prevent these two databases from getting confused, this change
adjusts DownloadManager to force the MIME type of already-completed
downloads based on the file extension, matching what MediaStore does.
Bug: 159594536
Test: atest PublicApiAccessTest#testAddCompletedWithoutExtension
Change-Id: I60c613eafcfe55007dffcac2d7d1fe375b753c19
| -rw-r--r-- | core/java/android/app/DownloadManager.java | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java index 1278ff6817fd..0719422632d1 100644 --- a/core/java/android/app/DownloadManager.java +++ b/core/java/android/app/DownloadManager.java @@ -25,6 +25,7 @@ import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; +import android.content.ClipDescription; import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentUris; @@ -50,11 +51,13 @@ import android.provider.Settings.SettingNotFoundException; import android.text.TextUtils; import android.util.LongSparseArray; import android.util.Pair; +import android.webkit.MimeTypeMap; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; +import java.util.Locale; /** * The download manager is a system service that handles long-running HTTP downloads. Clients may @@ -1554,6 +1557,7 @@ public class DownloadManager { values.put(Downloads.Impl.COLUMN_DESTINATION, Downloads.Impl.DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD); values.put(Downloads.Impl._DATA, path); + values.put(Downloads.Impl.COLUMN_MIME_TYPE, resolveMimeType(new File(path))); values.put(Downloads.Impl.COLUMN_STATUS, Downloads.Impl.STATUS_SUCCESS); values.put(Downloads.Impl.COLUMN_TOTAL_BYTES, length); values.put(Downloads.Impl.COLUMN_MEDIA_SCANNED, @@ -1569,6 +1573,58 @@ public class DownloadManager { return Long.parseLong(downloadUri.getLastPathSegment()); } + /** + * Shamelessly borrowed from + * {@code packages/providers/MediaProvider/src/com/android/providers/media/util/MimeUtils.java} + * + * @hide + */ + private static @NonNull String resolveMimeType(@NonNull File file) { + final String extension = extractFileExtension(file.getPath()); + if (extension == null) return ClipDescription.MIMETYPE_UNKNOWN; + + final String mimeType = MimeTypeMap.getSingleton() + .getMimeTypeFromExtension(extension.toLowerCase(Locale.ROOT)); + if (mimeType == null) return ClipDescription.MIMETYPE_UNKNOWN; + + return mimeType; + } + + /** + * Shamelessly borrowed from + * {@code packages/providers/MediaProvider/src/com/android/providers/media/util/FileUtils.java} + * + * @hide + */ + private static @Nullable String extractDisplayName(@Nullable String data) { + if (data == null) return null; + if (data.indexOf('/') == -1) { + return data; + } + if (data.endsWith("/")) { + data = data.substring(0, data.length() - 1); + } + return data.substring(data.lastIndexOf('/') + 1); + } + + /** + * Shamelessly borrowed from + * {@code packages/providers/MediaProvider/src/com/android/providers/media/util/FileUtils.java} + * + * @hide + */ + private static @Nullable String extractFileExtension(@Nullable String data) { + if (data == null) return null; + data = extractDisplayName(data); + + final int lastDot = data.lastIndexOf('.'); + if (lastDot == -1) { + return null; + } else { + return data.substring(lastDot + 1); + } + } + private static final String NON_DOWNLOADMANAGER_DOWNLOAD = "non-dwnldmngr-download-dont-retry2download"; |