diff options
Diffstat (limited to 'src/com/android/providers/downloads/DownloadReceiver.java')
-rw-r--r-- | src/com/android/providers/downloads/DownloadReceiver.java | 103 |
1 files changed, 45 insertions, 58 deletions
diff --git a/src/com/android/providers/downloads/DownloadReceiver.java b/src/com/android/providers/downloads/DownloadReceiver.java index 2f50dcf6..a0dc6947 100644 --- a/src/com/android/providers/downloads/DownloadReceiver.java +++ b/src/com/android/providers/downloads/DownloadReceiver.java @@ -18,7 +18,13 @@ package com.android.providers.downloads; import static android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED; import static android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION; + import static com.android.providers.downloads.Constants.TAG; +import static com.android.providers.downloads.Helpers.getAsyncHandler; +import static com.android.providers.downloads.Helpers.getDownloadNotifier; +import static com.android.providers.downloads.Helpers.getInt; +import static com.android.providers.downloads.Helpers.getString; +import static com.android.providers.downloads.Helpers.getSystemFacade; import android.app.DownloadManager; import android.app.NotificationManager; @@ -29,73 +35,49 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.Cursor; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; import android.net.Uri; -import android.os.Handler; -import android.os.HandlerThread; import android.provider.Downloads; import android.text.TextUtils; import android.util.Log; import android.util.Slog; import android.widget.Toast; -import com.google.common.annotations.VisibleForTesting; - /** * Receives system broadcasts (boot, network connectivity) */ public class DownloadReceiver extends BroadcastReceiver { /** - * Intent extra included with {@link #ACTION_CANCEL} intents, indicating the IDs (as array of - * long) of the downloads that were canceled. + * Intent extra included with {@link Constants#ACTION_CANCEL} intents, + * indicating the IDs (as array of long) of the downloads that were + * canceled. */ public static final String EXTRA_CANCELED_DOWNLOAD_IDS = "com.android.providers.downloads.extra.CANCELED_DOWNLOAD_IDS"; /** - * Intent extra included with {@link #ACTION_CANCEL} intents, indicating the tag of the - * notification corresponding to the download(s) that were canceled; this notification must be - * canceled. + * Intent extra included with {@link Constants#ACTION_CANCEL} intents, + * indicating the tag of the notification corresponding to the download(s) + * that were canceled; this notification must be canceled. */ public static final String EXTRA_CANCELED_DOWNLOAD_NOTIFICATION_TAG = "com.android.providers.downloads.extra.CANCELED_DOWNLOAD_NOTIFICATION_TAG"; - private static Handler sAsyncHandler; - - static { - final HandlerThread thread = new HandlerThread("DownloadReceiver"); - thread.start(); - sAsyncHandler = new Handler(thread.getLooper()); - } - - @VisibleForTesting - SystemFacade mSystemFacade = null; - @Override public void onReceive(final Context context, final Intent intent) { - if (mSystemFacade == null) { - mSystemFacade = new RealSystemFacade(context); - } - final String action = intent.getAction(); - if (Intent.ACTION_BOOT_COMPLETED.equals(action)) { - startService(context); - - } else if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) { - startService(context); - - } else if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) { - final ConnectivityManager connManager = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - final NetworkInfo info = connManager.getActiveNetworkInfo(); - if (info != null && info.isConnected()) { - startService(context); - } - + if (Intent.ACTION_BOOT_COMPLETED.equals(action) + || Intent.ACTION_MEDIA_MOUNTED.equals(action)) { + final PendingResult result = goAsync(); + getAsyncHandler().post(new Runnable() { + @Override + public void run() { + handleBootCompleted(context); + result.finish(); + } + }); } else if (Intent.ACTION_UID_REMOVED.equals(action)) { final PendingResult result = goAsync(); - sAsyncHandler.post(new Runnable() { + getAsyncHandler().post(new Runnable() { @Override public void run() { handleUidRemoved(context, intent); @@ -103,9 +85,6 @@ public class DownloadReceiver extends BroadcastReceiver { } }); - } else if (Constants.ACTION_RETRY.equals(action)) { - startService(context); - } else if (Constants.ACTION_OPEN.equals(action) || Constants.ACTION_LIST.equals(action) || Constants.ACTION_HIDE.equals(action)) { @@ -115,7 +94,7 @@ public class DownloadReceiver extends BroadcastReceiver { // TODO: remove this once test is refactored handleNotificationBroadcast(context, intent); } else { - sAsyncHandler.post(new Runnable() { + getAsyncHandler().post(new Runnable() { @Override public void run() { handleNotificationBroadcast(context, intent); @@ -138,6 +117,26 @@ public class DownloadReceiver extends BroadcastReceiver { } } + private void handleBootCompleted(Context context) { + // Show any relevant notifications for completed downloads + getDownloadNotifier(context).update(); + + // Schedule all downloads that are ready + final ContentResolver resolver = context.getContentResolver(); + try (Cursor cursor = resolver.query(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, null, null, + null, null)) { + final DownloadInfo.Reader reader = new DownloadInfo.Reader(resolver, cursor); + final DownloadInfo info = new DownloadInfo(context); + while (cursor.moveToNext()) { + reader.updateFromDatabase(info); + Helpers.scheduleJob(context, info); + } + } + + // Schedule idle pass to clean up orphaned files + DownloadIdleService.scheduleIdlePass(context); + } + private void handleUidRemoved(Context context, Intent intent) { final ContentResolver resolver = context.getContentResolver(); @@ -266,18 +265,6 @@ public class DownloadReceiver extends BroadcastReceiver { } } - mSystemFacade.sendBroadcast(appIntent); - } - - private static String getString(Cursor cursor, String col) { - return cursor.getString(cursor.getColumnIndexOrThrow(col)); - } - - private static int getInt(Cursor cursor, String col) { - return cursor.getInt(cursor.getColumnIndexOrThrow(col)); - } - - private void startService(Context context) { - context.startService(new Intent(context, DownloadService.class)); + getSystemFacade(context).sendBroadcast(appIntent); } } |