Merge "Save 1.2ms of drawing time per displayed tab." into honeycomb
diff --git a/res/layout/add_to_option.xml b/res/layout/add_to_option.xml
new file mode 100644
index 0000000..4cfa9f8
--- /dev/null
+++ b/res/layout/add_to_option.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:textAppearance="?android:attr/textAppearanceMedium"
+    android:gravity="center_vertical"
+    android:minHeight="?android:attr/listPreferredItemHeight" />
diff --git a/res/layout/browser_add_bookmark.xml b/res/layout/browser_add_bookmark.xml
index 8adf4b6..e25f903 100644
--- a/res/layout/browser_add_bookmark.xml
+++ b/res/layout/browser_add_bookmark.xml
@@ -131,19 +131,15 @@
             android:text="@string/containing_folder"
             android:textAppearance="?android:attr/textAppearanceMedium" />
 
-        <TextView
+        <view class="com.android.browser.addbookmark.FolderSpinner"
             android:id="@+id/folder"
             android:layout_height="wrap_content"
-            android:layout_width="250dip"
+            android:layout_width="wrap_content"
             android:layout_marginRight="20dip"
             android:layout_marginLeft="20dip"
+            android:spinnerMode="dropdown"
             android:gravity="center_vertical"
-            android:singleLine="true"
-            android:ellipsize="start"
-            android:text="@string/bookmarks"
-            android:drawableLeft="@drawable/ic_menu_bookmarks"
-            android:layout_marginBottom="40dip"
-            android:textAppearance="?android:attr/textAppearanceMedium" />
+            />
       </TableRow>
     </TableLayout>
 
