diff options
author | Jeff Sharkey <jsharkey@android.com> | 2014-10-16 22:16:04 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2014-10-16 22:16:04 +0000 |
commit | 9d59053e3e9167fe3771cc6445ef907d7d4d63fe (patch) | |
tree | 84525cc463a251ac98f7ce6d987a3f2f67ceaba9 | |
parent | 27efaa6f7457176a3b4d8b0b04a4622e85efff71 (diff) | |
parent | e24609e8f2aada5cb8ac1c3e93141b260e201efe (diff) | |
download | android_packages_providers_DownloadProvider-9d59053e3e9167fe3771cc6445ef907d7d4d63fe.tar.gz android_packages_providers_DownloadProvider-9d59053e3e9167fe3771cc6445ef907d7d4d63fe.tar.bz2 android_packages_providers_DownloadProvider-9d59053e3e9167fe3771cc6445ef907d7d4d63fe.zip |
Trim stale downloads from third-party apps.
automerge: e24609e
* commit 'e24609e8f2aada5cb8ac1c3e93141b260e201efe':
Trim stale downloads from third-party apps.
-rw-r--r-- | src/com/android/providers/downloads/DownloadIdleService.java | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/src/com/android/providers/downloads/DownloadIdleService.java b/src/com/android/providers/downloads/DownloadIdleService.java index ddfeba41..b5371552 100644 --- a/src/com/android/providers/downloads/DownloadIdleService.java +++ b/src/com/android/providers/downloads/DownloadIdleService.java @@ -29,6 +29,7 @@ import android.os.Environment; import android.provider.Downloads; import android.system.ErrnoException; import android.text.TextUtils; +import android.text.format.DateUtils; import android.util.Slog; import com.android.providers.downloads.StorageUtils.ConcreteFile; @@ -57,10 +58,11 @@ public class DownloadIdleService extends JobService { @Override public void run() { + cleanStale(); cleanOrphans(); jobFinished(mParams, false); } - }; + } @Override public boolean onStartJob(JobParameters params) { @@ -75,7 +77,47 @@ public class DownloadIdleService extends JobService { return false; } - private interface DownloadQuery { + private interface StaleQuery { + final String[] PROJECTION = new String[] { + Downloads.Impl._ID, + Downloads.Impl.COLUMN_STATUS, + Downloads.Impl.COLUMN_LAST_MODIFICATION, + Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI }; + + final int _ID = 0; + } + + /** + * Remove stale downloads that third-party apps probably forgot about. We + * only consider non-visible downloads that haven't been touched in over a + * week. + */ + public void cleanStale() { + final ContentResolver resolver = getContentResolver(); + + final long modifiedBefore = System.currentTimeMillis() - DateUtils.WEEK_IN_MILLIS; + final Cursor cursor = resolver.query(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, + StaleQuery.PROJECTION, Downloads.Impl.COLUMN_STATUS + " >= '200' AND " + + Downloads.Impl.COLUMN_LAST_MODIFICATION + " <= '" + modifiedBefore + + "' AND " + Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI + " == '0'", + null, null); + + int count = 0; + try { + while (cursor.moveToNext()) { + final long id = cursor.getLong(StaleQuery._ID); + resolver.delete(ContentUris.withAppendedId( + Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, id), null, null); + count++; + } + } finally { + IoUtils.closeQuietly(cursor); + } + + Slog.d(TAG, "Removed " + count + " stale downloads"); + } + + private interface OrphanQuery { final String[] PROJECTION = new String[] { Downloads.Impl._ID, Downloads.Impl._DATA }; @@ -93,10 +135,10 @@ public class DownloadIdleService extends JobService { // Collect known files from database final HashSet<ConcreteFile> fromDb = Sets.newHashSet(); final Cursor cursor = resolver.query(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, - DownloadQuery.PROJECTION, null, null, null); + OrphanQuery.PROJECTION, null, null, null); try { while (cursor.moveToNext()) { - final String path = cursor.getString(DownloadQuery._DATA); + final String path = cursor.getString(OrphanQuery._DATA); if (TextUtils.isEmpty(path)) continue; final File file = new File(path); @@ -111,7 +153,7 @@ public class DownloadIdleService extends JobService { // currently mounted device, so remove it from database. // This logic preserves files on external storage while // media is removed. - final long id = cursor.getLong(DownloadQuery._ID); + final long id = cursor.getLong(OrphanQuery._ID); Slog.d(TAG, "Missing " + file + ", deleting " + id); resolver.delete(ContentUris.withAppendedId( Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, id), null, null); |