blob: 684cd1a1a1fc5b680892a37e46dc8dd41af9345b [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;
Michael Kolb1acef692011-03-08 14:12:06 -080029import android.view.LayoutInflater;
30import android.view.Menu;
31import android.view.MenuItem;
Michael Kolb376b5412010-12-15 11:52:57 -080032import android.view.View;
33import android.view.View.OnClickListener;
Michael Kolb1acef692011-03-08 14:12:06 -080034import android.view.ViewGroup;
Michael Kolb376b5412010-12-15 11:52:57 -080035import android.view.ViewGroup.LayoutParams;
36import android.webkit.WebView;
Michael Kolb1acef692011-03-08 14:12:06 -080037import android.widget.BaseAdapter;
Michael Kolb376b5412010-12-15 11:52:57 -080038import android.widget.FrameLayout;
39import android.widget.ImageView;
Michael Kolbeb95db42011-03-03 10:38:40 -080040import android.widget.ImageView.ScaleType;
Michael Kolb1acef692011-03-08 14:12:06 -080041import android.widget.TextView;
42
43import java.util.ArrayList;
44import java.util.List;
Michael Kolb376b5412010-12-15 11:52:57 -080045
Michael Kolb376b5412010-12-15 11:52:57 -080046/**
47 * controller for Quick Controls pie menu
48 */
49public class PieControl implements OnClickListener, PieMenu.PieController {
50
51 private Activity mActivity;
52 private UiController mUiController;
Michael Kolbfdb70242011-03-24 09:41:11 -070053 private BaseUi mUi;
Michael Kolb376b5412010-12-15 11:52:57 -080054 private PieMenu mPie;
Michael Kolb0860d992011-03-07 15:26:33 -080055 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 mNewTab;
62 private PieItem mClose;
Michael Kolb1acef692011-03-08 14:12:06 -080063 private MenuAdapter mMenuAdapter;
Michael Kolbeb95db42011-03-03 10:38:40 -080064 private PieItem mShowTabs;
65 private TabAdapter mTabAdapter;
Michael Kolbf55f4b42011-03-10 18:19:57 -080066 private TextView mTabsCount;
67 private int mItemSize;
Michael Kolb376b5412010-12-15 11:52:57 -080068
Michael Kolbfdb70242011-03-24 09:41:11 -070069 public PieControl(Activity activity, UiController controller, BaseUi ui) {
Michael Kolb376b5412010-12-15 11:52:57 -080070 mActivity = activity;
71 mUiController = controller;
72 mUi = ui;
Michael Kolbf55f4b42011-03-10 18:19:57 -080073 mItemSize = (int) activity.getResources().getDimension(R.dimen.qc_item_size);
Michael Kolb376b5412010-12-15 11:52:57 -080074 }
75
76 protected void attachToContainer(FrameLayout container) {
77 if (mPie == null) {
78 mPie = new PieMenu(mActivity);
79 LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,
80 LayoutParams.MATCH_PARENT);
81 mPie.setLayoutParams(lp);
Michael Kolb0860d992011-03-07 15:26:33 -080082 mBack = makeItem(R.drawable.ic_back_holo_dark, 1);
83 mUrl = makeItem(R.drawable.ic_web_holo_dark, 1);
84 mBookmarks = makeItem(R.drawable.ic_bookmarks_holo_dark, 1);
85 mRefresh = makeItem(R.drawable.ic_refresh_holo_dark, 2);
86 mForward = makeItem(R.drawable.ic_forward_holo_dark, 2);
87 mNewTab = makeItem(R.drawable.ic_new_window_holo_dark, 2);
88 mClose = makeItem(R.drawable.ic_close_window_holo_dark, 2);
Michael Kolbf55f4b42011-03-10 18:19:57 -080089 View tabs = makeTabsView();
90 mShowTabs = new PieItem(tabs, 2);
Michael Kolb0860d992011-03-07 15:26:33 -080091 mOptions = makeItem(
92 com.android.internal.R.drawable.ic_menu_moreoverflow_normal_holo_dark,
93 2);
Michael Kolb1acef692011-03-08 14:12:06 -080094 mMenuAdapter = new MenuAdapter(mActivity, mUiController);
Michael Kolbeb95db42011-03-03 10:38:40 -080095 mTabAdapter = new TabAdapter(mActivity, mUiController);
96 PieStackView stack = new PieStackView(mActivity);
97 stack.setLayoutListener(new OnLayoutListener() {
98 @Override
99 public void onLayout(int ax, int ay, boolean left) {
100 buildTabs();
101 }
102 });
103 stack.setOnCurrentListener(mTabAdapter);
104 stack.setAdapter(mTabAdapter);
105 mShowTabs.setPieView(stack);
106 PieListView menuview = new PieListView(mActivity);
107 menuview.setLayoutListener(new OnLayoutListener() {
108 @Override
109 public void onLayout(int ax, int ay, boolean left) {
Michael Kolb8f11d062011-04-25 12:47:07 -0700110 buildMenu();
Michael Kolbeb95db42011-03-03 10:38:40 -0800111 }
112 });
113
114 mOptions.setPieView(menuview);
115 menuview.setAdapter(mMenuAdapter);
Michael Kolb2a56eca2011-02-25 09:45:06 -0800116 setClickListener(mBack,
Michael Kolb0860d992011-03-07 15:26:33 -0800117 mRefresh,
118 mForward,
Michael Kolb2a56eca2011-02-25 09:45:06 -0800119 mUrl,
Michael Kolb2a56eca2011-02-25 09:45:06 -0800120 mBookmarks,
Michael Kolb0860d992011-03-07 15:26:33 -0800121 mNewTab,
122 mClose
Michael Kolb2a56eca2011-02-25 09:45:06 -0800123 );
Michael Kolb0860d992011-03-07 15:26:33 -0800124 // level 1
125 mPie.addItem(mBack);
126 mPie.addItem(mUrl);
127 mPie.addItem(mBookmarks);
128 // level 2
129 mPie.addItem(mForward);
130 mPie.addItem(mRefresh);
Michael Kolbc16c5952011-03-29 15:37:03 -0700131 mPie.addItem(mOptions);
Michael Kolbeb95db42011-03-03 10:38:40 -0800132 mPie.addItem(mShowTabs);
Michael Kolb0860d992011-03-07 15:26:33 -0800133 mPie.addItem(mNewTab);
134 mPie.addItem(mClose);
Michael Kolb376b5412010-12-15 11:52:57 -0800135 mPie.setController(this);
136 }
137 container.addView(mPie);
138 }
139
Michael Kolbeb95db42011-03-03 10:38:40 -0800140 private void buildTabs() {
141 final List<Tab> tabs = mUiController.getTabs();
142 mUi.captureTab(mUi.getActiveTab());
143 mTabAdapter.setTabs(tabs);
144 PieStackView sym = (PieStackView) mShowTabs.getPieView();
145 sym.setCurrent(mUiController.getTabControl().getCurrentIndex());
146
147 }
148
Michael Kolb8f11d062011-04-25 12:47:07 -0700149 private void buildMenu() {
150 Menu menu = mUi.getMenu();
151 menu.setGroupVisible(R.id.NAV_MENU, false);
Michael Kolb1acef692011-03-08 14:12:06 -0800152 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);
Michael Kolbf55f4b42011-03-10 18:19:57 -0800168 return v;
169 }
170
Michael Kolb0860d992011-03-07 15:26:33 -0800171 private PieItem makeItem(int image, int l) {
172 ImageView view = new ImageView(mActivity);
173 view.setImageResource(image);
Michael Kolbf55f4b42011-03-10 18:19:57 -0800174 view.setMinimumWidth(mItemSize);
175 view.setMinimumHeight(mItemSize);
176 view.setScaleType(ScaleType.CENTER);
Michael Kolb565752e2011-03-16 16:06:03 -0700177 LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
Michael Kolb0860d992011-03-07 15:26:33 -0800178 view.setLayoutParams(lp);
Michael Kolb0860d992011-03-07 15:26:33 -0800179 return new PieItem(view, l);
Michael Kolb376b5412010-12-15 11:52:57 -0800180 }
181
Michael Kolb0860d992011-03-07 15:26:33 -0800182 private void setClickListener(PieItem... items) {
183 for (PieItem item : items) {
184 item.getView().setOnClickListener(this);
Michael Kolb376b5412010-12-15 11:52:57 -0800185 }
186 }
187
188 protected void forceToTop(FrameLayout container) {
189 if (mPie.getParent() != null) {
190 container.removeView(mPie);
191 container.addView(mPie);
192 }
193 }
194
195 @Override
196 public void onClick(View v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800197 Tab tab = mUiController.getTabControl().getCurrentTab();
198 WebView web = tab.getWebView();
Michael Kolb0860d992011-03-07 15:26:33 -0800199 if (mBack.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800200 web.goBack();
Michael Kolb0860d992011-03-07 15:26:33 -0800201 } else if (mForward.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800202 web.goForward();
Michael Kolb0860d992011-03-07 15:26:33 -0800203 } else if (mRefresh.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800204 if (tab.inPageLoad()) {
205 web.stopLoading();
206 } else {
207 web.reload();
208 }
Michael Kolb0860d992011-03-07 15:26:33 -0800209 } else if (mUrl.getView() == v) {
Michael Kolb46f987e2011-04-05 10:39:10 -0700210 mUi.editUrl(false);
Michael Kolb0860d992011-03-07 15:26:33 -0800211 } else if (mBookmarks.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800212 mUiController.bookmarksOrHistoryPicker(false);
Michael Kolb0860d992011-03-07 15:26:33 -0800213 } else if (mNewTab.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800214 mUiController.openTabToHomePage();
Michael Kolb46f987e2011-04-05 10:39:10 -0700215 mUi.editUrl(false);
Michael Kolb0860d992011-03-07 15:26:33 -0800216 } else if (mClose.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800217 mUiController.closeCurrentTab();
Michael Kolb376b5412010-12-15 11:52:57 -0800218 }
219 }
220
221 @Override
222 public boolean onOpen() {
Michael Kolbf55f4b42011-03-10 18:19:57 -0800223 int n = mUiController.getTabControl().getTabCount();
224 mTabsCount.setText(Integer.toString(n));
225 return true;
Michael Kolb376b5412010-12-15 11:52:57 -0800226 }
227
Michael Kolbeb95db42011-03-03 10:38:40 -0800228 private static class TabAdapter extends BaseAdapter implements OnCurrentListener {
Michael Kolb1acef692011-03-08 14:12:06 -0800229
Michael Kolbeb95db42011-03-03 10:38:40 -0800230 LayoutInflater mInflater;
231 UiController mUiController;
232 private List<Tab> mTabs;
233 private int mCurrent;
234
235 public TabAdapter(Context ctx, UiController ctl) {
236 mInflater = LayoutInflater.from(ctx);
237 mUiController = ctl;
238 mTabs = new ArrayList<Tab>();
239 mCurrent = -1;
240 }
241
242 public void setTabs(List<Tab> tabs) {
243 mTabs = tabs;
244 notifyDataSetChanged();
Michael Kolb1acef692011-03-08 14:12:06 -0800245 }
246
247 @Override
Michael Kolbeb95db42011-03-03 10:38:40 -0800248 public int getCount() {
249 return mTabs.size();
250 }
251
252 @Override
253 public Tab getItem(int position) {
254 return mTabs.get(position);
255 }
256
257 @Override
258 public long getItemId(int position) {
259 return position;
260 }
261
262 @Override
263 public View getView(int position, View convertView, ViewGroup parent) {
264 final Tab tab = mTabs.get(position);
265 View view = mInflater.inflate(R.layout.qc_tab,
266 null);
267 ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
268 TextView title1 = (TextView) view.findViewById(R.id.title1);
269 TextView title2 = (TextView) view.findViewById(R.id.title2);
270 Bitmap b = tab.getScreenshot();
271 if (b != null) {
272 thumb.setImageBitmap(b);
273 }
274 if (position > mCurrent) {
275 title1.setVisibility(View.GONE);
276 title2.setText(tab.getTitle());
277 } else {
278 title2.setVisibility(View.GONE);
279 title1.setText(tab.getTitle());
280 }
281 view.setOnClickListener(new OnClickListener() {
282 @Override
283 public void onClick(View v) {
284 mUiController.switchToTab(mUiController.getTabControl()
285 .getTabIndex(tab));
286 }
287 });
288 return view;
289 }
290
291 @Override
292 public void onSetCurrent(int index) {
293 mCurrent = index;
Michael Kolb1acef692011-03-08 14:12:06 -0800294 }
295
296 }
297
298 private static class MenuAdapter extends BaseAdapter
299 implements OnClickListener {
300
301 List<MenuItem> mItems;
302 UiController mUiController;
303 LayoutInflater mInflater;
304
305 public MenuAdapter(Context ctx, UiController ctl) {
306 mUiController = ctl;
307 mInflater = LayoutInflater.from(ctx);
308 mItems = new ArrayList<MenuItem>();
309 }
310
311 public void setMenu(Menu menu) {
312 mItems.clear();
313 for (int i = 0; i < menu.size(); i++) {
314 MenuItem item = menu.getItem(i);
315 if (item.isEnabled() && item.isVisible()) {
316 mItems.add(item);
317 }
318 }
319 notifyDataSetChanged();
320 }
321
322 @Override
323 public int getCount() {
324 return mItems.size();
325 }
326
327 @Override
328 public MenuItem getItem(int position) {
329 return mItems.get(position);
330 }
331
332 @Override
333 public long getItemId(int position) {
334 return position;
335 }
336
337 @Override
338 public void onClick(View v) {
339 if (v.getTag() != null) {
340 mUiController.onOptionsItemSelected((MenuItem) v.getTag());
341 }
342 }
343
344 @Override
345 public View getView(int position, View convertView, ViewGroup parent) {
346 final MenuItem item = mItems.get(position);
347 View view = mInflater.inflate(
348 R.layout.qc_menu_item, null);
349 TextView label =
350 (TextView) view.findViewById(R.id.title);
351 label.setText(item.getTitle());
352 label.setTag(item);
353 label.setOnClickListener(this);
354 label.setLayoutParams(new LayoutParams(240, 32));
355 return label;
356 }
357
358 }
359
Michael Kolb376b5412010-12-15 11:52:57 -0800360}