diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/providers/downloads/DownloadProvider.java | 48 | ||||
-rw-r--r-- | src/com/android/providers/downloads/Helpers.java | 9 |
2 files changed, 49 insertions, 8 deletions
diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java index a7f2093c..35c80de4 100644 --- a/src/com/android/providers/downloads/DownloadProvider.java +++ b/src/com/android/providers/downloads/DownloadProvider.java @@ -752,6 +752,8 @@ public final class DownloadProvider extends ContentProvider { filteredValues.put(Downloads.Impl.COLUMN_DESTINATION, dest); } + ensureDefaultColumns(values); + // copy some of the input values as is copyString(Downloads.Impl.COLUMN_URI, values, filteredValues); copyString(Downloads.Impl.COLUMN_APP_DATA, values, filteredValues); @@ -838,13 +840,7 @@ public final class DownloadProvider extends ContentProvider { copyStringWithDefault(Downloads.Impl.COLUMN_DESCRIPTION, values, filteredValues, ""); // is_visible_in_downloads_ui column - if (values.containsKey(Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI)) { - copyBoolean(Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI, values, filteredValues); - } else { - // by default, make external downloads visible in the UI - boolean isExternal = (dest == null || dest == Downloads.Impl.DESTINATION_EXTERNAL); - filteredValues.put(Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI, isExternal); - } + copyBoolean(COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI, values, filteredValues); // public api requests and networktypes/roaming columns if (isPublicApi) { @@ -1037,6 +1033,44 @@ public final class DownloadProvider extends ContentProvider { return packages[0]; } + private void ensureDefaultColumns(ContentValues values) { + final Integer dest = values.getAsInteger(COLUMN_DESTINATION); + if (dest != null) { + final int mediaScannable; + final boolean visibleInDownloadsUi; + if (dest == Downloads.Impl.DESTINATION_EXTERNAL) { + mediaScannable = MEDIA_NOT_SCANNED; + visibleInDownloadsUi = true; + } else if (dest != DESTINATION_FILE_URI + && dest != DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD) { + mediaScannable = MEDIA_NOT_SCANNABLE; + visibleInDownloadsUi = false; + } else { + final File file; + if (dest == Downloads.Impl.DESTINATION_FILE_URI) { + final String fileUri = values.getAsString(Downloads.Impl.COLUMN_FILE_NAME_HINT); + file = new File(getFileUri(fileUri).getPath()); + } else { + file = new File(values.getAsString(Downloads.Impl._DATA)); + } + + if (Helpers.isFileInExternalAndroidDirs(file.getAbsolutePath())) { + mediaScannable = MEDIA_NOT_SCANNABLE; + visibleInDownloadsUi = false; + } else { + mediaScannable = MEDIA_NOT_SCANNED; + visibleInDownloadsUi = true; + } + } + values.put(COLUMN_MEDIA_SCANNED, mediaScannable); + values.put(COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI, visibleInDownloadsUi); + } else { + if (!values.containsKey(COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI)) { + values.put(COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI, true); + } + } + } + /** * Check that the file URI provided for DESTINATION_FILE_URI is valid. */ diff --git a/src/com/android/providers/downloads/Helpers.java b/src/com/android/providers/downloads/Helpers.java index 40fd3b87..99ced675 100644 --- a/src/com/android/providers/downloads/Helpers.java +++ b/src/com/android/providers/downloads/Helpers.java @@ -16,6 +16,7 @@ package com.android.providers.downloads; +import static android.os.Environment.buildExternalStorageAndroidDataDirs; import static android.os.Environment.buildExternalStorageAppCacheDirs; import static android.os.Environment.buildExternalStorageAppDataDirs; import static android.os.Environment.buildExternalStorageAppMediaDirs; @@ -65,6 +66,9 @@ public class Helpers { private static final Pattern CONTENT_DISPOSITION_PATTERN = Pattern.compile("attachment;\\s*filename\\s*=\\s*\"([^\"]*)\""); + private static final Pattern PATTERN_ANDROID_DIRS = + Pattern.compile("(?i)^/storage/[^/]+(?:/[0-9]+)?/Android/(?:data|obb|media)/.+"); + private static final Object sUniqueLock = new Object(); private static HandlerThread sAsyncHandlerThread; @@ -473,6 +477,10 @@ public class Helpers { throw new IOException("Failed to generate an available filename"); } + public static boolean isFileInExternalAndroidDirs(String filePath) { + return PATTERN_ANDROID_DIRS.matcher(filePath).matches(); + } + static boolean isFilenameValid(Context context, File file) { return isFilenameValid(context, file, true); } @@ -491,7 +499,6 @@ public class Helpers { try { if (containsCanonical(buildExternalStorageAppDataDirs(packageName), file) || containsCanonical(buildExternalStorageAppObbDirs(packageName), file) || - containsCanonical(buildExternalStorageAppCacheDirs(packageName), file) || containsCanonical(buildExternalStorageAppMediaDirs(packageName), file)) { return true; } |