UI revision for tabbed browsing
     bug # http://b/issue?id=2712871

     separated tab bar from url bar
     subclassed webview for scroll listener
     added search button support

Change-Id: Ib9bd0c7e815e2ef08cdd20334daf61263cd52938
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index fd6d67b..4e65375 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -19,87 +19,56 @@
 import android.app.SearchManager;
 import android.content.Context;
 import android.content.Intent;
-import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
-import android.graphics.Color;
-import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.graphics.drawable.PaintDrawable;
 import android.view.ContextMenu;
 import android.view.LayoutInflater;
 import android.view.MenuInflater;
 import android.view.View;
+import android.view.View.OnClickListener;
 import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
 
-import com.android.browser.TabControl.TabChangeListener;
 import com.android.browser.UrlInputView.UrlInputListener;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * tabbed title bar for xlarge screen browser
  */
 public class TitleBarXLarge extends TitleBarBase
-    implements TabChangeListener, UrlInputListener {
+    implements UrlInputListener, OnClickListener {
 
     private static final int PROGRESS_MAX = 100;
 
-    private static final int TAB_WIDTH_SELECTED = 400;
-    private static final int TAB_WIDTH_UNSELECTED = 150;
+    private BrowserActivity mBrowserActivity;
+    private Drawable mStopDrawable;
+    private Drawable mReloadDrawable;
+    private Drawable mProgressDrawable;
 
-    private BrowserActivity       mBrowserActivity;
-    private Drawable              mStopDrawable;
-    private Drawable              mReloadDrawable;
-    private Drawable              mSelectedBackground;
-    private Drawable              mUnselectedBackground;
+    private View mBackButton;
+    private View mForwardButton;
+    private View mStar;
+    private View mSearchButton;
+    private ImageView mStopButton;
+    private View mMenu;
+    private View mAllButton;
+    private ImageView mProgressView;
+    private UrlInputView mUrlView;
+    private boolean mInLoad;
 
-    private View                  mBackButton;
-    private View                  mForwardButton;
-    private View                  mStar;
-    private View                  mMenu;
-    private View                  mAllButton;
-    private TabScrollView         mTabs;
-    private View                  mNewButton;
-    private TabControl            mControl;
-    private UrlInputView          mUrlView;
-
-    private boolean               mIsInLandscape;
-    private Map<Tab, TabViewData> mTabMap;
-
-    private float                 mDensityScale;
-
-    public TitleBarXLarge(BrowserActivity context, TabControl tabcontrol) {
+    public TitleBarXLarge(BrowserActivity context) {
         super(context);
-        mDensityScale = context.getResources().getDisplayMetrics().density;
-        mTabMap = new HashMap<Tab, TabViewData>();
         mBrowserActivity = context;
-        mControl = tabcontrol;
         Resources resources = context.getResources();
-        mSelectedBackground = resources.getDrawable(R.drawable.tab_selected_bg);
-        mUnselectedBackground = resources.getDrawable(R.drawable.tab_unselected_bg);
-        mStopDrawable = resources.getDrawable(R.drawable.progress_stop);
+        mStopDrawable = resources.getDrawable(R.drawable.ic_stop);
         mReloadDrawable = resources.getDrawable(R.drawable.ic_reload);
         rebuildLayout(context, true);
-        // register the tab change listener
-        mControl.setOnTabChangeListener(this);
-    }
-
-    void rebuildLayout() {
-        rebuildLayout(mBrowserActivity, false);
     }
 
     private void rebuildLayout(Context context, boolean rebuildData) {
         removeAllViews();
         LayoutInflater factory = LayoutInflater.from(context);
-        factory.inflate(R.layout.title_bar_tabbed, this);
+        factory.inflate(R.layout.url_bar, this);
 
-        mTabs = (TabScrollView) findViewById(R.id.tabs);
-        mNewButton = findViewById(R.id.newtab);
         mUrlView = (UrlInputView) findViewById(R.id.editurl);
         mAllButton = findViewById(R.id.all_btn);
         // TODO: Change enabled states based on whether you can go
@@ -108,67 +77,55 @@
         mForwardButton = findViewById(R.id.forward);
         mStar = findViewById(R.id.star);
         mMenu = findViewById(R.id.menu);
-        View.OnClickListener listener = new View.OnClickListener() {
-            public void onClick(View v) {
-                if (mBackButton == v) {
-                    mBrowserActivity.getTopWindow().goBack();
-                } else if (mForwardButton == v) {
-                    mBrowserActivity.getTopWindow().goForward();
-                } else if (mStar == v) {
-                    mBrowserActivity.promptAddOrInstallBookmark();
-                } else if (mMenu == v) {
-                    mBrowserActivity.openOptionsMenu();
-                } else if (mAllButton == v) {
-                    // TODO: Show the new bookmarks/windows view.
-                    mBrowserActivity.bookmarksOrHistoryPicker(false);
-                } else if (mNewButton == v) {
-                    mBrowserActivity.openTabToHomePage();
-                }
-            }
-        };
-        mBackButton.setOnClickListener(listener);
-        mForwardButton.setOnClickListener(listener);
-        mStar.setOnClickListener(listener);
-        mAllButton.setOnClickListener(listener);
-        mMenu.setOnClickListener(listener);
-        mNewButton.setOnClickListener(listener);
+        mStopButton = (ImageView) findViewById(R.id.stop);
+        mSearchButton = findViewById(R.id.search);
+        mLockIcon = (ImageView) findViewById(R.id.lock);
+        mProgressView = (ImageView) findViewById(R.id.progress);
+        mProgressDrawable = mProgressView.getDrawable();
 
-        mIsInLandscape = mBrowserActivity.getResources().getConfiguration().orientation
-                == Configuration.ORIENTATION_LANDSCAPE;
-        mUrlView.setVisibility(mIsInLandscape ? View.GONE : View.VISIBLE);
+        mBackButton.setOnClickListener(this);
+        mForwardButton.setOnClickListener(this);
+        mStar.setOnClickListener(this);
+        mAllButton.setOnClickListener(this);
+        mStopButton.setOnClickListener(this);
+        mSearchButton.setOnClickListener(this);
+        mMenu.setOnClickListener(this);
         mUrlView.setUrlInputListener(this);
-        buildTabs(rebuildData);
-        // ensure title bar state
-        onCurrentTab(mControl.getCurrentTab());
     }
 
-    void showUrlEditor(TabViewData tabdata) {
-        mUrlView.setVisibility(View.VISIBLE);
-        if (mIsInLandscape) {
-            mTabs.setVisibility(View.GONE);
-            mUrlView.requestFocus();
-            mUrlView.forceIme();
+    @Override
+    public void onClick(View v) {
+        if (mBackButton == v) {
+            mBrowserActivity.getTopWindow().goBack();
+        } else if (mForwardButton == v) {
+            mBrowserActivity.getTopWindow().goForward();
+        } else if (mStar == v) {
+            mBrowserActivity.promptAddOrInstallBookmark();
+        } else if (mMenu == v) {
+            mBrowserActivity.openOptionsMenu();
+        } else if (mAllButton == v) {
+            // TODO: Show the new bookmarks/windows view.
+            mBrowserActivity.bookmarksOrHistoryPicker(false);
+        } else if (mSearchButton == v) {
+            search();
+        } else if (mStopButton == v) {
+            stopOrRefresh();
         }
     }
 
-    void hideUrlEditor() {
-        Tab tab = mControl.getCurrentTab();
-        if (mIsInLandscape) {
-            mUrlView.setVisibility(View.GONE);
-            mTabs.setVisibility(View.VISIBLE);
-        } else {
-            // portrait mode
-            mUrlView.setText(tab.getWebView().getUrl());
-        }
-        tab.getWebView().requestFocus();
+    void requestUrlInputFocus() {
+        mUrlView.requestFocus();
     }
 
+    @Override
+    void setFavicon(Bitmap icon) { }
 
     // UrlInputListener implementation
 
     @Override
     public void onAction(String text) {
-        hideUrlEditor();
+        mBrowserActivity.getTabControl().getCurrentTopWebView().requestFocus();
+        mBrowserActivity.hideFakeTitleBar();
         Intent i = new Intent();
         i.setAction(Intent.ACTION_SEARCH);
         i.putExtra(SearchManager.QUERY, text);
@@ -177,7 +134,8 @@
 
     @Override
     public void onDismiss() {
-        hideUrlEditor();
+        mBrowserActivity.getTabControl().getCurrentTopWebView().requestFocus();
+        mBrowserActivity.hideFakeTitleBar();
     }
 
     @Override
@@ -187,321 +145,41 @@
         mBrowserActivity.onCreateContextMenu(menu, this, null);
     }
 
-    @Override
-    /* package */ void setLock(Drawable d) {
-        // TODO: handle in tab specific callback
+    private void search() {
+        mUrlView.setText("");
+        mUrlView.requestFocus();
     }
 
-    @Override
-    /* package */ void setFavicon(Bitmap icon) {
-        // this is handled in the tab specific callback
+    private void stopOrRefresh() {
+        if (mInLoad) {
+            mBrowserActivity.stopLoading();
+        } else {
+            mBrowserActivity.getTopWindow().reload();
+        }
     }
 
     /**
      * Update the progress, from 0 to 100.
      */
     @Override
-    /* package */ void setProgress(int newProgress) {
-        // this is handled in tab specific callback
+    void setProgress(int newProgress) {
+        if (newProgress >= PROGRESS_MAX) {
+            mProgressView.setVisibility(View.GONE);
+            mInLoad = false;
+            mStopButton.setImageDrawable(mReloadDrawable);
+        } else {
+            if (!mInLoad) {
+                mProgressView.setVisibility(View.VISIBLE);
+                mInLoad = true;
+                mStopButton.setImageDrawable(mStopDrawable);
+            }
+            mProgressDrawable.setLevel(newProgress*10000/PROGRESS_MAX);
+        }
     }
 
     @Override
     /* package */ void setDisplayTitle(String title) {
-        // this is done in tab specific callback
-    }
-
-    private void buildTabs(boolean needsRebuilding) {
-        mTabs.clearTabs();
-        for (int i = 0; i < mControl.getTabCount(); i++) {
-            Tab tab = mControl.getTab(i);
-            TabViewData data = buildTab(needsRebuilding, tab);
-            TabView tv = buildView(data);
-        }
-        mTabs.setSelectedTab(mControl.getCurrentIndex());
-    }
-
-    private TabViewData buildTab(boolean needsRebuilding, Tab tab) {
-        TabViewData data = null;
-        if (needsRebuilding) {
-            data = new TabViewData(tab);
-            mTabMap.put(tab, data);
-        } else {
-            data = mTabMap.get(tab);
-        }
-        return data;
-    }
-
-    private TabView buildView(final TabViewData data) {
-        TabView tv = new TabView(mBrowserActivity, data);
-        tv.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (mTabs.getSelectedTab() == v) {
-                    showUrlEditor(data);
-                } else {
-                    int ix = mControl.getTabIndex(data.mTab);
-                    mTabs.setSelectedTab(ix);
-                    mBrowserActivity.switchToTab(ix);
-                }
-            }
-        });
-        mTabs.addTab(tv);
-        return tv;
-    }
-
-    /**
-     * the views used in the tab bar
-     */
-    class TabView extends LinearLayout {
-
-        TabViewData          mTabData;
-        View                 mTabContent;
-        TextView             mTitle;
-        ImageView            mIconView;
-        ImageView            mLock;
-        CircularProgressView mStop;
-        ImageView            mClose;
-        boolean              mSelected;
-        boolean              mInLoad;
-
-        /**
-         * @param context
-         */
-        public TabView(Context context, TabViewData tab) {
-            super(context);
-            mTabData = tab;
-            LayoutInflater inflater = LayoutInflater.from(mContext);
-            mTabContent = inflater.inflate(R.layout.tab_title, this);
-            mTitle = (TextView) mTabContent.findViewById(R.id.title);
-            mIconView = (ImageView) mTabContent.findViewById(R.id.favicon);
-            mLock = (ImageView) mTabContent.findViewById(R.id.lock);
-            mStop = (CircularProgressView) mTabContent.findViewById(R.id.stop);
-            mStop.setMaxProgress(PROGRESS_MAX);
-            mClose = (ImageView) mTabContent.findViewById(R.id.close);
-            mClose.setOnClickListener(new OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    closeTab();
-                }
-            });
-            mStop.setOnClickListener(new OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    if (mInLoad) {
-                        mBrowserActivity.stopLoading();
-                    } else {
-                        mBrowserActivity.getTopWindow().reload();
-                    }
-                }
-            });
-            mSelected = false;
-            mInLoad = false;
-            // update the status
-            updateFromData();
-        }
-
-        private void updateFromData() {
-            mTabData.mTabView = this;
-            if (mTabData.mUrl != null) {
-                setDisplayTitle(mTabData.mUrl);
-            }
-            if (mTabData.mTitle != null) {
-                setDisplayTitle(mTabData.mTitle);
-            }
-            setProgress(mTabData.mProgress);
-            if (mTabData.mIcon != null) {
-                setFavicon(mTabData.mIcon);
-            }
-            if (mTabData.mLock != null) {
-                setLock(mTabData.mLock);
-            }
-        }
-
-        @Override
-        public void setSelected(boolean selected) {
-            mSelected = selected;
-            mStop.setVisibility(mSelected ? View.VISIBLE : View.GONE);
-            mIconView.setVisibility(mSelected ? View.VISIBLE : View.GONE);
-            super.setSelected(selected);
-            setBackgroundDrawable(selected ? mSelectedBackground
-                    : mUnselectedBackground);
-            setLayoutParams(new LayoutParams(selected ?
-                    (int) (TAB_WIDTH_SELECTED * mDensityScale)
-                    : (int) (TAB_WIDTH_UNSELECTED * mDensityScale),
-                    LayoutParams.WRAP_CONTENT));
-        }
-
-        void setDisplayTitle(String title) {
-            mTitle.setText(title);
-        }
-
-        void setFavicon(Drawable d) {
-            mIconView.setImageDrawable(d);
-        }
-
-        void setLock(Drawable d) {
-            if (null == d) {
-                mLock.setVisibility(View.GONE);
-            } else {
-                mLock.setImageDrawable(d);
-                mLock.setVisibility(View.VISIBLE);
-            }
-        }
-
-        void setTitleCompoundDrawables(Drawable left, Drawable top,
-                                              Drawable right, Drawable bottom) {
-            mTitle.setCompoundDrawables(left, top, right, bottom);
-        }
-
-        void setProgress(int newProgress) {
-            mStop.setProgress(newProgress);
-            if (newProgress >= PROGRESS_MAX) {
-                mInLoad = false;
-                mStop.setImageDrawable(mReloadDrawable);
-            } else {
-                if (!mInLoad && getWindowToken() != null) {
-                    // checking the window token lets us be sure that we
-                    // are attached to a window before starting the animation,
-                    // preventing a potential race condition
-                    // (fix for bug http://b/2115736)
-                    mInLoad = true;
-                    mStop.setImageDrawable(mStopDrawable);
-                }
-            }
-        }
-
-        private void closeTab() {
-            if (mTabData.mTab == mControl.getCurrentTab()) {
-                mBrowserActivity.closeCurrentWindow();
-            } else {
-                mBrowserActivity.closeTab(mTabData.mTab);
-            }
-        }
-
-    }
-
-    /**
-     * class to store tab state within the title bar
-     */
-    class TabViewData {
-
-        Tab mTab;
-        TabView mTabView;
-        int mProgress;
-        Drawable mIcon;
-        Drawable mLock;
-        String mTitle;
-        String mUrl;
-
-        TabViewData(Tab tab) {
-            mTab = tab;
-        }
-
-        void setUrlAndTitle(String url, String title) {
-            mUrl = url;
-            mTitle = title;
-            if (mTabView != null) {
-                if (title != null) {
-                    mTabView.setDisplayTitle(title);
-                } else if (url != null) {
-                    mTabView.setDisplayTitle(url);
-                }
-            }
-        }
-
-        void setProgress(int newProgress) {
-            mProgress = newProgress;
-            if (mTabView != null) {
-                mTabView.setProgress(mProgress);
-            }
-        }
-
-        void setFavicon(Bitmap icon) {
-            Drawable[] array = new Drawable[3];
-            array[0] = new PaintDrawable(Color.BLACK);
-            array[1] = new PaintDrawable(Color.WHITE);
-            if (icon == null) {
-                array[2] = mGenericFavicon;
-            } else {
-                array[2] = new BitmapDrawable(icon);
-            }
-            LayerDrawable d = new LayerDrawable(array);
-            d.setLayerInset(1, 1, 1, 1, 1);
-            d.setLayerInset(2, 2, 2, 2, 2);
-            mIcon = d;
-            if (mTabView != null) {
-                mTabView.setFavicon(mIcon);
-            }
-        }
-
-    }
-
-    // TabChangeListener implementation
-
-    @Override
-    public void onCurrentTab(Tab tab) {
-        mTabs.setSelectedTab(mControl.getCurrentIndex());
-        TabViewData tvd = mTabMap.get(tab);
-        if (tvd != null) {
-            if (tvd.mUrl != null) {
-                mUrlView.setText(tvd.mUrl);
-            }
-            setProgress(tvd.mProgress);
-        }
-    }
-
-    @Override
-    public void onFavicon(Tab tab, Bitmap favicon) {
-        TabViewData tvd = mTabMap.get(tab);
-        if (tvd != null) {
-            tvd.setFavicon(favicon);
-        }
-    }
-
-    @Override
-    public void onNewTab(Tab tab) {
-        TabViewData tvd = buildTab(true, tab);
-        buildView(tvd);
-    }
-
-    @Override
-    public void onProgress(Tab tab, int progress) {
-        TabViewData tvd = mTabMap.get(tab);
-        if (tvd != null) {
-            tvd.setProgress(progress);
-        }
-        if (tab == mControl.getCurrentTab()) {
-            setProgress(progress);
-        }
-    }
-
-    @Override
-    public void onRemoveTab(Tab tab) {
-        TabViewData tvd = mTabMap.get(tab);
-        TabView tv = tvd.mTabView;
-        if (tv != null) {
-            mTabs.removeTab(tv);
-        }
-        mTabMap.remove(tab);
-    }
-
-    @Override
-    public void onUrlAndTitle(Tab tab, String url, String title) {
-        TabViewData tvd = mTabMap.get(tab);
-        if (tvd != null) {
-            tvd.setUrlAndTitle(url, title);
-        }
-        if ((url != null) && (tab == mControl.getCurrentTab())) {
-            mUrlView.setText(url);
-        }
-    }
-
-    @Override
-    public void onPageFinished(Tab tab) {
-    }
-
-    @Override
-    public void onPageStarted(Tab tab) {
+        mUrlView.setText(title);
     }
 
 }