summaryrefslogtreecommitdiffstats
path: root/src/com/android/providers/downloads/DownloadService.java
diff options
context:
space:
mode:
authorSteve Howard <showard@google.com>2010-07-15 19:59:40 -0700
committerSteve Howard <showard@google.com>2010-07-19 11:04:38 -0700
commit071bd7acb3185f4f1e807855605c5e6018e9742f (patch)
tree85e1d36689bb632b20b74faaac9596d660a7a46d /src/com/android/providers/downloads/DownloadService.java
parent1aa26989047495ff58d3e2598d3f9549465cbb65 (diff)
downloadandroid_packages_providers_DownloadProvider-071bd7acb3185f4f1e807855605c5e6018e9742f.tar.gz
android_packages_providers_DownloadProvider-071bd7acb3185f4f1e807855605c5e6018e9742f.tar.bz2
android_packages_providers_DownloadProvider-071bd7acb3185f4f1e807855605c5e6018e9742f.zip
Support for max download size that may go over mobile
This change introduces support for a maximum download size that may go over a mobile connection. Downloads above this limit will wait for a wifi connection. To accomplish this, I moved a lot of the logic for checking connectivity info into DownloadInfo itself. I then moved the code to call these checks from DownloadService, where it would call the checks before spawning a DownloadThread, into DownloadThread itself. This makes it simpler to check connectivity after we get Content-Length info. It also eliminates the risk of a race condition where connectivity changes between the check and the actual request execution. I realize this change reduces efficiency, because we now call into ConnectivityManager/TelephonyManager twice per DownloadThread, rather than once per DownloadService "tick". I feel that it's OK since its a small amount of computation running relatively infrequently. If we feel that it's a serious concern, and that the efficiency issues outweigh the race problem, I can go easily back to the old approach. I've left out the code to actually fetch the limit. I think this will come from system settings, but I want to double-check, so I'll put it in a separate change. Other changes: * simplify SystemFacade's interface to get connectivity info - rather than returning all connected types, just return the active type, since that should be all we care about * adding @LargeTest to PublicApiFunctionalTest Change-Id: Id1faa2c45bf2dade9fe779440721a1d42cbdfcd1
Diffstat (limited to 'src/com/android/providers/downloads/DownloadService.java')
-rw-r--r--src/com/android/providers/downloads/DownloadService.java78
1 files changed, 9 insertions, 69 deletions
diff --git a/src/com/android/providers/downloads/DownloadService.java b/src/com/android/providers/downloads/DownloadService.java
index b5cb2d45..e474d4d7 100644
--- a/src/com/android/providers/downloads/DownloadService.java
+++ b/src/com/android/providers/downloads/DownloadService.java
@@ -310,8 +310,6 @@ public class DownloadService extends Service {
}
mPendingUpdate = false;
}
- boolean networkAvailable = Helpers.isNetworkAvailable(mSystemFacade);
- boolean networkRoaming = Helpers.isNetworkRoaming(mSystemFacade);
long now = mSystemFacade.currentTimeMillis();
Cursor cursor = getContentResolver().query(Downloads.Impl.CONTENT_URI,
@@ -368,7 +366,7 @@ public class DownloadService extends Service {
int id = cursor.getInt(idColumn);
if (arrayPos == mDownloads.size()) {
- insertDownload(cursor, arrayPos, networkAvailable, networkRoaming, now);
+ insertDownload(cursor, arrayPos, now);
if (Constants.LOGVV) {
Log.v(Constants.TAG, "Array update: appending " +
id + " @ " + arrayPos);
@@ -405,9 +403,7 @@ public class DownloadService extends Service {
deleteDownload(arrayPos); // this advances in the array
} else if (arrayId == id) {
// This cursor row already exists in the stored array
- updateDownload(
- cursor, arrayPos,
- networkAvailable, networkRoaming, now);
+ updateDownload(cursor, arrayPos, now);
if (shouldScanFile(arrayPos)
&& (!mediaScannerConnected()
|| !scanFile(cursor, arrayPos))) {
@@ -432,9 +428,7 @@ public class DownloadService extends Service {
Log.v(Constants.TAG, "Array update: inserting " +
id + " @ " + arrayPos);
}
- insertDownload(
- cursor, arrayPos,
- networkAvailable, networkRoaming, now);
+ insertDownload(cursor, arrayPos, now);
if (shouldScanFile(arrayPos)
&& (!mediaScannerConnected()
|| !scanFile(cursor, arrayPos))) {
@@ -551,10 +545,8 @@ public class DownloadService extends Service {
* Keeps a local copy of the info about a download, and initiates the
* download if appropriate.
*/
- private void insertDownload(
- Cursor cursor, int arrayPos,
- boolean networkAvailable, boolean networkRoaming, long now) {
- DownloadInfo info = new DownloadInfo(getContentResolver(), cursor);
+ private void insertDownload(Cursor cursor, int arrayPos, long now) {
+ DownloadInfo info = new DownloadInfo(this, mSystemFacade, cursor);
if (Constants.LOGVV) {
Log.v(Constants.TAG, "Service adding new entry");
@@ -617,51 +609,18 @@ public class DownloadService extends Service {
ContentValues values = new ContentValues();
values.put(Downloads.Impl.COLUMN_STATUS, Downloads.Impl.STATUS_NOT_ACCEPTABLE);
getContentResolver().update(uri, values, null, null);
- info.sendIntentIfRequested(uri, this);
+ info.sendIntentIfRequested(uri);
return;
}
}
- if (info.canUseNetwork(networkAvailable, networkRoaming)) {
- if (info.isReadyToStart(now)) {
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "Service spawning thread to handle new download " +
- info.mId);
- }
- if (info.mHasActiveThread) {
- throw new IllegalStateException("Multiple threads on same download on insert");
- }
- if (info.mStatus != Downloads.Impl.STATUS_RUNNING) {
- info.mStatus = Downloads.Impl.STATUS_RUNNING;
- ContentValues values = new ContentValues();
- values.put(Downloads.Impl.COLUMN_STATUS, info.mStatus);
- getContentResolver().update(
- ContentUris.withAppendedId(Downloads.Impl.CONTENT_URI, info.mId),
- values, null, null);
- }
- DownloadThread downloader = new DownloadThread(this, mSystemFacade, info);
- info.mHasActiveThread = true;
- downloader.start();
- }
- } else {
- if (info.mStatus == 0
- || info.mStatus == Downloads.Impl.STATUS_PENDING
- || info.mStatus == Downloads.Impl.STATUS_RUNNING) {
- info.mStatus = Downloads.Impl.STATUS_RUNNING_PAUSED;
- Uri uri = ContentUris.withAppendedId(Downloads.Impl.CONTENT_URI, info.mId);
- ContentValues values = new ContentValues();
- values.put(Downloads.Impl.COLUMN_STATUS, Downloads.Impl.STATUS_RUNNING_PAUSED);
- getContentResolver().update(uri, values, null, null);
- }
- }
+ info.startIfReady(now);
}
/**
* Updates the local copy of the info about a download.
*/
- private void updateDownload(
- Cursor cursor, int arrayPos,
- boolean networkAvailable, boolean networkRoaming, long now) {
+ private void updateDownload(Cursor cursor, int arrayPos, long now) {
DownloadInfo info = (DownloadInfo) mDownloads.get(arrayPos);
int statusColumn = cursor.getColumnIndexOrThrow(Downloads.Impl.COLUMN_STATUS);
int failedColumn = cursor.getColumnIndexOrThrow(Constants.FAILED_CONNECTIONS);
@@ -715,26 +674,7 @@ public class DownloadService extends Service {
info.mMediaScanned =
cursor.getInt(cursor.getColumnIndexOrThrow(Constants.MEDIA_SCANNED)) == 1;
- if (info.canUseNetwork(networkAvailable, networkRoaming)) {
- if (info.isReadyToRestart(now)) {
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "Service spawning thread to handle updated download " +
- info.mId);
- }
- if (info.mHasActiveThread) {
- throw new IllegalStateException("Multiple threads on same download on update");
- }
- info.mStatus = Downloads.Impl.STATUS_RUNNING;
- ContentValues values = new ContentValues();
- values.put(Downloads.Impl.COLUMN_STATUS, info.mStatus);
- getContentResolver().update(
- ContentUris.withAppendedId(Downloads.Impl.CONTENT_URI, info.mId),
- values, null, null);
- DownloadThread downloader = new DownloadThread(this, mSystemFacade, info);
- info.mHasActiveThread = true;
- downloader.start();
- }
- }
+ info.startIfReady(now);
}
/**