Merge "Fixes bookmark sort order"
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/res/drawable-hdpi/bookmark_dialog_bg.9.png b/res/drawable-hdpi/bookmark_dialog_bg.9.png
new file mode 100644
index 0000000..9b8384d
--- /dev/null
+++ b/res/drawable-hdpi/bookmark_dialog_bg.9.png
Binary files differ
diff --git a/res/drawable-hdpi/cab_bg.9.png b/res/drawable-hdpi/cab_bg.9.png
new file mode 100644
index 0000000..8d0de94
--- /dev/null
+++ b/res/drawable-hdpi/cab_bg.9.png
Binary files differ
diff --git a/res/drawable-hdpi/crumb_divider.9.png b/res/drawable-hdpi/crumb_divider.9.png
new file mode 100644
index 0000000..f748ffa
--- /dev/null
+++ b/res/drawable-hdpi/crumb_divider.9.png
Binary files differ
diff --git a/res/drawable-hdpi/dialog_full.9.png b/res/drawable-hdpi/dialog_full.9.png
new file mode 100644
index 0000000..33a502b
--- /dev/null
+++ b/res/drawable-hdpi/dialog_full.9.png
Binary files differ
diff --git a/res/drawable-hdpi/empty_bookmark_image.png b/res/drawable-hdpi/empty_bookmark_image.png
new file mode 100644
index 0000000..7f9af71
--- /dev/null
+++ b/res/drawable-hdpi/empty_bookmark_image.png
Binary files differ
diff --git a/res/drawable-hdpi/fav_incognito.png b/res/drawable-hdpi/fav_incognito.png
new file mode 100644
index 0000000..b8acde2
--- /dev/null
+++ b/res/drawable-hdpi/fav_incognito.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_add_string.png b/res/drawable-hdpi/ic_add_string.png
new file mode 100644
index 0000000..0775776
--- /dev/null
+++ b/res/drawable-hdpi/ic_add_string.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_back_normal.png b/res/drawable-hdpi/ic_back_normal.png
new file mode 100644
index 0000000..1e1b446
--- /dev/null
+++ b/res/drawable-hdpi/ic_back_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_bookmarks_history_normal.png b/res/drawable-hdpi/ic_bookmarks_history_normal.png
new file mode 100644
index 0000000..5110097
--- /dev/null
+++ b/res/drawable-hdpi/ic_bookmarks_history_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_favorite_on_dark.png b/res/drawable-hdpi/ic_favorite_on_dark.png
new file mode 100644
index 0000000..c60cbbe
--- /dev/null
+++ b/res/drawable-hdpi/ic_favorite_on_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_favorite_on_normal.png b/res/drawable-hdpi/ic_favorite_on_normal.png
new file mode 100644
index 0000000..fec86e8
--- /dev/null
+++ b/res/drawable-hdpi/ic_favorite_on_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_folder.9.png b/res/drawable-hdpi/ic_folder.9.png
new file mode 100644
index 0000000..c1c9d54
--- /dev/null
+++ b/res/drawable-hdpi/ic_folder.9.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_forward_normal.png b/res/drawable-hdpi/ic_forward_normal.png
new file mode 100644
index 0000000..1cbf28a
--- /dev/null
+++ b/res/drawable-hdpi/ic_forward_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_go_dark.png b/res/drawable-hdpi/ic_go_dark.png
new file mode 100644
index 0000000..6c06ced
--- /dev/null
+++ b/res/drawable-hdpi/ic_go_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_archive_normal.png b/res/drawable-hdpi/ic_menu_archive_normal.png
new file mode 100644
index 0000000..368b125
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_archive_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_cab_close.png b/res/drawable-hdpi/ic_menu_cab_close.png
new file mode 100644
index 0000000..5cf7990
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_cab_close.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_cab_pencil.png b/res/drawable-hdpi/ic_menu_cab_pencil.png
new file mode 100644
index 0000000..a15878b
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_cab_pencil.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_downloads_normal.png b/res/drawable-hdpi/ic_menu_downloads_normal.png
new file mode 100644
index 0000000..b1ef0fe
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_downloads_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_findonpage_normal.png b/res/drawable-hdpi/ic_menu_findonpage_normal.png
new file mode 100644
index 0000000..f4f8f85
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_findonpage_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_incognito_normal.png b/res/drawable-hdpi/ic_menu_incognito_normal.png
new file mode 100644
index 0000000..dbecf6f
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_incognito_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_overflow.png b/res/drawable-hdpi/ic_menu_overflow.png
new file mode 100644
index 0000000..107de5e
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_overflow.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_pageinfo_normal.png b/res/drawable-hdpi/ic_menu_pageinfo_normal.png
new file mode 100644
index 0000000..b783a65
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_pageinfo_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_settings_normal.png b/res/drawable-hdpi/ic_menu_settings_normal.png
new file mode 100644
index 0000000..f07be97
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_settings_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_share_normal.png b/res/drawable-hdpi/ic_menu_share_normal.png
new file mode 100644
index 0000000..b50b58f
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_share_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_refresh_normal.png b/res/drawable-hdpi/ic_refresh_normal.png
new file mode 100644
index 0000000..9ee3078
--- /dev/null
+++ b/res/drawable-hdpi/ic_refresh_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_search_normal.png b/res/drawable-hdpi/ic_search_normal.png
new file mode 100644
index 0000000..343d2ca
--- /dev/null
+++ b/res/drawable-hdpi/ic_search_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_stop_normal.png b/res/drawable-hdpi/ic_stop_normal.png
new file mode 100644
index 0000000..18ca67a
--- /dev/null
+++ b/res/drawable-hdpi/ic_stop_normal.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_tab_close.png b/res/drawable-hdpi/ic_tab_close.png
new file mode 100644
index 0000000..e501486
--- /dev/null
+++ b/res/drawable-hdpi/ic_tab_close.png
Binary files differ
diff --git a/res/drawable-hdpi/menu_dropdown.9.png b/res/drawable-hdpi/menu_dropdown.9.png
new file mode 100644
index 0000000..e388252
--- /dev/null
+++ b/res/drawable-hdpi/menu_dropdown.9.png
Binary files differ
diff --git a/res/drawable-hdpi/progress.9.png b/res/drawable-hdpi/progress.9.png
new file mode 100644
index 0000000..398bee4
--- /dev/null
+++ b/res/drawable-hdpi/progress.9.png
Binary files differ
diff --git a/res/drawable-hdpi/tabbar_bg.9.png b/res/drawable-hdpi/tabbar_bg.9.png
new file mode 100644
index 0000000..01dabd0
--- /dev/null
+++ b/res/drawable-hdpi/tabbar_bg.9.png
Binary files differ
diff --git a/res/drawable-hdpi/text_field.9.png b/res/drawable-hdpi/text_field.9.png
new file mode 100644
index 0000000..a30afd9
--- /dev/null
+++ b/res/drawable-hdpi/text_field.9.png
Binary files differ
diff --git a/res/drawable-hdpi/text_field_focused.9.png b/res/drawable-hdpi/text_field_focused.9.png
new file mode 100644
index 0000000..3888eef
--- /dev/null
+++ b/res/drawable-hdpi/text_field_focused.9.png
Binary files differ
diff --git a/res/drawable-hdpi/text_field_results.9.png b/res/drawable-hdpi/text_field_results.9.png
new file mode 100644
index 0000000..bd4bcc5
--- /dev/null
+++ b/res/drawable-hdpi/text_field_results.9.png
Binary files differ
diff --git a/res/drawable-hdpi/urlbar_bg.9.png b/res/drawable-hdpi/urlbar_bg.9.png
new file mode 100644
index 0000000..c35383e
--- /dev/null
+++ b/res/drawable-hdpi/urlbar_bg.9.png
Binary files differ
diff --git a/res/drawable-mdpi/button_selected.png b/res/drawable-mdpi/button_selected.png
new file mode 100644
index 0000000..5513bb3
--- /dev/null
+++ b/res/drawable-mdpi/button_selected.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_folder.9.png b/res/drawable-mdpi/ic_folder.9.png
new file mode 100644
index 0000000..431aae8
--- /dev/null
+++ b/res/drawable-mdpi/ic_folder.9.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_folder.png b/res/drawable-mdpi/ic_folder.png
deleted file mode 100644
index ee85b28..0000000
--- a/res/drawable-mdpi/ic_folder.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_downloads.png b/res/drawable-mdpi/ic_menu_downloads.png
new file mode 100644
index 0000000..9851f60
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_downloads.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_pageinfo.png b/res/drawable-mdpi/ic_menu_pageinfo.png
new file mode 100644
index 0000000..adf5c2a
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_pageinfo.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_settings.png b/res/drawable-mdpi/ic_menu_settings.png
new file mode 100644
index 0000000..a98a18b
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_settings.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_share.png b/res/drawable-mdpi/ic_menu_share.png
new file mode 100644
index 0000000..b09e74d
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_share.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_reload.png b/res/drawable-mdpi/ic_reload.png
new file mode 100644
index 0000000..215ca02
--- /dev/null
+++ b/res/drawable-mdpi/ic_reload.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_star.png b/res/drawable-mdpi/ic_star.png
new file mode 100644
index 0000000..608d8a7
--- /dev/null
+++ b/res/drawable-mdpi/ic_star.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_stop.png b/res/drawable-mdpi/ic_stop.png
new file mode 100644
index 0000000..19b2e15
--- /dev/null
+++ b/res/drawable-mdpi/ic_stop.png
Binary files differ
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 072a0b1..639a75b 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -3184,9 +3184,14 @@
         DownloadManager.Request request = new DownloadManager.Request(uri);
         request.setMimeType(mimetype);
         request.setDestinationInExternalFilesDir(this, null, filename);
