Merge "Handle chrome sync account deleted case" into honeycomb
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 77a27a1..c95ce21 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -195,7 +195,8 @@
         </receiver>
         <service
             android:name=".widget.BookmarkThumbnailWidgetService"
-            android:exported="true" />
+            android:permission="android.permission.BIND_REMOTEVIEWS"
+            android:exported="false" />
 
         <!-- Makes .BrowserActivity the search target for any activity in Browser -->
         <meta-data android:name="android.app.default_searchable" android:value=".BrowserActivity" />
diff --git a/res/drawable-hdpi/trashcan.png b/res/drawable-hdpi/trashcan.png
new file mode 100644
index 0000000..89b23ee
--- /dev/null
+++ b/res/drawable-hdpi/trashcan.png
Binary files differ
diff --git a/res/drawable-mdpi/trashcan.png b/res/drawable-mdpi/trashcan.png
new file mode 100644
index 0000000..f32bf27
--- /dev/null
+++ b/res/drawable-mdpi/trashcan.png
Binary files differ
diff --git a/res/layout/browser_add_bookmark.xml b/res/layout/browser_add_bookmark.xml
index 5eebc0b..df46be5 100644
--- a/res/layout/browser_add_bookmark.xml
+++ b/res/layout/browser_add_bookmark.xml
@@ -86,7 +86,7 @@
             android:layout_gravity="center_vertical"
             android:gravity="center_vertical"
             android:text="@string/remove"
-            android:drawableLeft="@*android:drawable/ic_menu_delete"
+            android:drawableLeft="@drawable/trashcan"
             android:visibility="gone"
             android:textAppearance="?android:attr/textAppearanceMedium" />
     </LinearLayout>
diff --git a/res/values/all_search_engines.xml b/res/values/all_search_engines.xml
index 08cf763..14aba39 100644
--- a/res/values/all_search_engines.xml
+++ b/res/values/all_search_engines.xml
@@ -208,9 +208,9 @@
     <item>Google</item>
     <item>google.com</item>
     <item>http://www.google.com/favicon.ico</item>
-    <item>http://www.google.com/m?hl={language}&amp;ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}</item>
+    <item>http://www.google.com/search?hl={language}&amp;ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}</item>
     <item>UTF-8</item>
-    <item>http://www.google.com/complete/search?hl={language}&amp;json=true&amp;q={searchTerms}</item>
+    <item>http://www.google.com/complete/search?hl={language}&amp;client=android&amp;q={searchTerms}</item>
   </string-array>
   <string-array name="bing_en_NZ" translatable="false">
     <item>Bing</item>
