diff options
author | Vasu Nori <vnori@google.com> | 2011-01-20 17:59:34 -0800 |
---|---|---|
committer | Vasu Nori <vnori@google.com> | 2011-01-21 17:36:07 -0800 |
commit | b18ed519040c1ecd98f8cb139adcc315a3f4eedc (patch) | |
tree | 90dac194384d698a62d041602f9721513548c170 /src/com/android/providers/downloads/DownloadProvider.java | |
parent | bc44d197c0e01c5d1c44302613ac5eb00acd14e4 (diff) | |
download | android_packages_providers_DownloadProvider-b18ed519040c1ecd98f8cb139adcc315a3f4eedc.tar.gz android_packages_providers_DownloadProvider-b18ed519040c1ecd98f8cb139adcc315a3f4eedc.tar.bz2 android_packages_providers_DownloadProvider-b18ed519040c1ecd98f8cb139adcc315a3f4eedc.zip |
bug:3048327 (master) ability to add completed download to dnload mgr
Change-Id: Ib9d4df107787191a5349365908cbe096b67770dc
Diffstat (limited to 'src/com/android/providers/downloads/DownloadProvider.java')
-rw-r--r-- | src/com/android/providers/downloads/DownloadProvider.java | 66 |
1 files changed, 56 insertions, 10 deletions
diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java index a9952533..66d49227 100644 --- a/src/com/android/providers/downloads/DownloadProvider.java +++ b/src/com/android/providers/downloads/DownloadProvider.java @@ -477,25 +477,26 @@ public final class DownloadProvider extends ContentProvider { throw new IllegalArgumentException("Unknown/Invalid URI " + uri); } + // copy some of the input values as it ContentValues filteredValues = new ContentValues(); - copyString(Downloads.Impl.COLUMN_URI, values, filteredValues); copyString(Downloads.Impl.COLUMN_APP_DATA, values, filteredValues); copyBoolean(Downloads.Impl.COLUMN_NO_INTEGRITY, values, filteredValues); copyString(Downloads.Impl.COLUMN_FILE_NAME_HINT, values, filteredValues); copyString(Downloads.Impl.COLUMN_MIME_TYPE, values, filteredValues); - copyBoolean(Downloads.Impl.COLUMN_IS_PUBLIC_API, values, filteredValues); + boolean isPublicApi = values.getAsBoolean(Downloads.Impl.COLUMN_IS_PUBLIC_API) == Boolean.TRUE; + // validate the destination column Integer dest = values.getAsInteger(Downloads.Impl.COLUMN_DESTINATION); if (dest != null) { if (getContext().checkCallingPermission(Downloads.Impl.PERMISSION_ACCESS_ADVANCED) != PackageManager.PERMISSION_GRANTED - && dest != Downloads.Impl.DESTINATION_EXTERNAL - && dest != Downloads.Impl.DESTINATION_CACHE_PARTITION_PURGEABLE - && dest != Downloads.Impl.DESTINATION_FILE_URI) { + && (dest == Downloads.Impl.DESTINATION_CACHE_PARTITION + || dest == Downloads.Impl.DESTINATION_CACHE_PARTITION_NOROAMING + || dest == Downloads.Impl.DESTINATION_SYSTEMCACHE_PARTITION)) { throw new SecurityException("setting destination to : " + dest + " not allowed, unless PERMISSION_ACCESS_ADVANCED is granted"); } @@ -523,6 +524,8 @@ public final class DownloadProvider extends ContentProvider { } filteredValues.put(Downloads.Impl.COLUMN_DESTINATION, dest); } + + // validate the visibility column Integer vis = values.getAsInteger(Downloads.Impl.COLUMN_VISIBILITY); if (vis == null) { if (dest == Downloads.Impl.DESTINATION_EXTERNAL) { @@ -535,11 +538,34 @@ public final class DownloadProvider extends ContentProvider { } else { filteredValues.put(Downloads.Impl.COLUMN_VISIBILITY, vis); } + // copy the control column as is copyInteger(Downloads.Impl.COLUMN_CONTROL, values, filteredValues); - filteredValues.put(Downloads.Impl.COLUMN_STATUS, Downloads.Impl.STATUS_PENDING); + + /* + * requests coming from + * DownloadManager.completedDownload(String, String, String, boolean, String, + * String, long) need special treatment + */ + if (values.getAsInteger(Downloads.Impl.COLUMN_DESTINATION) == + Downloads.Impl.DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD) { + // these requests always are marked as 'completed' + filteredValues.put(Downloads.Impl.COLUMN_STATUS, Downloads.Impl.STATUS_SUCCESS); + filteredValues.put(Downloads.Impl.COLUMN_TOTAL_BYTES, + values.getAsLong(Downloads.Impl.COLUMN_TOTAL_BYTES)); + filteredValues.put(Downloads.Impl.COLUMN_CURRENT_BYTES, 0); + copyInteger(Downloads.Impl.COLUMN_MEDIA_SCANNED, values, filteredValues); + copyString(Downloads.Impl._DATA, values, filteredValues); + } else { + filteredValues.put(Downloads.Impl.COLUMN_STATUS, Downloads.Impl.STATUS_PENDING); + filteredValues.put(Downloads.Impl.COLUMN_TOTAL_BYTES, -1); + filteredValues.put(Downloads.Impl.COLUMN_CURRENT_BYTES, 0); + } + + // set lastupdate to current time filteredValues.put(Downloads.Impl.COLUMN_LAST_MODIFICATION, mSystemFacade.currentTimeMillis()); + // use packagename of the caller to set the notification columns String pckg = values.getAsString(Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE); String clazz = values.getAsString(Downloads.Impl.COLUMN_NOTIFICATION_CLASS); if (pckg != null && (clazz != null || isPublicApi)) { @@ -555,10 +581,14 @@ public final class DownloadProvider extends ContentProvider { /* ignored for now */ } } + + // copy some more columns as is copyString(Downloads.Impl.COLUMN_NOTIFICATION_EXTRAS, values, filteredValues); copyString(Downloads.Impl.COLUMN_COOKIE_DATA, values, filteredValues); copyString(Downloads.Impl.COLUMN_USER_AGENT, values, filteredValues); copyString(Downloads.Impl.COLUMN_REFERER, values, filteredValues); + + // UID, PID columns if (getContext().checkCallingPermission(Downloads.Impl.PERMISSION_ACCESS_ADVANCED) == PackageManager.PERMISSION_GRANTED) { copyInteger(Downloads.Impl.COLUMN_OTHER_UID, values, filteredValues); @@ -567,11 +597,12 @@ public final class DownloadProvider extends ContentProvider { if (Binder.getCallingUid() == 0) { copyInteger(Constants.UID, values, filteredValues); } + + // copy some more columns as is copyStringWithDefault(Downloads.Impl.COLUMN_TITLE, values, filteredValues, ""); copyStringWithDefault(Downloads.Impl.COLUMN_DESCRIPTION, values, filteredValues, ""); - filteredValues.put(Downloads.Impl.COLUMN_TOTAL_BYTES, -1); - filteredValues.put(Downloads.Impl.COLUMN_CURRENT_BYTES, 0); + // 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 { @@ -580,6 +611,7 @@ public final class DownloadProvider extends ContentProvider { filteredValues.put(Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI, isExternal); } + // public api requests and networktypes/roaming columns if (isPublicApi) { copyInteger(Downloads.Impl.COLUMN_ALLOWED_NETWORK_TYPES, values, filteredValues); copyBoolean(Downloads.Impl.COLUMN_ALLOW_ROAMING, values, filteredValues); @@ -656,9 +688,22 @@ public final class DownloadProvider extends ContentProvider { // check columns whose values are restricted enforceAllowedValues(values, Downloads.Impl.COLUMN_IS_PUBLIC_API, Boolean.TRUE); + + // validate the destination column + if (values.getAsInteger(Downloads.Impl.COLUMN_DESTINATION) == + Downloads.Impl.DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD) { + /* this row is inserted by + * DownloadManager.completedDownload(String, String, String, boolean, String, + * String, long) + */ + values.remove(Downloads.Impl.COLUMN_TOTAL_BYTES); + values.remove(Downloads.Impl._DATA); + values.remove(Downloads.Impl.COLUMN_STATUS); + } enforceAllowedValues(values, Downloads.Impl.COLUMN_DESTINATION, Downloads.Impl.DESTINATION_CACHE_PARTITION_PURGEABLE, - Downloads.Impl.DESTINATION_FILE_URI); + Downloads.Impl.DESTINATION_FILE_URI, + Downloads.Impl.DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD); if (getContext().checkCallingOrSelfPermission(Downloads.Impl.PERMISSION_NO_NOTIFICATION) == PackageManager.PERMISSION_GRANTED) { @@ -680,6 +725,7 @@ public final class DownloadProvider extends ContentProvider { values.remove(Downloads.Impl.COLUMN_ALLOW_ROAMING); values.remove(Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI); values.remove(Downloads.Impl.COLUMN_MEDIA_SCANNED); + Iterator<Map.Entry<String, Object>> iterator = values.valueSet().iterator(); while (iterator.hasNext()) { String key = iterator.next().getKey(); @@ -1081,7 +1127,7 @@ public final class DownloadProvider extends ContentProvider { throw new FileNotFoundException("No filename found."); } if (!Helpers.isFilenameValid(path, mDownloadsDataDir)) { - throw new FileNotFoundException("Invalid filename."); + throw new FileNotFoundException("Invalid filename: " + path); } if (!"r".equals(mode)) { throw new FileNotFoundException("Bad mode for " + uri + ": " + mode); |