Merge "Show a remove button for existing bookmarks." into honeycomb
diff --git a/res/layout/bookmarkthumbnailwidget.xml b/res/layout/bookmarkthumbnailwidget.xml
index 2c94d32..e312a2a 100644
--- a/res/layout/bookmarkthumbnailwidget.xml
+++ b/res/layout/bookmarkthumbnailwidget.xml
@@ -13,50 +13,39 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<FrameLayout
+<RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:paddingTop="4dip"
-    android:paddingBottom="22dip"
-    android:paddingLeft="13dip"
-    android:paddingRight="13dip">
-    <LinearLayout
+    android:paddingBottom="20dip"
+    android:paddingLeft="12dip"
+    android:paddingRight="12dip">
+    <GridView
+        android:id="@+id/bookmarks_list"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:orientation="vertical"
-        android:padding="0dip">
-        <ImageView android:background="@drawable/list_div_top_btm_bookmark_widget_holo"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:layout_marginTop="2dip"
-            android:layout_marginLeft="1dip"
-            android:layout_marginRight="1dip"
-            android:visibility="invisible" />
-        <GridView
-            android:id="@+id/bookmarks_list"
-            android:layout_width="match_parent"
-            android:layout_height="0dip"
-            android:layout_weight="1"
-            android:layout_marginLeft="5dip"
-            android:layout_marginRight="5dip"
-            android:numColumns="2"
-            android:paddingTop="1dip"
-            android:paddingBottom="1dip"
-            android:paddingRight="0dip"
-            android:paddingLeft="0dip"
-            android:stretchMode="columnWidth"
-            android:horizontalSpacing="@dimen/widgetHorizontalSpacing"
-            android:verticalSpacing="@dimen/widgetVerticalSpacing"
-            android:drawSelectorOnTop="true"
-            android:listSelector="@drawable/bookmark_widget_thumb_selector"
-            android:fadingEdgeLength="24dp" />
-        <ImageView android:background="@drawable/list_div_top_btm_bookmark_widget_holo"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:layout_marginBottom="3dip"
-            android:layout_marginLeft="1dip"
-            android:layout_marginRight="1dip"
-            android:visibility="invisible" />
-    </LinearLayout>
-</FrameLayout>
+        android:numColumns="2"
+        android:paddingBottom="6dip"
+        android:paddingRight="3dip"
+        android:paddingLeft="3dip"
+        android:stretchMode="columnWidth"
+        android:horizontalSpacing="@dimen/widgetHorizontalSpacing"
+        android:verticalSpacing="@dimen/widgetVerticalSpacing"
+        android:drawSelectorOnTop="true"
+        android:listSelector="@drawable/bookmark_widget_thumb_selector"
+        android:fadingEdgeLength="24dp" />
+
+    <ImageButton
+        android:id="@+id/app_shortcut"
+        android:layout_width="56dip"
+        android:layout_height="56dip"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentRight="true"
+        android:layout_marginRight="4dip"
+        android:layout_marginBottom="6dip"
+        android:scaleType="centerInside"
+        android:src="@mipmap/ic_launcher_browser"
+        android:background="@drawable/bookmark_widget_thumb_selector"
+        android:padding="4dip" />
+</RelativeLayout>
diff --git a/res/values-xlarge-port/dimensions.xml b/res/values-xlarge-port/dimensions.xml
index 46e7272..e6b59ce 100644
--- a/res/values-xlarge-port/dimensions.xml
+++ b/res/values-xlarge-port/dimensions.xml
@@ -11,7 +11,7 @@
     License.
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <dimen name="widgetThumbnailHeight">72dip</dimen>
-    <dimen name="widgetHorizontalSpacing">0dip</dimen>
-    <dimen name="widgetVerticalSpacing">4dip</dimen>
+    <dimen name="widgetThumbnailHeight">84dip</dimen>
+    <dimen name="widgetHorizontalSpacing">10dip</dimen>
+    <dimen name="widgetVerticalSpacing">10dip</dimen>
 </resources>
diff --git a/res/values-xlarge/dimensions.xml b/res/values-xlarge/dimensions.xml
index d56146b..6aa83d2 100644
--- a/res/values-xlarge/dimensions.xml
+++ b/res/values-xlarge/dimensions.xml
@@ -13,8 +13,8 @@
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <dimen name="bookmarkThumbnailWidth">180dip</dimen>
     <dimen name="bookmarkThumbnailHeight">120dip</dimen>