+        // let this downloaded file be scanned by MediaScanner - so that it can show up
+        // in Gallery app, for example.
+        request.allowScanningByMediaScanner();
         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..02dba51 100644
--- a/src/com/android/browser/OpenDownloadReceiver.java
+++ b/src/com/android/browser/OpenDownloadReceiver.java
@@ -17,17 +17,10 @@
 package com.android.browser;
 
 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;
 
 /**
  * This {@link BroadcastReceiver} handles clicks to notifications that
@@ -36,49 +29,41 @@
  * 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();
-        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);
-                    }
-                }
-            }
-        } finally {
-            if (cursor != null) cursor.close();
+        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 manager = (DownloadManager) context.getSystemService(
+                Context.DOWNLOAD_SERVICE);
+        Uri uri = manager.getUriForDownloadedFile(id);
+        if (uri == null) {
+            // Open the downloads page
+            openDownloadsPage(context);
+        } else {
+            Intent launchIntent = new Intent(Intent.ACTION_VIEW);
+            launchIntent.setDataAndType(uri, context.getContentResolver().getType(uri));
+            launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            context.startActivity(launchIntent);
+        }
+    }
+
+    /**
+     * 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);
     }
 }
diff --git a/src/com/android/browser/SuggestionsAdapter.java b/src/com/android/browser/SuggestionsAdapter.java
index 626283a..d3609b2 100644
--- a/src/com/android/browser/SuggestionsAdapter.java
+++ b/src/com/android/browser/SuggestionsAdapter.java
@@ -73,7 +73,7 @@
 
         public void onSearch(String txt);
 
-        public void onSelect(String txt);
+        public void onSelect(String txt, String extraData);
 
         public void onFilterComplete(int count);
 
@@ -119,7 +119,8 @@
             mListener.onSearch(item.title);
         } else {
             SuggestItem item = (SuggestItem) v.getTag();
-            mListener.onSelect((TextUtils.isEmpty(item.url)? item.title : item.url));
+            mListener.onSelect((TextUtils.isEmpty(item.url)? item.title : item.url),
+                    item.extra);
         }
     }
 
@@ -378,6 +379,7 @@
         String title;
         String url;
         int type;
+        String extra;
 
         public SuggestItem(String text, String u, int t) {
             title = text;
@@ -541,7 +543,10 @@
                 String uri = mCursor.getString(
                         mCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_INTENT_DATA));
                 int type = (TextUtils.isEmpty(url)) ? TYPE_SUGGEST : TYPE_SUGGEST_URL;
-                return new SuggestItem(title, url, type);
+                SuggestItem item = new SuggestItem(title, url, type);
+                item.extra = mCursor.getString(
+                        mCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA));
+                return item;
             }
             return null;
         }
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index b87ea78..f39c769 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -137,7 +137,7 @@
             stopOrRefresh();
         } else if (mGoButton == v) {
             if (!TextUtils.isEmpty(mUrlFocused.getText())) {
-                onAction(mUrlFocused.getText().toString());
+                onAction(mUrlFocused.getText().toString(), null);
             }
         } else if (mClearButton == v) {
             mUrlFocused.setText("");
@@ -154,12 +154,15 @@
     // UrlInputListener implementation
 
     @Override
-    public void onAction(String text) {
+    public void onAction(String text, String extra) {
         mBrowserActivity.getTabControl().getCurrentTopWebView().requestFocus();
         mBrowserActivity.hideFakeTitleBar();
         Intent i = new Intent();
         i.setAction(Intent.ACTION_SEARCH);
         i.putExtra(SearchManager.QUERY, text);
+        if (extra != null) {
+            i.putExtra(SearchManager.EXTRA_DATA_KEY, extra);
+        }
         mBrowserActivity.onNewIntent(i);
         setUrlMode(false);
         setDisplayTitle(text);
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 18c5fe6..e7fc233 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -114,7 +114,7 @@
 
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-        finishInput(getText().toString());
+        finishInput(getText().toString(), null);
         return true;
     }
 
@@ -123,7 +123,7 @@
         if (hasFocus) {
             forceIme();
         } else {
-            finishInput(null);
+            finishInput(null, null);
         }
         if (mWrappedFocusListener != null) {
             mWrappedFocusListener.onFocusChange(v, hasFocus);
@@ -138,14 +138,14 @@
         mInputManager.showSoftInput(this, 0);
     }
 
-    private void finishInput(String url) {
+    private void finishInput(String url, String extra) {
         this.dismissDropDown();
         this.setSelection(0,0);
         mInputManager.hideSoftInputFromWindow(getWindowToken(), 0);
         if (url == null) {
             mListener.onDismiss();
         } else {
-            mListener.onAction(url);
+            mListener.onAction(url, extra);
         }
     }
 
@@ -157,15 +157,15 @@
     }
 
     @Override
-    public void onSelect(String url) {
-        finishInput(url);
+    public void onSelect(String url, String extra) {
+        finishInput(url, extra);
     }
 
     @Override
     public boolean onKeyPreIme(int keyCode, KeyEvent evt) {
         if (keyCode == KeyEvent.KEYCODE_BACK) {
             // catch back key in order to do slightly more cleanup than usual
-            finishInput(null);
+            finishInput(null, null);
             return true;
         }
         return super.onKeyPreIme(keyCode, evt);
@@ -175,7 +175,7 @@
 
         public void onDismiss();
 
-        public void onAction(String text);
+        public void onAction(String text, String extra);
 
         public void onEdit(String text);