diff --git a/res/menu/folder_choice.xml b/res/menu/folder_choice.xml
deleted file mode 100644
index c62e2f8..0000000
--- a/res/menu/folder_choice.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:id="@+id/home_screen"
-        android:icon="@*android:drawable/ic_menu_home"
-        android:title="@string/add_to_homescreen_menu_option"/>
-    <item android:id="@+id/bookmarks"
-        android:icon="@drawable/ic_menu_bookmarks"
-        android:title="@string/add_to_bookmarks_menu_option"/>
-    <item android:id="@+id/other"
-        android:icon="@*android:drawable/ic_menu_archive"
-        android:title="@string/add_to_other_folder_menu_option"/>
-</menu>
diff --git a/res/values-es-rUS-xlarge/strings.xml b/res/values-es-rUS-xlarge/strings.xml
index 7f9e8b6..508f3fe 100644
--- a/res/values-es-rUS-xlarge/strings.xml
+++ b/res/values-es-rUS-xlarge/strings.xml
@@ -1,24 +1,106 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2010 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="new_tab" msgid="7275656655054293038">"Pestaña nueva"</string>
-    <string name="new_incognito_tab" msgid="5149742197322201152">"Nueva pestaña de incógnito"</string>
-    <string name="active_tabs" msgid="5324492165541331128">"Pestañas"</string>
-    <!-- no translation found for contextmenu_openlink_newwindow (1061831678814826192) -->
-    <skip />
+    <!-- XL xlarge -->
+    <string name="new_tab" msgid="7211896313409251144">"Pestaña nueva"</string>
+    <!-- XL xlarge -->
+    <string name="new_incognito_tab" msgid="8067945824740306172">"Nueva pestaña de incógnito"</string>
+    <!-- XL xlarge -->
+    <string name="active_tabs" msgid="5948496827915445500">"Pestañas"</string>
+    <!-- XL -->
+    <string name="tab_bookmarks" msgid="2107205776996598691">"Favoritos"</string>
+    <!-- XL -->
+    <string name="added_to_bookmarks" msgid="8889115451085864249">"Agregado a favoritos"</string>
+    <!-- XL -->
+    <string name="removed_from_bookmarks" msgid="7846438980097184281">"Suprimido de Favoritos"</string>
+    <!-- XL -->
+    <string name="sign_in_to" msgid="1214184176627571479">"Acceder a <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+    <!-- XL -->
+    <string name="action" msgid="4943864730966939961">"Acceder"</string>
+    <!-- XL -->
+    <string name="add_to_bookmarks_menu_option" msgid="7552383875291126013">"Favoritos"</string>
+    <!-- XL -->
+    <string name="remove_from_bookmarks" msgid="7311939805508190918">"Eliminar de Favoritos"</string>
+    <!-- XL -->
+    <string name="bookmark_saved" msgid="1806548159693236924">"Guardado en los favoritos."</string>
+    <!-- XL -->
+    <string name="bookmark_cannot_save_url" msgid="8417203985466903497">"No se puede agregar esta URL a los favoritos."</string>
+    <!-- XL -->
+    <string name="bookmarks" msgid="8254231548777487838">"Favoritos"</string>
+    <!-- XL -->
+    <string name="copy_page_url" msgid="7121286358832939849">"Copiar la URL de la página"</string>
+    <!-- XL -->
+    <string name="contextheader_folder_bookmarkcount" msgid="7867101902984210591">"<xliff:g id="BOOKMARK_COUNT">%d</xliff:g> favoritos"</string>
+    <!-- XL -->
+    <string name="contextheader_folder_empty" msgid="8989453566115363329">"Carpeta vacía"</string>
+    <!-- XL xlarge -->
+    <string name="contextmenu_openlink_newwindow" msgid="8177825954953587540">"Abrir en una ventana nueva"</string>
+    <!-- XL -->
+    <string name="contextmenu_map" msgid="3809951100283548665">"Mapa"</string>
+    <!-- XL -->
+    <string name="browser_bookmarks_page_bookmarks_text" msgid="4676739439702068160">"Favoritos"</string>
+    <!-- XL -->
+    <string name="menu_preferences" msgid="3003635465914395516">"Configuración"</string>
+    <!-- XL -->
+    <string name="pref_content_block_popups" msgid="6871160654981179930">"Bloquear ventanas emergentes"</string>
+    <!-- XL -->
+    <string name="pref_content_open_in_background" msgid="7928143573209470961">"Abrir en modo subordinado"</string>
+    <!-- XL -->
+    <string name="pref_content_homepage" msgid="6044903119907405007">"Definir página principal"</string>
+    <!-- XL -->
+    <string name="pref_content_autofit" msgid="152292940099720429">"Ajuste automático de páginas"</string>
+    <!-- XL -->
+    <string name="pref_autofill_profile_editor_summary" msgid="6606678927956330022">"Configurar &amp; administrar datos para los formularios de autollenado"</string>
+    <!-- XL -->
+    <string name="autofill_profile_editor_heading" msgid="376355900106687672">"La función Autocompletar utilizará tu perfil para ayudarte a completar los formularios web con solo un clic."</string>
+    <!-- XL -->
+    <string name="autofill_setup_dialog_negative_toast" msgid="8606640740851832808">"Autocomp se configura en cualquier momento con Configuración del navegador -&gt; Configuración personal"</string>
+    <!-- XL -->
+    <string name="pref_privacy_clear_cookies" msgid="2430066169979191550">"Borrar todos los datos de las cookies"</string>
+    <!-- XL -->
+    <string name="pref_security_save_form_data" msgid="4687632734841414584">"Recordar datos del formulario"</string>
+    <!-- XL -->
+    <string name="pref_security_show_security_warning" msgid="237213216450431926">"Mostrar advertencias de seguridad"</string>
+    <!-- XL -->
+  <string-array name="pref_text_size_choices">
+    <item msgid="9175838437528854188">"Diminuto"</item>
+    <item msgid="8310610720691502080">"Pequeño"</item>
+    <item msgid="577786719596429685">"Normal"</item>
+    <item msgid="1882099825378500373">"Grande"</item>
+    <item msgid="2624955515232921031">"Enorme"</item>
+  </string-array>
+    <!-- XL -->
+    <string name="pref_default_zoom" msgid="7937970520334948703">"Zoom predeterminado"</string>
+    <!-- XL -->
+  <string-array name="pref_default_zoom_choices">
+    <item msgid="7308170040893292647">"Lejos"</item>
+    <item msgid="2127686869768024870">"Medio"</item>
+    <item msgid="6369171816013236032">"Cerrar"</item>
+  </string-array>
+    <!-- XL -->
+    <string name="pref_default_zoom_dialogtitle" msgid="8698964985032801767">"Zoom predeterminado"</string>
+    <!-- XL -->
+    <string name="pref_content_load_page" msgid="7460666469137362825">"Abrir las páginas en visión general"</string>
+    <!-- XL -->
+    <!-- outdated translation 3239395481036882698 -->     <string name="pref_extras_title" msgid="7223601187104530963">"Configuración avanzada"</string>
+    <!-- XL -->
+    <string name="pref_extras_reset_default" msgid="113675796607112935">"Restablecer a la forma predeterminada"</string>
+    <!-- XL -->
+    <string name="pref_extras_reset_default_dlg_title" msgid="5686450294662109619">"Restablecer a la forma predeterminada"</string>
+    <!-- XL -->
+    <string name="search_settings_description" msgid="8504084593679367617">"Favoritos e historial web"</string>
+    <!-- XL -->
+    <string name="search_the_web" msgid="3493318001113588865">"Buscar en la Web"</string>
+    <!-- XL -->
+    <string name="defaultBookmarksUpButton" msgid="5051877462652364478">"Favoritos"</string>
+    <!-- XL -->
+    <string name="max_tabs_warning" msgid="1283136201153746764">"No hay más etiquetas disponibles"</string>
+    <!-- XL -->
+    <string name="pref_lab_title" msgid="209824994106188072">"Lab"</string>
+    <!-- XL -->
+    <string name="pref_lab_quick_controls" msgid="1617774508416113544">"Controles rápidos"</string>
+    <!-- XL -->
+    <string name="pref_lab_quick_controls_summary" msgid="1067572298315336767">"Desliza el pulgar del borde izquierdo/derecho y accede a los controles rápidos."</string>
+    <!-- XL -->
+    <string name="account_picker_title" msgid="19248413027956627">"Seleccionar una cuenta o cancelar el acceso manual"</string>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2a00f1d..b8a45bf 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -522,7 +522,7 @@
     <string name="pref_content_load_page">Open pages in overview</string>
     <!-- Settings summary -->
     <string name="pref_content_load_page_summary">Show overview of newly opened pages</string>
-    <!-- Settings screen, section title -->
+    <!-- Settings screen, section title [CHAR LIMIT=50] -->
     <string name="pref_extras_title">Advanced</string>
     <!-- Settings label -->
     <string name="pref_extras_website_settings">Website settings</string>
diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java
index d3c147c..9d8c73c 100644
--- a/src/com/android/browser/AddBookmarkPage.java
+++ b/src/com/android/browser/AddBookmarkPage.java
@@ -17,6 +17,7 @@
 package com.android.browser;
 
 import com.android.browser.provider.BrowserProvider2;
+import com.android.browser.addbookmark.FolderSpinnerAdapter;
 
 import android.app.Activity;
 import android.app.LoaderManager;
@@ -44,7 +45,6 @@
 import android.util.AttributeSet;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
-import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
@@ -55,7 +55,7 @@
 import android.widget.CursorAdapter;
 import android.widget.EditText;
 import android.widget.ListView;
-import android.widget.PopupMenu;
+import android.widget.Spinner;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -66,7 +66,7 @@
 public class AddBookmarkPage extends Activity
         implements View.OnClickListener, TextView.OnEditorActionListener,
         AdapterView.OnItemClickListener, LoaderManager.LoaderCallbacks<Cursor>,