-    <dimen name="widgetThumbnailHeight">100dip</dimen>
-    <dimen name="widgetHorizontalSpacing">12dip</dimen>
+    <dimen name="widgetThumbnailHeight">104dip</dimen>
+    <dimen name="widgetHorizontalSpacing">14dip</dimen>
     <dimen name="widgetVerticalSpacing">12dip</dimen>
     <dimen name="favicon_padded_size">24dip</dimen>
     <!-- For the most visited page -->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b9ed908..09bd56d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -427,7 +427,7 @@
     <string name="autofill_setup_dialog_message">Browser can automatically complete web forms like this one. Would you like to set up your profile?</string>
     <!-- Toast message displayed when the user decides to not set up autofill at this time. We want to remind them that they can configure
          it through the Browser Settings menu. [CHAR-LIMIT=NONE] -->
-    <string name="autofill_setup_dialog_negative_toast">AutoFill can always be configured through Browser Settings -&gt; Personal Settings.</string>
+    <string name="autofill_setup_dialog_negative_toast">AutoFill can always be configured through Browser Settings.</string>
 
     <!-- Settings screen, section title [CHAR-LIMIT=50] -->
     <string name="pref_privacy_security_title">Privacy &amp; Security</string>
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 02f1e7c..b79acab 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -1304,11 +1304,7 @@
 
             case WebView.HitTestResult.SRC_ANCHOR_TYPE:
             case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE:
-                TextView titleView = (TextView) LayoutInflater.from(mActivity)
-                        .inflate(android.R.layout.browser_link_context_header,
-                        null);
-                titleView.setText(extra);
-                menu.setHeaderView(titleView);
+                menu.setHeaderTitle(extra);
                 // decide whether to show the open link in new tab option
                 boolean showNewTab = mTabControl.canCreateNewTab();
                 MenuItem newTabItem
diff --git a/src/com/android/browser/SuggestionsAdapter.java b/src/com/android/browser/SuggestionsAdapter.java
index e2d9386..abf9088 100644
--- a/src/com/android/browser/SuggestionsAdapter.java
+++ b/src/com/android/browser/SuggestionsAdapter.java
@@ -41,13 +41,15 @@
 /**
  * adapter to wrap multiple cursors for url/search completions
  */
