blob: 7c4291c8722d4d0d63dee42c1183e7fa82bce024 [file] [log] [blame]
Michael Kolb80f75082012-04-10 10:50:06 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.browser;
18
19import android.app.Activity;
20import android.content.Context;
21import android.graphics.Bitmap;
22import android.view.LayoutInflater;
23import android.view.View;
24import android.view.View.OnClickListener;
25import android.view.ViewGroup;
26import android.view.ViewGroup.LayoutParams;
27import android.webkit.WebView;
28import android.widget.BaseAdapter;
29import android.widget.FrameLayout;
30import android.widget.ImageView;
31import android.widget.ImageView.ScaleType;
32import android.widget.TextView;
33
34import com.android.browser.UI.ComboViews;
35import com.android.browser.view.PieItem;
36import com.android.browser.view.PieMenu;
37import com.android.browser.view.PieMenu.PieView.OnLayoutListener;
38import com.android.browser.view.PieStackView;
39import com.android.browser.view.PieStackView.OnCurrentListener;
40
41import java.util.ArrayList;
42import java.util.List;
43
44/**
45 * Controller for Quick Controls pie menu
46 */
47public class PieControl implements PieMenu.PieController, OnClickListener {
48
49 protected Activity mActivity;
50 protected UiController mUiController;
51 protected PieMenu mPie;
52 protected int mItemSize;
53 protected TextView mTabsCount;
54 private BaseUi mUi;
55 private PieItem mBack;
56 private PieItem mForward;
57 private PieItem mRefresh;
58 private PieItem mUrl;
59 private PieItem mOptions;
60 private PieItem mBookmarks;
61 private PieItem mHistory;
62 private PieItem mAddBookmark;
63 private PieItem mNewTab;
64 private PieItem mIncognito;
65 private PieItem mClose;
66 private PieItem mShowTabs;
67 private PieItem mInfo;
68 private PieItem mFind;
69 private PieItem mShare;
70 private PieItem mRDS;
71 private TabAdapter mTabAdapter;
72
73 public PieControl(Activity activity, UiController controller, BaseUi ui) {
74 mActivity = activity;
75 mUiController = controller;
76 mItemSize = (int) activity.getResources().getDimension(R.dimen.qc_item_size);
77 mUi = ui;
78 }
79
80 public void stopEditingUrl() {
81 mUi.stopEditingUrl();
82 }
83
84 protected void attachToContainer(FrameLayout container) {
85 if (mPie == null) {
86 mPie = new PieMenu(mActivity);
87 LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,
88 LayoutParams.MATCH_PARENT);
89 mPie.setLayoutParams(lp);
90 populateMenu();
91 mPie.setController(this);
92 }
93 container.addView(mPie);
94 }
95
96 protected void removeFromContainer(FrameLayout container) {
97 container.removeView(mPie);
98 }
99
100 protected void forceToTop(FrameLayout container) {
101 if (mPie.getParent() != null) {
102 container.removeView(mPie);
103 container.addView(mPie);
104 }
105 }
106
107 protected void setClickListener(OnClickListener listener, PieItem... items) {
108 for (PieItem item : items) {
109 item.getView().setOnClickListener(listener);
110 }
111 }
112
113 @Override
114 public boolean onOpen() {
115 int n = mUiController.getTabControl().getTabCount();
116 mTabsCount.setText(Integer.toString(n));
117 Tab tab = mUiController.getCurrentTab();
Michael Kolb5fea4a22012-05-07 10:50:50 -0700118 if (tab != null) {
119 mForward.setEnabled(tab.canGoForward());
120 }
Michael Kolb80f75082012-04-10 10:50:06 -0700121 return true;
122 }
123
124 protected void populateMenu() {
125 mBack = makeItem(R.drawable.ic_back_holo_dark, 1);
126 mUrl = makeItem(R.drawable.ic_web_holo_dark, 1);
127 mBookmarks = makeItem(R.drawable.ic_bookmarks_holo_dark, 1);
128 mHistory = makeItem(R.drawable.ic_history_holo_dark, 1);
129 mAddBookmark = makeItem(R.drawable.ic_bookmark_on_holo_dark, 1);
130 mRefresh = makeItem(R.drawable.ic_refresh_holo_dark, 1);
131 mForward = makeItem(R.drawable.ic_forward_holo_dark, 1);
132 mNewTab = makeItem(R.drawable.ic_new_window_holo_dark, 1);
133 mIncognito = makeItem(R.drawable.ic_new_incognito_holo_dark, 1);
134 mClose = makeItem(R.drawable.ic_close_window_holo_dark, 1);
135 mInfo = makeItem(android.R.drawable.ic_menu_info_details, 1);
136 mFind = makeItem(R.drawable.ic_search_holo_dark, 1);
137 mShare = makeItem(R.drawable.ic_share_holo_dark, 1);
138 View tabs = makeTabsView();
139 mShowTabs = new PieItem(tabs, 1);
140 mOptions = makeItem(R.drawable.ic_settings_holo_dark, 1);
141 mRDS = makeItem(R.drawable.ic_desktop_holo_dark, 1);
142 mTabAdapter = new TabAdapter(mActivity, mUiController);
143 PieStackView stack = new PieStackView(mActivity);
144 stack.setLayoutListener(new OnLayoutListener() {
145 @Override
146 public void onLayout(int ax, int ay, boolean left) {
147 buildTabs();
148 }
149 });
150 stack.setOnCurrentListener(mTabAdapter);
151 stack.setAdapter(mTabAdapter);
152 mShowTabs.setPieView(stack);
153 setClickListener(this, mBack, mRefresh, mForward, mUrl, mFind, mInfo,
154 mShare, mBookmarks, mNewTab, mIncognito, mClose, mHistory,
155 mAddBookmark, mOptions, mRDS);
Michael Kolba34ae502012-04-23 12:51:30 -0700156 if (!BrowserActivity.isTablet(mActivity)) {
157 mShowTabs.getView().setOnClickListener(this);
158 }
Michael Kolb80f75082012-04-10 10:50:06 -0700159 // level 1
160 mPie.addItem(mOptions);
161 mOptions.addItem(mRDS);
162 mOptions.addItem(makeFiller());
163 mOptions.addItem(makeFiller());
164 mOptions.addItem(makeFiller());
165 mPie.addItem(mBack);
166 mBack.addItem(mRefresh);
167 mBack.addItem(mForward);
168 mBack.addItem(makeFiller());
169 mBack.addItem(makeFiller());
170 mPie.addItem(mUrl);
171 mUrl.addItem(mFind);
172 mUrl.addItem(mShare);
173 mUrl.addItem(makeFiller());
174 mUrl.addItem(makeFiller());
175 mPie.addItem(mShowTabs);
176 mShowTabs.addItem(mClose);
177 mShowTabs.addItem(mIncognito);
178 mShowTabs.addItem(mNewTab);
179 mShowTabs.addItem(makeFiller());
180 mPie.addItem(mBookmarks);
181 mBookmarks.addItem(makeFiller());
182 mBookmarks.addItem(makeFiller());
183 mBookmarks.addItem(mAddBookmark);
184 mBookmarks.addItem(mHistory);
185 }
186
187 @Override
188 public void onClick(View v) {
189 Tab tab = mUiController.getTabControl().getCurrentTab();
190 WebView web = tab.getWebView();
191 if (mBack.getView() == v) {
192 tab.goBack();
193 } else if (mForward.getView() == v) {
194 tab.goForward();
195 } else if (mRefresh.getView() == v) {
196 if (tab.inPageLoad()) {
197 web.stopLoading();
198 } else {
199 web.reload();
200 }
201 } else if (mUrl.getView() == v) {
Michael Kolb1f9b3562012-04-24 14:38:34 -0700202 mUi.editUrl(false, true);
Michael Kolb80f75082012-04-10 10:50:06 -0700203 } else if (mBookmarks.getView() == v) {
204 mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
205 } else if (mHistory.getView() == v) {
206 mUiController.bookmarksOrHistoryPicker(ComboViews.History);
207 } else if (mAddBookmark.getView() == v) {
208 mUiController.bookmarkCurrentPage();
209 } else if (mNewTab.getView() == v) {
210 mUiController.openTabToHomePage();
Michael Kolb1f9b3562012-04-24 14:38:34 -0700211 mUi.editUrl(false, true);
Michael Kolb80f75082012-04-10 10:50:06 -0700212 } else if (mIncognito.getView() == v) {
213 mUiController.openIncognitoTab();
Michael Kolb1f9b3562012-04-24 14:38:34 -0700214 mUi.editUrl(false, true);
Michael Kolb80f75082012-04-10 10:50:06 -0700215 } else if (mClose.getView() == v) {
216 mUiController.closeCurrentTab();
217 } else if (mOptions.getView() == v) {
218 mUiController.openPreferences();
219 } else if (mShare.getView() == v) {
220 mUiController.shareCurrentPage();
221 } else if (mInfo.getView() == v) {
222 mUiController.showPageInfo();
223 } else if (mFind.getView() == v) {
224 mUiController.findOnPage();
225 } else if (mRDS.getView() == v) {
226 mUiController.toggleUserAgent();
Michael Kolba34ae502012-04-23 12:51:30 -0700227 } else if (mShowTabs.getView() == v) {
228 ((PhoneUi) mUi).showNavScreen();
Michael Kolb80f75082012-04-10 10:50:06 -0700229 }
230 }
231
232 private void buildTabs() {
233 final List<Tab> tabs = mUiController.getTabs();
234 mUi.getActiveTab().capture();
235 mTabAdapter.setTabs(tabs);
236 PieStackView sym = (PieStackView) mShowTabs.getPieView();
237 sym.setCurrent(mUiController.getTabControl().getCurrentPosition());
238 }
239
240 protected PieItem makeItem(int image, int l) {
241 ImageView view = new ImageView(mActivity);
242 view.setImageResource(image);
243 view.setMinimumWidth(mItemSize);
244 view.setMinimumHeight(mItemSize);
245 view.setScaleType(ScaleType.CENTER);
246 LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
247 view.setLayoutParams(lp);
248 return new PieItem(view, l);
249 }
250
251 protected PieItem makeFiller() {
252 return new PieItem(null, 1);
253 }
254
255 protected View makeTabsView() {
256 View v = mActivity.getLayoutInflater().inflate(R.layout.qc_tabs_view, null);
257 mTabsCount = (TextView) v.findViewById(R.id.label);
258 mTabsCount.setText("1");
259 ImageView image = (ImageView) v.findViewById(R.id.icon);
260 image.setImageResource(R.drawable.ic_windows_holo_dark);
261 image.setScaleType(ScaleType.CENTER);
262 LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
263 v.setLayoutParams(lp);
264 return v;
265 }
266
267 static class TabAdapter extends BaseAdapter implements OnCurrentListener {
268
269 LayoutInflater mInflater;
270 UiController mUiController;
271 private List<Tab> mTabs;
272 private int mCurrent;
273
274 public TabAdapter(Context ctx, UiController ctl) {
275 mInflater = LayoutInflater.from(ctx);
276 mUiController = ctl;
277 mTabs = new ArrayList<Tab>();
278 mCurrent = -1;
279 }
280
281 public void setTabs(List<Tab> tabs) {
282 mTabs = tabs;
283 notifyDataSetChanged();
284 }
285
286 @Override
287 public int getCount() {
288 return mTabs.size();
289 }
290
291 @Override
292 public Tab getItem(int position) {
293 return mTabs.get(position);
294 }
295
296 @Override
297 public long getItemId(int position) {
298 return position;
299 }
300
301 @Override
302 public View getView(int position, View convertView, ViewGroup parent) {
303 final Tab tab = mTabs.get(position);
304 View view = mInflater.inflate(R.layout.qc_tab,
305 null);
306 ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
307 TextView title1 = (TextView) view.findViewById(R.id.title1);
308 TextView title2 = (TextView) view.findViewById(R.id.title2);
309 Bitmap b = tab.getScreenshot();
310 if (b != null) {
311 thumb.setImageBitmap(b);
312 }
313 if (position > mCurrent) {
314 title1.setVisibility(View.GONE);
315 title2.setText(tab.getTitle());
316 } else {
317 title2.setVisibility(View.GONE);
318 title1.setText(tab.getTitle());
319 }
320 view.setOnClickListener(new OnClickListener() {
321 @Override
322 public void onClick(View v) {
323 mUiController.switchToTab(tab);
324 }
325 });
326 return view;
327 }
328
329 @Override
330 public void onSetCurrent(int index) {
331 mCurrent = index;
332 }
333
334 }
335
336}