-        BreadCrumbView.Controller, PopupMenu.OnMenuItemClickListener {
+        BreadCrumbView.Controller, AdapterView.OnItemSelectedListener {
 
     public static final long DEFAULT_FOLDER_ID = -1;
     public static final String TOUCH_ICON_URL = "touch_icon_url";
@@ -94,7 +94,7 @@
     private Bundle      mMap;
     private String      mTouchIconUrl;
     private String      mOriginalUrl;
-    private TextView mFolder;
+    private Spinner mFolder;
     private View mDefaultView;
     private View mFolderSelector;
     private EditText mFolderNamer;
@@ -112,7 +112,9 @@
     private long mRootFolder;
     private TextView mTopLevelLabel;
     private Drawable mHeaderIcon;
-
+    // We manually change the spinner's selection if the edited bookmark is not
+    // in the root folder.  This makes sure our listener ignores this change.
+    private boolean mIgnoreSelectionChange;
     private static class Folder {
         String Name;
         long Id;
@@ -198,11 +200,22 @@
             if (data != null) {
                 Folder folder = (Folder) data;
                 mCurrentFolder = folder.Id;
-                int resource = mCurrentFolder == mRootFolder ?
-                        R.drawable.ic_menu_bookmarks :
-                        com.android.internal.R.drawable.ic_menu_archive;
-                Drawable drawable = getResources().getDrawable(resource);
-                updateFolderLabel(folder.Name, drawable);
+                if (mCurrentFolder == mRootFolder) {
+                    // The Spinner changed to show "Other folder ..."  Change
+                    // it back to "Bookmarks", which is position 0 if we are
+                    // editing a folder, 1 otherwise.
+                    mFolder.setSelection(mEditingFolder ? 0 : 1);
+                } else {
+                    ((TextView) mFolder.getSelectedView()).setText(folder.Name);
+                }
+            }
+        } else {
+            // The user canceled selecting a folder.  Revert back to the earlier
+            // selection.
+            if (mSaveToHomeScreen) {
+                mFolder.setSelection(0);
+            } else {
+                mFolder.setSelection(mEditingFolder ? 0 : 1);
             }
         }
     }
@@ -230,15 +243,6 @@
             } else {
                 finish();
             }
-        } else if (v == mFolder) {
-            PopupMenu popup = new PopupMenu(this, mFolder);
-            popup.getMenuInflater().inflate(R.menu.folder_choice,
-                    popup.getMenu());
-            if (mEditingFolder) {
-                popup.getMenu().removeItem(R.id.home_screen);
-            }
-            popup.setOnMenuItemClickListener(this);
-            popup.show();
         } else if (v == mAddNewFolder) {
             setShowFolderNamer(true);
             mFolderNamer.setText(R.string.new_folder);
@@ -254,25 +258,32 @@
     }
 
     @Override
-    public boolean onMenuItemClick(MenuItem item) {
-        switch(item.getItemId()) {
-            case R.id.bookmarks:
+    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+        if (mIgnoreSelectionChange) {
+            mIgnoreSelectionChange = false;
+            return;
+        }
+        // In response to the spinner changing.
+        int intId = (int) id;
+        switch (intId) {
+            case FolderSpinnerAdapter.ROOT_FOLDER:
                 mCurrentFolder = mRootFolder;
-                updateFolderLabel(item.getTitle(), item.getIcon());
                 mSaveToHomeScreen = false;
                 break;
-            case R.id.home_screen:
+            case FolderSpinnerAdapter.HOME_SCREEN:
                 // Create a short cut to the home screen
                 mSaveToHomeScreen = true;
-                updateFolderLabel(item.getTitle(), item.getIcon());
                 break;
-            case R.id.other:
+            case FolderSpinnerAdapter.OTHER_FOLDER:
                 switchToFolderSelector();
                 break;
             default:
-                return false;
+                break;
         }
-        return true;
+    }
+
+    @Override
+    public void onNothingSelected(AdapterView<?> parent) {
     }
 
     private void completeOrCancelFolderNaming(boolean cancel) {
@@ -317,6 +328,8 @@
     }
 
     private void switchToFolderSelector() {
+        // Set the list to the top in case it is scrolled.
+        mListView.setSelection(0);
         mDefaultView.setVisibility(View.GONE);
         mFolderSelector.setVisibility(View.VISIBLE);
         mCrumbHolder.setVisibility(View.VISIBLE);
@@ -399,9 +412,7 @@
                     moveCursorToFolder(cursor, parent, idIndex);
                     String name = cursor.getString(titleIndex);
                     if (parent == mCurrentFolder) {
-                        Drawable draw = getResources().getDrawable(
-                                com.android.internal.R.drawable.ic_menu_archive);
-                        updateFolderLabel(name, draw);
+                        ((TextView) mFolder.getSelectedView()).setText(name);
                     }
                     folderStack.push(new Folder(name, parent));
                     parent = cursor.getLong(parentIndex);
@@ -448,18 +459,6 @@
         }
     }
 
-    /**
-     * Update the name and image to show where the bookmark will be added
-     * @param name Name of the location to save (folder name, bookmarks, or home
-     *             screen.
-     * @param drawable Image to show corresponding to the save location.
-     */
-    void updateFolderLabel(CharSequence name, Drawable drawable) {
-        mFolder.setText(name);
-        mFolder.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null,
-                null);
-    }
-
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position,
             long id) {
@@ -573,8 +572,15 @@
         mCancelButton = findViewById(R.id.cancel);
         mCancelButton.setOnClickListener(this);
 
-        mFolder = (TextView) findViewById(R.id.folder);
-        mFolder.setOnClickListener(this);
+        mFolder = (Spinner) findViewById(R.id.folder);
+        mFolder.setAdapter(new FolderSpinnerAdapter(!mEditingFolder));
+        if (!mEditingFolder) {
+            // Initially the "Bookmarks" folder should be showing, rather than
+            // the home screen.  In the editing folder case, home screen is not
+            // an option, so "Bookmarks" folder is already at the top.
+            mFolder.setSelection(FolderSpinnerAdapter.ROOT_FOLDER);
+        }
+        mFolder.setOnItemSelectedListener(this);
 
         mDefaultView = findViewById(R.id.default_view);
         mFolderSelector = findViewById(R.id.folder_selector);
@@ -609,6 +615,11 @@
         if (mCurrentFolder != mRootFolder) {
             // Find all the folders
             manager.initLoader(LOADER_ID_ALL_FOLDERS, null, this);
+            // Since we're not in the root folder, change the selection to other
+            // folder now.  The text will get changed once we select the correct
+            // folder.
+            mIgnoreSelectionChange = true;
+            mFolder.setSelection(mEditingFolder ? 1 : 2);
         } else {
             setShowBookmarkIcon(true);
         }
diff --git a/src/com/android/browser/BookmarkUtils.java b/src/com/android/browser/BookmarkUtils.java
index f261cb3..b548607 100644
--- a/src/com/android/browser/BookmarkUtils.java
+++ b/src/com/android/browser/BookmarkUtils.java
@@ -206,12 +206,10 @@
         SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
         String accountType = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE, null);
         String accountName = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, null);