diff --git a/src/com/android/browser/AutoFillSettingsFragment.java b/src/com/android/browser/AutoFillSettingsFragment.java
index 389be1f..3a7ae12 100644
--- a/src/com/android/browser/AutoFillSettingsFragment.java
+++ b/src/com/android/browser/AutoFillSettingsFragment.java
@@ -65,11 +65,18 @@
     private class PhoneNumberValidator implements TextWatcher {
         // Keep in sync with kPhoneNumberLength in chrome/browser/autofill/phone_number.cc
         private static final int PHONE_NUMBER_LENGTH = 7;
+        private static final String PHONE_NUMBER_SEPARATORS_REGEX = "[\\s\\.\\(\\)-]";
 
         public void afterTextChanged(Editable s) {
-            int phoneNumberLength = s.toString().length();
+            String phoneNumber = s.toString();
+            int phoneNumberLength = phoneNumber.length();
 
-            if (phoneNumberLength > 0 && phoneNumberLength < PHONE_NUMBER_LENGTH) {
+            // Strip out any phone number separators.
+            phoneNumber = phoneNumber.replaceAll(PHONE_NUMBER_SEPARATORS_REGEX, "");
+
+            int strippedPhoneNumberLength = phoneNumber.length();
+
+            if (phoneNumberLength > 0 && strippedPhoneNumberLength < PHONE_NUMBER_LENGTH) {
                 mPhoneEdit.setError(getResources().getText(
                         R.string.autofill_profile_editor_phone_number_invalid));
             } else {
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index f3c7a7f..5d8d153 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -55,11 +55,9 @@
 import android.view.ViewStub;
 import android.webkit.WebIconDatabase.IconListener;
 import android.widget.AdapterView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.BaseAdapter;
-import android.widget.ExpandableListView;
-import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
-import android.widget.ExpandableListView.OnChildClickListener;
 import android.widget.ListView;
 import android.widget.TextView;
 import android.widget.Toast;
@@ -69,7 +67,7 @@
  * days of viewing.
  */
 public class BrowserHistoryPage extends Fragment
-        implements LoaderCallbacks<Cursor>, OnChildClickListener {
+        implements LoaderCallbacks<Cursor> {
 
     static final int LOADER_HISTORY = 1;
     static final int LOADER_MOST_VISITED = 2;
@@ -250,6 +248,8 @@
         mChildWrapper = new HistoryChildWrapper(mAdapter);
         mChildList = new ListView(getActivity());
         mChildList.setAdapter(mChildWrapper);
+        mChildList.setOnItemClickListener(mChildItemClickListener);
+        registerForContextMenu(mChildList);
         ViewGroup prefs = (ViewGroup) mRoot.findViewById(com.android.internal.R.id.prefs);
         prefs.addView(mChildList);
 
@@ -272,6 +272,14 @@
         }
     };
 
+    private OnItemClickListener mChildItemClickListener = new OnItemClickListener() {
+        @Override
+        public void onItemClick(
+                AdapterView<?> parent, View view, int position, long id) {
+            mCallbacks.onUrlSelected(((HistoryItem) view).getUrl(), false);
+        }
+    };
+
     @Override
     public void onDestroy() {
         super.onDestroy();
@@ -337,11 +345,7 @@
 
     @Override
     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
-        ExpandableListContextMenuInfo i = (ExpandableListContextMenuInfo) menuInfo;
-        // Do not allow a context menu to come up from the group views.
-        if (!(i.targetView instanceof HistoryItem)) {
-            return;
-        }
+        AdapterContextMenuInfo i = (AdapterContextMenuInfo) menuInfo;
 
         // Inflate the menu
         Activity parent = getActivity();
@@ -380,8 +384,8 @@
 
     @Override
     public boolean onContextItemSelected(MenuItem item) {
-        ExpandableListContextMenuInfo i =
-            (ExpandableListContextMenuInfo) item.getMenuInfo();
+        AdapterContextMenuInfo i =
+            (AdapterContextMenuInfo) item.getMenuInfo();
         if (i == null) {
             return false;
         }
@@ -424,16 +428,6 @@
         return super.onContextItemSelected(item);
     }
 
-    @Override
-    public boolean onChildClick(ExpandableListView parent, View v,
-            int groupPosition, int childPosition, long id) {
-        if (v instanceof HistoryItem) {
-            mCallbacks.onUrlSelected(((HistoryItem) v).getUrl(), false);
-            return true;
-        }
-        return false;
-    }
-
     private static abstract class HistoryWrapper extends BaseAdapter {
 
         protected HistoryAdapter mAdapter;
diff --git a/src/com/android/browser/widget/BookmarkThumbnailWidgetProvider.java b/src/com/android/browser/widget/BookmarkThumbnailWidgetProvider.java
index 6604a5f..b991abd 100644
--- a/src/com/android/browser/widget/BookmarkThumbnailWidgetProvider.java
+++ b/src/com/android/browser/widget/BookmarkThumbnailWidgetProvider.java
@@ -90,7 +90,7 @@
             RemoteViews views = new RemoteViews(context.getPackageName(),
                     R.layout.bookmarkthumbnailwidget);
             views.setOnClickPendingIntent(R.id.app_shortcut, launchBrowser);
-            views.setRemoteAdapter(R.id.bookmarks_list, updateIntent);
+            views.setRemoteAdapter(appWidgetId, R.id.bookmarks_list, updateIntent);
             appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.bookmarks_list);
             Intent ic = new Intent(context, BookmarkThumbnailWidgetService.class);
             views.setPendingIntentTemplate(R.id.bookmarks_list,
diff --git a/tools/get_search_engines.py b/tools/get_search_engines.py
index cd73423..bd6e5f8 100755
--- a/tools/get_search_engines.py
+++ b/tools/get_search_engines.py
@@ -39,16 +39,15 @@
 
 google_data = ["google", "Google", "google.com",
   "http://www.google.com/favicon.ico",
-  "http://www.google.com/m?hl={language}&amp;ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}",
+  "http://www.google.com/search?hl={language}&amp;ie={inputEncoding}&amp;source=android-browser&amp;q={searchTerms}",
   "UTF-8",
-  "http://www.google.com/complete/search?hl={language}&amp;json=true&amp;q={searchTerms}"]
+  "http://www.google.com/complete/search?hl={language}&amp;client=android&amp;q={searchTerms}"]
 
 class SearchEngineManager(object):
   """Manages list of search engines and creates locale specific lists.
 
   The main method useful for the caller is generateListForLocale(), which
-  creates a locale specific search_engines.xml file suitable for use by the
-  Android WebSearchProvider implementation.
+  creates a locale specific donottranslate-search_engines.xml file.
   """
 
   def __init__(self):
@@ -195,7 +194,7 @@
     self.writeEngineList(os.path.join(self.resdir, 'values'), "default")
 
   def generateListForLocale(self, locale):
-    """Creates a new locale specific search_engines.xml file.
+    """Creates a new locale specific donottranslate-search_engines.xml file.
 
     The new file contains search engines specific to that country. If required
     this function updates all_search_engines.xml file with any new search
@@ -237,7 +236,7 @@
     text.append('  </string-array>\n');
 
     self.generateXmlFromTemplate(os.path.join(sys.path[0], 'search_engines.template.xml'),
-        os.path.join(dir_path, 'search_engines.xml'),
+        os.path.join(dir_path, 'donottranslate-search_engines.xml'),
         text)
 
   def generateXmlFromTemplate(self, template_path, out_path, text):
@@ -265,4 +264,3 @@
   for locale in locales:
     manager.generateListForLocale(locale)
   manager.writeAllEngines()
-