new iteration of the navigation UI

    use live webviews

Change-Id: Ie787c76470e445548d358374f83f33a1b0b0b5cf
diff --git a/src/com/android/browser/NavTabScroller.java b/src/com/android/browser/NavTabScroller.java
new file mode 100644
index 0000000..dc5627a
--- /dev/null
+++ b/src/com/android/browser/NavTabScroller.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.browser;
+
+import com.android.browser.view.HorizontalScrollView;
+
+import android.content.Context;
+import android.database.DataSetObserver;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.LinearLayout;
+
+/**
+ * custom view for displaying tabs in the nav screen
+ */
+public class NavTabScroller extends HorizontalScrollView {
+
+    private static final float DEFAULT_ALPHA = 0.5f;
+
+    private LinearLayout mContentView;
+    private int mSelected;
+    private BaseAdapter mAdapter;
+    private boolean mSnapScroll;
+
+    public NavTabScroller(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        init(context);
+    }
+
+    public NavTabScroller(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(context);
+    }
+
+    public NavTabScroller(Context context) {
+        super(context);
+        init(context);
+    }
+
+    private void init(Context ctx) {
+        setHorizontalScrollBarEnabled(false);
+        mContentView = new LinearLayout(ctx);
+        mContentView.setOrientation(LinearLayout.HORIZONTAL);
+        int pad = ctx.getResources().getDimensionPixelSize(R.dimen.nav_scroller_padding);
+        mContentView.setPadding(pad, 0, pad, 0);
+        mContentView.setLayoutParams(
+                new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
+        addView(mContentView);
+        mSelected = -1;
+    }
+
+    protected void setAdapter(BaseAdapter adapter) {
+        mAdapter = adapter;
+        mAdapter.registerDataSetObserver(new DataSetObserver() {
+
+            @Override
+            public void onChanged() {
+                super.onChanged();
+                populateList();
+            }
+
+            @Override
+            public void onInvalidated() {
+                super.onInvalidated();
+            }
+        });
+        populateList();
+    }
+
+    protected void setSelection(int ix) {
+        mSelected = ix;
+        updateViewAlpha();
+    }
+
+    private void updateViewAlpha() {
+        final int n = mContentView.getChildCount();
+        for (int i = 0; i < n; i ++) {
+            View v = mContentView.getChildAt(i);
+            v.setAlpha((i == mSelected) ? 1.0f : DEFAULT_ALPHA);
+        }
+    }
+
+    protected int getSelectionIndex() {
+        return mSelected;
+    }
+
+    protected Tab getSelectedItem() {
+        return (Tab) mAdapter.getItem(mSelected);
+    }
+
+    protected ViewGroup getContentView() {
+        return mContentView;
+    }
+
+    private void populateList() {
+        clearTabs();
+        for (int i = 0; i < mAdapter.getCount(); i++) {
+            View v = mAdapter.getView(i, null, mContentView);
+            mContentView.addView(v);
+            v.setAlpha((i == mSelected) ? 1.0f : DEFAULT_ALPHA);
+        }
+    }
+
+    View getSelectedTab() {
+        if ((mSelected >= 0) && (mSelected < mContentView.getChildCount())) {
+            return mContentView.getChildAt(mSelected);
+        } else {
+            return null;
+        }
+    }
+
+    void clearTabs() {
+        for (int i = 0; i < mContentView.getChildCount(); i++) {
+            ViewGroup vg = (ViewGroup) mContentView.getChildAt(i);
+            vg.removeViewAt(0);
+        }
+        mContentView.removeAllViews();
+    }
+
+    protected void onScrollChanged(int sl, int st, int ol, int ot) {
+        int midx = getScrollX() + getWidth() / 2;
+        int sel = -1;
+        for (int i = 0; i < mContentView.getChildCount(); i++) {
+            View child = mContentView.getChildAt(i);
+            if (child.getLeft() < midx && child.getRight() > midx) {
+                sel = i;
+                break;
+            }
+        }
+        if (sel != -1 && sel != mSelected) {
+            setSelection(sel);
+        }
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent evt) {
+        boolean dragged = mIsBeingDragged;
+        boolean result = super.onTouchEvent(evt);
+        if (MotionEvent.ACTION_UP == evt.getActionMasked()) {
+            if (mScroller.isFinished() && dragged) {
+                snapToSelected();
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public void computeScroll() {
+        super.computeScroll();
+        if (mScroller.isFinished() && !mIsBeingDragged) {
+            if (!mSnapScroll) {
+                snapToSelected();
+            } else {
+                // reset snap scrolling flag
+                mSnapScroll = false;
+            }
+        }
+    }
+
+    private void snapToSelected() {
+        // snap to selected
+        mSnapScroll = true;
+        View v = mContentView.getChildAt(mSelected);
+        int left = (v.getLeft() + v.getRight()) / 2;
+        left -= getWidth() / 2;
+        scrollTo(left,0);
+    }
+
+}