Add an active tabs page.

The active tabs page gives the user the ability to see all of their
open tabs in a list, and switch tabs, create a new one, or close
an old one.

Fix for http://b/issue?id=2101994

Change-Id: Id4c14dd437f769144dbdb02011144ea97d8fd030
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 887f832..bff8d04 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -1251,15 +1251,17 @@
         return true;
     }
 
+    /* package */ TabControl.Tab openTabToHomePage() {
+        return openTabAndShow(mSettings.getHomePage(), false, null);
+    }
+
     /* package */ void closeCurrentWindow() {
         final TabControl.Tab current = mTabControl.getCurrentTab();
         if (mTabControl.getTabCount() == 1) {
             // This is the last tab.  Open a new one, with the home
             // page and close the current one.
-            TabControl.Tab newTab = openTabAndShow(
-                    mSettings.getHomePage(), false, null);
+            TabControl.Tab newTab = openTabToHomePage();
             closeTab(current);
-            mTabControl.setCurrentTab(newTab);
             return;
         }
         final TabControl.Tab parent = current.getParentTab();
@@ -1281,6 +1283,23 @@
         }
     }
 
+    private ActiveTabsPage mActiveTabsPage;
+
+    /**
+     * Remove the active tabs page.
+     * @param needToAttach If true, the active tabs page did not attach a tab
+     *                     to the content view, so we need to do that here.
+     */
+    /* package */ void removeActiveTabPage(boolean needToAttach) {
+        mContentView.removeView(mActiveTabsPage);
+        mActiveTabsPage = null;
+        mMenuState = R.id.MAIN_MENU;
+        if (needToAttach) {
+            attachTabToContentView(mTabControl.getCurrentTab());
+        }
+        getTopWindow().requestFocus();
+    }
+
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         if (!mCanChord) {
@@ -1301,13 +1320,21 @@
         switch (item.getItemId()) {
             // -- Main menu
             case R.id.new_tab_menu_id:
-                openTabAndShow(mSettings.getHomePage(), false, null);
+                openTabToHomePage();
                 break;
 
             case R.id.goto_menu_id:
                 bookmarksOrHistoryPicker(false);
                 break;
 
+            case R.id.active_tabs_menu_id:
+                mActiveTabsPage = new ActiveTabsPage(this, mTabControl);
+                removeTabFromContentView(mTabControl.getCurrentTab());
+                mContentView.addView(mActiveTabsPage, COVER_SCREEN_PARAMS);
+                mActiveTabsPage.requestFocus();
+                mMenuState = EMPTY_MENU;
+                break;
+
             case R.id.add_bookmark_menu_id:
                 Intent i = new Intent(BrowserActivity.this,
                         AddBookmarkPage.class);
@@ -1696,7 +1723,11 @@
             if (CUSTOM_BROWSER_BAR) {
                 mTitleBar.addTab(webview, true);
             }
-            removeTabFromContentView(currentTab);
+            // If the last tab was removed from the active tabs page, currentTab
+            // will be null.
+            if (currentTab != null) {
+                removeTabFromContentView(currentTab);
+            }
             attachTabToContentView(tab);
             // We must set the new tab as the current tab to reflect the old
             // animation behavior.
@@ -1956,13 +1987,20 @@
     }
 
     /**
-     * Close the tab after removing its associated title bar.
+     * Close the tab, remove its associated title bar, and adjust mTabControl's
+     * current tab to a valid value.
      */
-    private void closeTab(TabControl.Tab t) {
+    /* package */ void closeTab(TabControl.Tab t) {
+        int currentIndex = mTabControl.getCurrentIndex();
+        int removeIndex = mTabControl.getTabIndex(t);
         if (CUSTOM_BROWSER_BAR) {
-            mTitleBar.removeTab(mTabControl.getTabIndex(t));
+            mTitleBar.removeTab(removeIndex);
         }
         mTabControl.removeTab(t);
+        if (currentIndex >= removeIndex && currentIndex != 0) {
+            currentIndex--;
+        }
+        mTabControl.setCurrentTab(mTabControl.getTab(currentIndex));
     }
 
     private void goBackOnePageOrQuit() {
@@ -2012,6 +2050,9 @@
                     pauseWebViewTimers();
                     mActivityInPause = savedState;
                     removeTabFromContentView(current);
+                    if (CUSTOM_BROWSER_BAR) {
+                        mTitleBar.removeTab(mTabControl.getTabIndex(current));
+                    }
                     mTabControl.removeTab(current);
                 }
                 /*