Open downloads from notifications.
Bug:3116742
When moving to the public API, notifications no longer
worked as expected. Make downloads show after completing,
and use the public API in OpenDownloadReceiver.
Change-Id: Ia15000de4a66e8728b43fc53f428e098503b003b
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8e6934c..9fea44a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -232,7 +232,6 @@
<receiver android:name=".OpenDownloadReceiver">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"/>
- <data android:scheme="content" android:mimeType="vnd.android.cursor.item/download"/>
</intent-filter>
</receiver>
</application>
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 072a0b1..799a8da 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -3187,6 +3187,8 @@
request.setDescription(webAddress.getHost());
String cookies = CookieManager.getInstance().getCookie(url);
request.addRequestHeader("cookie", cookies);
+ request.setNotificationVisibility(
+ DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
if (mimetype == null) {
ContentValues values = new ContentValues();
values.put(FetchUrlMimeType.URI, addressString);
diff --git a/src/com/android/browser/OpenDownloadReceiver.java b/src/com/android/browser/OpenDownloadReceiver.java
index f66c332..34cc6b9 100644
--- a/src/com/android/browser/OpenDownloadReceiver.java
+++ b/src/com/android/browser/OpenDownloadReceiver.java
@@ -19,12 +19,10 @@
import android.app.DownloadManager;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
-import android.provider.Downloads;
import android.widget.Toast;
import java.io.File;
@@ -36,49 +34,66 @@
* a complete, successful download will open the file.
*/
public class OpenDownloadReceiver extends BroadcastReceiver {
+ @Override
public void onReceive(Context context, Intent intent) {
- ContentResolver cr = context.getContentResolver();
- Uri data = intent.getData();
+ String action = intent.getAction();
+ if (!DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) {
+ openDownloadsPage(context);
+ return;
+ }
+ long ids[] = intent.getLongArrayExtra(
+ DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS);
+ if (ids == null || ids.length == 0) {
+ openDownloadsPage(context);
+ return;
+ }
+ long id = ids[0];
+ DownloadManager.Query query = new DownloadManager.Query();
+ query.setFilterById(id);
+ DownloadManager manager = (DownloadManager) context.getSystemService(
+ Context.DOWNLOAD_SERVICE);
Cursor cursor = null;
try {
- cursor = cr.query(data,
- new String[] { Downloads.Impl._ID, Downloads.Impl._DATA,
- Downloads.Impl.COLUMN_MIME_TYPE, Downloads.Impl.COLUMN_STATUS },
- null, null, null);
- if (cursor.moveToFirst()) {
- String filename = cursor.getString(1);
- String mimetype = cursor.getString(2);
- String action = intent.getAction();
- if (Downloads.Impl.ACTION_NOTIFICATION_CLICKED.equals(action)) {
- int status = cursor.getInt(3);
- if (Downloads.Impl.isStatusCompleted(status)
- && Downloads.Impl.isStatusSuccess(status)) {
- Intent launchIntent = new Intent(Intent.ACTION_VIEW);
- Uri path = Uri.parse(filename);
- // If there is no scheme, then it must be a file
- if (path.getScheme() == null) {
- path = Uri.fromFile(new File(filename));
- }
- launchIntent.setDataAndType(path, mimetype);
- launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- try {
- context.startActivity(launchIntent);
- } catch (ActivityNotFoundException ex) {
- Toast.makeText(context,
- R.string.download_no_application_title,
- Toast.LENGTH_LONG).show();
- }
- } else {
- // Open the downloads page
- Intent pageView = new Intent(
- DownloadManager.ACTION_VIEW_DOWNLOADS);
- pageView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(pageView);
+ cursor = manager.query(query);
+ if (cursor != null && cursor.moveToFirst()) {
+ int status = cursor.getInt(cursor.getColumnIndexOrThrow(
+ DownloadManager.COLUMN_STATUS));
+ if (DownloadManager.STATUS_SUCCESSFUL == status) {
+ Intent launchIntent = new Intent(Intent.ACTION_VIEW);
+ int uriCol = cursor.getColumnIndexOrThrow(
+ DownloadManager.COLUMN_LOCAL_FILENAME);
+ String filename = cursor.getString(uriCol);
+ Uri path = Uri.parse(filename);
+ // If there is no scheme, then it must be a file
+ if (path.getScheme() == null) {
+ path = Uri.fromFile(new File(filename));
}
+ int typeCol = cursor.getColumnIndexOrThrow(
+ DownloadManager.COLUMN_MEDIA_TYPE);
+ String mimetype = cursor.getString(typeCol);
+ launchIntent.setDataAndType(path, mimetype);
+ launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(launchIntent);
+ } else {
+ // Open the downloads page
+ openDownloadsPage(context);
}
}
+ } catch (ActivityNotFoundException ex) {
+ Toast.makeText(context, R.string.download_no_application_title,
+ Toast.LENGTH_LONG).show();
} finally {
if (cursor != null) cursor.close();
}
}
+
+ /**
+ * Open the Activity which shows a list of all downloads.
+ * @param context
+ */
+ private void openDownloadsPage(Context context) {
+ Intent pageView = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
+ pageView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(pageView);
+ }
}