blob: ed3e9600f5e567903a625eaa9e1161e14e42486d [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 Kolbf55f4b42011-03-10 18:19:57 -080068 private TextView mTabsCount;
69 private int mItemSize;
Michael Kolb376b5412010-12-15 11:52:57 -080070
71 public PieControl(Activity activity, UiController controller, XLargeUi ui) {
72 mActivity = activity;
73 mUiController = controller;
74 mUi = ui;
Michael Kolbf55f4b42011-03-10 18:19:57 -080075 mItemSize = (int) activity.getResources().getDimension(R.dimen.qc_item_size);
Michael Kolb376b5412010-12-15 11:52:57 -080076 }
77
78 protected void attachToContainer(FrameLayout container) {
79 if (mPie == null) {
80 mPie = new PieMenu(mActivity);
81 LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,
82 LayoutParams.MATCH_PARENT);
83 mPie.setLayoutParams(lp);
Michael Kolb0860d992011-03-07 15:26:33 -080084 mBack = makeItem(R.drawable.ic_back_holo_dark, 1);
85 mUrl = makeItem(R.drawable.ic_web_holo_dark, 1);
86 mBookmarks = makeItem(R.drawable.ic_bookmarks_holo_dark, 1);
87 mRefresh = makeItem(R.drawable.ic_refresh_holo_dark, 2);
88 mForward = makeItem(R.drawable.ic_forward_holo_dark, 2);
89 mNewTab = makeItem(R.drawable.ic_new_window_holo_dark, 2);
90 mClose = makeItem(R.drawable.ic_close_window_holo_dark, 2);
Michael Kolbf55f4b42011-03-10 18:19:57 -080091 View tabs = makeTabsView();
92 mShowTabs = new PieItem(tabs, 2);
Michael Kolb0860d992011-03-07 15:26:33 -080093 mOptions = makeItem(
94 com.android.internal.R.drawable.ic_menu_moreoverflow_normal_holo_dark,
95 2);
Michael Kolb1acef692011-03-08 14:12:06 -080096 mMenuAdapter = new MenuAdapter(mActivity, mUiController);
Michael Kolbeb95db42011-03-03 10:38:40 -080097 mTabAdapter = new TabAdapter(mActivity, mUiController);
98 PieStackView stack = new PieStackView(mActivity);
99 stack.setLayoutListener(new OnLayoutListener() {
100 @Override
101 public void onLayout(int ax, int ay, boolean left) {
102 buildTabs();
103 }
104 });
105 stack.setOnCurrentListener(mTabAdapter);
106 stack.setAdapter(mTabAdapter);
107 mShowTabs.setPieView(stack);
108 PieListView menuview = new PieListView(mActivity);
109 menuview.setLayoutListener(new OnLayoutListener() {
110 @Override
111 public void onLayout(int ax, int ay, boolean left) {
112 mActivity.openOptionsMenu();
113 }
114 });
115
116 mOptions.setPieView(menuview);
117 menuview.setAdapter(mMenuAdapter);
Michael Kolb2a56eca2011-02-25 09:45:06 -0800118 setClickListener(mBack,
Michael Kolb0860d992011-03-07 15:26:33 -0800119 mRefresh,
120 mForward,
Michael Kolb2a56eca2011-02-25 09:45:06 -0800121 mUrl,
Michael Kolb2a56eca2011-02-25 09:45:06 -0800122 mBookmarks,
Michael Kolb0860d992011-03-07 15:26:33 -0800123 mNewTab,
124 mClose
Michael Kolb2a56eca2011-02-25 09:45:06 -0800125 );
Michael Kolb0860d992011-03-07 15:26:33 -0800126 // level 1
127 mPie.addItem(mBack);
128 mPie.addItem(mUrl);
129 mPie.addItem(mBookmarks);
130 // level 2
131 mPie.addItem(mForward);
132 mPie.addItem(mRefresh);
Michael Kolbeb95db42011-03-03 10:38:40 -0800133 mPie.addItem(mShowTabs);
Michael Kolb0860d992011-03-07 15:26:33 -0800134 mPie.addItem(mNewTab);
135 mPie.addItem(mClose);
136 mPie.addItem(mOptions);
Michael Kolb376b5412010-12-15 11:52:57 -0800137 mPie.setController(this);
138 }
139 container.addView(mPie);
140 }
141
Michael Kolbeb95db42011-03-03 10:38:40 -0800142 private void buildTabs() {
143 final List<Tab> tabs = mUiController.getTabs();
144 mUi.captureTab(mUi.getActiveTab());
145 mTabAdapter.setTabs(tabs);
146 PieStackView sym = (PieStackView) mShowTabs.getPieView();
147 sym.setCurrent(mUiController.getTabControl().getCurrentIndex());
148
149 }
150
Michael Kolb1acef692011-03-08 14:12:06 -0800151 protected void onMenuOpened(Menu menu) {
152 mMenuAdapter.setMenu(menu);
153 }
154
Michael Kolb376b5412010-12-15 11:52:57 -0800155 protected void removeFromContainer(FrameLayout container) {
156 container.removeView(mPie);
157 }
158
Michael Kolbf55f4b42011-03-10 18:19:57 -0800159 private View makeTabsView() {
160 View v = mActivity.getLayoutInflater().inflate(R.layout.qc_tabs_view, null);
161 mTabsCount = (TextView) v.findViewById(R.id.label);
162 mTabsCount.setText("1");
163 ImageView image = (ImageView) v.findViewById(R.id.icon);
164 image.setImageResource(R.drawable.ic_windows_holo_dark);
165 image.setScaleType(ScaleType.CENTER);
166 LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
167 v.setLayoutParams(lp);
168 v.setBackgroundResource(R.drawable.qc_item_selector);
169 return v;
170 }
171
Michael Kolb0860d992011-03-07 15:26:33 -0800172 private PieItem makeItem(int image, int l) {
173 ImageView view = new ImageView(mActivity);
174 view.setImageResource(image);
Michael Kolbf55f4b42011-03-10 18:19:57 -0800175 view.setMinimumWidth(mItemSize);
176 view.setMinimumHeight(mItemSize);
177 view.setScaleType(ScaleType.CENTER);
178 LayoutParams lp = new LayoutParams(mItemSize,mItemSize);
Michael Kolb0860d992011-03-07 15:26:33 -0800179 view.setLayoutParams(lp);
180 view.setBackgroundResource(R.drawable.qc_item_selector);
181 return new PieItem(view, l);
Michael Kolb376b5412010-12-15 11:52:57 -0800182 }
183
Michael Kolb0860d992011-03-07 15:26:33 -0800184 private void setClickListener(PieItem... items) {
185 for (PieItem item : items) {
186 item.getView().setOnClickListener(this);
Michael Kolb376b5412010-12-15 11:52:57 -0800187 }
188 }
189
190 protected void forceToTop(FrameLayout container) {
191 if (mPie.getParent() != null) {
192 container.removeView(mPie);
193 container.addView(mPie);
194 }
195 }
196
197 @Override
198 public void onClick(View v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800199 Tab tab = mUiController.getTabControl().getCurrentTab();
200 WebView web = tab.getWebView();
Michael Kolb0860d992011-03-07 15:26:33 -0800201 if (mBack.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800202 web.goBack();
Michael Kolb0860d992011-03-07 15:26:33 -0800203 } else if (mForward.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800204 web.goForward();
Michael Kolb0860d992011-03-07 15:26:33 -0800205 } else if (mRefresh.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800206 if (tab.inPageLoad()) {
207 web.stopLoading();
208 } else {
209 web.reload();
210 }
Michael Kolb0860d992011-03-07 15:26:33 -0800211 } else if (mUrl.getView() == v) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800212 mUi.showTitleBarAndEdit();
Michael Kolb0860d992011-03-07 15:26:33 -0800213 } else if (mBookmarks.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800214 mUiController.bookmarksOrHistoryPicker(false);
Michael Kolb0860d992011-03-07 15:26:33 -0800215 } else if (mNewTab.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800216 mUiController.openTabToHomePage();
Michael Kolb7cdc4902011-02-03 17:54:40 -0800217 mUi.showTitleBarAndEdit();
Michael Kolb0860d992011-03-07 15:26:33 -0800218 } else if (mClose.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800219 mUiController.closeCurrentTab();
Michael Kolb376b5412010-12-15 11:52:57 -0800220 }
221 }
222
223 @Override
224 public boolean onOpen() {
Michael Kolbf55f4b42011-03-10 18:19:57 -0800225 int n = mUiController.getTabControl().getTabCount();
226 mTabsCount.setText(Integer.toString(n));
227 return true;
Michael Kolb376b5412010-12-15 11:52:57 -0800228 }
229
Michael Kolbeb95db42011-03-03 10:38:40 -0800230 private static class TabAdapter extends BaseAdapter implements OnCurrentListener {
Michael Kolb1acef692011-03-08 14:12:06 -0800231
Michael Kolbeb95db42011-03-03 10:38:40 -0800232 LayoutInflater mInflater;
233 UiController mUiController;
234 private List<Tab> mTabs;
235 private int mCurrent;
236
237 public TabAdapter(Context ctx, UiController ctl) {
238 mInflater = LayoutInflater.from(ctx);
239 mUiController = ctl;
240 mTabs = new ArrayList<Tab>();
241 mCurrent = -1;
242 }
243
244 public void setTabs(List<Tab> tabs) {
245 mTabs = tabs;
246 notifyDataSetChanged();
Michael Kolb1acef692011-03-08 14:12:06 -0800247 }
248
249 @Override
Michael Kolbeb95db42011-03-03 10:38:40 -0800250 public int getCount() {
251 return mTabs.size();
252 }
253
254 @Override
255 public Tab getItem(int position) {
256 return mTabs.get(position);
257 }
258
259 @Override
260 public long getItemId(int position) {
261 return position;
262 }
263
264 @Override
265 public View getView(int position, View convertView, ViewGroup parent) {
266 final Tab tab = mTabs.get(position);
267 View view = mInflater.inflate(R.layout.qc_tab,
268 null);
269 ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
270 TextView title1 = (TextView) view.findViewById(R.id.title1);
271 TextView title2 = (TextView) view.findViewById(R.id.title2);
272 Bitmap b = tab.getScreenshot();
273 if (b != null) {
274 thumb.setImageBitmap(b);
275 }
276 if (position > mCurrent) {
277 title1.setVisibility(View.GONE);
278 title2.setText(tab.getTitle());
279 } else {
280 title2.setVisibility(View.GONE);
281 title1.setText(tab.getTitle());
282 }
283 view.setOnClickListener(new OnClickListener() {
284 @Override
285 public void onClick(View v) {
286 mUiController.switchToTab(mUiController.getTabControl()
287 .getTabIndex(tab));
288 }
289 });
290 return view;
291 }
292
293 @Override
294 public void onSetCurrent(int index) {
295 mCurrent = index;
Michael Kolb1acef692011-03-08 14:12:06 -0800296 }
297
298 }
299
300 private static class MenuAdapter extends BaseAdapter
301 implements OnClickListener {
302
303 List<MenuItem> mItems;
304 UiController mUiController;
305 LayoutInflater mInflater;
306
307 public MenuAdapter(Context ctx, UiController ctl) {
308 mUiController = ctl;
309 mInflater = LayoutInflater.from(ctx);
310 mItems = new ArrayList<MenuItem>();
311 }
312
313 public void setMenu(Menu menu) {
314 mItems.clear();
315 for (int i = 0; i < menu.size(); i++) {
316 MenuItem item = menu.getItem(i);
317 if (item.isEnabled() && item.isVisible()) {
318 mItems.add(item);
319 }
320 }
321 notifyDataSetChanged();
322 }
323
324 @Override
325 public int getCount() {
326 return mItems.size();
327 }
328
329 @Override
330 public MenuItem getItem(int position) {
331 return mItems.get(position);
332 }
333
334 @Override
335 public long getItemId(int position) {
336 return position;
337 }
338
339 @Override
340 public void onClick(View v) {
341 if (v.getTag() != null) {
342 mUiController.onOptionsItemSelected((MenuItem) v.getTag());
343 }
344 }
345
346 @Override
347 public View getView(int position, View convertView, ViewGroup parent) {
348 final MenuItem item = mItems.get(position);
349 View view = mInflater.inflate(
350 R.layout.qc_menu_item, null);
351 TextView label =
352 (TextView) view.findViewById(R.id.title);
353 label.setText(item.getTitle());
354 label.setTag(item);
355 label.setOnClickListener(this);
356 label.setLayoutParams(new LayoutParams(240, 32));
357 return label;
358 }
359
360 }
361
Michael Kolb376b5412010-12-15 11:52:57 -0800362}