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/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);
+    }
 }