-        if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountType)) {
-            ub.appendQueryParameter(
-                    BrowserContract.Bookmarks.PARAM_ACCOUNT_NAME,accountName);
-            ub.appendQueryParameter(
-                    BrowserContract.Bookmarks.PARAM_ACCOUNT_TYPE, accountType);
-        }
+        ub.appendQueryParameter(
+                BrowserContract.Bookmarks.PARAM_ACCOUNT_NAME,accountName);
+        ub.appendQueryParameter(
+                BrowserContract.Bookmarks.PARAM_ACCOUNT_TYPE, accountType);
         return ub;
     }
 }
diff --git a/src/com/android/browser/Bookmarks.java b/src/com/android/browser/Bookmarks.java
index 9a5b6f0..beea489 100644
--- a/src/com/android/browser/Bookmarks.java
+++ b/src/com/android/browser/Bookmarks.java
@@ -100,8 +100,8 @@
      *  will remain in the database, but only as a history item, and not as a
      *  bookmarked site.
      *  @param context Context of the calling Activity.  This is used to make
-     *          Toast confirming that the bookmark has been removed.  If the
-     *          caller provides null, the Toast will not be shown.
+     *          Toast confirming that the bookmark has been removed and to
+     *          lookup the correct content uri.  It must not be null.
      *  @param cr The ContentResolver being used to remove the bookmark.
      *  @param url URL of the website to be removed.
      */
@@ -127,7 +127,8 @@
                     cursor.getLong(0));
             cr.delete(uri, null, null);
             if (context != null) {
-                Toast.makeText(context, R.string.removed_from_bookmarks, Toast.LENGTH_LONG).show();
+                Toast.makeText(context, R.string.removed_from_bookmarks,
+                        Toast.LENGTH_LONG).show();
             }
         } catch (IllegalStateException e) {
             Log.e(LOGTAG, "removeFromBookmarks", e);
diff --git a/src/com/android/browser/BookmarksLoader.java b/src/com/android/browser/BookmarksLoader.java
index 650c3ca..e2f8941 100644
--- a/src/com/android/browser/BookmarksLoader.java
+++ b/src/com/android/browser/BookmarksLoader.java
@@ -66,10 +66,7 @@
     }
 
     static Uri addAccount(Uri uri, String accountType, String accountName) {
-        if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
-            return uri.buildUpon().appendQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE, accountType).
-                    appendQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME, accountName).build();
-        }
-        return uri;
+        return uri.buildUpon().appendQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE, accountType).
+                appendQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME, accountName).build();
     }
 }
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index d8e8177..41d3749 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -126,10 +126,8 @@
         String accountType = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE, null);
         String accountName = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, null);
         Uri.Builder combinedBuilder = Combined.CONTENT_URI.buildUpon();
-        if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountName)) {
-            combinedBuilder.appendQueryParameter(BrowserContract.Bookmarks.PARAM_ACCOUNT_TYPE, accountType);
-            combinedBuilder.appendQueryParameter(BrowserContract.Bookmarks.PARAM_ACCOUNT_NAME, accountName);
-        }
+        combinedBuilder.appendQueryParameter(BrowserContract.Bookmarks.PARAM_ACCOUNT_TYPE, accountType);
+        combinedBuilder.appendQueryParameter(BrowserContract.Bookmarks.PARAM_ACCOUNT_NAME, accountName);
 
         switch (id) {
             case LOADER_HISTORY: {
diff --git a/src/com/android/browser/DataController.java b/src/com/android/browser/DataController.java
index aa233fd..a56fce8 100644
--- a/src/com/android/browser/DataController.java
+++ b/src/com/android/browser/DataController.java
@@ -100,7 +100,12 @@
     }
 
     public void queryBookmarkStatus(String url, OnQueryUrlIsBookmark replyTo) {
-        mDataHandler.sendMessage(QUERY_URL_IS_BOOKMARK, url, replyTo);
+        if (url == null || url.trim().length() == 0) {
+            // null or empty url is never a bookmark
+            replyTo.onQueryUrlIsBookmark(url, false);
+            return;
+        }
+        mDataHandler.sendMessage(QUERY_URL_IS_BOOKMARK, url.trim(), replyTo);
     }
 
     // The standard Handler and Message classes don't allow the queue manipulation
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index c4edda6..320d3b3 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -546,6 +546,9 @@
             mInPageLoad = false;
             // Sync state (in case of stop/timeout)
             mCurrentState.mUrl = view.getUrl();
+            if (mCurrentState.mUrl == null) {
+                mCurrentState.mUrl = url != null ? url : "";
+            }
             mCurrentState.mTitle = view.getTitle();
             mCurrentState.mFavicon = view.getFavicon();
             if (!URLUtil.isHttpsUrl(mCurrentState.mUrl)) {
diff --git a/src/com/android/browser/TabScrollView.java b/src/com/android/browser/TabScrollView.java
index 04ed5a3..f501e64 100644
--- a/src/com/android/browser/TabScrollView.java
+++ b/src/com/android/browser/TabScrollView.java
@@ -124,7 +124,6 @@
 
     void addTab(View tab) {
         mContentView.addView(tab);
-        animateIn(tab);
         tab.setActivated(false);
     }
 
@@ -135,7 +134,7 @@
         } else if (ix < mSelected) {
             mSelected--;
         }
-        animateOut(tab);
+        mContentView.removeView(tab);
     }
 
     private void ensureChildVisible(View child) {
@@ -172,25 +171,27 @@
         }
     }
 
