blob: 68b0c7b9e84ce1e9149f4eeec6fe278d30930a88 [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);
154 // level 1
155 mPie.addItem(mOptions);
156 mOptions.addItem(mRDS);
157 mOptions.addItem(makeFiller());
158 mOptions.addItem(makeFiller());
159 mOptions.addItem(makeFiller());
160 mPie.addItem(mBack);
161 mBack.addItem(mRefresh);
162 mBack.addItem(mForward);
163 mBack.addItem(makeFiller());
164 mBack.addItem(makeFiller());
165 mPie.addItem(mUrl);
166 mUrl.addItem(mFind);
167 mUrl.addItem(mShare);
168 mUrl.addItem(makeFiller());
169 mUrl.addItem(makeFiller());
170 mPie.addItem(mShowTabs);
171 mShowTabs.addItem(mClose);
172 mShowTabs.addItem(mIncognito);
173 mShowTabs.addItem(mNewTab);
174 mShowTabs.addItem(makeFiller());
175 mPie.addItem(mBookmarks);
176 mBookmarks.addItem(makeFiller());
177 mBookmarks.addItem(makeFiller());
178 mBookmarks.addItem(mAddBookmark);
179 mBookmarks.addItem(mHistory);
180 }
181
182 @Override
183 public void onClick(View v) {
184 Tab tab = mUiController.getTabControl().getCurrentTab();
185 WebView web = tab.getWebView();
186 if (mBack.getView() == v) {
187 tab.goBack();
188 } else if (mForward.getView() == v) {
189 tab.goForward();
190 } else if (mRefresh.getView() == v) {
191 if (tab.inPageLoad()) {
192 web.stopLoading();
193 } else {
194 web.reload();
195 }
196 } else if (mUrl.getView() == v) {
197 mUi.editUrl(false);
198 } else if (mBookmarks.getView() == v) {
199 mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
200 } else if (mHistory.getView() == v) {
201 mUiController.bookmarksOrHistoryPicker(ComboViews.History);
202 } else if (mAddBookmark.getView() == v) {
203 mUiController.bookmarkCurrentPage();
204 } else if (mNewTab.getView() == v) {
205 mUiController.openTabToHomePage();
206 mUi.editUrl(false);
207 } else if (mIncognito.getView() == v) {
208 mUiController.openIncognitoTab();
209 mUi.editUrl(false);
210 } else if (mClose.getView() == v) {
211 mUiController.closeCurrentTab();
212 } else if (mOptions.getView() == v) {
213 mUiController.openPreferences();
214 } else if (mShare.getView() == v) {
215 mUiController.shareCurrentPage();
216 } else if (mInfo.getView() == v) {
217 mUiController.showPageInfo();
218 } else if (mFind.getView() == v) {
219 mUiController.findOnPage();
220 } else if (mRDS.getView() == v) {
221 mUiController.toggleUserAgent();
222 }
223 }
224
225 private void buildTabs() {
226 final List<Tab> tabs = mUiController.getTabs();
227 mUi.getActiveTab().capture();
228 mTabAdapter.setTabs(tabs);
229 PieStackView sym = (PieStackView) mShowTabs.getPieView();
230 sym.setCurrent(mUiController.getTabControl().getCurrentPosition());
231 }
232
233 protected PieItem makeItem(int image, int l) {
234 ImageView view = new ImageView(mActivity);
235 view.setImageResource(image);
236 view.setMinimumWidth(mItemSize);
237 view.setMinimumHeight(mItemSize);
238 view.setScaleType(ScaleType.CENTER);
239 LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
240 view.setLayoutParams(lp);
241 return new PieItem(view, l);
242 }
243
244 protected PieItem makeFiller() {
245 return new PieItem(null, 1);
246 }
247
248 protected View makeTabsView() {
249 View v = mActivity.getLayoutInflater().inflate(R.layout.qc_tabs_view, null);
250 mTabsCount = (TextView) v.findViewById(R.id.label);
251 mTabsCount.setText("1");
252 ImageView image = (ImageView) v.findViewById(R.id.icon);
253 image.setImageResource(R.drawable.ic_windows_holo_dark);
254 image.setScaleType(ScaleType.CENTER);
255 LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
256 v.setLayoutParams(lp);
257 return v;
258 }
259
260 static class TabAdapter extends BaseAdapter implements OnCurrentListener {
261
262 LayoutInflater mInflater;
263 UiController mUiController;
264 private List<Tab> mTabs;
265 private int mCurrent;
266
267 public TabAdapter(Context ctx, UiController ctl) {
268 mInflater = LayoutInflater.from(ctx);
269 mUiController = ctl;
270 mTabs = new ArrayList<Tab>();
271 mCurrent = -1;
272 }
273
274 public void setTabs(List<Tab> tabs) {
275 mTabs = tabs;
276 notifyDataSetChanged();
277 }
278
279 @Override
280 public int getCount() {
281 return mTabs.size();
282 }
283
284 @Override
285 public Tab getItem(int position) {
286 return mTabs.get(position);
287 }
288
289 @Override
290 public long getItemId(int position) {
291 return position;
292 }
293
294 @Override
295 public View getView(int position, View convertView, ViewGroup parent) {
296 final Tab tab = mTabs.get(position);
297 View view = mInflater.inflate(R.layout.qc_tab,
298 null);
299 ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
300 TextView title1 = (TextView) view.findViewById(R.id.title1);
301 TextView title2 = (TextView) view.findViewById(R.id.title2);
302 Bitmap b = tab.getScreenshot();
303 if (b != null) {
304 thumb.setImageBitmap(b);
305 }
306 if (position > mCurrent) {
307 title1.setVisibility(View.GONE);
308 title2.setText(tab.getTitle());
309 } else {
310 title2.setVisibility(View.GONE);
311 title1.setText(tab.getTitle());
312 }
313 view.setOnClickListener(new OnClickListener() {
314 @Override
315 public void onClick(View v) {
316 mUiController.switchToTab(tab);
317 }
318 });
319 return view;
320 }
321
322 @Override
323 public void onSetCurrent(int index) {
324 mCurrent = index;
325 }
326
327 }
328
329}