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