-    private void animateIn(View tab) {
-        ObjectAnimator animator = ObjectAnimator.ofInt(tab, "TranslationX", 500, 0);
-        animator.setDuration(mAnimationDuration);
-        animator.start();
-    }
-
-    private void animateOut(final View tab) {
-        ObjectAnimator animator = ObjectAnimator.ofInt(
-                tab, "TranslationX", 0, getScrollX() - tab.getRight());
-        animator.setDuration(mAnimationDuration);
-        animator.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                mContentView.removeView(tab);
-            }
-        });
-        animator.setInterpolator(new AccelerateInterpolator());
-        animator.start();
-    }
+// TODO: These animations are broken and don't work correctly, removing for now
+//       as animateOut is actually causing issues
+//    private void animateIn(View tab) {
+//        ObjectAnimator animator = ObjectAnimator.ofInt(tab, "TranslationX", 500, 0);
+//        animator.setDuration(mAnimationDuration);
+//        animator.start();
+//    }
+//
+//    private void animateOut(final View tab) {
+//        ObjectAnimator animator = ObjectAnimator.ofInt(
+//                tab, "TranslationX", 0, getScrollX() - tab.getRight());
+//        animator.setDuration(mAnimationDuration);
+//        animator.addListener(new AnimatorListenerAdapter() {
+//            @Override
+//            public void onAnimationEnd(Animator animation) {
+//                mContentView.removeView(tab);
+//            }
+//        });
+//        animator.setInterpolator(new AccelerateInterpolator());
+//        animator.start();
+//    }
 
     private void animateScroll(int newscroll) {
         ObjectAnimator animator = ObjectAnimator.ofInt(this, "scroll", getScrollX(), newscroll);
diff --git a/src/com/android/browser/UrlHandler.java b/src/com/android/browser/UrlHandler.java
index 6cdd071..cd0afeb 100644
--- a/src/com/android/browser/UrlHandler.java
+++ b/src/com/android/browser/UrlHandler.java
@@ -133,51 +133,8 @@
             }
         }
 
-        Intent intent;
-        // perform generic parsing of the URI to turn it into an Intent.
-        try {
-            intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
-        } catch (URISyntaxException ex) {
-            Log.w("Browser", "Bad URI " + url + ": " + ex.getMessage());
-            return false;
-        }
-
-        // check whether the intent can be resolved. If not, we will see
-        // whether we can download it from the Market.
-        if (mActivity.getPackageManager().resolveActivity(intent, 0) == null) {
-            String packagename = intent.getPackage();
-            if (packagename != null) {
-                intent = new Intent(Intent.ACTION_VIEW, Uri
-                        .parse("market://search?q=pname:" + packagename));
-                intent.addCategory(Intent.CATEGORY_BROWSABLE);
-                mActivity.startActivity(intent);
-                // before leaving BrowserActivity, close the empty child tab.
-                // If a new tab is created through JavaScript open to load this
-                // url, we would like to close it as we will load this url in a
-                // different Activity.
-                mController.closeEmptyChildTab();
-                return true;
-            } else {
-                return false;
-            }
-        }
-
-        // sanitize the Intent, ensuring web pages can not bypass browser
-        // security (only access to BROWSABLE activities).
-        intent.addCategory(Intent.CATEGORY_BROWSABLE);
-        intent.setComponent(null);
-        try {
-            if (mActivity.startActivityIfNeeded(intent, -1)) {
-                // before leaving BrowserActivity, close the empty child tab.
-                // If a new tab is created through JavaScript open to load this
-                // url, we would like to close it as we will load this url in a
-                // different Activity.
-                mController.closeEmptyChildTab();
-                return true;
-            }
-        } catch (ActivityNotFoundException ex) {
-            // ignore the error. If no application can handle the URL,
-            // eg about:blank, assume the browser can handle it.
+        if (startActivityForUrl(url)) {
+            return true;
         }
 
         if (mController.isMenuDown()) {
@@ -185,9 +142,62 @@
             mActivity.closeOptionsMenu();
             return true;
         }
+
         return false;
     }
 
+    boolean startActivityForUrl(String url)
+    {
+      Intent intent;
+      // perform generic parsing of the URI to turn it into an Intent.
+      try {
+          intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
+      } catch (URISyntaxException ex) {
+          Log.w("Browser", "Bad URI " + url + ": " + ex.getMessage());
+          return false;
+      }
+
+      // check whether the intent can be resolved. If not, we will see
+      // whether we can download it from the Market.
+      if (mActivity.getPackageManager().resolveActivity(intent, 0) == null) {
+          String packagename = intent.getPackage();
+          if (packagename != null) {
+              intent = new Intent(Intent.ACTION_VIEW, Uri
+                      .parse("market://search?q=pname:" + packagename));
+              intent.addCategory(Intent.CATEGORY_BROWSABLE);
+              mActivity.startActivity(intent);
+              // before leaving BrowserActivity, close the empty child tab.
+              // If a new tab is created through JavaScript open to load this
+              // url, we would like to close it as we will load this url in a
+              // different Activity.
+              mController.closeEmptyChildTab();
+              return true;
+          } else {
+              return false;
+          }
+      }
+
+      // sanitize the Intent, ensuring web pages can not bypass browser
+      // security (only access to BROWSABLE activities).
+      intent.addCategory(Intent.CATEGORY_BROWSABLE);
+      intent.setComponent(null);
+      try {
+          if (mActivity.startActivityIfNeeded(intent, -1)) {
+              // before leaving BrowserActivity, close the empty child tab.
+              // If a new tab is created through JavaScript open to load this
+              // url, we would like to close it as we will load this url in a
+              // different Activity.
+              mController.closeEmptyChildTab();
+              return true;
+          }
+      } catch (ActivityNotFoundException ex) {
+          // ignore the error. If no application can handle the URL,
+          // eg about:blank, assume the browser can handle it.
+      }
+
+      return false;
+    }
+
     // Url for issuing the uber token.
     private final static Uri ISSUE_AUTH_TOKEN_URL = Uri.parse(
             "https://www.google.com/accounts/IssueAuthToken?service=gaia&Session=false");
