blob: 5e956845de7d1a6048e891e6d047ed8eed9a9896 [file] [log] [blame]
Michael Kolb376b5412010-12-15 11:52:57 -08001/*
2 * Copyright (C) 2010 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
Michael Kolb0860d992011-03-07 15:26:33 -080019import com.android.browser.view.PieItem;
Michael Kolb1acef692011-03-08 14:12:06 -080020import com.android.browser.view.PieListView;
Michael Kolb376b5412010-12-15 11:52:57 -080021import com.android.browser.view.PieMenu;
Michael Kolbeb95db42011-03-03 10:38:40 -080022import com.android.browser.view.PieMenu.PieView.OnLayoutListener;
23import com.android.browser.view.PieStackView;
24import com.android.browser.view.PieStackView.OnCurrentListener;
Michael Kolb376b5412010-12-15 11:52:57 -080025
26import android.app.Activity;
Michael Kolb1acef692011-03-08 14:12:06 -080027import android.content.Context;
Michael Kolbeb95db42011-03-03 10:38:40 -080028import android.graphics.Bitmap;
29import android.graphics.drawable.BitmapDrawable;
30import android.os.Handler;
Michael Kolb1acef692011-03-08 14:12:06 -080031import android.view.LayoutInflater;
32import android.view.Menu;
33import android.view.MenuItem;
Michael Kolb376b5412010-12-15 11:52:57 -080034import android.view.View;
35import android.view.View.OnClickListener;
Michael Kolb1acef692011-03-08 14:12:06 -080036import android.view.ViewGroup;
Michael Kolb376b5412010-12-15 11:52:57 -080037import android.view.ViewGroup.LayoutParams;
38import android.webkit.WebView;
Michael Kolb1acef692011-03-08 14:12:06 -080039import android.widget.BaseAdapter;
Michael Kolb376b5412010-12-15 11:52:57 -080040import android.widget.FrameLayout;
41import android.widget.ImageView;
Michael Kolbeb95db42011-03-03 10:38:40 -080042import android.widget.ImageView.ScaleType;
Michael Kolb1acef692011-03-08 14:12:06 -080043import android.widget.TextView;
44
45import java.util.ArrayList;
46import java.util.List;
Michael Kolb376b5412010-12-15 11:52:57 -080047
Michael Kolb376b5412010-12-15 11:52:57 -080048/**
49 * controller for Quick Controls pie menu
50 */
51public class PieControl implements OnClickListener, PieMenu.PieController {
52
53 private Activity mActivity;
54 private UiController mUiController;
55 private XLargeUi mUi;
56 private PieMenu mPie;
Michael Kolb0860d992011-03-07 15:26:33 -080057 private PieItem mBack;
58 private PieItem mForward;
59 private PieItem mRefresh;
60 private PieItem mUrl;
61 private PieItem mOptions;
62 private PieItem mBookmarks;
63 private PieItem mNewTab;
64 private PieItem mClose;
Michael Kolb1acef692011-03-08 14:12:06 -080065 private MenuAdapter mMenuAdapter;
Michael Kolbeb95db42011-03-03 10:38:40 -080066 private PieItem mShowTabs;
67 private TabAdapter mTabAdapter;
Michael Kolb376b5412010-12-15 11:52:57 -080068
69 public PieControl(Activity activity, UiController controller, XLargeUi ui) {
70 mActivity = activity;
71 mUiController = controller;
72 mUi = ui;
Michael Kolb376b5412010-12-15 11:52:57 -080073 }
74
75 protected void attachToContainer(FrameLayout container) {
76 if (mPie == null) {
77 mPie = new PieMenu(mActivity);
78 LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,
79 LayoutParams.MATCH_PARENT);
80 mPie.setLayoutParams(lp);
Michael Kolb0860d992011-03-07 15:26:33 -080081 mBack = makeItem(R.drawable.ic_back_holo_dark, 1);
82 mUrl = makeItem(R.drawable.ic_web_holo_dark, 1);
83 mBookmarks = makeItem(R.drawable.ic_bookmarks_holo_dark, 1);
84 mRefresh = makeItem(R.drawable.ic_refresh_holo_dark, 2);
85 mForward = makeItem(R.drawable.ic_forward_holo_dark, 2);
86 mNewTab = makeItem(R.drawable.ic_new_window_holo_dark, 2);
87 mClose = makeItem(R.drawable.ic_close_window_holo_dark, 2);
Michael Kolbeb95db42011-03-03 10:38:40 -080088 mShowTabs = makeItem(R.drawable.ic_windows_holo_dark, 2);
Michael Kolb0860d992011-03-07 15:26:33 -080089 mOptions = makeItem(
90 com.android.internal.R.drawable.ic_menu_moreoverflow_normal_holo_dark,
91 2);
Michael Kolb1acef692011-03-08 14:12:06 -080092 mMenuAdapter = new MenuAdapter(mActivity, mUiController);
Michael Kolbeb95db42011-03-03 10:38:40 -080093 mTabAdapter = new TabAdapter(mActivity, mUiController);
94 PieStackView stack = new PieStackView(mActivity);
95 stack.setLayoutListener(new OnLayoutListener() {
96 @Override
97 public void onLayout(int ax, int ay, boolean left) {
98 buildTabs();
99 }
100 });
101 stack.setOnCurrentListener(mTabAdapter);
102 stack.setAdapter(mTabAdapter);
103 mShowTabs.setPieView(stack);
104 PieListView menuview = new PieListView(mActivity);
105 menuview.setLayoutListener(new OnLayoutListener() {
106 @Override
107 public void onLayout(int ax, int ay, boolean left) {
108 mActivity.openOptionsMenu();
109 }
110 });
111
112 mOptions.setPieView(menuview);
113 menuview.setAdapter(mMenuAdapter);
Michael Kolb2a56eca2011-02-25 09:45:06 -0800114 setClickListener(mBack,
Michael Kolb0860d992011-03-07 15:26:33 -0800115 mRefresh,
116 mForward,
Michael Kolb2a56eca2011-02-25 09:45:06 -0800117 mUrl,
Michael Kolb2a56eca2011-02-25 09:45:06 -0800118 mBookmarks,
Michael Kolb0860d992011-03-07 15:26:33 -0800119 mNewTab,
120 mClose
Michael Kolb2a56eca2011-02-25 09:45:06 -0800121 );
Michael Kolb0860d992011-03-07 15:26:33 -0800122 // level 1
123 mPie.addItem(mBack);
124 mPie.addItem(mUrl);
125 mPie.addItem(mBookmarks);
126 // level 2
127 mPie.addItem(mForward);
128 mPie.addItem(mRefresh);
Michael Kolbeb95db42011-03-03 10:38:40 -0800129 mPie.addItem(mShowTabs);
Michael Kolb0860d992011-03-07 15:26:33 -0800130 mPie.addItem(mNewTab);
131 mPie.addItem(mClose);
132 mPie.addItem(mOptions);
Michael Kolb376b5412010-12-15 11:52:57 -0800133 mPie.setController(this);
134 }
135 container.addView(mPie);
136 }
137
Michael Kolbeb95db42011-03-03 10:38:40 -0800138 private void buildTabs() {
139 final List<Tab> tabs = mUiController.getTabs();
140 mUi.captureTab(mUi.getActiveTab());
141 mTabAdapter.setTabs(tabs);
142 PieStackView sym = (PieStackView) mShowTabs.getPieView();
143 sym.setCurrent(mUiController.getTabControl().getCurrentIndex());
144
145 }
146
Michael Kolb1acef692011-03-08 14:12:06 -0800147 protected void onMenuOpened(Menu menu) {
148 mMenuAdapter.setMenu(menu);
149 }
150
Michael Kolb376b5412010-12-15 11:52:57 -0800151 protected void removeFromContainer(FrameLayout container) {
152 container.removeView(mPie);
153 }
154
Michael Kolb0860d992011-03-07 15:26:33 -0800155 private PieItem makeItem(int image, int l) {
156 ImageView view = new ImageView(mActivity);
157 view.setImageResource(image);
158 view.setMinimumWidth(48);
159 view.setMinimumHeight(48);
Michael Kolb376b5412010-12-15 11:52:57 -0800160 LayoutParams lp = new LayoutParams(48, 48);
Michael Kolb0860d992011-03-07 15:26:33 -0800161 view.setLayoutParams(lp);
162 view.setBackgroundResource(R.drawable.qc_item_selector);
163 return new PieItem(view, l);
Michael Kolb376b5412010-12-15 11:52:57 -0800164 }
165
Michael Kolb0860d992011-03-07 15:26:33 -0800166 private void setClickListener(PieItem... items) {
167 for (PieItem item : items) {
168 item.getView().setOnClickListener(this);
Michael Kolb376b5412010-12-15 11:52:57 -0800169 }
170 }
171
172 protected void forceToTop(FrameLayout container) {
173 if (mPie.getParent() != null) {
174 container.removeView(mPie);
175 container.addView(mPie);
176 }
177 }
178
179 @Override
180 public void onClick(View v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800181 Tab tab = mUiController.getTabControl().getCurrentTab();
182 WebView web = tab.getWebView();
Michael Kolb0860d992011-03-07 15:26:33 -0800183 if (mBack.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800184 web.goBack();
Michael Kolb0860d992011-03-07 15:26:33 -0800185 } else if (mForward.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800186 web.goForward();
Michael Kolb0860d992011-03-07 15:26:33 -0800187 } else if (mRefresh.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800188 if (tab.inPageLoad()) {
189 web.stopLoading();
190 } else {
191 web.reload();
192 }
Michael Kolb0860d992011-03-07 15:26:33 -0800193 } else if (mUrl.getView() == v) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800194 mUi.showTitleBarAndEdit();
Michael Kolb0860d992011-03-07 15:26:33 -0800195 } else if (mBookmarks.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800196 mUiController.bookmarksOrHistoryPicker(false);
Michael Kolb0860d992011-03-07 15:26:33 -0800197 } else if (mNewTab.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800198 mUiController.openTabToHomePage();
Michael Kolb7cdc4902011-02-03 17:54:40 -0800199 mUi.showTitleBarAndEdit();
Michael Kolb0860d992011-03-07 15:26:33 -0800200 } else if (mClose.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800201 mUiController.closeCurrentTab();
Michael Kolb376b5412010-12-15 11:52:57 -0800202 }
203 }
204
205 @Override
206 public boolean onOpen() {
Michael Kolb0860d992011-03-07 15:26:33 -0800207 return false;
Michael Kolb376b5412010-12-15 11:52:57 -0800208 }
209
Michael Kolbeb95db42011-03-03 10:38:40 -0800210 private static class TabAdapter extends BaseAdapter implements OnCurrentListener {
Michael Kolb1acef692011-03-08 14:12:06 -0800211
Michael Kolbeb95db42011-03-03 10:38:40 -0800212 LayoutInflater mInflater;
213 UiController mUiController;
214 private List<Tab> mTabs;
215 private int mCurrent;
216
217 public TabAdapter(Context ctx, UiController ctl) {
218 mInflater = LayoutInflater.from(ctx);
219 mUiController = ctl;
220 mTabs = new ArrayList<Tab>();
221 mCurrent = -1;
222 }
223
224 public void setTabs(List<Tab> tabs) {
225 mTabs = tabs;
226 notifyDataSetChanged();
Michael Kolb1acef692011-03-08 14:12:06 -0800227 }
228
229 @Override
Michael Kolbeb95db42011-03-03 10:38:40 -0800230 public int getCount() {
231 return mTabs.size();
232 }
233
234 @Override
235 public Tab getItem(int position) {
236 return mTabs.get(position);
237 }
238
239 @Override
240 public long getItemId(int position) {
241 return position;
242 }
243
244 @Override
245 public View getView(int position, View convertView, ViewGroup parent) {
246 final Tab tab = mTabs.get(position);
247 View view = mInflater.inflate(R.layout.qc_tab,
248 null);
249 ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
250 TextView title1 = (TextView) view.findViewById(R.id.title1);
251 TextView title2 = (TextView) view.findViewById(R.id.title2);
252 Bitmap b = tab.getScreenshot();
253 if (b != null) {
254 thumb.setImageBitmap(b);
255 }
256 if (position > mCurrent) {
257 title1.setVisibility(View.GONE);
258 title2.setText(tab.getTitle());
259 } else {
260 title2.setVisibility(View.GONE);
261 title1.setText(tab.getTitle());
262 }
263 view.setOnClickListener(new OnClickListener() {
264 @Override
265 public void onClick(View v) {
266 mUiController.switchToTab(mUiController.getTabControl()
267 .getTabIndex(tab));
268 }
269 });
270 return view;
271 }
272
273 @Override
274 public void onSetCurrent(int index) {
275 mCurrent = index;
Michael Kolb1acef692011-03-08 14:12:06 -0800276 }
277
278 }
279
280 private static class MenuAdapter extends BaseAdapter
281 implements OnClickListener {
282
283 List<MenuItem> mItems;
284 UiController mUiController;
285 LayoutInflater mInflater;
286
287 public MenuAdapter(Context ctx, UiController ctl) {
288 mUiController = ctl;
289 mInflater = LayoutInflater.from(ctx);
290 mItems = new ArrayList<MenuItem>();
291 }
292
293 public void setMenu(Menu menu) {
294 mItems.clear();
295 for (int i = 0; i < menu.size(); i++) {
296 MenuItem item = menu.getItem(i);
297 if (item.isEnabled() && item.isVisible()) {
298 mItems.add(item);
299 }
300 }
301 notifyDataSetChanged();
302 }
303
304 @Override
305 public int getCount() {
306 return mItems.size();
307 }
308
309 @Override
310 public MenuItem getItem(int position) {
311 return mItems.get(position);
312 }
313
314 @Override
315 public long getItemId(int position) {
316 return position;
317 }
318
319 @Override
320 public void onClick(View v) {
321 if (v.getTag() != null) {
322 mUiController.onOptionsItemSelected((MenuItem) v.getTag());
323 }
324 }
325
326 @Override
327 public View getView(int position, View convertView, ViewGroup parent) {
328 final MenuItem item = mItems.get(position);
329 View view = mInflater.inflate(
330 R.layout.qc_menu_item, null);
331 TextView label =
332 (TextView) view.findViewById(R.id.title);
333 label.setText(item.getTitle());
334 label.setTag(item);
335 label.setOnClickListener(this);
336 label.setLayoutParams(new LayoutParams(240, 32));
337 return label;
338 }
339
340 }
341
Michael Kolb376b5412010-12-15 11:52:57 -0800342}