Add quick controls

    Bug: http://b/issue?id=3277888
    Added Quick Controls Lab setting
    Implemented Quick Controls UI

Change-Id: I72011daf9140aa5d15c8b785126867c10bbc5501
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 69e6724..7f9baa7 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -21,8 +21,12 @@
 import android.app.ActionBar;
 import android.app.Activity;
 import android.graphics.Bitmap;
+import android.util.Log;
 import android.view.ActionMode;
+import android.view.Gravity;
 import android.webkit.WebView;
+import android.widget.FrameLayout;
+import android.widget.FrameLayout.LayoutParams;
 
 import java.util.List;
 
@@ -33,11 +37,15 @@
 
     private static final String LOGTAG = "XLargeUi";
 
+    private ActionBar mActionBar;
     private TabBar mTabBar;
 
     private TitleBarXLarge mTitleBar;
     private TitleBarXLarge mFakeTitleBar;
 
+    private boolean mUseQuickControls;
+    private PieControl mPieControl;
+
     /**
      * @param browser
      * @param controller
@@ -49,10 +57,51 @@
         mTitleBar.setEditable(false);
         mFakeTitleBar = new TitleBarXLarge(mActivity, mUiController, this);
         mFakeTitleBar.setEditable(true);
-        ActionBar actionBar = mActivity.getActionBar();
         mTabBar = new TabBar(mActivity, mUiController, this);
-        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
-        actionBar.setCustomView(mTabBar);
+        mActionBar = mActivity.getActionBar();
+        mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
+        mActionBar.setCustomView(mTabBar);
+        setUseQuickControls(BrowserSettings.getInstance().useQuickControls());
+    }
+
+    private void setUseQuickControls(boolean useQuickControls) {
+        mUseQuickControls = useQuickControls;
+        if (useQuickControls) {
+            checkTabCount();
+            mPieControl = new PieControl(mActivity, mUiController, this);
+            mPieControl.attachToContainer(mContentView);
+            setFakeTitleBarGravity(Gravity.BOTTOM);
+
+            // remove embedded title bar if present
+            WebView web = mTabControl.getCurrentWebView();
+            if ((web != null) && (web.getVisibleTitleHeight() > 0)) {
+                web.setEmbeddedTitleBar(null);
+            }
+        } else {
+            mActivity.getActionBar().show();
+            if (mPieControl != null) {
+                mPieControl.removeFromContainer(mContentView);
+            }
+            setFakeTitleBarGravity(Gravity.TOP);
+            // remove embedded title bar if present
+            WebView web = mTabControl.getCurrentWebView();
+            if ((web != null) && (web.getVisibleTitleHeight() == 0)) {
+                web.setEmbeddedTitleBar(mTitleBar);
+            }
+        }
+        mTabBar.setUseQuickControls(mUseQuickControls);
+        mFakeTitleBar.setUseQuickControls(mUseQuickControls);
+    }
+
+    private void checkTabCount() {
+        if (mUseQuickControls) {
+            int n = mTabBar.getTabCount();
+            if (n >= 2) {
+                mActivity.getActionBar().show();
+            } else if (n == 1) {
+                mActivity.getActionBar().hide();
+            }
+        }
     }
 
     @Override
@@ -114,6 +163,9 @@
     public void onPageFinished(Tab tab, String url) {
         mTabBar.onPageFinished(tab);
         super.onPageFinished(tab, url);
+        if (mUseQuickControls) {
+            mFakeTitleBar.setShowProgressOnly(false);
+        }
     }
 
     @Override
@@ -123,7 +175,17 @@
             mFakeTitleBar.setProgress(progress);
             if (progress == 100) {
                 hideFakeTitleBar();
+                if (mUseQuickControls) {
+                    mFakeTitleBar.setShowProgressOnly(false);
+                    setFakeTitleBarGravity(Gravity.BOTTOM);
+                }
             } else {
+                if (mUseQuickControls) {
+                    mFakeTitleBar.setShowProgressOnly(true);
+                    if (!isFakeTitleBarShowing()) {
+                        setFakeTitleBarGravity(Gravity.TOP);
+                    }
+                }
                 showFakeTitleBar();
             }
         }
@@ -137,28 +199,55 @@
     @Override
     public void addTab(Tab tab) {
         mTabBar.onNewTab(tab);
+        checkTabCount();
     }
 
     @Override
     public void setActiveTab(Tab tab) {
         super.setActiveTab(tab);
+        ScrollWebView view = (ScrollWebView) tab.getWebView();
+        // TabControl.setCurrentTab has been called before this,
+        // so the tab is guaranteed to have a webview
+        if (view == null) {
+            Log.e(LOGTAG, "active tab with no webview detected");
+            return;
+        }
+        // Request focus on the top window.
+        if (mUseQuickControls) {
+            mPieControl.forceToTop(mContentView);
+            view.setScrollListener(null);
+            mTabBar.showTitleBarIndicator(false);
+        } else {
+            view.setEmbeddedTitleBar(mTitleBar);
+            view.setScrollListener(this);
+        }
         mTabBar.onSetActiveTab(tab);
+        if (tab.isInVoiceSearchMode()) {
+            showVoiceTitleBar(tab.getVoiceDisplayTitle());
+        } else {
+            revertVoiceTitleBar(tab);
+        }
+        resetTitleIconAndProgress(tab);
+        updateLockIconToLatest(tab);
+        tab.getTopWindow().requestFocus();
     }
 
     @Override
     public void updateTabs(List<Tab> tabs) {
         mTabBar.updateTabs(tabs);
+        checkTabCount();
     }
 
     @Override
     public void removeTab(Tab tab) {
         super.removeTab(tab);
         mTabBar.onRemoveTab(tab);
+        checkTabCount();
     }
 
-    int getTitleBarWidth() {
-        if (mTitleBar != null) {
-            return mTitleBar.getWidth();
+    int getContentWidth() {
+        if (mContentView != null) {
+            return mContentView.getWidth();
         }
         return 0;
     }
@@ -168,6 +257,22 @@
         mFakeTitleBar.onEditUrl(clearInput);
     }
 
+    void setFakeTitleBarGravity(int gravity) {
+        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams)
+                mFakeTitleBar.getLayoutParams();
+        if (lp == null) {
+            lp = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
+                    LayoutParams.WRAP_CONTENT);
+        }
+        lp.gravity = gravity;
+        mFakeTitleBar.setLayoutParams(lp);
+    }
+
+    void showFakeTitleBarAndEdit() {
+        showFakeTitleBar();
+        mFakeTitleBar.onEditUrl(false);
+    }
+
     @Override
     protected void attachFakeTitleBar(WebView mainView) {
         mContentView.addView(mFakeTitleBar);
@@ -208,6 +313,20 @@
     }
 
     @Override
+    public void onActionModeFinished(boolean inLoad) {
+        checkTabCount();
+        if (inLoad) {
+            // the titlebar was removed when the CAB was shown
+            // if the page is loading, show it again
+            mFakeTitleBar.setShowProgressOnly(true);
+            if (!isFakeTitleBarShowing()) {
+                setFakeTitleBarGravity(Gravity.TOP);
+            }
+            showFakeTitleBar();
+        }
+    }
+
+    @Override
     public void setUrlTitle(Tab tab, String url, String title) {
         super.setUrlTitle(tab, url, title);
         mTabBar.onUrlAndTitle(tab, url, title);