summaryrefslogtreecommitdiffstats
path: root/src/com/android/browser/NavTabScroller.java
diff options
context:
space:
mode:
authorMichael Kolb <kolby@google.com>2011-05-19 15:49:41 -0700
committerMichael Kolb <kolby@google.com>2011-05-25 15:17:50 -0700
commit2814a362c21ac219410d9b54e1bd3e8152b845c7 (patch)
treee151c7b93ebd686c6136d1a630410ecc4cd445d9 /src/com/android/browser/NavTabScroller.java
parent45377778b556064718b61c9495ae5bdc900fd996 (diff)
downloadpackages_apps_browser-2814a362c21ac219410d9b54e1bd3e8152b845c7.zip
packages_apps_browser-2814a362c21ac219410d9b54e1bd3e8152b845c7.tar.gz
packages_apps_browser-2814a362c21ac219410d9b54e1bd3e8152b845c7.tar.bz2
new iteration of the navigation UI
use live webviews Change-Id: Ie787c76470e445548d358374f83f33a1b0b0b5cf
Diffstat (limited to 'src/com/android/browser/NavTabScroller.java')
-rw-r--r--src/com/android/browser/NavTabScroller.java186
1 files changed, 186 insertions, 0 deletions
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);
+ }
+
+}