blob: edbaa3be496655dd756880894503056834d9db1c [file] [log] [blame]
Michael Kolbf2055602011-04-09 17:20:03 -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
17package com.android.browser;
18
19import android.app.Activity;
20import android.content.Context;
21import android.graphics.Bitmap;
22import android.view.LayoutInflater;
23import android.view.Menu;
24import android.view.MenuItem;
25import android.view.View;
26import android.view.View.OnClickListener;
27import android.view.ViewGroup;
28import android.webkit.WebView;
29import android.widget.AdapterView;
30import android.widget.AdapterView.OnItemClickListener;
31import android.widget.AdapterView.OnItemSelectedListener;
32import android.widget.BaseAdapter;
33import android.widget.FrameLayout;
34import android.widget.Gallery;
35import android.widget.ImageButton;
36import android.widget.ImageView;
Michael Kolbf2055602011-04-09 17:20:03 -070037import android.widget.LinearLayout;
38import android.widget.ListPopupWindow;
39import android.widget.TextView;
40
41import java.util.ArrayList;
42import java.util.List;
43
44public class NavScreen extends LinearLayout implements OnClickListener {
45
46 UiController mUiController;
47 PhoneUi mUi;
48 Tab mTab;
49 Activity mActivity;
50
51 View mTopPanel;
52 ImageButton mBack;
53 ImageButton mRefresh;
54 ImageButton mForward;
55 ImageButton mTabs;
56 ImageButton mBookmarks;
57 ImageButton mMore;
58 ImageButton mNewTab;
59 ImageButton mNewIncognito;
60 FrameLayout mHolder;
61
62 Gallery mFlipper;
63 int mTabWidth;
64 int mTabHeight;
65 TabAdapter mAdapter;
66 ListPopupWindow mPopup;
Michael Kolbf2055602011-04-09 17:20:03 -070067
68 public NavScreen(Activity activity, UiController ctl, PhoneUi ui) {
69 super(activity);
70 mActivity = activity;
71 mUiController = ctl;
72 mUi = ui;
73 init();
74 }
75
76 protected Tab getSelectedTab() {
77 return (Tab) mFlipper.getSelectedItem();
78 }
79
80 protected void setTabDimensions(int w, int h) {
81 mTabWidth = w;
82 mTabHeight = h;
83 requestLayout();
84 }
85
Michael Kolbfedb4922011-04-20 16:45:33 -070086 protected void showMenu() {
87 Menu menu = mUi.getMenu();
88 menu.setGroupVisible(R.id.NAV_MENU, false);
89
Michael Kolbf2055602011-04-09 17:20:03 -070090 MenuAdapter menuAdapter = new MenuAdapter(mContext);
91 menuAdapter.setMenu(menu);
92 ListPopupWindow popup = new ListPopupWindow(mContext);
93 popup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NOT_NEEDED);
94 popup.setAdapter(menuAdapter);
95 popup.setModal(true);
96 popup.setAnchorView(mMore);
97 popup.setWidth((int) mContext.getResources().getDimension(
98 R.dimen.menu_width));
99 popup.show();
100 mPopup = popup;
101 }
102
103 protected void dismissMenu() {
104 if (mPopup != null) {
105 mPopup.dismiss();
106 }
107 }
108
109 private void init() {
110 LayoutInflater.from(mContext).inflate(R.layout.nav_screen, this);
111 LinearLayout content = (LinearLayout) findViewById(R.id.nav_screen);
112 mTopPanel = findViewById(R.id.navtop);
113 mBack = (ImageButton) findViewById(R.id.back);
114 mForward = (ImageButton) findViewById(R.id.forward);
115 mRefresh = (ImageButton) findViewById(R.id.refresh);
116 mTabs = (ImageButton) findViewById(R.id.tabs);
117 mBookmarks = (ImageButton) findViewById(R.id.bookmarks);
118 mNewTab = (ImageButton) findViewById(R.id.newtab);
119 mNewIncognito = (ImageButton) findViewById(R.id.newincognito);
120 mMore = (ImageButton) findViewById(R.id.more);
121 mBack.setOnClickListener(this);
122 mForward.setOnClickListener(this);
123 mRefresh.setOnClickListener(this);
124 mTabs.setOnClickListener(this);
125 mBookmarks.setOnClickListener(this);
126 mNewTab.setOnClickListener(this);
127 mNewIncognito.setOnClickListener(this);
128 mMore.setOnClickListener(this);
129 mHolder = (FrameLayout) findViewById(R.id.galleryholder);
130 FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
131 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
132 mFlipper = new TabGallery(mContext);
133 mFlipper.setSpacing((int)(mContext.getResources()
134 .getDimension(R.dimen.nav_tab_spacing)));
135 mFlipper.setLayoutParams(lp);
136 mHolder.addView(mFlipper, 0);
137 mAdapter = new TabAdapter(mContext, mUiController.getTabControl());
138 mFlipper.setAdapter(mAdapter);
139 setTab(mUi.getActiveTab(), true);
140 mFlipper.setOnItemClickListener(new OnItemClickListener() {
141 @Override
142 public void onItemClick(AdapterView<?> parent, View view,
143 int position, long id) {
144 // post as runnable to prevent bug in gesturedetector
145 // when view is removed in click handler
146 // sends action_cancel before action_up
147 mFlipper.post(new Runnable() {
148 public void run() {
149 close();
150 }
151 });
152 }
153 });
154 mFlipper.setOnItemSelectedListener(new OnItemSelectedListener() {
155 @Override
156 public void onItemSelected(AdapterView<?> parent, View view,
157 int position, long id) {
158 final Tab tab = mAdapter.getItem(position);
159 setTab(tab, false);
160 }
161
162 @Override
163 public void onNothingSelected(AdapterView<?> parent) {
164 }
165 });
166 }
167
168 private void setTab(Tab tab, boolean updateFlipper) {
169 mTab = tab;
170 // refresh state from tab
171 WebView web = tab.getWebView();
172 if (web != null) {
173 mBack.setImageResource(web.canGoBack()
174 ? R.drawable.ic_back_holo_dark
175 : R.drawable.ic_back_disabled_holo_dark);
176 mForward.setImageResource(web.canGoForward()
177 ? R.drawable.ic_forward_holo_dark
178 : R.drawable.ic_forward_disabled_holo_dark);
179 }
180 if (updateFlipper) {
181 mFlipper.setSelection(mUiController.getTabControl().getTabIndex(tab));
182 }
183 }
184
185 @Override
186 public void onClick(View v) {
187 WebView web = (mTab != null) ? mTab.getWebView() : null;
188 if (web != null) {
189 if (mBack == v) {
190 mUi.hideNavScreen(true);
191 web.goBack();
192 } else if (mForward == v) {
193 mUi.hideNavScreen(true);
194 web.goForward();
195 } else if (mRefresh == v) {
196 mUi.hideNavScreen(true);
197 web.reload();
198 }
199 }
200 if (mBookmarks == v) {
201 mUi.hideNavScreen(false);
202 mUiController.bookmarksOrHistoryPicker(false);
203 } else if (mTabs == v) {
204 mUi.hideNavScreen(false);
205 mUi.showActiveTabsPage();
206 } else if (mNewTab == v) {
207 mUi.hideNavScreen(true);
208 mUiController.openTabToHomePage();
209 } else if (mMore == v) {
Michael Kolbfedb4922011-04-20 16:45:33 -0700210 showMenu();
Michael Kolbf2055602011-04-09 17:20:03 -0700211 } else if (mNewIncognito == v) {
212 mUi.hideNavScreen(true);
213 mUiController.openIncognitoTab();
214 }
215 }
216
217 protected void close() {
218 close(true);
219 }
220
221 protected void close(boolean animate) {
222 mUi.hideNavScreen(animate);
223 Tab tab = (Tab) mFlipper.getSelectedItem();
224 if (tab != mUi.getActiveTab()) {
225 mUiController.setActiveTab(tab);
226 }
227 }
228
229 class TabGallery extends Gallery {
230
231 public TabGallery(Context ctx) {
232 super(ctx);
233 setUnselectedAlpha(0.3f);
234 }
235
236 @Override
237 protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
238 return new Gallery.LayoutParams(
239 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
240 }
241
242 @Override
243 protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) {
244 return generateDefaultLayoutParams();
245 }
246
247 }
248
249 class TabAdapter extends BaseAdapter {
250
251 Context context;
252 TabControl tabControl;
253
254 public TabAdapter(Context ctx, TabControl tc) {
255 context = ctx;
256 tabControl = tc;
257 }
258
259 void onCloseTab(Tab tab) {
260 if (tab != null) {
261 mUiController.closeTab(tab);
262 if (tabControl.getTabCount() == 0) {
263 mUiController.openTabToHomePage();
264 mUi.hideNavScreen(false);
265 } else {
266 notifyDataSetChanged();
267 }
268 }
269 }
270
271 @Override
272 public int getCount() {
273 return tabControl.getTabCount();
274 }
275
276 @Override
277 public Tab getItem(int position) {
278 return tabControl.getTab(position);
279 }
280
281 public long getItemId(int position) {
282 return position;
283 }
284
285 @Override
286 public View getView(int position, View convertView, ViewGroup parent) {
287 ImageView content = null;
288 if (convertView == null) {
289 convertView = LayoutInflater.from(context).inflate(R.layout.nav_tab_view,
290 null);
291 content = (ImageView) convertView.findViewById(R.id.content);
292 content.setLayoutParams(new LayoutParams(mTabWidth, mTabHeight));
293 } else {
294 content = (ImageView) convertView.findViewById(R.id.content);
295 }
296 TextView title = (TextView) convertView.findViewById(R.id.title);
297 ImageView icon = (ImageView) convertView.findViewById(R.id.favicon);
298 ImageButton close = (ImageButton) convertView.findViewById(R.id.closetab);
299 final Tab tab = getItem(position);
300 if (tab.getFavicon() != null) {
301 icon.setImageBitmap(tab.getFavicon());
302 }
303 title.setText(tab.getUrl());
304 Bitmap screen = tab.getScreenshot();
305 content.setImageBitmap(screen);
306 close.setOnClickListener(new OnClickListener() {
307 @Override
308 public void onClick(View v) {
309 onCloseTab(tab);
310 }
311 });
312 title.setOnClickListener(new OnClickListener() {
313 @Override
314 public void onClick(View v) {
315 close(false);
316 mUi.editUrl(false);
317 }
318 });
319 return convertView;
320 }
321 }
322
323 private class MenuAdapter extends BaseAdapter implements OnClickListener {
324
325 List<MenuItem> mItems;
326 LayoutInflater mInflater;
327
328 public MenuAdapter(Context ctx) {
329 mInflater = LayoutInflater.from(ctx);
330 mItems = new ArrayList<MenuItem>();
331 }
332
333 public void setMenu(Menu menu) {
334 mItems.clear();
335 for (int i = 0; i < menu.size(); i++) {
336 MenuItem item = menu.getItem(i);
337 if (item.isEnabled() && item.isVisible()) {
338 mItems.add(item);
339 }
340 }
341 notifyDataSetChanged();
342 }
343
344 @Override
345 public int getCount() {
346 return mItems.size();
347 }
348
349 @Override
350 public MenuItem getItem(int position) {
351 return mItems.get(position);
352 }
353
354 @Override
355 public long getItemId(int position) {
356 return position;
357 }
358
359 @Override
360 public void onClick(View v) {
361 if (v.getTag() != null) {
362 dismissMenu();
363 mActivity.closeOptionsMenu();
364 mUi.hideNavScreen(false);
365 mUiController.onOptionsItemSelected((MenuItem) v.getTag());
366 }
367 }
368
369 @Override
370 public View getView(int position, View convertView, ViewGroup parent) {
371 final MenuItem item = mItems.get(position);
372 View view = mInflater.inflate(R.layout.qc_menu_item, null);
373 TextView label = (TextView) view.findViewById(R.id.title);
374 label.setText(item.getTitle());
375 label.setTag(item);
376 label.setOnClickListener(this);
377 return label;
378 }
379
380 }
381
382}