@@ -373,7 +383,7 @@
         }
 
         protected void onPostExecute(String result) {
-            mController.loadUrl(mWebView, result);
+            startActivityForUrl(result);
         }
     }
 
diff --git a/src/com/android/browser/WebStorageSizeManager.java b/src/com/android/browser/WebStorageSizeManager.java
index 5f76f72..bd7f8e6 100644
--- a/src/com/android/browser/WebStorageSizeManager.java
+++ b/src/com/android/browser/WebStorageSizeManager.java
@@ -141,11 +141,11 @@
         }
 
         public long getFreeSpaceSizeBytes() {
-            return mFs.getAvailableBlocks() * mFs.getBlockSize();
+            return (long)(mFs.getAvailableBlocks()) * mFs.getBlockSize();
         }
 
         public long getTotalSizeBytes() {
-            return mFs.getBlockCount() * mFs.getBlockSize();
+            return (long)(mFs.getBlockCount()) * mFs.getBlockSize();
         }
     };
 
diff --git a/src/com/android/browser/addbookmark/FolderSpinner.java b/src/com/android/browser/addbookmark/FolderSpinner.java
new file mode 100644
index 0000000..789c1f1
--- /dev/null
+++ b/src/com/android/browser/addbookmark/FolderSpinner.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser.addbookmark;
+
+import android.content.Context;
+import android.view.View;
+import android.util.AttributeSet;
+import android.widget.Spinner;
+
+/**
+ * Special Spinner class which calls onItemSelected even if the item selected
+ * was already selected.  In that case, it passes null for the View.
+ */
+public class FolderSpinner extends Spinner {
+    public FolderSpinner(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    public void setSelection(int position) {
+        int oldPosition = getSelectedItemPosition();
+        super.setSelection(position);
+        if (oldPosition == position) {
+            // Normally this is not called because the item did not actually
+            // change, but in this case, we still want it to be called.
+            long id = getAdapter().getItemId(position);
+            getOnItemSelectedListener().onItemSelected(this, null, position, id);
+        }
+    }
+}
+
diff --git a/src/com/android/browser/addbookmark/FolderSpinnerAdapter.java b/src/com/android/browser/addbookmark/FolderSpinnerAdapter.java
new file mode 100644
index 0000000..5c17bfa
--- /dev/null
+++ b/src/com/android/browser/addbookmark/FolderSpinnerAdapter.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser.addbookmark;
+
+import com.android.browser.R;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.database.DataSetObserver;
+import android.graphics.drawable.Drawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Adapter;
+import android.widget.SpinnerAdapter;
+import android.widget.TextView;
+
+/**
+ * SpinnerAdapter used in the AddBookmarkPage to select where to save a
+ * bookmark/folder.
+ */
+public class FolderSpinnerAdapter implements SpinnerAdapter {
+    private boolean mIncludeHomeScreen;
+
+    public static final int HOME_SCREEN = 0;
+    public static final int ROOT_FOLDER = 1;
+    public static final int OTHER_FOLDER = 2;
+
+    public FolderSpinnerAdapter(boolean includeHomeScreen) {
+        mIncludeHomeScreen = includeHomeScreen;
+    }
+
+    @Override
+    public View getDropDownView(int position, View convertView, ViewGroup parent) {
+        int labelResource;
+        int drawableResource;
+        if (!mIncludeHomeScreen) {
+            position++;
+        }
+        switch (position) {
+            case HOME_SCREEN:
+                labelResource = R.string.add_to_homescreen_menu_option;
+                drawableResource = com.android.internal.R.drawable.ic_menu_home;
+                break;
+            case ROOT_FOLDER:
+                labelResource = R.string.add_to_bookmarks_menu_option;
+                drawableResource = R.drawable.ic_menu_bookmarks;
+                break;
+            case OTHER_FOLDER:
+                labelResource = R.string.add_to_other_folder_menu_option;
+                drawableResource = com.android.internal.R.drawable.ic_menu_archive;
+                break;
+            default:
+                labelResource = 0;
+                drawableResource = 0;
+                // assert
+                break;
+        }
+        Context context = parent.getContext();
+        LayoutInflater factory = LayoutInflater.from(context);
+        TextView textView = (TextView) factory.inflate(R.layout.add_to_option, null);
+        textView.setText(labelResource);
+        Drawable drawable = context.getResources().getDrawable(drawableResource);
+        textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null,
+                null, null);
+        return textView;
+    }
+
+    @Override
+    public void registerDataSetObserver(DataSetObserver observer) {
+    }
+
+    @Override
+    public void unregisterDataSetObserver(DataSetObserver observer) {
+    }
+
+    @Override
+    public int getCount() {
+        return mIncludeHomeScreen ? 3 : 2;
+    }
+
+    @Override
+    public Object getItem(int position) {
+        return null;
+    }
+
+    @Override
+    public long getItemId(int position) {
+        long id = position;
+        if (!mIncludeHomeScreen) {
+            id++;
+        }
+        return id;
+    }
+
+    @Override
+    public boolean hasStableIds() {
+        return true;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        return getDropDownView(position, convertView, parent);
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        // Never want to recycle views
+        return Adapter.IGNORE_ITEM_VIEW_TYPE;
+    }
+
+    @Override
+    public int getViewTypeCount() {
+        return 1;
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return false;
+    }
+}
diff --git a/src/com/android/browser/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java
index 358ee2d..919a135 100644
--- a/src/com/android/browser/provider/BrowserProvider2.java
+++ b/src/com/android/browser/provider/BrowserProvider2.java
@@ -65,7 +65,8 @@
 public class BrowserProvider2 extends SQLiteContentProvider {
 
     static final String LEGACY_AUTHORITY = "browser";
-    static final Uri LEGACY_AUTHORITY_URI = new Uri.Builder().authority(LEGACY_AUTHORITY).build();
+    static final Uri LEGACY_AUTHORITY_URI = new Uri.Builder()
+            .authority(LEGACY_AUTHORITY).scheme("content").build();
 
     static final String TABLE_BOOKMARKS = "bookmarks";
     static final String TABLE_HISTORY = "history";
@@ -593,6 +594,33 @@
         return null;
     }
 
