diff options
author | Steve Howard <showard@google.com> | 2010-07-20 16:32:31 -0700 |
---|---|---|
committer | Steve Howard <showard@google.com> | 2010-07-23 15:14:45 -0700 |
commit | 71aab521efba9b28779541440c797220ec98ac97 (patch) | |
tree | 592cfe9a02dddf9e862934146536623050724355 /src/com | |
parent | b06b739b078ce4b00600487cfec31659647bf31f (diff) | |
download | android_packages_providers_DownloadProvider-71aab521efba9b28779541440c797220ec98ac97.tar.gz android_packages_providers_DownloadProvider-71aab521efba9b28779541440c797220ec98ac97.tar.bz2 android_packages_providers_DownloadProvider-71aab521efba9b28779541440c797220ec98ac97.zip |
Support for non-purgeable downloads through the public API.
This change adds a permission,
android.permission.DOWNLOAD_CACHE_NON_PURGEABLE. When an app has this
permission, any downloads it requests through the public API to the
download cache will automatically become non-purgeable, i.e. they'll
never be automatically deleted by the download manager to free up
space. This is intended for use only by the system updater.
Change-Id: I35cdd44f7e5d46bc70443d1a9743f61a51395ddb
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/android/providers/downloads/DownloadProvider.java | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java index 2c0a2645..a116f87d 100644 --- a/src/com/android/providers/downloads/DownloadProvider.java +++ b/src/com/android/providers/downloads/DownloadProvider.java @@ -337,6 +337,11 @@ public final class DownloadProvider extends ContentProvider { 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; + Integer dest = values.getAsInteger(Downloads.Impl.COLUMN_DESTINATION); if (dest != null) { if (getContext().checkCallingPermission(Downloads.Impl.PERMISSION_ACCESS_ADVANCED) @@ -346,6 +351,16 @@ public final class DownloadProvider extends ContentProvider { && dest != Downloads.Impl.DESTINATION_FILE_URI) { throw new SecurityException("unauthorized destination code"); } + // for public API behavior, if an app has CACHE_NON_PURGEABLE permission, automatically + // switch to non-purgeable download + boolean hasNonPurgeablePermission = + getContext().checkCallingPermission( + Downloads.Impl.PERMISSION_CACHE_NON_PURGEABLE) + == PackageManager.PERMISSION_GRANTED; + if (isPublicApi && dest == Downloads.Impl.DESTINATION_CACHE_PARTITION_PURGEABLE + && hasNonPurgeablePermission) { + dest = Downloads.Impl.DESTINATION_CACHE_PARTITION; + } if (dest == Downloads.Impl.DESTINATION_FILE_URI) { getContext().enforcePermission( android.Manifest.permission.WRITE_EXTERNAL_STORAGE, @@ -372,10 +387,6 @@ public final class DownloadProvider extends ContentProvider { filteredValues.put(Downloads.Impl.COLUMN_LAST_MODIFICATION, mSystemFacade.currentTimeMillis()); - copyBoolean(Downloads.Impl.COLUMN_IS_PUBLIC_API, values, filteredValues); - boolean isPublicApi = - values.getAsBoolean(Downloads.Impl.COLUMN_IS_PUBLIC_API) == Boolean.TRUE; - String pckg = values.getAsString(Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE); String clazz = values.getAsString(Downloads.Impl.COLUMN_NOTIFICATION_CLASS); if (pckg != null && (clazz != null || isPublicApi)) { @@ -846,7 +857,7 @@ public final class DownloadProvider extends ContentProvider { getContext().getContentResolver().notifyChange(uri, null); return count; } - + private void appendClause(StringBuilder whereClause, String newClause) { if (whereClause.length() != 0) { whereClause.append(" AND "); |