1ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck/* 2ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * Copyright (C) 2011 The Android Open Source Project 3ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * 4ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * you may not use this file except in compliance with the License. 6ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * You may obtain a copy of the License at 7ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * 8ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * 10ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * Unless required by applicable law or agreed to in writing, software 11ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * See the License for the specific language governing permissions and 14ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck * limitations under the License. 15ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck */ 16ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckpackage com.android.browser; 17ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 18ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport android.content.Context; 19ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport android.graphics.Bitmap; 20ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport android.os.Handler; 21ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport android.os.Message; 22ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport android.text.TextUtils; 23ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport android.util.AttributeSet; 24f26ff6306dec07a7fa34d0ad5c54b49aec268d18John Reckimport android.view.MenuItem; 25419f6b4136a8fac758e2159f223700b1dfcc20e2John Reckimport android.view.View; 26419f6b4136a8fac758e2159f223700b1dfcc20e2John Reckimport android.view.View.OnClickListener; 27ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport android.view.ViewConfiguration; 28ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport android.view.ViewPropertyAnimator; 29ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport android.widget.ImageView; 30ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport android.widget.LinearLayout; 31f26ff6306dec07a7fa34d0ad5c54b49aec268d18John Reckimport android.widget.PopupMenu.OnMenuItemClickListener; 32ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport android.widget.TextView; 33ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 34315d502edce27bb4e93e53134f1a43b8f5c45588Michael Kolbimport com.android.browser.UI.ComboViews; 35315d502edce27bb4e93e53134f1a43b8f5c45588Michael Kolb 36ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport java.text.DateFormat; 37ef654f1dd80f55609060005342fc4f2cde62990cJohn Reckimport java.util.Date; 38ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 39e1a03a366ff90ebcd8568a86b84a5917610cf512John Reckpublic class SnapshotBar extends LinearLayout implements OnClickListener { 40ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 41ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private static final int MSG_SHOW_TITLE = 1; 42ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private static final long DURATION_SHOW_DATE = BaseUi.HIDE_TITLEBAR_DELAY; 43ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 44ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private ImageView mFavicon; 45ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private TextView mDate; 46ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private TextView mTitle; 47ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private View mBookmarks; 48ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private TitleBar mTitleBar; 49ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private View mTabSwitcher; 50ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private View mOverflowMenu; 51ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private View mToggleContainer; 52ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private boolean mIsAnimating; 53ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private ViewPropertyAnimator mTitleAnimator, mDateAnimator; 54ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private float mAnimRadius = 20f; 55ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 56ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck public SnapshotBar(Context context) { 57ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck super(context); 58ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 59ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 60ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck public SnapshotBar(Context context, AttributeSet attrs) { 61ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck super(context, attrs); 62ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 63ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 64ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck public SnapshotBar(Context context, AttributeSet attrs, int defStyle) { 65ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck super(context, attrs, defStyle); 66ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 67ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 68ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck public void setTitleBar(TitleBar titleBar) { 69ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTitleBar = titleBar; 70ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck setFavicon(null); 71ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 72ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 73ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private Handler mHandler = new Handler() { 74ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck @Override 75ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck public void handleMessage(Message msg) { 76ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (msg.what == MSG_SHOW_TITLE) { 77ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mIsAnimating = false; 78ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck showTitle(); 79ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTitleBar.getUi().showTitleBarForDuration(); 80ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 81ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 82ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck }; 83ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 84ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck @Override 85ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck protected void onFinishInflate() { 86ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck super.onFinishInflate(); 87e1a03a366ff90ebcd8568a86b84a5917610cf512John Reck mFavicon = (ImageView) findViewById(R.id.favicon); 88ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mDate = (TextView) findViewById(R.id.date); 89ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTitle = (TextView) findViewById(R.id.title); 90ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mBookmarks = findViewById(R.id.all_btn); 91ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTabSwitcher = findViewById(R.id.tab_switcher); 92ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mOverflowMenu = findViewById(R.id.more); 93ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mToggleContainer = findViewById(R.id.toggle_container); 94ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 95ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (mBookmarks != null) { 96ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mBookmarks.setOnClickListener(this); 97ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 98ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (mTabSwitcher != null) { 99ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTabSwitcher.setOnClickListener(this); 100ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 101ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (mOverflowMenu != null) { 102ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mOverflowMenu.setOnClickListener(this); 103ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck boolean showMenu = !ViewConfiguration.get(getContext()) 104ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .hasPermanentMenuKey(); 105ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mOverflowMenu.setVisibility(showMenu ? VISIBLE : GONE); 106ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 107ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (mToggleContainer != null) { 108ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mToggleContainer.setOnClickListener(this); 109ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck resetAnimation(); 110ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 111ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 112ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 113ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck @Override 114ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck protected void onLayout(boolean changed, int l, int t, int r, int b) { 115ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck super.onLayout(changed, l, t, r, b); 116ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (mToggleContainer != null) { 117ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mAnimRadius = mToggleContainer.getHeight() / 2f; 118ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 119ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 120ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 121ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck void resetAnimation() { 122ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (mToggleContainer == null) { 123ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck // No animation needed/used 124ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck return; 125ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 126ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (mTitleAnimator != null) { 127ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTitleAnimator.cancel(); 128ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTitleAnimator = null; 129ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 130ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (mDateAnimator != null) { 131ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mDateAnimator.cancel(); 132ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mDateAnimator = null; 133ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 134ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mIsAnimating = false; 135ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mHandler.removeMessages(MSG_SHOW_TITLE); 136ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTitle.setAlpha(1f); 137ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTitle.setTranslationY(0f); 138ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTitle.setRotationX(0f); 139419f6b4136a8fac758e2159f223700b1dfcc20e2John Reck mDate.setAlpha(0f); 140419f6b4136a8fac758e2159f223700b1dfcc20e2John Reck mDate.setTranslationY(-mAnimRadius); 141419f6b4136a8fac758e2159f223700b1dfcc20e2John Reck mDate.setRotationX(90f); 142ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 143ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 144ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private void showDate() { 145ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTitleAnimator = mTitle.animate() 146ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .alpha(0f) 147ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .translationY(mAnimRadius) 148ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .rotationX(-90f); 149419f6b4136a8fac758e2159f223700b1dfcc20e2John Reck mDateAnimator = mDate.animate() 150ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .alpha(1f) 151ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .translationY(0f) 152ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .rotationX(0f); 153ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 154ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 155ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck private void showTitle() { 156ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTitleAnimator = mTitle.animate() 157ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .alpha(1f) 158ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .translationY(0f) 159ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .rotationX(0f); 160419f6b4136a8fac758e2159f223700b1dfcc20e2John Reck mDateAnimator = mDate.animate() 161ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .alpha(0f) 162ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .translationY(-mAnimRadius) 163ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck .rotationX(90f); 164ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 165ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 166ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck @Override 167ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck public void onClick(View v) { 168ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (mBookmarks == v) { 169315d502edce27bb4e93e53134f1a43b8f5c45588Michael Kolb mTitleBar.getUiController().bookmarksOrHistoryPicker(ComboViews.Bookmarks); 170ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } else if (mTabSwitcher == v) { 171a3bc250203a04f7471270724b5db0fc3bf73fdcbJohn Reck ((PhoneUi) mTitleBar.getUi()).toggleNavScreen(); 172ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } else if (mOverflowMenu == v) { 173ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck NavigationBarBase navBar = mTitleBar.getNavigationBar(); 174ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (navBar instanceof NavigationBarPhone) { 175ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck ((NavigationBarPhone)navBar).showMenu(mOverflowMenu); 176ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 177ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } else if (mToggleContainer == v && !mIsAnimating) { 178ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mIsAnimating = true; 179ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck showDate(); 180ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTitleBar.getUi().showTitleBar(); 181ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck Message m = mHandler.obtainMessage(MSG_SHOW_TITLE); 182ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mHandler.sendMessageDelayed(m, DURATION_SHOW_DATE); 183ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 184ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 185ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 186ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck public void onTabDataChanged(Tab tab) { 187ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (!tab.isSnapshot()) return; 188ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck SnapshotTab snapshot = (SnapshotTab) tab; 189ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG); 190ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mDate.setText(dateFormat.format(new Date(snapshot.getDateCreated()))); 191ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck String title = snapshot.getTitle(); 192ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (TextUtils.isEmpty(title)) { 193ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck title = UrlUtils.stripUrl(snapshot.getUrl()); 194ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 195ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mTitle.setText(title); 196ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck setFavicon(tab.getFavicon()); 197ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck resetAnimation(); 198ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 199ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 200ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck public void setFavicon(Bitmap icon) { 201ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck if (mFavicon == null) return; 202ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck mFavicon.setImageDrawable(mTitleBar.getUi().getFaviconDrawable(icon)); 203ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 204ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 205ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck public boolean isAnimating() { 206ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck return mIsAnimating; 207ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck } 208ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck 209ef654f1dd80f55609060005342fc4f2cde62990cJohn Reck} 210