blob: abe8d3756853a039ef4e639e1300b77ad06bb24e [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();
118 mForward.setEnabled(tab.canGoForward());
119 return true;
120 }
121
122 protected void populateMenu() {
123 mBack = makeItem(R.drawable.ic_back_holo_dark, 1);
124 mUrl = makeItem(R.drawable.ic_web_holo_dark, 1);
125 mBookmarks = makeItem(R.drawable.ic_bookmarks_holo_dark, 1);
126 mHistory = makeItem(R.drawable.ic_history_holo_dark, 1);
127 mAddBookmark = makeItem(R.drawable.ic_bookmark_on_holo_dark, 1);
128 mRefresh = makeItem(R.drawable.ic_refresh_holo_dark, 1);
129 mForward = makeItem(R.drawable.ic_forward_holo_dark, 1);
130 mNewTab = makeItem(R.drawable.ic_new_window_holo_dark, 1);
131 mIncognito = makeItem(R.drawable.ic_new_incognito_holo_dark, 1);
132 mClose = makeItem(R.drawable.ic_close_window_holo_dark, 1);
133 mInfo = makeItem(android.R.drawable.ic_menu_info_details, 1);
134 mFind = makeItem(R.drawable.ic_search_holo_dark, 1);
135 mShare = makeItem(R.drawable.ic_share_holo_dark, 1);
136 View tabs = makeTabsView();
137 mShowTabs = new PieItem(tabs, 1);
138 mOptions = makeItem(R.drawable.ic_settings_holo_dark, 1);
139 mRDS = makeItem(R.drawable.ic_desktop_holo_dark, 1);
140 mTabAdapter = new TabAdapter(mActivity, mUiController);
141 PieStackView stack = new PieStackView(mActivity);
142 stack.setLayoutListener(new OnLayoutListener() {
143 @Override
144 public void onLayout(int ax, int ay, boolean left) {
145 buildTabs();
146 }
147 });
148 stack.setOnCurrentListener(mTabAdapter);
149 stack.setAdapter(mTabAdapter);
150 mShowTabs.setPieView(stack);
151 setClickListener(this, mBack, mRefresh, mForward, mUrl, mFind, mInfo,
152 mShare, mBookmarks, mNewTab, mIncognito, mClose, mHistory,
153 mAddBookmark, mOptions, mRDS);
Michael Kolba34ae502012-04-23 12:51:30 -0700154 if (!BrowserActivity.isTablet(mActivity)) {
155 mShowTabs.getView().setOnClickListener(this);
156 }
Michael Kolb80f75082012-04-10 10:50:06 -0700157 // level 1
158 mPie.addItem(mOptions);
159 mOptions.addItem(mRDS);
160 mOptions.addItem(makeFiller());
161 mOptions.addItem(makeFiller());
162 mOptions.addItem(makeFiller());
163 mPie.addItem(mBack);
164 mBack.addItem(mRefresh);
165 mBack.addItem(mForward);
166 mBack.addItem(makeFiller());
167 mBack.addItem(makeFiller());
168 mPie.addItem(mUrl);
169 mUrl.addItem(mFind);
170 mUrl.addItem(mShare);
171 mUrl.addItem(makeFiller());
172 mUrl.addItem(makeFiller());
173 mPie.addItem(mShowTabs);
174 mShowTabs.addItem(mClose);
175 mShowTabs.addItem(mIncognito);
176 mShowTabs.addItem(mNewTab);
177 mShowTabs.addItem(makeFiller());
178 mPie.addItem(mBookmarks);
179 mBookmarks.addItem(makeFiller());
180 mBookmarks.addItem(makeFiller());
181 mBookmarks.addItem(mAddBookmark);
182 mBookmarks.addItem(mHistory);
183 }
184
185 @Override
186 public void onClick(View v) {
187 Tab tab = mUiController.getTabControl().getCurrentTab();
188 WebView web = tab.getWebView();
189 if (mBack.getView() == v) {
190 tab.goBack();
191 } else if (mForward.getView() == v) {
192 tab.goForward();
193 } else if (mRefresh.getView() == v) {
194 if (tab.inPageLoad()) {
195 web.stopLoading();
196 } else {
197 web.reload();
198 }
199 } else if (mUrl.getView() == v) {
Michael Kolb1f9b3562012-04-24 14:38:34 -0700200 mUi.editUrl(false, true);
Michael Kolb80f75082012-04-10 10:50:06 -0700201 } else if (mBookmarks.getView() == v) {
202 mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
203 } else if (mHistory.getView() == v) {
204 mUiController.bookmarksOrHistoryPicker(ComboViews.History);
205 } else if (mAddBookmark.getView() == v) {
206 mUiController.bookmarkCurrentPage();
207 } else if (mNewTab.getView() == v) {
208 mUiController.openTabToHomePage();
Michael Kolb1f9b3562012-04-24 14:38:34 -0700209 mUi.editUrl(false, true);
Michael Kolb80f75082012-04-10 10:50:06 -0700210 } else if (mIncognito.getView() == v) {
211 mUiController.openIncognitoTab();
Michael Kolb1f9b3562012-04-24 14:38:34 -0700212 mUi.editUrl(false, true);
Michael Kolb80f75082012-04-10 10:50:06 -0700213 } else if (mClose.getView() == v) {
214 mUiController.closeCurrentTab();
215 } else if (mOptions.getView() == v) {
216 mUiController.openPreferences();
217 } else if (mShare.getView() == v) {
218 mUiController.shareCurrentPage();
219 } else if (mInfo.getView() == v) {
220 mUiController.showPageInfo();
221 } else if (mFind.getView() == v) {
222 mUiController.findOnPage();
223 } else if (mRDS.getView() == v) {
224 mUiController.toggleUserAgent();
Michael Kolba34ae502012-04-23 12:51:30 -0700225 } else if (mShowTabs.getView() == v) {
226 ((PhoneUi) mUi).showNavScreen();
Michael Kolb80f75082012-04-10 10:50:06 -0700227 }
228 }
229
230 private void buildTabs() {
231 final List<Tab> tabs = mUiController.getTabs();
232 mUi.getActiveTab().capture();
233 mTabAdapter.setTabs(tabs);
234 PieStackView sym = (PieStackView) mShowTabs.getPieView();
235 sym.setCurrent(mUiController.getTabControl().getCurrentPosition());
236 }
237
238 protected PieItem makeItem(int image, int l) {
239 ImageView view = new ImageView(mActivity);
240 view.setImageResource(image);
241 view.setMinimumWidth(mItemSize);
242 view.setMinimumHeight(mItemSize);
243 view.setScaleType(ScaleType.CENTER);
244 LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
245 view.setLayoutParams(lp);
246 return new PieItem(view, l);
247 }
248
249 protected PieItem makeFiller() {
250 return new PieItem(null, 1);
251 }
252
253 protected View makeTabsView() {
254 View v = mActivity.getLayoutInflater().inflate(R.layout.qc_tabs_view, null);
255 mTabsCount = (TextView) v.findViewById(R.id.label);
256 mTabsCount.setText("1");
257 ImageView image = (ImageView) v.findViewById(R.id.icon);
258 image.setImageResource(R.drawable.ic_windows_holo_dark);
259 image.setScaleType(ScaleType.CENTER);
260 LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
261 v.setLayoutParams(lp);
262 return v;
263 }
264
265 static class TabAdapter extends BaseAdapter implements OnCurrentListener {
266
267 LayoutInflater mInflater;
268 UiController mUiController;
269 private List<Tab> mTabs;
270 private int mCurrent;
271
272 public TabAdapter(Context ctx, UiController ctl) {
273 mInflater = LayoutInflater.from(ctx);
274 mUiController = ctl;
275 mTabs = new ArrayList<Tab>();
276 mCurrent = -1;
277 }
278
279 public void setTabs(List<Tab> tabs) {
280 mTabs = tabs;
281 notifyDataSetChanged();
282 }
283
284 @Override
285 public int getCount() {
286 return mTabs.size();
287 }
288
289 @Override
290 public Tab getItem(int position) {
291 return mTabs.get(position);
292 }
293
294 @Override
295 public long getItemId(int position) {
296 return position;
297 }
298
299 @Override
300 public View getView(int position, View convertView, ViewGroup parent) {
301 final Tab tab = mTabs.get(position);
302 View view = mInflater.inflate(R.layout.qc_tab,
303 null);
304 ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
305 TextView title1 = (TextView) view.findViewById(R.id.title1);
306 TextView title2 = (TextView) view.findViewById(R.id.title2);
307 Bitmap b = tab.getScreenshot();
308 if (b != null) {
309 thumb.setImageBitmap(b);
310 }
311 if (position > mCurrent) {
312 title1.setVisibility(View.GONE);
313 title2.setText(tab.getTitle());
314 } else {
315 title2.setVisibility(View.GONE);
316 title1.setText(tab.getTitle());
317 }
318 view.setOnClickListener(new OnClickListener() {
319 @Override
320 public void onClick(View v) {
321 mUiController.switchToTab(tab);
322 }
323 });
324 return view;
325 }
326
327 @Override
328 public void onSetCurrent(int index) {
329 mCurrent = index;
330 }
331
332 }
333
334}