+    boolean isNullAccount(String account) {
+        if (account == null) return true;
+        account = account.trim();
+        return account.length() == 0 || account.equals("null");
+    }
+
+    Object[] getSelectionWithAccounts(Uri uri, String selection, String[] selectionArgs) {
+        // Look for account info
+        String accountType = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE);
+        String accountName = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME);
+        boolean hasAccounts = false;
+        if (accountType != null && accountName != null) {
+            if (!isNullAccount(accountType) && !isNullAccount(accountName)) {
+                selection = DatabaseUtils.concatenateWhere(selection,
+                        Bookmarks.ACCOUNT_TYPE + "=? AND " + Bookmarks.ACCOUNT_NAME + "=? ");
+                selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
+                        new String[] { accountType, accountName });
+                hasAccounts = true;
+            } else {
+                selection = DatabaseUtils.concatenateWhere(selection,
+                        Bookmarks.ACCOUNT_NAME + " IS NULL AND " +
+                        Bookmarks.ACCOUNT_TYPE + " IS NULL");
+            }
+        }
+        return new Object[] { selection, selectionArgs, hasAccounts };
+    }
+
     @Override
     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
             String sortOrder) {
@@ -632,29 +660,14 @@
                             new String[] { Long.toString(ContentUris.parseId(uri)) });
                 }
 
-                // Look for account info
-                String accountType = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE);
-                String accountName = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME);
-                // Only add it if it isn't already in the selection
-                if (selection == null ||
-                        (!selection.contains(Bookmarks.ACCOUNT_NAME)
-                        && !selection.contains(Bookmarks.ACCOUNT_TYPE))) {
-                    if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
-                        selection = DatabaseUtils.concatenateWhere(selection,
-                                Bookmarks.ACCOUNT_TYPE + "=? AND " + Bookmarks.ACCOUNT_NAME + "=? ");
-                        selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
-                                new String[] { accountType, accountName });
-                    } else {
-                        selection = DatabaseUtils.concatenateWhere(selection,
-                                Bookmarks.ACCOUNT_TYPE + " IS NULL AND " +
-                                Bookmarks.ACCOUNT_NAME + " IS NULL ");
-                    }
-                }
+                Object[] withAccount = getSelectionWithAccounts(uri, selection, selectionArgs);
+                selection = (String) withAccount[0];
+                selectionArgs = (String[]) withAccount[1];
+                boolean hasAccounts = (Boolean) withAccount[2];
 
                 // Set a default sort order if one isn't specified
                 if (TextUtils.isEmpty(sortOrder)) {
-                    if (!TextUtils.isEmpty(accountType)
-                            && !TextUtils.isEmpty(accountName)) {
+                    if (hasAccounts) {
                         sortOrder = DEFAULT_BOOKMARKS_SORT_ORDER_SYNC;
                     } else {
                         sortOrder = DEFAULT_BOOKMARKS_SORT_ORDER;
@@ -671,7 +684,7 @@
                 boolean useAccount = false;
                 String accountType = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE);
                 String accountName = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME);
-                if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
+                if (!isNullAccount(accountType) && !isNullAccount(accountName)) {
                     useAccount = true;
                 }
 
@@ -805,6 +818,10 @@
                         && projection == null) {
                     projection = Browser.HISTORY_PROJECTION;
                 }
+                if (match == LEGACY) {
+                    uri = BookmarkUtils.addAccountInfo(getContext(),
+                            uri.buildUpon()).build();
+                }
                 String[] args = createCombinedQuery(uri, projection, qb);
                 if (selectionArgs == null) {
                     selectionArgs = args;
@@ -876,25 +893,22 @@
     private String[] createCombinedQuery(
             Uri uri, String[] projection, SQLiteQueryBuilder qb) {
         String[] args = null;
-        // Look for account info
-        String accountType = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE);
-        String accountName = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME);
         StringBuilder whereBuilder = new StringBuilder(128);
         whereBuilder.append(Bookmarks.IS_DELETED);
-        whereBuilder.append(" = 0 AND ");
-        if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountType)) {
-            whereBuilder.append(Bookmarks.ACCOUNT_NAME);
-            whereBuilder.append("=? AND ");
-            whereBuilder.append(Bookmarks.ACCOUNT_TYPE);
-            whereBuilder.append("=?");
-            // We use this where twice
-            args = new String[] { accountName, accountType,
-                    accountName, accountType};
-        } else {
-            whereBuilder.append(Bookmarks.ACCOUNT_NAME);
-            whereBuilder.append(" IS NULL AND ");
-            whereBuilder.append(Bookmarks.ACCOUNT_TYPE);
-            whereBuilder.append(" IS NULL");
+        whereBuilder.append(" = 0");
+        // Look for account info
+        Object[] withAccount = getSelectionWithAccounts(uri, null, null);
+        String selection = (String) withAccount[0];
+        String[] selectionArgs = (String[]) withAccount[1];
+        if (selection != null) {
+            whereBuilder.append(" AND " + selection);
+            if (selectionArgs != null) {
+                // We use the selection twice, hence we need to duplicate the args
+                args = new String[selectionArgs.length * 2];
+                System.arraycopy(selectionArgs, 0, args, 0, selectionArgs.length);
+                System.arraycopy(selectionArgs, 0, args, selectionArgs.length,
+                        selectionArgs.length);
+            }
         }
         String where = whereBuilder.toString();
         // Build the bookmark subquery for history union subquery
@@ -921,31 +935,18 @@
         return args;
     }
 
