NavScreen.java revision a4261fd53fef2b311e733fcfee4be3a9967ad967
1f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb/*
2f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb * Copyright (C) 2011 The Android Open Source Project
3f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb *
4f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
5f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb * you may not use this file except in compliance with the License.
6f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb * You may obtain a copy of the License at
7f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb *
8f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
9f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb *
10f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb * Unless required by applicable law or agreed to in writing, software
11f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
12f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb * See the License for the specific language governing permissions and
14f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb * limitations under the License.
15f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb */
16f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
17f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbpackage com.android.browser;
18f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
19f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.app.Activity;
20f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.content.Context;
21a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolbimport android.content.res.Configuration;
22f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.graphics.Bitmap;
23a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolbimport android.graphics.Matrix;
24f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.view.LayoutInflater;
25f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.view.Menu;
26f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.view.MenuItem;
27f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.view.View;
28f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.view.View.OnClickListener;
29f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.view.ViewGroup;
30f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.webkit.WebView;
31f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.widget.AdapterView;
32f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.widget.AdapterView.OnItemClickListener;
33f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.widget.AdapterView.OnItemSelectedListener;
34f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.widget.BaseAdapter;
35f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.widget.FrameLayout;
36a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolbimport android.widget.FrameLayout.LayoutParams;
37f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.widget.Gallery;
38f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.widget.ImageButton;
39f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.widget.ImageView;
40a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolbimport android.widget.ImageView.ScaleType;
41f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.widget.LinearLayout;
42f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.widget.ListPopupWindow;
43f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport android.widget.TextView;
44f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
45f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport java.util.ArrayList;
46f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbimport java.util.List;
47f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
48f205560dacc8a85f0443ca1949a68962404321e8Michael Kolbpublic class NavScreen extends LinearLayout implements OnClickListener {
49f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
50f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    UiController mUiController;
51f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    PhoneUi mUi;
52f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    Tab mTab;
53f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    Activity mActivity;
54f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
55f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    View mTopPanel;
56f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    ImageButton mBack;
57f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    ImageButton mRefresh;
58f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    ImageButton mForward;
59f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    ImageButton mTabs;
60f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    ImageButton mBookmarks;
61f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    ImageButton mMore;
62f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    ImageButton mNewTab;
63f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    ImageButton mNewIncognito;
64f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    FrameLayout mHolder;
65f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
66f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    Gallery mFlipper;
67a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    float mTabAspect = 0.66f;
68f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    int mTabWidth;
69f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    int mTabHeight;
70f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    TabAdapter mAdapter;
71f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    ListPopupWindow mPopup;
72a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    int mOrientation;
73f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
74f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    public NavScreen(Activity activity, UiController ctl, PhoneUi ui) {
75f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        super(activity);
76f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mActivity = activity;
77f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mUiController = ctl;
78f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mUi = ui;
79a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        mOrientation = activity.getResources().getConfiguration().orientation;
80f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        init();
81f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
82f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
83a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    @Override
84a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    public void onMeasure(int wspec, int hspec) {
85a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        super.onMeasure(wspec, hspec);
86a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        mTabHeight = mFlipper.getMeasuredHeight();
87a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        mTabWidth = (int) (mTabHeight * mTabAspect);
88a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        if (mAdapter != null) {
89a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            mAdapter.notifyDataSetChanged();
90a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        }
91f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
92f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
93a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    protected Tab getSelectedTab() {
94a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        return (Tab) mFlipper.getSelectedItem();
95f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
96f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
97fedb492d1ac1068e17028b6d4083d1a6b0578287Michael Kolb    protected void showMenu() {
98fedb492d1ac1068e17028b6d4083d1a6b0578287Michael Kolb        Menu menu = mUi.getMenu();
99fedb492d1ac1068e17028b6d4083d1a6b0578287Michael Kolb        menu.setGroupVisible(R.id.NAV_MENU, false);
100fedb492d1ac1068e17028b6d4083d1a6b0578287Michael Kolb
101f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        MenuAdapter menuAdapter = new MenuAdapter(mContext);
102f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        menuAdapter.setMenu(menu);
103f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        ListPopupWindow popup = new ListPopupWindow(mContext);
104f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
105f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        popup.setAdapter(menuAdapter);
106f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        popup.setModal(true);
107f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        popup.setAnchorView(mMore);
108f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        popup.setWidth((int) mContext.getResources().getDimension(
109f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                R.dimen.menu_width));
110f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        popup.show();
111f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mPopup = popup;
112f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
113f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
114adc921feeb327ed118711d4abddfaa421c841290John Reck    protected float getToolbarHeight() {
115adc921feeb327ed118711d4abddfaa421c841290John Reck        return mActivity.getResources().getDimension(R.dimen.toolbar_height);
116adc921feeb327ed118711d4abddfaa421c841290John Reck    }
117adc921feeb327ed118711d4abddfaa421c841290John Reck
118f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    protected void dismissMenu() {
119f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        if (mPopup != null) {
120f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            mPopup.dismiss();
121f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
122f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
123f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
124a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    // for configuration changes
125a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    @Override
126a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    protected void onConfigurationChanged(Configuration newconfig) {
127a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        if (newconfig.orientation != mOrientation) {
128a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            int selIx = mFlipper.getSelectedItemPosition();
129a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            removeAllViews();
130a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            init();
131a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            mFlipper.setSelection(selIx);
132a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            mOrientation = newconfig.orientation;
133a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        }
134a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    }
135a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb
136f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    private void init() {
137f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        LayoutInflater.from(mContext).inflate(R.layout.nav_screen, this);
138f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        LinearLayout content = (LinearLayout) findViewById(R.id.nav_screen);
139f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mTopPanel = findViewById(R.id.navtop);
140f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mBack = (ImageButton) findViewById(R.id.back);
141f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mForward = (ImageButton) findViewById(R.id.forward);
142f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mRefresh = (ImageButton) findViewById(R.id.refresh);
143f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mTabs = (ImageButton) findViewById(R.id.tabs);
144f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mBookmarks = (ImageButton) findViewById(R.id.bookmarks);
145f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mNewTab = (ImageButton) findViewById(R.id.newtab);
146f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mNewIncognito = (ImageButton) findViewById(R.id.newincognito);
147f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mMore = (ImageButton) findViewById(R.id.more);
148f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mBack.setOnClickListener(this);
149f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mForward.setOnClickListener(this);
150f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mRefresh.setOnClickListener(this);
151f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mTabs.setOnClickListener(this);
152f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mBookmarks.setOnClickListener(this);
153f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mNewTab.setOnClickListener(this);
154f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mNewIncognito.setOnClickListener(this);
155f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mMore.setOnClickListener(this);
156f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mHolder = (FrameLayout) findViewById(R.id.galleryholder);
157f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
158f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
159f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mFlipper = new TabGallery(mContext);
160f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mFlipper.setSpacing((int)(mContext.getResources()
161f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                .getDimension(R.dimen.nav_tab_spacing)));
162a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        mFlipper.setUnselectedAlpha(0.8f);
163f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mFlipper.setLayoutParams(lp);
164f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mHolder.addView(mFlipper, 0);
165f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mAdapter = new TabAdapter(mContext, mUiController.getTabControl());
166f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mFlipper.setAdapter(mAdapter);
167f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        setTab(mUi.getActiveTab(), true);
168f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mFlipper.setOnItemClickListener(new OnItemClickListener() {
169f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            @Override
170f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            public void onItemClick(AdapterView<?> parent, View view,
171f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    int position, long id) {
172f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                // post as runnable to prevent bug in gesturedetector
173f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                // when view is removed in click handler
174f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                // sends action_cancel before action_up
175f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                mFlipper.post(new Runnable() {
176f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    public void run() {
177f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                        close();
178f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    }
179f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                });
180f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            }
181f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        });
182f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mFlipper.setOnItemSelectedListener(new OnItemSelectedListener() {
183f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            @Override
184f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            public void onItemSelected(AdapterView<?> parent, View view,
185f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    int position, long id) {
186f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                final Tab tab = mAdapter.getItem(position);
187f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                setTab(tab, false);
188f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            }
189f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
190f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            @Override
191f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            public void onNothingSelected(AdapterView<?> parent) {
192f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            }
193f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        });
194f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
195f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
196f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    private void setTab(Tab tab, boolean updateFlipper) {
197f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        mTab = tab;
198f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        // refresh state from tab
199f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        WebView web = tab.getWebView();
200f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        if (web != null) {
201f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            mBack.setImageResource(web.canGoBack()
202f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    ? R.drawable.ic_back_holo_dark
203f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    : R.drawable.ic_back_disabled_holo_dark);
204f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            mForward.setImageResource(web.canGoForward()
205f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    ? R.drawable.ic_forward_holo_dark
206f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    : R.drawable.ic_forward_disabled_holo_dark);
207f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
208f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        if (updateFlipper) {
209f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            mFlipper.setSelection(mUiController.getTabControl().getTabIndex(tab));
210f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
211f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
212f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
213f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    @Override
214f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    public void onClick(View v) {
215f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        WebView web = (mTab != null) ? mTab.getWebView() : null;
216f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        if (web != null) {
217f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            if (mBack == v) {
218f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                mUi.hideNavScreen(true);
219a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                switchToSelected();
220f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                web.goBack();
221f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            } else if (mForward == v) {
222f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                mUi.hideNavScreen(true);
223a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                switchToSelected();
224f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                web.goForward();
225f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            } else if (mRefresh == v) {
226f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                mUi.hideNavScreen(true);
227a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                switchToSelected();
228f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                web.reload();
229f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            }
230f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
231f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        if (mBookmarks == v) {
232f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            mUi.hideNavScreen(false);
233a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            switchToSelected();
234f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            mUiController.bookmarksOrHistoryPicker(false);
235f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        } else if (mTabs == v) {
236f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        } else if (mNewTab == v) {
237a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            openNewTab();
238f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        } else if (mMore == v) {
239fedb492d1ac1068e17028b6d4083d1a6b0578287Michael Kolb            showMenu();
240f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        } else if (mNewIncognito == v) {
241f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            mUi.hideNavScreen(true);
242f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            mUiController.openIncognitoTab();
243f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
244f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
245f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
246a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    private void openNewTab() {
247a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        Tab tab = mUiController.createNewTab(
248a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                BrowserSettings.getInstance().getHomePage(),
249a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                false);
250a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        mAdapter.notifyDataSetChanged();
251a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb
252a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        if (tab != null) {
253a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            // set tab as the selected in flipper, then hide
254a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            final int tix = mUi.mTabControl.getTabIndex(tab);
255a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            post(new Runnable() {
256a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                public void run() {
257a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                    if (tix != -1) {
258a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                        for (int i = mFlipper.getSelectedItemPosition();
259a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                                i <= tix; i++) {
260a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                            mFlipper.setSelection(i, true);
261a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                            mFlipper.invalidate();
262a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                            try {
263a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                                Thread.sleep(100);
264a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                            } catch (InterruptedException e) {
265a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                                e.printStackTrace();
266a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                            }
267a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                        }
268a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                    }
269a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                    mUi.hideNavScreen(true);
270a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                    switchToSelected();
271a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                }
272a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            });
273a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        }
274f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
275f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
276a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    private void switchToSelected() {
277f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        Tab tab = (Tab) mFlipper.getSelectedItem();
278f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        if (tab != mUi.getActiveTab()) {
279f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            mUiController.setActiveTab(tab);
280f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
281f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
282f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
283a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    protected void close() {
284a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        close(true);
285a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    }
286a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb
287a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    protected void close(boolean animate) {
288a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        mUi.hideNavScreen(animate);
289a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb        switchToSelected();
290a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb    }
291a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb
292f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    class TabGallery extends Gallery {
293f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
294f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public TabGallery(Context ctx) {
295f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            super(ctx);
296f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            setUnselectedAlpha(0.3f);
297f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
298f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
299f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb       @Override
300f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb       protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
301f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb           return new Gallery.LayoutParams(
302f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                   LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
303f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb       }
304f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
305f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb       @Override
306f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb       protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) {
307f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb           return generateDefaultLayoutParams();
308f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb       }
309f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
310f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
311f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
312f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    class TabAdapter extends BaseAdapter {
313f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
314f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        Context context;
315f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        TabControl tabControl;
316f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
317f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public TabAdapter(Context ctx, TabControl tc) {
318f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            context = ctx;
319f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            tabControl = tc;
320f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
321f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
322f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        void onCloseTab(Tab tab) {
323f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            if (tab != null) {
324f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                mUiController.closeTab(tab);
325f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                if (tabControl.getTabCount() == 0) {
326f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    mUiController.openTabToHomePage();
327f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    mUi.hideNavScreen(false);
328f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                } else {
329f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    notifyDataSetChanged();
330f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                }
331f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            }
332f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
333f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
334f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        @Override
335f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public int getCount() {
336f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            return tabControl.getTabCount();
337f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
338f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
339f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        @Override
340f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public Tab getItem(int position) {
341f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            return tabControl.getTab(position);
342f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
343f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
344f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public long getItemId(int position) {
345f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            return position;
346f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
347f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
348f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        @Override
349f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public View getView(int position, View convertView, ViewGroup parent) {
350f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            ImageView content = null;
351f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            if (convertView == null) {
352f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                convertView = LayoutInflater.from(context).inflate(R.layout.nav_tab_view,
353f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                        null);
354f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                content = (ImageView) convertView.findViewById(R.id.content);
355f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                content.setLayoutParams(new LayoutParams(mTabWidth, mTabHeight));
356f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            } else {
357f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                content = (ImageView) convertView.findViewById(R.id.content);
358a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                content.setLayoutParams(new LayoutParams(mTabWidth, mTabHeight));
359f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            }
3605a4372f4638f9a1fc5c052d85977fbcc0c4d8c55Michael Kolb            View tbar = convertView.findViewById(R.id.titlebar);
361f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            TextView title = (TextView) convertView.findViewById(R.id.title);
362f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            ImageView icon = (ImageView) convertView.findViewById(R.id.favicon);
363f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            ImageButton close = (ImageButton) convertView.findViewById(R.id.closetab);
364f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            final Tab tab = getItem(position);
3655a4372f4638f9a1fc5c052d85977fbcc0c4d8c55Michael Kolb            icon.setImageDrawable(mUi.getFaviconDrawable(tab.getFavicon()));
366f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            title.setText(tab.getUrl());
367a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            content.setScaleType(ScaleType.MATRIX);
368a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            Matrix matrix = new Matrix();
369f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            Bitmap screen = tab.getScreenshot();
370a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            if (screen != null) {
371a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                float scale = 1.0f;
372a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                if (mTabWidth > mTabHeight) {
373a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                    scale = mTabWidth / (float) screen.getWidth();
374a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                } else {
375a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                    scale = mTabHeight / (float) screen.getHeight();
376a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                }
377a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                matrix.setScale(scale, scale);
378a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                content.setImageMatrix(matrix);
379a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb                content.setImageBitmap(screen);
380a4261fd53fef2b311e733fcfee4be3a9967ad967Michael Kolb            }
381f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            close.setOnClickListener(new OnClickListener() {
382f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                @Override
383f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                public void onClick(View v) {
384f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    onCloseTab(tab);
385f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                }
386f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            });
3875a4372f4638f9a1fc5c052d85977fbcc0c4d8c55Michael Kolb            tbar.setOnClickListener(new OnClickListener() {
388f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                @Override
389f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                public void onClick(View v) {
390f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    close(false);
391ff6c36b53a394e8221215b1a9851fd739f2c03deMichael Kolb                    mUi.getTitleBar().setSkipTitleBarAnimations(true);
392f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    mUi.editUrl(false);
393ff6c36b53a394e8221215b1a9851fd739f2c03deMichael Kolb                    mUi.getTitleBar().setSkipTitleBarAnimations(false);
394f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                }
395f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            });
396f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            return convertView;
397f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
398f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
399f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
400f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    private class MenuAdapter extends BaseAdapter implements OnClickListener {
401f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
402f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        List<MenuItem> mItems;
403f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        LayoutInflater mInflater;
404f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
405f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public MenuAdapter(Context ctx) {
406f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            mInflater = LayoutInflater.from(ctx);
407f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            mItems = new ArrayList<MenuItem>();
408f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
409f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
410f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public void setMenu(Menu menu) {
411f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            mItems.clear();
412f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            for (int i = 0; i < menu.size(); i++) {
413f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                MenuItem item = menu.getItem(i);
414f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                if (item.isEnabled() && item.isVisible()) {
415f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                    mItems.add(item);
416f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                }
417f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            }
418f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            notifyDataSetChanged();
419f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
420f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
421f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        @Override
422f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public int getCount() {
423f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            return mItems.size();
424f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
425f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
426f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        @Override
427f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public MenuItem getItem(int position) {
428f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            return mItems.get(position);
429f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
430f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
431f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        @Override
432f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public long getItemId(int position) {
433f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            return position;
434f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
435f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
436f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        @Override
437f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public void onClick(View v) {
438f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            if (v.getTag() != null) {
439f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                dismissMenu();
440f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                mActivity.closeOptionsMenu();
441f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                mUi.hideNavScreen(false);
442f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb                mUiController.onOptionsItemSelected((MenuItem) v.getTag());
443f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            }
444f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
445f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
446f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        @Override
447f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        public View getView(int position, View convertView, ViewGroup parent) {
448f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            final MenuItem item = mItems.get(position);
449f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            View view = mInflater.inflate(R.layout.qc_menu_item, null);
450f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            TextView label = (TextView) view.findViewById(R.id.title);
451f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            label.setText(item.getTitle());
452f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            label.setTag(item);
453f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            label.setOnClickListener(this);
454f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb            return label;
455f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb        }
456f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
457f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb    }
458f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb
459f205560dacc8a85f0443ca1949a68962404321e8Michael Kolb}
460