blob: 846811dc167755915dbd61b127398cd0bec862df [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) {
110 mActivity.openOptionsMenu();
111 }
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 Kolb1acef692011-03-08 14:12:06 -0800149 protected void onMenuOpened(Menu menu) {
150 mMenuAdapter.setMenu(menu);
151 }
152
Michael Kolb376b5412010-12-15 11:52:57 -0800153 protected void removeFromContainer(FrameLayout container) {
154 container.removeView(mPie);
155 }
156
Michael Kolbf55f4b42011-03-10 18:19:57 -0800157 private View makeTabsView() {
158 View v = mActivity.getLayoutInflater().inflate(R.layout.qc_tabs_view, null);
159 mTabsCount = (TextView) v.findViewById(R.id.label);
160 mTabsCount.setText("1");
161 ImageView image = (ImageView) v.findViewById(R.id.icon);
162 image.setImageResource(R.drawable.ic_windows_holo_dark);
163 image.setScaleType(ScaleType.CENTER);
164 LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
165 v.setLayoutParams(lp);
Michael Kolbf55f4b42011-03-10 18:19:57 -0800166 return v;
167 }
168
Michael Kolb0860d992011-03-07 15:26:33 -0800169 private PieItem makeItem(int image, int l) {
170 ImageView view = new ImageView(mActivity);
171 view.setImageResource(image);
Michael Kolbf55f4b42011-03-10 18:19:57 -0800172 view.setMinimumWidth(mItemSize);
173 view.setMinimumHeight(mItemSize);
174 view.setScaleType(ScaleType.CENTER);
Michael Kolb565752e2011-03-16 16:06:03 -0700175 LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
Michael Kolb0860d992011-03-07 15:26:33 -0800176 view.setLayoutParams(lp);
Michael Kolb0860d992011-03-07 15:26:33 -0800177 return new PieItem(view, l);
Michael Kolb376b5412010-12-15 11:52:57 -0800178 }
179
Michael Kolb0860d992011-03-07 15:26:33 -0800180 private void setClickListener(PieItem... items) {
181 for (PieItem item : items) {
182 item.getView().setOnClickListener(this);
Michael Kolb376b5412010-12-15 11:52:57 -0800183 }
184 }
185
186 protected void forceToTop(FrameLayout container) {
187 if (mPie.getParent() != null) {
188 container.removeView(mPie);
189 container.addView(mPie);
190 }
191 }
192
193 @Override
194 public void onClick(View v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800195 Tab tab = mUiController.getTabControl().getCurrentTab();
196 WebView web = tab.getWebView();
Michael Kolb0860d992011-03-07 15:26:33 -0800197 if (mBack.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800198 web.goBack();
Michael Kolb0860d992011-03-07 15:26:33 -0800199 } else if (mForward.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800200 web.goForward();
Michael Kolb0860d992011-03-07 15:26:33 -0800201 } else if (mRefresh.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800202 if (tab.inPageLoad()) {
203 web.stopLoading();
204 } else {
205 web.reload();
206 }
Michael Kolb0860d992011-03-07 15:26:33 -0800207 } else if (mUrl.getView() == v) {
Michael Kolb7cdc4902011-02-03 17:54:40 -0800208 mUi.showTitleBarAndEdit();
Michael Kolb0860d992011-03-07 15:26:33 -0800209 } else if (mBookmarks.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800210 mUiController.bookmarksOrHistoryPicker(false);
Michael Kolb0860d992011-03-07 15:26:33 -0800211 } else if (mNewTab.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800212 mUiController.openTabToHomePage();
Michael Kolb7cdc4902011-02-03 17:54:40 -0800213 mUi.showTitleBarAndEdit();
Michael Kolb0860d992011-03-07 15:26:33 -0800214 } else if (mClose.getView() == v) {
Michael Kolb376b5412010-12-15 11:52:57 -0800215 mUiController.closeCurrentTab();
Michael Kolb376b5412010-12-15 11:52:57 -0800216 }
217 }
218
219 @Override
220 public boolean onOpen() {
Michael Kolbf55f4b42011-03-10 18:19:57 -0800221 int n = mUiController.getTabControl().getTabCount();
222 mTabsCount.setText(Integer.toString(n));
223 return true;
Michael Kolb376b5412010-12-15 11:52:57 -0800224 }
225
Michael Kolbeb95db42011-03-03 10:38:40 -0800226 private static class TabAdapter extends BaseAdapter implements OnCurrentListener {
Michael Kolb1acef692011-03-08 14:12:06 -0800227
Michael Kolbeb95db42011-03-03 10:38:40 -0800228 LayoutInflater mInflater;
229 UiController mUiController;
230 private List<Tab> mTabs;
231 private int mCurrent;
232
233 public TabAdapter(Context ctx, UiController ctl) {
234 mInflater = LayoutInflater.from(ctx);
235 mUiController = ctl;
236 mTabs = new ArrayList<Tab>();
237 mCurrent = -1;
238 }
239
240 public void setTabs(List<Tab> tabs) {
241 mTabs = tabs;
242 notifyDataSetChanged();
Michael Kolb1acef692011-03-08 14:12:06 -0800243 }
244
245 @Override
Michael Kolbeb95db42011-03-03 10:38:40 -0800246 public int getCount() {
247 return mTabs.size();
248 }
249
250 @Override
251 public Tab getItem(int position) {
252 return mTabs.get(position);
253 }
254
255 @Override
256 public long getItemId(int position) {
257 return position;
258 }
259
260 @Override
261 public View getView(int position, View convertView, ViewGroup parent) {
262 final Tab tab = mTabs.get(position);
263 View view = mInflater.inflate(R.layout.qc_tab,
264 null);
265 ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
266 TextView title1 = (TextView) view.findViewById(R.id.title1);
267 TextView title2 = (TextView) view.findViewById(R.id.title2);
268 Bitmap b = tab.getScreenshot();
269 if (b != null) {
270 thumb.setImageBitmap(b);
271 }
272 if (position > mCurrent) {
273 title1.setVisibility(View.GONE);
274 title2.setText(tab.getTitle());
275 } else {
276 title2.setVisibility(View.GONE);
277 title1.setText(tab.getTitle());
278 }
279 view.setOnClickListener(new OnClickListener() {
280 @Override
281 public void onClick(View v) {
282 mUiController.switchToTab(mUiController.getTabControl()
283 .getTabIndex(tab));
284 }
285 });
286 return view;
287 }
288
289 @Override
290 public void onSetCurrent(int index) {
291 mCurrent = index;
Michael Kolb1acef692011-03-08 14:12:06 -0800292 }
293
294 }
295
296 private static class MenuAdapter extends BaseAdapter
297 implements OnClickListener {
298
299 List<MenuItem> mItems;
300 UiController mUiController;
301 LayoutInflater mInflater;
302
303 public MenuAdapter(Context ctx, UiController ctl) {
304 mUiController = ctl;
305 mInflater = LayoutInflater.from(ctx);
306 mItems = new ArrayList<MenuItem>();
307 }
308
309 public void setMenu(Menu menu) {
310 mItems.clear();
311 for (int i = 0; i < menu.size(); i++) {
312 MenuItem item = menu.getItem(i);
313 if (item.isEnabled() && item.isVisible()) {
314 mItems.add(item);
315 }
316 }
317 notifyDataSetChanged();
318 }
319
320 @Override
321 public int getCount() {
322 return mItems.size();
323 }
324
325 @Override
326 public MenuItem getItem(int position) {
327 return mItems.get(position);
328 }
329
330 @Override
331 public long getItemId(int position) {
332 return position;
333 }
334
335 @Override
336 public void onClick(View v) {
337 if (v.getTag() != null) {
338 mUiController.onOptionsItemSelected((MenuItem) v.getTag());
339 }
340 }
341
342 @Override
343 public View getView(int position, View convertView, ViewGroup parent) {
344 final MenuItem item = mItems.get(position);
345 View view = mInflater.inflate(
346 R.layout.qc_menu_item, null);
347 TextView label =
348 (TextView) view.findViewById(R.id.title);
349 label.setText(item.getTitle());
350 label.setTag(item);
351 label.setOnClickListener(this);
352 label.setLayoutParams(new LayoutParams(240, 32));
353 return label;
354 }
355
356 }
357
Michael Kolb376b5412010-12-15 11:52:57 -0800358}