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