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;
291cc1d1d08c50211e4f9f8407978d0435a0110375John Reckimport android.view.accessibility.AccessibilityManager;
300f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.view.animation.Animation;
310f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.view.animation.Animation.AnimationListener;
320f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.view.animation.AnimationUtils;
330f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.view.animation.DecelerateInterpolator;
340f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reckimport android.webkit.WebView;
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;
492711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    private FrameLayout mContentView;
500f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private PageProgressView mProgress;
511cc1d1d08c50211e4f9f8407978d0435a0110375John Reck    private AccessibilityManager mAccessibilityManager;
520f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
530f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private AutologinBar mAutoLogin;
540f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private NavigationBarBase mNavBar;
550f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private boolean mUseQuickControls;
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;
622711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    private boolean mIsFixedTitleBar;
630f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
640f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public TitleBar(Context context, UiController controller, BaseUi ui,
652711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            FrameLayout contentView) {
660f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        super(context, null);
670f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mUiController = controller;
680f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mBaseUi = ui;
692711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        mContentView = contentView;
701cc1d1d08c50211e4f9f8407978d0435a0110375John Reck        mAccessibilityManager = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
710f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        initLayout(context);
720f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck        setFixedTitleBar();
730f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
740f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
750f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private void initLayout(Context context) {
760f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        LayoutInflater factory = LayoutInflater.from(context);
770f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        factory.inflate(R.layout.title_bar, this);
780f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mProgress = (PageProgressView) findViewById(R.id.progress);
790f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mNavBar = (NavigationBarBase) findViewById(R.id.taburlbar);
800f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mNavBar.setTitleBar(this);
81d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch    }
82d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
83d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch    private void inflateAutoLoginBar() {
84d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mAutoLogin != null) {
85d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            return;
86d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
87d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
88d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        ViewStub stub = (ViewStub) findViewById(R.id.autologin_stub);
89d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        mAutoLogin = (AutologinBar) stub.inflate();
90d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        mAutoLogin.setTitleBar(this);
91d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch    }
92d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch
9357059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolb    @Override
9457059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolb    protected void onConfigurationChanged(Configuration config) {
9557059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolb        super.onConfigurationChanged(config);
960f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck        setFixedTitleBar();
972711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    }
982711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck
992711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    @Override
1002711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
1012711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
1022711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (mIsFixedTitleBar) {
1032711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            int margin = getMeasuredHeight() - calculateEmbeddedHeight();
1042711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            mBaseUi.setContentViewMarginTop(-margin);
1050f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck        } else {
1060f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck            mBaseUi.setContentViewMarginTop(0);
1072711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        }
1082711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    }
1092711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck
1100f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck    private void setFixedTitleBar() {
1112711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        // If getParent() returns null, we are initializing
1122711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        ViewGroup parent = (ViewGroup)getParent();
113f9e1705d4012706664a2bdf63a50b8a784b833ddJonathan Dixon        if (mIsFixedTitleBar && parent != null) return;
114f9e1705d4012706664a2bdf63a50b8a784b833ddJonathan Dixon        mIsFixedTitleBar = true;
1152711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        setSkipTitleBarAnimations(true);
1162711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        show();
1172711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        setSkipTitleBarAnimations(false);
1182711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (parent != null) {
1192711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            parent.removeView(this);
1202711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        }
1212711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (mIsFixedTitleBar) {
1222711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            mBaseUi.addFixedTitleBar(this);
1232711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        } else {
1242711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            mContentView.addView(this, makeLayoutParams());
1252711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            mBaseUi.setContentViewMarginTop(0);
12657059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolb        }
12757059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolb    }
12857059a8360e3b9872f4f6cbdaa8b5af4ac1c901dMichael Kolb
1290f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public BaseUi getUi() {
1300f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mBaseUi;
1310f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1320f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1330f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public UiController getUiController() {
1340f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mUiController;
1350f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1360f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1370f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void setUseQuickControls(boolean use) {
1380f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mUseQuickControls = use;
1390f9aaebdf2b1fbf230cf497598c684d7cff66653John Reck        setFixedTitleBar();
1404923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb        if (use) {
1414923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            this.setVisibility(View.GONE);
1424923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb        } else {
1434923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            this.setVisibility(View.VISIBLE);
1444923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb        }
1450f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1460f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1470f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void setShowProgressOnly(boolean progress) {
148ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck        if (progress && !wantsToBeVisible()) {
1490f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mNavBar.setVisibility(View.GONE);
1500f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
1510f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mNavBar.setVisibility(View.VISIBLE);
1520f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
1530f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1540f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1550f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void setSkipTitleBarAnimations(boolean skip) {
1560f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mSkipTitleBarAnimations = skip;
1570f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1580f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1590f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void setupTitleBarAnimator(Animator animator) {
1600f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        Resources res = mContext.getResources();
1610f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        int duration = res.getInteger(R.integer.titlebar_animation_duration);
1620f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        animator.setInterpolator(new DecelerateInterpolator(
1630f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                ANIM_TITLEBAR_DECELERATE));
1640f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        animator.setDuration(duration);
1650f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1660f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1670f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void show() {
1682711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        cancelTitleBarAnimation(false);
1692711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (mUseQuickControls || mSkipTitleBarAnimations) {
1704923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            this.setVisibility(View.VISIBLE);
1714923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            this.setTranslationY(0);
1720f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
1732711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            int visibleHeight = getVisibleTitleHeight();
1742711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            float startPos = (-getEmbeddedHeight() + visibleHeight);
1752711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            if (getTranslationY() != 0) {
1762711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck                startPos = Math.max(startPos, getTranslationY());
1770f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
1782711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            mTitleBarAnimator = ObjectAnimator.ofFloat(this,
1792711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck                    "translationY",
1802711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck                    startPos, 0);
1812711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            setupTitleBarAnimator(mTitleBarAnimator);
1822711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            mTitleBarAnimator.start();
1830f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
1840f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mShowing = true;
1850f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
1860f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
1870f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void hide() {
1880f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mUseQuickControls) {
1894923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            this.setVisibility(View.GONE);
1900f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
1912711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck            if (mIsFixedTitleBar) return;
1920f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (!mSkipTitleBarAnimations) {
1930f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                cancelTitleBarAnimation(false);
1940f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                int visibleHeight = getVisibleTitleHeight();
1950f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mTitleBarAnimator = ObjectAnimator.ofFloat(this,
1960f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        "translationY", getTranslationY(),
1970f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        (-getEmbeddedHeight() + visibleHeight));
1980f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mTitleBarAnimator.addListener(mHideTileBarAnimatorListener);
1990f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                setupTitleBarAnimator(mTitleBarAnimator);
2000f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mTitleBarAnimator.start();
2010f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            } else {
2024923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb                onScrollChanged();
2030f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
2040f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2050f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mShowing = false;
2060f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2070f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2080f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    boolean isShowing() {
2090f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mShowing;
2100f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2110f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2120f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    void cancelTitleBarAnimation(boolean reset) {
2130f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mTitleBarAnimator != null) {
2140f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mTitleBarAnimator.cancel();
2150f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mTitleBarAnimator = null;
2160f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2170f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (reset) {
2180f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            setTranslationY(0);
2190f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2200f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2210f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2220f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private AnimatorListener mHideTileBarAnimatorListener = new AnimatorListener() {
2230f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2240f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        @Override
2250f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        public void onAnimationStart(Animator animation) {
2260f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2270f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2280f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        @Override
2290f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        public void onAnimationRepeat(Animator animation) {
2300f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2310f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2320f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        @Override
2330f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        public void onAnimationEnd(Animator animation) {
2344923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            // update position
2354923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            onScrollChanged();
2360f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2370f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2380f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        @Override
2390f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        public void onAnimationCancel(Animator animation) {
2400f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2410f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    };
2420f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2430f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private int getVisibleTitleHeight() {
2440f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        Tab tab = mBaseUi.getActiveTab();
2450f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        WebView webview = tab != null ? tab.getWebView() : null;
2460f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return webview != null ? webview.getVisibleTitleHeight() : 0;
2470f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2480f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2490f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    /**
2500f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck     * Update the progress, from 0 to 100.
2510f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck     */
2520f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void setProgress(int newProgress) {
2530f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (newProgress >= PROGRESS_MAX) {
2540f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mProgress.setProgress(PageProgressView.MAX_PROGRESS);
2550f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mProgress.setVisibility(View.GONE);
2560f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mInLoad = false;
2570f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mNavBar.onProgressStopped();
2580f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            // check if needs to be hidden
259ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck            if (!isEditingUrl() && !wantsToBeVisible()) {
2600f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                if (mUseQuickControls) {
261e8a823329e004c4261ee5f810e1ca3ebd90914ddMichael Kolb                    hide();
262bc82ec97530f9ee4fc1f33e7d1d6050575c22a21John Reck                } else {
263bc82ec97530f9ee4fc1f33e7d1d6050575c22a21John Reck                    mBaseUi.showTitleBarForDuration();
2640f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                }
2650f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
2660f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
2670f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (!mInLoad) {
2680f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mProgress.setVisibility(View.VISIBLE);
2690f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mInLoad = true;
2700f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mNavBar.onProgressStarted();
2710f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
2720f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mProgress.setProgress(newProgress * PageProgressView.MAX_PROGRESS
2730f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    / PROGRESS_MAX);
274e8a823329e004c4261ee5f810e1ca3ebd90914ddMichael Kolb            if (mUseQuickControls && !isEditingUrl()) {
275e8a823329e004c4261ee5f810e1ca3ebd90914ddMichael Kolb                setShowProgressOnly(true);
276e8a823329e004c4261ee5f810e1ca3ebd90914ddMichael Kolb            }
2770f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (!mShowing) {
2780f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                show();
2790f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
2800f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2810f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2820f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2830f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public int getEmbeddedHeight() {
2842711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (mUseQuickControls || mIsFixedTitleBar) return 0;
2852711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        return calculateEmbeddedHeight();
2862711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    }
2872711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck
2882711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck    private int calculateEmbeddedHeight() {
2890f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        int height = mNavBar.getHeight();
290d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mAutoLogin != null && mAutoLogin.getVisibility() == View.VISIBLE) {
2910f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            height += mAutoLogin.getHeight();
2920f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
2930f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return height;
2940f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
2950f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
2960f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void updateAutoLogin(Tab tab, boolean animate) {
297d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mAutoLogin == null) {
298d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            if  (tab.getDeviceAccountLogin() == null) {
299d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch                return;
300d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            }
301d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            inflateAutoLoginBar();
302d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
3030f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mAutoLogin.updateAutoLogin(tab, animate);
3040f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3050f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3060f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void showAutoLogin(boolean animate) {
3070f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mUseQuickControls) {
3080f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mBaseUi.showTitleBar();
3090f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
310d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        if (mAutoLogin == null) {
311d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch            inflateAutoLoginBar();
312d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        }
3130f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        mAutoLogin.setVisibility(View.VISIBLE);
3140f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (animate) {
3150f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mAutoLogin.startAnimation(AnimationUtils.loadAnimation(
3160f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    getContext(), R.anim.autologin_enter));
3170f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
3180f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3190f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3200f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public void hideAutoLogin(boolean animate) {
3210f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (mUseQuickControls) {
3220f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mBaseUi.hideTitleBar();
3230f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mAutoLogin.setVisibility(View.GONE);
3240f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            mBaseUi.refreshWebView();
3250f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
3260f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            if (animate) {
3270f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                Animation anim = AnimationUtils.loadAnimation(getContext(),
3280f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        R.anim.autologin_exit);
3290f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                anim.setAnimationListener(new AnimationListener() {
3300f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    @Override
3310f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    public void onAnimationEnd(Animation a) {
3320f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        mAutoLogin.setVisibility(View.GONE);
3330f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                        mBaseUi.refreshWebView();
3340f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    }
3350f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3360f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    @Override
3370f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    public void onAnimationStart(Animation a) {
3380f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    }
3390f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3400f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    @Override
3410f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    public void onAnimationRepeat(Animation a) {
3420f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                    }
3430f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                });
3440f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mAutoLogin.startAnimation(anim);
3450f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            } else if (mAutoLogin.getAnimation() == null) {
3460f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mAutoLogin.setVisibility(View.GONE);
3470f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck                mBaseUi.refreshWebView();
3480f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            }
3490f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
3500f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3510f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
352ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    public boolean wantsToBeVisible() {
353f9e1705d4012706664a2bdf63a50b8a784b833ddJonathan Dixon        return inAutoLogin();
354ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    }
355ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck
356ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    private boolean inAutoLogin() {
357d51bb570d4806d9e6b3c997bb0868d094f481bf2Ben Murdoch        return mAutoLogin != null && mAutoLogin.getVisibility() == View.VISIBLE;
3580f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3590f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3600f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public boolean isEditingUrl() {
3610f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mNavBar.isEditingUrl();
3620f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3630f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3640f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public WebView getCurrentWebView() {
3650f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        Tab t = mBaseUi.getActiveTab();
3660f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        if (t != null) {
3670f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            return t.getWebView();
3680f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        } else {
3690f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck            return null;
3700f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
3710f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3720f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3730f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public PageProgressView getProgressView() {
3740f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mProgress;
3750f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3760f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3770f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public NavigationBarBase getNavigationBar() {
3780f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mNavBar;
3790f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3800f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3810f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public boolean useQuickControls() {
3820f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mUseQuickControls;
3830f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3840f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3850f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public boolean isInLoad() {
3860f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return mInLoad;
3870f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3880f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3890f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    private ViewGroup.LayoutParams makeLayoutParams() {
3904923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb        return new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
3914923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb                LayoutParams.WRAP_CONTENT);
3920f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
3930f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
3940f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    @Override
3950f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    public View focusSearch(View focused, int dir) {
396fcb6095b9140296cf3b5a4af3107500ee943baccJohn Reck        WebView web = getCurrentWebView();
397d70419abc78bbf76f21ea7e85c551d20e9fd1685John Reck        if (FOCUS_DOWN == dir && hasFocus() && web != null
398fcb6095b9140296cf3b5a4af3107500ee943baccJohn Reck                && web.hasFocusable() && web.getParent() != null) {
399fcb6095b9140296cf3b5a4af3107500ee943baccJohn Reck            return web;
4000f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        }
4010f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck        return super.focusSearch(focused, dir);
4020f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck    }
4030f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck
404ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    public void onTabDataChanged(Tab tab) {
405f9e1705d4012706664a2bdf63a50b8a784b833ddJonathan Dixon        mNavBar.setVisibility(VISIBLE);
406ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck    }
407ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck
4084923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb    public void onScrollChanged() {
4092711fab2fa2eb798e3aea90368f7ac5af1fbe523John Reck        if (!mShowing && !mIsFixedTitleBar) {
4104923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb            setTranslationY(getVisibleTitleHeight() - getEmbeddedHeight());
4114923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb        }
4124923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb    }
4134923c22cb79296a9624a599cf8874323cdbc6cbcMichael Kolb
4141cc1d1d08c50211e4f9f8407978d0435a0110375John Reck    public void onResume() {
4151cc1d1d08c50211e4f9f8407978d0435a0110375John Reck        setFixedTitleBar();
4161cc1d1d08c50211e4f9f8407978d0435a0110375John Reck    }
4171cc1d1d08c50211e4f9f8407978d0435a0110375John Reck
4180f602f3933dcd88702fdb514b6611e3066ca7a2bJohn Reck}
419