Merge "Settings cleanup"
diff --git a/src/com/android/browser/Bookmarks.java b/src/com/android/browser/Bookmarks.java
index fef634f..9a5b6f0 100644
--- a/src/com/android/browser/Bookmarks.java
+++ b/src/com/android/browser/Bookmarks.java
@@ -29,6 +29,7 @@
 import android.provider.BrowserContract;
 import android.provider.BrowserContract.Combined;
 import android.provider.BrowserContract.Images;
+import android.text.TextUtils;
 import android.util.Log;
 import android.webkit.WebIconDatabase;
 import android.widget.Toast;
@@ -218,25 +219,25 @@
         new AsyncTask<Void, Void, Void>() {
             @Override
             protected Void doInBackground(Void... unused) {
-                Cursor cursor = queryCombinedForUrl(cr, originalUrl, url);
-                try {
-                    if (cursor.moveToFirst()) {
-                        final ByteArrayOutputStream os = new ByteArrayOutputStream();
-                        favicon.compress(Bitmap.CompressFormat.PNG, 100, os);
+                final ByteArrayOutputStream os = new ByteArrayOutputStream();
+                favicon.compress(Bitmap.CompressFormat.PNG, 100, os);
 
-                        ContentValues values = new ContentValues();
-                        values.put(Images.FAVICON, os.toByteArray());
-                        values.put(Images.URL, cursor.getString(0));
-
-                        do {
-                            cr.update(Images.CONTENT_URI, values, null, null);
-                        } while (cursor.moveToNext());
-                    }
-                } finally {
-                    if (cursor != null) cursor.close();
-                }
+                // The Images update will insert if it doesn't exist
+                ContentValues values = new ContentValues();
+                values.put(Images.FAVICON, os.toByteArray());
+                updateImages(cr, originalUrl, values);
+                updateImages(cr, url, values);
                 return null;
             }
+
+            private void updateImages(final ContentResolver cr,
+                    final String url, ContentValues values) {
+                String iurl = removeQuery(url);
+                if (!TextUtils.isEmpty(iurl)) {
+                    values.put(Images.URL, iurl);
+                    cr.update(BrowserContract.Images.CONTENT_URI, values, null, null);
+                }
+            }
         }.execute();
     }
 }
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index ab6578a..b7a39a2 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -1048,6 +1048,7 @@
             // view is showing.
             mOldMenuState = mMenuState;
             mMenuState = EMPTY_MENU;
+            mActivity.invalidateOptionsMenu();
         }
     }
 
@@ -1058,6 +1059,7 @@
             // Reset the old menu state.
             mMenuState = mOldMenuState;
             mOldMenuState = EMPTY_MENU;
+            mActivity.invalidateOptionsMenu();
         }
     }
 
@@ -1187,6 +1189,9 @@
     // TODO: maybe put into separate handler
 
     protected boolean onCreateOptionsMenu(Menu menu) {
+        if (mMenuState == EMPTY_MENU) {
+            return false;
+        }
         MenuInflater inflater = mActivity.getMenuInflater();
         inflater.inflate(R.menu.browser, menu);
         updateInLoadMenuItems(menu);
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index dcba39b..f45b0a1 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -24,6 +24,8 @@
 import android.util.Log;
 import android.view.ActionMode;
 import android.view.Gravity;
+import android.view.View;
+import android.webkit.WebChromeClient.CustomViewCallback;
 import android.webkit.WebView;
 import android.widget.FrameLayout;
 import android.widget.FrameLayout.LayoutParams;
@@ -349,5 +351,19 @@
         mFakeTitleBar.setDisplayTitle(url);
     }
 
+    @Override
+    public void showCustomView(View view, CustomViewCallback callback) {
+        super.showCustomView(view, callback);
+        mActivity.getActionBar().hide();
+    }
 
+    @Override
+    public void onHideCustomView() {
+        super.onHideCustomView();
+        if (mUseQuickControls) {
+            checkTabCount();
+        } else {
+            mActivity.getActionBar().show();
+        }
+    }
 }
diff --git a/tests/src/com/android/browser/JNIBindingsTest.java b/tests/src/com/android/browser/JNIBindingsTest.java
index ba3c66a..94dc985 100644
--- a/tests/src/com/android/browser/JNIBindingsTest.java
+++ b/tests/src/com/android/browser/JNIBindingsTest.java
@@ -212,7 +212,8 @@
     public boolean testJSPrimitivesToStringsInJava(String intParam, String nullParam,
             String doubleParam, String booleanParam, String charParam,
             String undefinedParam) {
-        String expectedIntParam = "123";
+        // Since JS numbers are treated as doubles.
+        String expectedIntParam = "123.0";
         String expectedDoubleParam = "456.789";
         String expectedBooleanParam = "true";
         String expectedCharParam = "d";