-    int deleteBookmarks(Uri uri, String selection, String[] selectionArgs,
+    int deleteBookmarks(String selection, String[] selectionArgs,
             boolean callerIsSyncAdapter) {
         //TODO cascade deletes down from folders
         final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        // Look for account info
-        String accountType = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE);
-        String accountName = uri.getQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME);
-        if (!TextUtils.isEmpty(accountType) && !TextUtils.isEmpty(accountName)) {
-            selection = DatabaseUtils.concatenateWhere(selection,
-                    Bookmarks.ACCOUNT_TYPE + "=? AND " + Bookmarks.ACCOUNT_NAME + "=? ");
-            selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,
-                    new String[] { accountType, accountName });
-        } else {
-            selection = DatabaseUtils.concatenateWhere(selection,
-                    Bookmarks.ACCOUNT_TYPE + " IS NULL AND " +
-                    Bookmarks.ACCOUNT_NAME + " IS NULL ");
-        }
         if (callerIsSyncAdapter) {
             return db.delete(TABLE_BOOKMARKS, selection, selectionArgs);
         }
         ContentValues values = new ContentValues();
         values.put(Bookmarks.DATE_MODIFIED, System.currentTimeMillis());
         values.put(Bookmarks.IS_DELETED, 1);
-        return updateInTransaction(Bookmarks.CONTENT_URI, values,
-                selection, selectionArgs, callerIsSyncAdapter);
+        return updateBookmarksInTransaction(values, selection, selectionArgs,
+                callerIsSyncAdapter);
     }
 
     @Override
@@ -962,7 +963,11 @@
                 // fall through
             }
             case BOOKMARKS: {
-                int deleted = deleteBookmarks(uri, selection, selectionArgs, callerIsSyncAdapter);
+                // Look for account info
+                Object[] withAccount = getSelectionWithAccounts(uri, selection, selectionArgs);
+                selection = (String) withAccount[0];
+                selectionArgs = (String[]) withAccount[1];
+                int deleted = deleteBookmarks(selection, selectionArgs, callerIsSyncAdapter);
                 pruneImages();
                 return deleted;
             }
@@ -1027,7 +1032,7 @@
                     boolean isBookmark = c.getInt(1) != 0;
                     String url = c.getString(2);
                     if (isBookmark) {
-                        deleted += deleteBookmarks(uri, Bookmarks._ID + "=?",
+                        deleted += deleteBookmarks(Bookmarks._ID + "=?",
                                 new String[] { Long.toString(id) },
                                 callerIsSyncAdapter);
                         db.delete(TABLE_HISTORY, History.URL + "=?",
@@ -1041,7 +1046,7 @@
                 return deleted;
             }
         }
-        throw new UnsupportedOperationException("Unknown update URI " + uri);
+        throw new UnsupportedOperationException("Unknown delete URI " + uri);
     }
 
     long queryDefaultFolderId(String accountName, String accountType) {
@@ -1287,6 +1292,9 @@
                 // fall through
             }
             case BOOKMARKS: {
+                Object[] withAccount = getSelectionWithAccounts(uri, selection, selectionArgs);
+                selection = (String) withAccount[0];
+                selectionArgs = (String[]) withAccount[1];
                 int updated = updateBookmarksInTransaction(values, selection, selectionArgs,
                         callerIsSyncAdapter);
                 pruneImages();
@@ -1347,9 +1355,9 @@
             String[] selectionArgs, boolean callerIsSyncAdapter) {
         int count = 0;
         final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        Cursor cursor = query(Bookmarks.CONTENT_URI,
+        Cursor cursor = db.query(TABLE_BOOKMARKS,
                 new String[] { Bookmarks._ID, Bookmarks.VERSION, Bookmarks.URL },
-                selection, selectionArgs, null);
+                selection, selectionArgs, null, null, null);
         try {
             String[] args = new String[1];
             // Mark the bookmark dirty if the caller isn't a sync adapter
diff --git a/src/com/android/browser/widget/BookmarkListWidgetService.java b/src/com/android/browser/widget/BookmarkListWidgetService.java
index 39751e6..4d72d41 100644
--- a/src/com/android/browser/widget/BookmarkListWidgetService.java
+++ b/src/com/android/browser/widget/BookmarkListWidgetService.java
@@ -85,7 +85,7 @@
         mUiHandler = new Handler();
         mBookmarksObserver = new BookmarksObserver(mUiHandler);
         getContentResolver().registerContentObserver(
-                BrowserContract.AUTHORITY_URI, true, mBookmarksObserver);
+                BrowserContract.Bookmarks.CONTENT_URI, true, mBookmarksObserver);
     }
 
     @Override
@@ -337,12 +337,10 @@
                 uri = BrowserContract.Bookmarks.CONTENT_URI;
                 where = Bookmarks.IS_FOLDER + " == 0";
             }
-            if (!TextUtils.isEmpty(mAccountType) && !TextUtils.isEmpty(mAccountName)) {
-                uri = uri.buildUpon()
-                        .appendQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE, mAccountType)
-                        .appendQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME, mAccountName)
-                        .build();
-            }
+            uri = uri.buildUpon()
+                    .appendQueryParameter(Bookmarks.PARAM_ACCOUNT_TYPE, mAccountType)
+                    .appendQueryParameter(Bookmarks.PARAM_ACCOUNT_NAME, mAccountName)
+                    .build();
             Cursor c = null;
             try {
                 c = mContext.getContentResolver().query(uri, PROJECTION,