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