-public class SuggestionsAdapter extends BaseAdapter implements Filterable, OnClickListener {
+public class SuggestionsAdapter extends BaseAdapter implements Filterable,
+        OnClickListener {
 
     static final int TYPE_BOOKMARK = 0;
     static final int TYPE_SUGGEST_URL = 1;
     static final int TYPE_HISTORY = 2;
     static final int TYPE_SEARCH = 3;
     static final int TYPE_SUGGEST = 4;
+    static final int TYPE_VOICE_SEARCH = 5;
 
     private static final String[] COMBINED_PROJECTION =
             {BrowserContract.Combined._ID, BrowserContract.Combined.TITLE,
@@ -73,7 +75,7 @@
 
         public void onSearch(String txt);
 
-        public void onSelect(String txt, String extraData);
+        public void onSelect(String txt, int type, String extraData);
 
         public void onFilterComplete(int count);
 
@@ -114,8 +116,9 @@
             // replace input field text with suggestion text
             mListener.onSearch(item.title);
         } else {
-            mListener.onSelect((TextUtils.isEmpty(item.url)? item.title : item.url),
-                    item.extra);
+            mListener.onSelect(
+                    (TextUtils.isEmpty(item.url)? item.title : item.url),
+                    item.type, item.extra);
         }
     }
 
@@ -138,8 +141,10 @@
             position = (getCount() - 1) - position;
         }
         if (mVoiceResults != null) {
-            return new SuggestItem(mVoiceResults.get(position), null,
-                    TYPE_SEARCH);
+            SuggestItem item = new SuggestItem(mVoiceResults.get(position),
+                    null, TYPE_VOICE_SEARCH);
+            item.extra = Integer.toString(position);
+            return item;
         }
         if (mMixedResults == null) {
             return null;
@@ -186,6 +191,7 @@
         switch (item.type) {
             case TYPE_SUGGEST:
             case TYPE_SEARCH:
+            case TYPE_VOICE_SEARCH:
                 id = R.drawable.ic_search_category_suggest;
                 break;
             case TYPE_BOOKMARK:
@@ -203,7 +209,9 @@
         if (id != -1) {
             ic1.setImageDrawable(mContext.getResources().getDrawable(id));
         }
-        ic2.setVisibility(((TYPE_SUGGEST == item.type) || (TYPE_SEARCH == item.type))
+        ic2.setVisibility(((TYPE_SUGGEST == item.type)
+                || (TYPE_SEARCH == item.type)
+                || (TYPE_VOICE_SEARCH == item.type))
                 ? View.VISIBLE : View.GONE);
         div.setVisibility(ic2.getVisibility());
         ic2.setOnClickListener(this);
@@ -396,6 +404,7 @@
             url = u;
             type = t;
         }
+
     }
 
     abstract class CursorSource {
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index 8be4df5..b5a8032 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -27,6 +27,7 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.speech.RecognizerResultsIntent;
 import android.text.Editable;
 import android.text.TextUtils;
 import android.text.TextWatcher;
@@ -268,7 +269,14 @@
         mUiController.getCurrentTopWebView().requestFocus();
         mUi.hideFakeTitleBar();
         Intent i = new Intent();
-        i.setAction(Intent.ACTION_SEARCH);
+        String action = null;
+        if (UrlInputView.VOICE.equals(source)) {
+            action = RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS;
+            source = null;
+        } else {
+            action = Intent.ACTION_SEARCH;
+        }
+        i.setAction(action);
         i.putExtra(SearchManager.QUERY, text);
         if (extra != null) {
             i.putExtra(SearchManager.EXTRA_DATA_KEY, extra);
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 428a0f2..7dc2ed4 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -17,7 +17,6 @@
 package com.android.browser;
 
 import com.android.browser.SuggestionsAdapter.CompletionListener;
-import com.android.browser.SuggestionsAdapter.SuggestItem;
 
 import android.content.Context;
 import android.content.res.Configuration;
@@ -27,8 +26,6 @@
 import android.view.View;
 import android.view.View.OnFocusChangeListener;
 import android.view.inputmethod.InputMethodManager;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
 import android.widget.AutoCompleteTextView;
 import android.widget.TextView;
 import android.widget.TextView.OnEditorActionListener;
@@ -41,11 +38,12 @@
  */
 public class UrlInputView extends AutoCompleteTextView
         implements OnFocusChangeListener, OnEditorActionListener,
-        CompletionListener, OnItemClickListener {
+        CompletionListener {
 
 
     static final String TYPED = "browser-type";
     static final String SUGGESTED = "browser-suggest";
+    static final String VOICE = "voice-search";
 
     private UrlInputListener   mListener;
     private InputMethodManager mInputManager;
@@ -79,7 +77,6 @@
         setSelectAllOnFocus(true);
         onConfigurationChanged(ctx.getResources().getConfiguration());
         setThreshold(1);
-        setOnItemClickListener(this);
     }
 
     void setController(UiController controller) {
@@ -185,8 +182,9 @@
     }
 
     @Override
-    public void onSelect(String url, String extra) {
-        finishInput(url, extra, SUGGESTED);
+    public void onSelect(String url, int type, String extra) {
+        finishInput(url, extra, (type == SuggestionsAdapter.TYPE_VOICE_SEARCH)
+                ? VOICE : SUGGESTED);
     }
 
     @Override
@@ -209,14 +207,6 @@
 
     }
 
-    @Override
-    public void onItemClick(
-            AdapterView<?> parent, View view, int position, long id) {
-        SuggestItem item = mAdapter.getItem(position);
-        onSelect((TextUtils.isEmpty(item.url) ? item.title : item.url),
-                item.extra);
-    }
-
     public void setReverseResults(boolean reverse) {
         mAdapter.setReverseResults(reverse);
     }
diff --git a/src/com/android/browser/widget/BookmarkThumbnailWidgetProvider.java b/src/com/android/browser/widget/BookmarkThumbnailWidgetProvider.java
index 14e1c89..db52130 100644
--- a/src/com/android/browser/widget/BookmarkThumbnailWidgetProvider.java
+++ b/src/com/android/browser/widget/BookmarkThumbnailWidgetProvider.java
@@ -16,6 +16,7 @@
 
 package com.android.browser.widget;
 
+import com.android.browser.BrowserActivity;
 import com.android.browser.R;
 
 import android.app.PendingIntent;
@@ -78,12 +79,16 @@
 
     private void performUpdate(Context context,
             AppWidgetManager appWidgetManager, int[] appWidgetIds) {
+        Intent launchBrowser = new Intent(BrowserActivity.ACTION_SHOW_BROWSER,
+                null, context, BrowserActivity.class);
         for (int appWidgetId : appWidgetIds) {
             Intent updateIntent = new Intent(context, BookmarkThumbnailWidgetService.class);
             updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
             updateIntent.setData(Uri.parse(updateIntent.toUri(Intent.URI_INTENT_SCHEME)));
             RemoteViews views = new RemoteViews(context.getPackageName(),
                     R.layout.bookmarkthumbnailwidget);
+            views.setOnClickPendingIntent(R.id.app_shortcut, PendingIntent
+                    .getActivity(context, 0, launchBrowser, PendingIntent.FLAG_CANCEL_CURRENT));
             views.setRemoteAdapter(R.id.bookmarks_list, updateIntent);
             appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.bookmarks_list);
             Intent ic = new Intent(context, BookmarkThumbnailWidgetService.class);