TitleBar.java revision d70419abc78bbf76f21ea7e85c551d20e9fd1685
10f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck/*
20f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck * Copyright (C) 2010 The Android Open Source Project
30f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck *
40f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck * Licensed under the Apache License, Version 2.0 (the "License");
50f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck * you may not use this file except in compliance with the License.
60f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck * You may obtain a copy of the License at
70f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck *
80f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck *      http://www.apache.org/licenses/LICENSE-2.0
90f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck *
100f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck * Unless required by applicable law or agreed to in writing, software
110f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck * distributed under the License is distributed on an "AS IS" BASIS,
120f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck * See the License for the specific language governing permissions and
140f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck * limitations under the License.
150f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck */
160f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
170f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckpackage com.android.browser;
180f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
190f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.animation.Animator;
200f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.animation.Animator.AnimatorListener;
210f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.animation.ObjectAnimator;
220f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.content.Context;
2357059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolbimport android.content.res.Configuration;
240f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.content.res.Resources;
250f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.view.LayoutInflater;
260f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.view.View;
270f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.view.ViewGroup;
28d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdochimport android.view.ViewStub;
290f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.view.animation.Animation;
300f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.view.animation.Animation.AnimationListener;
310f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.view.animation.AnimationUtils;
320f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.view.animation.DecelerateInterpolator;
330f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.webkit.WebView;
340f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.widget.FrameLayout;
350f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.widget.RelativeLayout;
360f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
370f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
380f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck/**
390f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck * Base class for a title bar used by the browser.
400f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck */
410f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckpublic class TitleBar extends RelativeLayout {
420f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
430f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private static final int PROGRESS_MAX = 100;
440f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private static final float ANIM_TITLEBAR_DECELERATE = 2.5f;
450f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
460f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private UiController mUiController;
470f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private BaseUi mBaseUi;
482711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    private FrameLayout mContentView;
490f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private PageProgressView mProgress;
500f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
510f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private AutologinBar mAutoLogin;
520f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private NavigationBarBase mNavBar;
530f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private boolean mUseQuickControls;
54ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    private SnapshotBar mSnapshotBar;
550f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
560f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    //state
570f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private boolean mShowing;
580f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private boolean mInLoad;
590f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private boolean mSkipTitleBarAnimations;
600f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private Animator mTitleBarAnimator;
612711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    private boolean mIsFixedTitleBar;
620f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
630f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public TitleBar(Context context, UiController controller, BaseUi ui,
642711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            FrameLayout contentView) {
650f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        super(context, null);
660f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mUiController = controller;
670f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mBaseUi = ui;
682711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        mContentView = contentView;
690f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        initLayout(context);
700f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck        setFixedTitleBar();
710f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
720f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
730f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private void initLayout(Context context) {
740f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        LayoutInflater factory = LayoutInflater.from(context);
750f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        factory.inflate(R.layout.title_bar, this);
760f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mProgress = (PageProgressView) findViewById(R.id.progress);
770f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mNavBar = (NavigationBarBase) findViewById(R.id.taburlbar);
780f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mNavBar.setTitleBar(this);
79d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch    }
80d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
81d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch    private void inflateAutoLoginBar() {
82d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mAutoLogin != null) {
83d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            return;
84d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
85d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
86d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        ViewStub stub = (ViewStub) findViewById(R.id.autologin_stub);
87d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        mAutoLogin = (AutologinBar) stub.inflate();
88d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        mAutoLogin.setTitleBar(this);
89d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch    }
90d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
91d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch    private void inflateSnapshotBar() {
92d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mSnapshotBar != null) {
93d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            return;
94d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
95d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
96d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        ViewStub stub = (ViewStub) findViewById(R.id.snapshotbar_stub);
97d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        mSnapshotBar = (SnapshotBar) stub.inflate();
98ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        mSnapshotBar.setTitleBar(this);
990f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1000f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
10157059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolb    @Override
10257059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolb    protected void onConfigurationChanged(Configuration config) {
10357059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolb        super.onConfigurationChanged(config);
1040f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck        setFixedTitleBar();
1052711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    }
1062711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck
1072711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    @Override
1082711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
1092711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
1102711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (mIsFixedTitleBar) {
1112711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            int margin = getMeasuredHeight() - calculateEmbeddedHeight();
1122711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            mBaseUi.setContentViewMarginTop(-margin);
1130f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck        } else {
1140f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck            mBaseUi.setContentViewMarginTop(0);
1152711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        }
1162711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    }
1172711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck
1180f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck    private void setFixedTitleBar() {
1190f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck        boolean isFixed = !mUseQuickControls
1200f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck                && !mContext.getResources().getBoolean(R.bool.hide_title);
1212711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        // If getParent() returns null, we are initializing
1222711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        ViewGroup parent = (ViewGroup)getParent();
1232711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (mIsFixedTitleBar == isFixed && parent != null) return;
1242711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        mIsFixedTitleBar = isFixed;
1252711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        setSkipTitleBarAnimations(true);
1262711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        show();
1272711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        setSkipTitleBarAnimations(false);
1282711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (parent != null) {
1292711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            parent.removeView(this);
1302711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        }
1312711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (mIsFixedTitleBar) {
1322711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            mBaseUi.addFixedTitleBar(this);
1332711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        } else {
1342711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            mContentView.addView(this, makeLayoutParams());
1352711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            mBaseUi.setContentViewMarginTop(0);
13657059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolb        }
13757059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolb    }
13857059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolb
1390f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public BaseUi getUi() {
1400f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mBaseUi;
1410f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1420f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1430f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public UiController getUiController() {
1440f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mUiController;
1450f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1460f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1470f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void setUseQuickControls(boolean use) {
1480f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mUseQuickControls = use;
1490f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck        setFixedTitleBar();
1504923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb        if (use) {
1514923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            this.setVisibility(View.GONE);
1524923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb        } else {
1534923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            this.setVisibility(View.VISIBLE);
1544923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb        }
1550f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1560f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1570f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void setShowProgressOnly(boolean progress) {
158ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        if (progress && !wantsToBeVisible()) {
1590f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mNavBar.setVisibility(View.GONE);
1600f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
1610f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mNavBar.setVisibility(View.VISIBLE);
1620f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
1630f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1640f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1650f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void setSkipTitleBarAnimations(boolean skip) {
1660f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mSkipTitleBarAnimations = skip;
1670f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1680f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1690f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void setupTitleBarAnimator(Animator animator) {
1700f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        Resources res = mContext.getResources();
1710f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        int duration = res.getInteger(R.integer.titlebar_animation_duration);
1720f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        animator.setInterpolator(new DecelerateInterpolator(
1730f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                ANIM_TITLEBAR_DECELERATE));
1740f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        animator.setDuration(duration);
1750f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1760f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1770f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void show() {
1782711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        cancelTitleBarAnimation(false);
1792711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (mUseQuickControls || mSkipTitleBarAnimations) {
1804923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            this.setVisibility(View.VISIBLE);
1814923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            this.setTranslationY(0);
1820f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
1832711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            int visibleHeight = getVisibleTitleHeight();
1842711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            float startPos = (-getEmbeddedHeight() + visibleHeight);
1852711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            if (getTranslationY() != 0) {
1862711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck                startPos = Math.max(startPos, getTranslationY());
1870f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
1882711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            mTitleBarAnimator = ObjectAnimator.ofFloat(this,
1892711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck                    "translationY",
1902711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck                    startPos, 0);
1912711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            setupTitleBarAnimator(mTitleBarAnimator);
1922711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            mTitleBarAnimator.start();
1930f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
1940f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mShowing = true;
1950f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1960f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1970f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void hide() {
1980f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mUseQuickControls) {
1994923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            this.setVisibility(View.GONE);
2000f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
2012711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            if (mIsFixedTitleBar) return;
2020f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (!mSkipTitleBarAnimations) {
2030f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                cancelTitleBarAnimation(false);
2040f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                int visibleHeight = getVisibleTitleHeight();
2050f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mTitleBarAnimator = ObjectAnimator.ofFloat(this,
2060f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        "translationY", getTranslationY(),
2070f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        (-getEmbeddedHeight() + visibleHeight));
2080f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mTitleBarAnimator.addListener(mHideTileBarAnimatorListener);
2090f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                setupTitleBarAnimator(mTitleBarAnimator);
2100f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mTitleBarAnimator.start();
2110f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            } else {
2124923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb                onScrollChanged();
2130f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
2140f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2150f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mShowing = false;
2160f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2170f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2180f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    boolean isShowing() {
2190f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mShowing;
2200f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2210f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2220f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void cancelTitleBarAnimation(boolean reset) {
2230f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mTitleBarAnimator != null) {
2240f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mTitleBarAnimator.cancel();
2250f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mTitleBarAnimator = null;
2260f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2270f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (reset) {
2280f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            setTranslationY(0);
2290f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2300f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2310f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2320f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private AnimatorListener mHideTileBarAnimatorListener = new AnimatorListener() {
2330f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2340f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        @Override
2350f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        public void onAnimationStart(Animator animation) {
2360f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2370f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2380f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        @Override
2390f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        public void onAnimationRepeat(Animator animation) {
2400f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2410f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2420f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        @Override
2430f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        public void onAnimationEnd(Animator animation) {
2444923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            // update position
2454923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            onScrollChanged();
2460f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2470f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2480f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        @Override
2490f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        public void onAnimationCancel(Animator animation) {
2500f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2510f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    };
2520f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2530f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private int getVisibleTitleHeight() {
2540f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        Tab tab = mBaseUi.getActiveTab();
2550f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        WebView webview = tab != null ? tab.getWebView() : null;
2560f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return webview != null ? webview.getVisibleTitleHeight() : 0;
2570f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2580f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2590f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    /**
2600f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck     * Update the progress, from 0 to 100.
2610f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck     */
2620f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void setProgress(int newProgress) {
2630f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (newProgress >= PROGRESS_MAX) {
2640f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mProgress.setProgress(PageProgressView.MAX_PROGRESS);
2650f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mProgress.setVisibility(View.GONE);
2660f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mInLoad = false;
2670f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mNavBar.onProgressStopped();
2680f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            // check if needs to be hidden
269ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck            if (!isEditingUrl() && !wantsToBeVisible()) {
2700f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                if (mUseQuickControls) {
271e8a823329e004c4261ee5f810e1ca3ebd90914ddMichael Kolb                    hide();
272bc82ec97530f9ee4fc1f33e7d1d6050575c22a21John Reck                } else {
273bc82ec97530f9ee4fc1f33e7d1d6050575c22a21John Reck                    mBaseUi.showTitleBarForDuration();
2740f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                }
2750f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
2760f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
2770f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (!mInLoad) {
2780f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mProgress.setVisibility(View.VISIBLE);
2790f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mInLoad = true;
2800f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mNavBar.onProgressStarted();
2810f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
2820f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mProgress.setProgress(newProgress * PageProgressView.MAX_PROGRESS
2830f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    / PROGRESS_MAX);
284e8a823329e004c4261ee5f810e1ca3ebd90914ddMichael Kolb            if (mUseQuickControls && !isEditingUrl()) {
285e8a823329e004c4261ee5f810e1ca3ebd90914ddMichael Kolb                setShowProgressOnly(true);
286e8a823329e004c4261ee5f810e1ca3ebd90914ddMichael Kolb            }
2870f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (!mShowing) {
2880f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                show();
2890f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
2900f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2910f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2920f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2930f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public int getEmbeddedHeight() {
2942711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (mUseQuickControls || mIsFixedTitleBar) return 0;
2952711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        return calculateEmbeddedHeight();
2962711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    }
2972711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck
2982711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    private int calculateEmbeddedHeight() {
2990f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        int height = mNavBar.getHeight();
300d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mAutoLogin != null && mAutoLogin.getVisibility() == View.VISIBLE) {
3010f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            height += mAutoLogin.getHeight();
3020f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
3030f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return height;
3040f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3050f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3060f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void updateAutoLogin(Tab tab, boolean animate) {
307d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mAutoLogin == null) {
308d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            if  (tab.getDeviceAccountLogin() == null) {
309d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch                return;
310d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            }
311d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            inflateAutoLoginBar();
312d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
3130f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mAutoLogin.updateAutoLogin(tab, animate);
3140f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3150f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3160f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void showAutoLogin(boolean animate) {
3170f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mUseQuickControls) {
3180f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mBaseUi.showTitleBar();
3190f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
320d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mAutoLogin == null) {
321d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            inflateAutoLoginBar();
322d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
3230f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mAutoLogin.setVisibility(View.VISIBLE);
3240f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (animate) {
3250f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mAutoLogin.startAnimation(AnimationUtils.loadAnimation(
3260f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    getContext(), R.anim.autologin_enter));
3270f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
3280f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3290f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3300f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void hideAutoLogin(boolean animate) {
3310f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mUseQuickControls) {
3320f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mBaseUi.hideTitleBar();
3330f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mAutoLogin.setVisibility(View.GONE);
3340f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mBaseUi.refreshWebView();
3350f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
3360f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (animate) {
3370f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                Animation anim = AnimationUtils.loadAnimation(getContext(),
3380f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        R.anim.autologin_exit);
3390f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                anim.setAnimationListener(new AnimationListener() {
3400f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    @Override
3410f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    public void onAnimationEnd(Animation a) {
3420f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        mAutoLogin.setVisibility(View.GONE);
3430f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        mBaseUi.refreshWebView();
3440f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    }
3450f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3460f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    @Override
3470f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    public void onAnimationStart(Animation a) {
3480f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    }
3490f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3500f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    @Override
3510f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    public void onAnimationRepeat(Animation a) {
3520f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    }
3530f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                });
3540f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mAutoLogin.startAnimation(anim);
3550f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            } else if (mAutoLogin.getAnimation() == null) {
3560f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mAutoLogin.setVisibility(View.GONE);
3570f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mBaseUi.refreshWebView();
3580f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
3590f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
3600f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3610f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
362ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    public boolean wantsToBeVisible() {
363ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        return inAutoLogin()
364d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            || (mSnapshotBar != null && mSnapshotBar.getVisibility() == View.VISIBLE
365ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck                    && mSnapshotBar.isAnimating());
366ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    }
367ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck
368ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    private boolean inAutoLogin() {
369d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        return mAutoLogin != null && mAutoLogin.getVisibility() == View.VISIBLE;
3700f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3710f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3720f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public boolean isEditingUrl() {
3730f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mNavBar.isEditingUrl();
3740f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3750f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3760f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public WebView getCurrentWebView() {
3770f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        Tab t = mBaseUi.getActiveTab();
3780f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (t != null) {
3790f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            return t.getWebView();
3800f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
3810f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            return null;
3820f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
3830f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3840f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3850f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public PageProgressView getProgressView() {
3860f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mProgress;
3870f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3880f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3890f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public NavigationBarBase getNavigationBar() {
3900f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mNavBar;
3910f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3920f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3930f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public boolean useQuickControls() {
3940f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mUseQuickControls;
3950f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3960f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3970f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public boolean isInLoad() {
3980f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mInLoad;
3990f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
4000f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
4010f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private ViewGroup.LayoutParams makeLayoutParams() {
4024923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb        return new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
4034923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb                LayoutParams.WRAP_CONTENT);
4040f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
4050f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
4060f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    @Override
4070f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public View focusSearch(View focused, int dir) {
408fcb6095b9140296cf3b5a4af3107500ee943baccJohn Reck        WebView web = getCurrentWebView();
409d70419abc78bbf76f21ea7e85c551d20e9fd1685John Reck        if (FOCUS_DOWN == dir && hasFocus() && web != null
410fcb6095b9140296cf3b5a4af3107500ee943baccJohn Reck                && web.hasFocusable() && web.getParent() != null) {
411fcb6095b9140296cf3b5a4af3107500ee943baccJohn Reck            return web;
4120f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
4130f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return super.focusSearch(focused, dir);
4140f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
4150f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
416ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    public void onTabDataChanged(Tab tab) {
417d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mSnapshotBar != null) {
418d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            mSnapshotBar.onTabDataChanged(tab);
419d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
420d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
421ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        if (tab.isSnapshot()) {
422d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            inflateSnapshotBar();
423ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck            mSnapshotBar.setVisibility(VISIBLE);
424ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck            mNavBar.setVisibility(GONE);
425ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        } else {
426d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            if (mSnapshotBar != null) {
427d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch                mSnapshotBar.setVisibility(GONE);
428d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            }
429ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck            mNavBar.setVisibility(VISIBLE);
430ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        }
431ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    }
432ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck
4334923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb    public void onScrollChanged() {
4342711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (!mShowing && !mIsFixedTitleBar) {
4354923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            setTranslationY(getVisibleTitleHeight() - getEmbeddedHeight());
4364923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb        }
4374923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb    }
4384923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb
4390f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck}
440