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