summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2019-05-01 01:58:17 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2019-05-01 01:58:17 +0000
commite6b506950f7fbfa12a2063fc0b732362a559da13 (patch)
treeb79bafc0bed9357fb65a88469282b71619c5e195 /src
parent7cff85ee863cbd69ec3856dcde71809f29607eb4 (diff)
parent0af33616d06ba73d0515defa76a3e96a80b7db97 (diff)
downloadandroid_packages_providers_DownloadProvider-e6b506950f7fbfa12a2063fc0b732362a559da13.tar.gz
android_packages_providers_DownloadProvider-e6b506950f7fbfa12a2063fc0b732362a559da13.tar.bz2
android_packages_providers_DownloadProvider-e6b506950f7fbfa12a2063fc0b732362a559da13.zip
Merge "Update API impl of allowScanningByMediaScanner/setVisibleInDownloadsUi." into qt-dev
Diffstat (limited to 'src')
-rw-r--r--src/com/android/providers/downloads/DownloadProvider.java48
-rw-r--r--src/com/android/providers/downloads/Helpers.java9
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 4a95361d..b9b249ab 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;
}