Merge "Remove prompt-bypass"
diff --git a/res/layout/snapshots.xml b/res/layout/snapshots.xml
index 48d2883..54d4e01 100644
--- a/res/layout/snapshots.xml
+++ b/res/layout/snapshots.xml
@@ -33,8 +33,8 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center"
-        android:textAppearance="?android:attr/textAppearanceLarge"
-        android:text="@string/empty_bookmarks_folder"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:text="@string/empty_snapshots_folder"
         android:visibility="gone" />
 
 </FrameLayout>
diff --git a/res/menu/snapshots_context.xml b/res/menu/snapshots_context.xml
index 01880dd..af7a776 100644
--- a/res/menu/snapshots_context.xml
+++ b/res/menu/snapshots_context.xml
@@ -18,6 +18,6 @@
     <group android:id="@+id/CONTEXT_MENU">
         <item
             android:id="@+id/delete_context_menu_id"
-            android:title="@string/remove_bookmark"/>
+            android:title="@string/remove_snapshot"/>
     </group>
 </menu>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 39cd1a7..a33670a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1004,4 +1004,8 @@
     <string name="ua_switcher_desktop">Desktop</string>
     <!-- Preload permission label [CHAR LIMIT=40] -->
     <string name="permission_preload_label">Preload results</string>
+    <!-- Empty text for the "saved pages" tab that is shown when no saved pages exist. [CHAR LIMIT=None] -->
+    <string name="empty_snapshots_folder">There are no saved pages.</string>
+    <!-- Menu option to delete the currently selected saved page [CHAR LIMIT=50] -->
+    <string name="remove_snapshot">Delete saved page</string>
 </resources>
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index d1445d8..b270dea 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -35,6 +35,7 @@
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.Menu;
+import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -653,6 +654,11 @@
     }
 
     @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        return false;
+    }
+
+    @Override
     public void onOptionsMenuClosed(boolean inLoad) {
     }
 
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 9b81870..8a4433e 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -1512,6 +1512,10 @@
             // won't get onKeyUp for MENU. So it is important to reset it here.
             mMenuIsDown = false;
         }
