TitleBar.java revision d51bb570d4806d9e6b3c997bb0868d094f481bf2
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;
230f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.content.res.Resources;
240f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.view.Gravity;
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.AbsoluteLayout;
350f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.widget.FrameLayout;
360f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.widget.RelativeLayout;
370f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
380f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
390f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck/**
400f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck * Base class for a title bar used by the browser.
410f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck */
420f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckpublic class TitleBar extends RelativeLayout {
430f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
440f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private static final int PROGRESS_MAX = 100;
450f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private static final float ANIM_TITLEBAR_DECELERATE = 2.5f;
460f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
470f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private UiController mUiController;
480f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private BaseUi mBaseUi;
490f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private FrameLayout mParent;
500f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private PageProgressView mProgress;
510f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
520f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private AutologinBar mAutoLogin;
530f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private NavigationBarBase mNavBar;
540f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private boolean mUseQuickControls;
55ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    private SnapshotBar mSnapshotBar;
560f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
570f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    //state
580f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private boolean mShowing;
590f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private boolean mInLoad;
600f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private boolean mSkipTitleBarAnimations;
610f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private Animator mTitleBarAnimator;
620f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
630f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public TitleBar(Context context, UiController controller, BaseUi ui,
640f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            FrameLayout parent) {
650f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        super(context, null);
660f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mUiController = controller;
670f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mBaseUi = ui;
680f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mParent = parent;
690f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        initLayout(context);
700f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
710f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
720f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private void initLayout(Context context) {
730f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        LayoutInflater factory = LayoutInflater.from(context);
740f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        factory.inflate(R.layout.title_bar, this);
750f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mProgress = (PageProgressView) findViewById(R.id.progress);
760f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mNavBar = (NavigationBarBase) findViewById(R.id.taburlbar);
770f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mNavBar.setTitleBar(this);
78d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch    }
79d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
80d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch    private void inflateAutoLoginBar() {
81d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mAutoLogin != null) {
82d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            return;
83d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
84d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
85d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        ViewStub stub = (ViewStub) findViewById(R.id.autologin_stub);
86d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        mAutoLogin = (AutologinBar) stub.inflate();
87d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        mAutoLogin.setTitleBar(this);
88d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch    }
89d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
90d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch    private void inflateSnapshotBar() {
91d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mSnapshotBar != null) {
92d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            return;
93d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
94d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
95d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        ViewStub stub = (ViewStub) findViewById(R.id.snapshotbar_stub);
96d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        mSnapshotBar = (SnapshotBar) stub.inflate();
97ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        mSnapshotBar.setTitleBar(this);
980f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
990f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1000f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public BaseUi getUi() {
1010f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mBaseUi;
1020f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1030f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1040f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public UiController getUiController() {
1050f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mUiController;
1060f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1070f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1080f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void setUseQuickControls(boolean use) {
1090f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mUseQuickControls = use;
1100f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        setLayoutParams(makeLayoutParams());
1110f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1120f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1130f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void setShowProgressOnly(boolean progress) {
114ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        if (progress && !wantsToBeVisible()) {
1150f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mNavBar.setVisibility(View.GONE);
1160f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
1170f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mNavBar.setVisibility(View.VISIBLE);
1180f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
1190f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1200f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1210f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void setSkipTitleBarAnimations(boolean skip) {
1220f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mSkipTitleBarAnimations = skip;
1230f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1240f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1250f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void setupTitleBarAnimator(Animator animator) {
1260f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        Resources res = mContext.getResources();
1270f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        int duration = res.getInteger(R.integer.titlebar_animation_duration);
1280f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        animator.setInterpolator(new DecelerateInterpolator(
1290f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                ANIM_TITLEBAR_DECELERATE));
1300f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        animator.setDuration(duration);
1310f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1320f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1330f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void show() {
1340f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mUseQuickControls) {
1350f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mParent.addView(this);
1360f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
1370f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (!mSkipTitleBarAnimations) {
1380f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                cancelTitleBarAnimation(false);
1390f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                int visibleHeight = getVisibleTitleHeight();
1400f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                float startPos = (-getEmbeddedHeight() + visibleHeight);
1410f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                if (getTranslationY() != 0) {
1420f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    startPos = Math.max(startPos, getTranslationY());
1430f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                }
1440f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mTitleBarAnimator = ObjectAnimator.ofFloat(this,
1450f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        "translationY",
1460f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        startPos, 0);
1470f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                setupTitleBarAnimator(mTitleBarAnimator);
1480f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mTitleBarAnimator.start();
1490f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
1500f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mBaseUi.setTitleGravity(Gravity.TOP);
1510f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
1520f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mShowing = true;
1530f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1540f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1550f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void hide() {
1560f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mUseQuickControls) {
1570f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mParent.removeView(this);
1580f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
1590f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (!mSkipTitleBarAnimations) {
1600f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                cancelTitleBarAnimation(false);
1610f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                int visibleHeight = getVisibleTitleHeight();
1620f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mTitleBarAnimator = ObjectAnimator.ofFloat(this,
1630f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        "translationY", getTranslationY(),
1640f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        (-getEmbeddedHeight() + visibleHeight));
1650f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mTitleBarAnimator.addListener(mHideTileBarAnimatorListener);
1660f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                setupTitleBarAnimator(mTitleBarAnimator);
1670f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mTitleBarAnimator.start();
1680f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            } else {
1690f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mBaseUi.setTitleGravity(Gravity.NO_GRAVITY);
1700f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
1710f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
1720f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mShowing = false;
1730f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1740f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1750f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    boolean isShowing() {
1760f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mShowing;
1770f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1780f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1790f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void cancelTitleBarAnimation(boolean reset) {
1800f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mTitleBarAnimator != null) {
1810f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mTitleBarAnimator.cancel();
1820f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mTitleBarAnimator = null;
1830f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
1840f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (reset) {
1850f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            setTranslationY(0);
1860f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
1870f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1880f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1890f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private AnimatorListener mHideTileBarAnimatorListener = new AnimatorListener() {
1900f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1910f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        boolean mWasCanceled;
1920f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        @Override
1930f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        public void onAnimationStart(Animator animation) {
1940f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mWasCanceled = false;
1950f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
1960f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1970f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        @Override
1980f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        public void onAnimationRepeat(Animator animation) {
1990f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2000f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2010f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        @Override
2020f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        public void onAnimationEnd(Animator animation) {
2030f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (!mWasCanceled) {
2040f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                setTranslationY(0);
2050f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
2060f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mBaseUi.setTitleGravity(Gravity.NO_GRAVITY);
2070f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2080f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2090f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        @Override
2100f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        public void onAnimationCancel(Animator animation) {
2110f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mWasCanceled = true;
2120f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2130f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    };
2140f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2150f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private int getVisibleTitleHeight() {
2160f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        Tab tab = mBaseUi.getActiveTab();
2170f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        WebView webview = tab != null ? tab.getWebView() : null;
2180f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return webview != null ? webview.getVisibleTitleHeight() : 0;
2190f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2200f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2210f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    /**
2220f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck     * Update the progress, from 0 to 100.
2230f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck     */
2240f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void setProgress(int newProgress) {
2250f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (newProgress >= PROGRESS_MAX) {
2260f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mProgress.setProgress(PageProgressView.MAX_PROGRESS);
2270f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mProgress.setVisibility(View.GONE);
2280f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mInLoad = false;
2290f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mNavBar.onProgressStopped();
2300f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            // check if needs to be hidden
231ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck            if (!isEditingUrl() && !wantsToBeVisible()) {
2320f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                hide();
2330f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                if (mUseQuickControls) {
2340f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    setShowProgressOnly(false);
2350f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                }
2360f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
2370f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
2380f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (!mInLoad) {
2390f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mProgress.setVisibility(View.VISIBLE);
2400f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mInLoad = true;
2410f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mNavBar.onProgressStarted();
2420f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
2430f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mProgress.setProgress(newProgress * PageProgressView.MAX_PROGRESS
2440f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    / PROGRESS_MAX);
2450f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (!mShowing) {
2460f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                if (mUseQuickControls && !isEditingUrl()) {
2470f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    setShowProgressOnly(true);
2480f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                }
2490f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                show();
2500f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
2510f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2520f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2530f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2540f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public int getEmbeddedHeight() {
2550f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        int height = mNavBar.getHeight();
256d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mAutoLogin != null && mAutoLogin.getVisibility() == View.VISIBLE) {
2570f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            height += mAutoLogin.getHeight();
2580f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2590f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return height;
2600f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2610f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2620f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void updateAutoLogin(Tab tab, boolean animate) {
263d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mAutoLogin == null) {
264d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            if  (tab.getDeviceAccountLogin() == null) {
265d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch                return;
266d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            }
267d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            inflateAutoLoginBar();
268d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
2690f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mAutoLogin.updateAutoLogin(tab, animate);
2700f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2710f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2720f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void showAutoLogin(boolean animate) {
2730f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mUseQuickControls) {
2740f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mBaseUi.showTitleBar();
2750f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
276d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mAutoLogin == null) {
277d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            inflateAutoLoginBar();
278d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
2790f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mAutoLogin.setVisibility(View.VISIBLE);
2800f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (animate) {
2810f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mAutoLogin.startAnimation(AnimationUtils.loadAnimation(
2820f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    getContext(), R.anim.autologin_enter));
2830f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2840f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2850f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2860f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void hideAutoLogin(boolean animate) {
2870f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mUseQuickControls) {
2880f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mBaseUi.hideTitleBar();
2890f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mAutoLogin.setVisibility(View.GONE);
2900f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mBaseUi.refreshWebView();
2910f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
2920f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (animate) {
2930f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                Animation anim = AnimationUtils.loadAnimation(getContext(),
2940f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        R.anim.autologin_exit);
2950f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                anim.setAnimationListener(new AnimationListener() {
2960f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    @Override
2970f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    public void onAnimationEnd(Animation a) {
2980f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        mAutoLogin.setVisibility(View.GONE);
2990f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        mBaseUi.refreshWebView();
3000f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    }
3010f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3020f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    @Override
3030f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    public void onAnimationStart(Animation a) {
3040f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    }
3050f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3060f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    @Override
3070f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    public void onAnimationRepeat(Animation a) {
3080f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    }
3090f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                });
3100f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mAutoLogin.startAnimation(anim);
3110f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            } else if (mAutoLogin.getAnimation() == null) {
3120f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mAutoLogin.setVisibility(View.GONE);
3130f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mBaseUi.refreshWebView();
3140f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
3150f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
3160f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3170f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
318ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    public boolean wantsToBeVisible() {
319ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        return inAutoLogin()
320d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            || (mSnapshotBar != null && mSnapshotBar.getVisibility() == View.VISIBLE
321ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck                    && mSnapshotBar.isAnimating());
322ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    }
323ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck
324ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    private boolean inAutoLogin() {
325d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        return mAutoLogin != null && mAutoLogin.getVisibility() == View.VISIBLE;
3260f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3270f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3280f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public boolean isEditingUrl() {
3290f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mNavBar.isEditingUrl();
3300f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3310f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3320f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public WebView getCurrentWebView() {
3330f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        Tab t = mBaseUi.getActiveTab();
3340f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (t != null) {
3350f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            return t.getWebView();
3360f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
3370f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            return null;
3380f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
3390f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3400f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3410f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public PageProgressView getProgressView() {
3420f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mProgress;
3430f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3440f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3450f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public NavigationBarBase getNavigationBar() {
3460f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mNavBar;
3470f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3480f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3490f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public boolean useQuickControls() {
3500f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mUseQuickControls;
3510f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3520f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3530f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public boolean isInLoad() {
3540f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mInLoad;
3550f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3560f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3570f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private ViewGroup.LayoutParams makeLayoutParams() {
3580f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mUseQuickControls) {
3590f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            return new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
3600f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    LayoutParams.WRAP_CONTENT);
3610f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
3620f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            return new AbsoluteLayout.LayoutParams(
3630f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,
3640f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    0, 0);
3650f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
3660f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3670f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3680f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    @Override
3690f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public View focusSearch(View focused, int dir) {
3700f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (FOCUS_DOWN == dir && hasFocus()) {
3710f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            return getCurrentWebView();
3720f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
3730f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return super.focusSearch(focused, dir);
3740f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3750f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
376ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    public void onTabDataChanged(Tab tab) {
377d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mSnapshotBar != null) {
378d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            mSnapshotBar.onTabDataChanged(tab);
379d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
380d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
381ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        if (tab.isSnapshot()) {
382d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            inflateSnapshotBar();
383ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck            mSnapshotBar.setVisibility(VISIBLE);
384ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck            mNavBar.setVisibility(GONE);
385ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        } else {
386d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            if (mSnapshotBar != null) {
387d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch                mSnapshotBar.setVisibility(GONE);
388d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            }
389ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck            mNavBar.setVisibility(VISIBLE);
390ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        }
391ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    }
392ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck
3930f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck}
394