blob: 68f79831bfcb3461b0f9ffcc0f2f748d5ffe40b9 [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
Bijan Amirzada41242f22014-03-21 12:12:18 -070017package com.android.browser;
Michael Kolb80f75082012-04-10 10:50:06 -070018
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;
Bijan Amirzada9b1e9882014-02-26 17:15:46 -080027import org.codeaurora.swe.WebView;
Michael Kolb80f75082012-04-10 10:50:06 -070028import android.widget.BaseAdapter;
29import android.widget.FrameLayout;
30import android.widget.ImageView;
31import android.widget.ImageView.ScaleType;
32import android.widget.TextView;
33
Bijan Amirzada41242f22014-03-21 12:12:18 -070034import com.android.browser.R;
35import com.android.browser.UI.ComboViews;
36import com.android.browser.view.PieItem;
37import com.android.browser.view.PieMenu;
38import com.android.browser.view.PieStackView;
39import com.android.browser.view.PieMenu.PieView.OnLayoutListener;
40import com.android.browser.view.PieStackView.OnCurrentListener;
Michael Kolb80f75082012-04-10 10:50:06 -070041
42import java.util.ArrayList;
43import java.util.List;
44
45/**
46 * Controller for Quick Controls pie menu
47 */
48public class PieControl implements PieMenu.PieController, OnClickListener {
49
50 protected Activity mActivity;
51 protected UiController mUiController;
52 protected PieMenu mPie;
53 protected int mItemSize;
54 protected TextView mTabsCount;
55 private BaseUi mUi;
56 private PieItem mBack;
57 private PieItem mForward;
58 private PieItem mRefresh;
59 private PieItem mUrl;
60 private PieItem mOptions;
61 private PieItem mBookmarks;
62 private PieItem mHistory;
63 private PieItem mAddBookmark;
64 private PieItem mNewTab;
65 private PieItem mIncognito;
66 private PieItem mClose;
67 private PieItem mShowTabs;
68 private PieItem mInfo;
69 private PieItem mFind;
70 private PieItem mShare;
71 private PieItem mRDS;
72 private TabAdapter mTabAdapter;
73
74 public PieControl(Activity activity, UiController controller, BaseUi ui) {
75 mActivity = activity;
76 mUiController = controller;
77 mItemSize = (int) activity.getResources().getDimension(R.dimen.qc_item_size);
78 mUi = ui;
79 }
80
81 public void stopEditingUrl() {
82 mUi.stopEditingUrl();
83 }
84
85 protected void attachToContainer(FrameLayout container) {
86 if (mPie == null) {
87 mPie = new PieMenu(mActivity);
88 LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,
89 LayoutParams.MATCH_PARENT);
90 mPie.setLayoutParams(lp);
91 populateMenu();
92 mPie.setController(this);
93 }
94 container.addView(mPie);
95 }
96
97 protected void removeFromContainer(FrameLayout container) {
98 container.removeView(mPie);
99 }
100
101 protected void forceToTop(FrameLayout container) {
102 if (mPie.getParent() != null) {
103 container.removeView(mPie);
104 container.addView(mPie);
105 }
106 }
107
108 protected void setClickListener(OnClickListener listener, PieItem... items) {
109 for (PieItem item : items) {
110 item.getView().setOnClickListener(listener);
111 }
112 }
113
114 @Override
115 public boolean onOpen() {
116 int n = mUiController.getTabControl().getTabCount();
117 mTabsCount.setText(Integer.toString(n));
118 Tab tab = mUiController.getCurrentTab();
Michael Kolb5fea4a22012-05-07 10:50:50 -0700119 if (tab != null) {
120 mForward.setEnabled(tab.canGoForward());
121 }
Michael Kolbaf63dba2012-05-16 12:58:05 -0700122 WebView view = mUiController.getCurrentWebView();
123 if (view != null) {
124 ImageView icon = (ImageView) mRDS.getView();
125 if (mUiController.getSettings().hasDesktopUseragent(view)) {
126 icon.setImageResource(R.drawable.ic_mobile);
127 } else {
128 icon.setImageResource(R.drawable.ic_desktop_holo_dark);
129 }
130 }
Michael Kolb80f75082012-04-10 10:50:06 -0700131 return true;
132 }
133
134 protected void populateMenu() {
135 mBack = makeItem(R.drawable.ic_back_holo_dark, 1);
136 mUrl = makeItem(R.drawable.ic_web_holo_dark, 1);
137 mBookmarks = makeItem(R.drawable.ic_bookmarks_holo_dark, 1);
138 mHistory = makeItem(R.drawable.ic_history_holo_dark, 1);
139 mAddBookmark = makeItem(R.drawable.ic_bookmark_on_holo_dark, 1);
140 mRefresh = makeItem(R.drawable.ic_refresh_holo_dark, 1);
141 mForward = makeItem(R.drawable.ic_forward_holo_dark, 1);
142 mNewTab = makeItem(R.drawable.ic_new_window_holo_dark, 1);
143 mIncognito = makeItem(R.drawable.ic_new_incognito_holo_dark, 1);
144 mClose = makeItem(R.drawable.ic_close_window_holo_dark, 1);
145 mInfo = makeItem(android.R.drawable.ic_menu_info_details, 1);
146 mFind = makeItem(R.drawable.ic_search_holo_dark, 1);
147 mShare = makeItem(R.drawable.ic_share_holo_dark, 1);
148 View tabs = makeTabsView();
149 mShowTabs = new PieItem(tabs, 1);
150 mOptions = makeItem(R.drawable.ic_settings_holo_dark, 1);
151 mRDS = makeItem(R.drawable.ic_desktop_holo_dark, 1);
152 mTabAdapter = new TabAdapter(mActivity, mUiController);
153 PieStackView stack = new PieStackView(mActivity);
154 stack.setLayoutListener(new OnLayoutListener() {
155 @Override
156 public void onLayout(int ax, int ay, boolean left) {
157 buildTabs();
158 }
159 });
160 stack.setOnCurrentListener(mTabAdapter);
161 stack.setAdapter(mTabAdapter);
162 mShowTabs.setPieView(stack);
163 setClickListener(this, mBack, mRefresh, mForward, mUrl, mFind, mInfo,
164 mShare, mBookmarks, mNewTab, mIncognito, mClose, mHistory,
165 mAddBookmark, mOptions, mRDS);
Michael Kolba34ae502012-04-23 12:51:30 -0700166 if (!BrowserActivity.isTablet(mActivity)) {
167 mShowTabs.getView().setOnClickListener(this);
168 }
Michael Kolb80f75082012-04-10 10:50:06 -0700169 // level 1
170 mPie.addItem(mOptions);
171 mOptions.addItem(mRDS);
172 mOptions.addItem(makeFiller());
173 mOptions.addItem(makeFiller());
174 mOptions.addItem(makeFiller());
175 mPie.addItem(mBack);
176 mBack.addItem(mRefresh);
177 mBack.addItem(mForward);
178 mBack.addItem(makeFiller());
179 mBack.addItem(makeFiller());
180 mPie.addItem(mUrl);
181 mUrl.addItem(mFind);
182 mUrl.addItem(mShare);
183 mUrl.addItem(makeFiller());
184 mUrl.addItem(makeFiller());
185 mPie.addItem(mShowTabs);
186 mShowTabs.addItem(mClose);
187 mShowTabs.addItem(mIncognito);
188 mShowTabs.addItem(mNewTab);
189 mShowTabs.addItem(makeFiller());
190 mPie.addItem(mBookmarks);
191 mBookmarks.addItem(makeFiller());
192 mBookmarks.addItem(makeFiller());
193 mBookmarks.addItem(mAddBookmark);
194 mBookmarks.addItem(mHistory);
195 }
196
197 @Override
198 public void onClick(View v) {
199 Tab tab = mUiController.getTabControl().getCurrentTab();
200 WebView web = tab.getWebView();
201 if (mBack.getView() == v) {
202 tab.goBack();
203 } else if (mForward.getView() == v) {
204 tab.goForward();
205 } else if (mRefresh.getView() == v) {
206 if (tab.inPageLoad()) {
207 web.stopLoading();
208 } else {
209 web.reload();
210 }
211 } else if (mUrl.getView() == v) {
Michael Kolb1f9b3562012-04-24 14:38:34 -0700212 mUi.editUrl(false, true);
Michael Kolb80f75082012-04-10 10:50:06 -0700213 } else if (mBookmarks.getView() == v) {
214 mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
215 } else if (mHistory.getView() == v) {
216 mUiController.bookmarksOrHistoryPicker(ComboViews.History);
217 } else if (mAddBookmark.getView() == v) {
218 mUiController.bookmarkCurrentPage();
219 } else if (mNewTab.getView() == v) {
220 mUiController.openTabToHomePage();
Michael Kolb1f9b3562012-04-24 14:38:34 -0700221 mUi.editUrl(false, true);
Michael Kolb80f75082012-04-10 10:50:06 -0700222 } else if (mIncognito.getView() == v) {
223 mUiController.openIncognitoTab();
Michael Kolb1f9b3562012-04-24 14:38:34 -0700224 mUi.editUrl(false, true);
Michael Kolb80f75082012-04-10 10:50:06 -0700225 } else if (mClose.getView() == v) {
226 mUiController.closeCurrentTab();
227 } else if (mOptions.getView() == v) {
228 mUiController.openPreferences();
229 } else if (mShare.getView() == v) {
230 mUiController.shareCurrentPage();
231 } else if (mInfo.getView() == v) {
232 mUiController.showPageInfo();
233 } else if (mFind.getView() == v) {
234 mUiController.findOnPage();
235 } else if (mRDS.getView() == v) {
236 mUiController.toggleUserAgent();
Michael Kolba34ae502012-04-23 12:51:30 -0700237 } else if (mShowTabs.getView() == v) {
238 ((PhoneUi) mUi).showNavScreen();
Michael Kolb80f75082012-04-10 10:50:06 -0700239 }
240 }
241
242 private void buildTabs() {
243 final List<Tab> tabs = mUiController.getTabs();
244 mUi.getActiveTab().capture();
245 mTabAdapter.setTabs(tabs);
246 PieStackView sym = (PieStackView) mShowTabs.getPieView();
247 sym.setCurrent(mUiController.getTabControl().getCurrentPosition());
248 }
249
250 protected PieItem makeItem(int image, int l) {
251 ImageView view = new ImageView(mActivity);
252 view.setImageResource(image);
253 view.setMinimumWidth(mItemSize);
254 view.setMinimumHeight(mItemSize);
255 view.setScaleType(ScaleType.CENTER);
256 LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
257 view.setLayoutParams(lp);
258 return new PieItem(view, l);
259 }
260
261 protected PieItem makeFiller() {
262 return new PieItem(null, 1);
263 }
264
265 protected View makeTabsView() {
266 View v = mActivity.getLayoutInflater().inflate(R.layout.qc_tabs_view, null);
267 mTabsCount = (TextView) v.findViewById(R.id.label);
268 mTabsCount.setText("1");
269 ImageView image = (ImageView) v.findViewById(R.id.icon);
270 image.setImageResource(R.drawable.ic_windows_holo_dark);
271 image.setScaleType(ScaleType.CENTER);
272 LayoutParams lp = new LayoutParams(mItemSize, mItemSize);
273 v.setLayoutParams(lp);
274 return v;
275 }
276
277 static class TabAdapter extends BaseAdapter implements OnCurrentListener {
278
279 LayoutInflater mInflater;
280 UiController mUiController;
281 private List<Tab> mTabs;
282 private int mCurrent;
283
284 public TabAdapter(Context ctx, UiController ctl) {
285 mInflater = LayoutInflater.from(ctx);
286 mUiController = ctl;
287 mTabs = new ArrayList<Tab>();
288 mCurrent = -1;
289 }
290
291 public void setTabs(List<Tab> tabs) {
292 mTabs = tabs;
293 notifyDataSetChanged();
294 }
295
296 @Override
297 public int getCount() {
298 return mTabs.size();
299 }
300
301 @Override
302 public Tab getItem(int position) {
303 return mTabs.get(position);
304 }
305
306 @Override
307 public long getItemId(int position) {
308 return position;
309 }
310
311 @Override
312 public View getView(int position, View convertView, ViewGroup parent) {
313 final Tab tab = mTabs.get(position);
314 View view = mInflater.inflate(R.layout.qc_tab,
315 null);
316 ImageView thumb = (ImageView) view.findViewById(R.id.thumb);
317 TextView title1 = (TextView) view.findViewById(R.id.title1);
318 TextView title2 = (TextView) view.findViewById(R.id.title2);
319 Bitmap b = tab.getScreenshot();
320 if (b != null) {
321 thumb.setImageBitmap(b);
322 }
323 if (position > mCurrent) {
324 title1.setVisibility(View.GONE);
325 title2.setText(tab.getTitle());
326 } else {
327 title2.setVisibility(View.GONE);
328 title1.setText(tab.getTitle());
329 }
330 view.setOnClickListener(new OnClickListener() {
331 @Override
332 public void onClick(View v) {
333 mUiController.switchToTab(tab);
334 }
335 });
336 return view;
337 }
338
339 @Override
340 public void onSetCurrent(int index) {
341 mCurrent = index;
342 }
343
344 }
345
346}