+        if (mUi.onOptionsItemSelected(item)) {
+            // ui callback handled it
+            return true;
+        }
         switch (item.getItemId()) {
             // -- Main menu
             case R.id.new_tab_menu_id:
@@ -2462,10 +2466,6 @@
         boolean noModifiers = event.hasNoModifiers();
         // Even if MENU is already held down, we need to call to super to open
         // the IME on long press.
-        if (KeyEvent.KEYCODE_MENU == keyCode) {
-            event.startTracking();
-            return true;
-        }
         if (!noModifiers
                 && ((KeyEvent.KEYCODE_MENU == keyCode)
                         || (KeyEvent.KEYCODE_CTRL_LEFT == keyCode)
diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java
index 23317b5..ee20535 100644
--- a/src/com/android/browser/NavScreen.java
+++ b/src/com/android/browser/NavScreen.java
@@ -23,6 +23,7 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.ViewConfiguration;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.webkit.WebView;
@@ -59,6 +60,7 @@
     NavTabGallery mScroller;
     TabAdapter mAdapter;
     int mOrientation;
+    boolean mNeedsMenu;
 
     public NavScreen(Activity activity, UiController ctl, PhoneUi ui) {
         super(activity);
@@ -122,6 +124,10 @@
                 ? LinearLayout.HORIZONTAL : LinearLayout.VERTICAL);
         // update state for active tab
         mScroller.setSelection(mUiController.getTabControl().getTabPosition(mUi.getActiveTab()));
+        mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
+        if (!mNeedsMenu) {
+            mMore.setVisibility(View.GONE);
+        }
     }
 
     @Override
diff --git a/src/com/android/browser/NavigationBarPhone.java b/src/com/android/browser/NavigationBarPhone.java
index 2030169..400b695 100644
--- a/src/com/android/browser/NavigationBarPhone.java
+++ b/src/com/android/browser/NavigationBarPhone.java
@@ -167,30 +167,6 @@
         return mMenuShowing;
     }
 
-    void showMenu() {
-        // called from menu key, use tab switcher as anchor
-        mMenuShowing = true;
-        if (isEditingUrl()) {
-            stopEditingUrl();
-            post(new Runnable() {
-                @Override
-                public void run() {
-                    showMenu();
-                }
-            });
-        } else {
-            mBaseUi.getTitleBar().setSkipTitleBarAnimations(true);
-            mBaseUi.showTitleBar();
-            mBaseUi.getTitleBar().setSkipTitleBarAnimations(false);
-            post(new Runnable() {
-                @Override
-                public void run() {
-                    showMenu(mTabSwitcher);
-                }
-            });
-        }
-    }
-
     void showMenu(View anchor) {
         mMenuShowing = true;
         mPopupMenu = new PopupMenu(mContext, anchor);
@@ -202,13 +178,6 @@
         mPopupMenu.show();
     }
 
-    void dismissMenu() {
-       if (mPopupMenu != null) {
-           mPopupMenu.dismiss();
-           mBaseUi.suggestHideTitleBar();
-       }
-    }
-
     @Override
     public void onDismiss(PopupMenu menu) {
         onMenuHidden();
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index 9e3310b..28db6f0 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -23,6 +23,7 @@
 import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 import android.webkit.WebView;
 import android.widget.FrameLayout;
@@ -78,16 +79,6 @@
     }
 
     @Override
-    public boolean onMenuKey() {
-        if (mNavigationBar.isMenuShowing()) {
-            mNavigationBar.dismissMenu();
-        } else {
-            mNavigationBar.showMenu();
-        }
-        return true;
-    }
-
-    @Override
     public boolean dispatchKey(int code, KeyEvent event) {
         return false;
     }
@@ -169,6 +160,20 @@
     // menu handling callbacks
 
     @Override
+    public boolean onPrepareOptionsMenu(Menu menu) {
+        menu.setGroupVisible(R.id.NAV_MENU, (mNavScreen == null));
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (mNavScreen != null) {
+            hideNavScreen(false);
+        }
+        return false;
+    }
+
+    @Override
     public void onContextMenuCreated(Menu menu) {
         hideTitleBar();
     }
diff --git a/src/com/android/browser/PreloadController.java b/src/com/android/browser/PreloadController.java
index 11586ea..652ea8e 100644
--- a/src/com/android/browser/PreloadController.java
+++ b/src/com/android/browser/PreloadController.java
@@ -81,11 +81,25 @@
     @Override
     public void onPageStarted(Tab tab, WebView view, Bitmap favicon) {
         if (LOGD_ENABLED) Log.d(LOGTAG, "onPageStarted()");
+        if (view != null) {
+            // Clear history of all previously visited pages. When the
+            // user visits a preloaded tab, the only item in the history
+            // list should the currently viewed page.
+            view.clearHistory();
+        }
     }
 
     @Override
     public void onPageFinished(Tab tab) {
         if (LOGD_ENABLED) Log.d(LOGTAG, "onPageFinished()");
+        if (tab != null) {
+            final WebView view = tab.getWebView();
+            if (view != null) {
+                // Clear history of all previously visited pages. When the
+                // user visits a preloaded tab.
+                view.clearHistory();
+            }
+        }
     }
 
     @Override
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 1be2016..6473c88 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -389,6 +389,11 @@
                 // ignore tab
             } else if (id == currentId || restoreAll) {
                 Tab t = createNewTab();
+                if (t == null) {
+                    // We could "break" at this point, but we want
+                    // sNextId to be set correctly.
+                    continue;
+                }
                 tabMap.put(id, t);
                 // Me must set the current tab before restoring the state
                 // so that all the client classes are set.
@@ -416,11 +421,12 @@
                 // added the tab to the front as they are not current
                 mTabQueue.add(0, t);
             }
-            // make sure that there is no id overlap between the restored
-            // and new tabs
-            sNextId = maxId + 1;
-
         }
+
+        // make sure that there is no id overlap between the restored
+        // and new tabs
+        sNextId = maxId + 1;
+
         if (mCurrentTab == -1) {
             if (getTabCount() > 0) {
                 setCurrentTab(getTab(0));
diff --git a/src/com/android/browser/UI.java b/src/com/android/browser/UI.java
index 4b58872..23897f7 100644
--- a/src/com/android/browser/UI.java
+++ b/src/com/android/browser/UI.java
@@ -22,6 +22,7 @@
 import android.view.ActionMode;
 import android.view.KeyEvent;
 import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 import android.webkit.WebChromeClient.CustomViewCallback;
 import android.webkit.WebView;
@@ -102,6 +103,8 @@
 
     public void onExtendedMenuOpened();
 
+    public boolean onOptionsItemSelected(MenuItem item);
+
     public void onOptionsMenuClosed(boolean inLoad);
 
     public void onExtendedMenuClosed(boolean inLoad);