• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
17 package com.android.browser;
18 
19 import android.app.Activity;
20 import android.content.Context;
21 import android.content.res.Configuration;
22 import android.view.LayoutInflater;
23 import android.view.Menu;
24 import android.view.MenuItem;
25 import android.view.View;
26 import android.view.View.OnClickListener;
27 import android.view.ViewConfiguration;
28 import android.view.ViewGroup;
29 import android.widget.BaseAdapter;
30 import android.widget.FrameLayout;
31 import android.widget.ImageButton;
32 import android.widget.ImageView;
33 import android.widget.LinearLayout;
34 import android.widget.PopupMenu;
35 import android.widget.PopupMenu.OnMenuItemClickListener;
36 import android.widget.RelativeLayout;
37 import android.widget.TextView;
38 
39 import com.android.browser.NavTabScroller.OnLayoutListener;
40 import com.android.browser.NavTabScroller.OnRemoveListener;
41 import com.android.browser.TabControl.OnThumbnailUpdatedListener;
42 import com.android.browser.UI.ComboViews;
43 
44 import java.util.HashMap;
45 
46 public class NavScreen extends RelativeLayout
47         implements OnClickListener, OnMenuItemClickListener, OnThumbnailUpdatedListener {
48 
49 
50     UiController mUiController;
51     PhoneUi mUi;
52     Tab mTab;
53     Activity mActivity;
54 
55     ImageButton mRefresh;
56     ImageButton mForward;
57     ImageButton mBookmarks;
58     ImageButton mMore;
59     ImageButton mNewTab;
60     FrameLayout mHolder;
61 
62     TextView mTitle;
63     ImageView mFavicon;
64     ImageButton mCloseTab;
65 
66     NavTabScroller mScroller;
67     TabAdapter mAdapter;
68     int mOrientation;
69     boolean mNeedsMenu;
70     HashMap<Tab, View> mTabViews;
71 
NavScreen(Activity activity, UiController ctl, PhoneUi ui)72     public NavScreen(Activity activity, UiController ctl, PhoneUi ui) {
73         super(activity);
74         mActivity = activity;
75         mUiController = ctl;
76         mUi = ui;
77         mOrientation = activity.getResources().getConfiguration().orientation;
78         init();
79     }
80 
showMenu()81     protected void showMenu() {
82         PopupMenu popup = new PopupMenu(mContext, mMore);
83         Menu menu = popup.getMenu();
84         popup.getMenuInflater().inflate(R.menu.browser, menu);
85         mUiController.updateMenuState(mUiController.getCurrentTab(), menu);
86         popup.setOnMenuItemClickListener(this);
87         popup.show();
88     }
89 
90     @Override
onMenuItemClick(MenuItem item)91     public boolean onMenuItemClick(MenuItem item) {
92         return mUiController.onOptionsItemSelected(item);
93     }
94 
getToolbarHeight()95     protected float getToolbarHeight() {
96         return mActivity.getResources().getDimension(R.dimen.toolbar_height);
97     }
98 
99     @Override
onConfigurationChanged(Configuration newconfig)100     protected void onConfigurationChanged(Configuration newconfig) {
101         if (newconfig.orientation != mOrientation) {
102             int sv = mScroller.getScrollValue();
103             removeAllViews();
104             mOrientation = newconfig.orientation;
105             init();
106             mScroller.setScrollValue(sv);
107             mAdapter.notifyDataSetChanged();
108         }
109     }
110 
refreshAdapter()111     public void refreshAdapter() {
112         mScroller.handleDataChanged(
113                 mUiController.getTabControl().getTabPosition(mUi.getActiveTab()));
114     }
115 
init()116     private void init() {
117         LayoutInflater.from(mContext).inflate(R.layout.nav_screen, this);
118         setContentDescription(mContext.getResources().getString(
119                 R.string.accessibility_transition_navscreen));
120         mBookmarks = (ImageButton) findViewById(R.id.bookmarks);
121         mNewTab = (ImageButton) findViewById(R.id.newtab);
122         mMore = (ImageButton) findViewById(R.id.more);
123         mBookmarks.setOnClickListener(this);
124         mNewTab.setOnClickListener(this);
125         mMore.setOnClickListener(this);
126         mScroller = (NavTabScroller) findViewById(R.id.scroller);
127         TabControl tc = mUiController.getTabControl();
128         mTabViews = new HashMap<Tab, View>(tc.getTabCount());
129         mAdapter = new TabAdapter(mContext, tc);
130         mScroller.setOrientation(mOrientation == Configuration.ORIENTATION_LANDSCAPE
131                 ? LinearLayout.HORIZONTAL : LinearLayout.VERTICAL);
132         // update state for active tab
133         mScroller.setAdapter(mAdapter,
134                 mUiController.getTabControl().getTabPosition(mUi.getActiveTab()));
135         mScroller.setOnRemoveListener(new OnRemoveListener() {
136             public void onRemovePosition(int pos) {
137                 Tab tab = mAdapter.getItem(pos);
138                 onCloseTab(tab);
139             }
140         });
141         mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
142         if (!mNeedsMenu) {
143             mMore.setVisibility(View.GONE);
144         }
145     }
146 
147     @Override
onClick(View v)148     public void onClick(View v) {
149         if (mBookmarks == v) {
150             mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
151         } else if (mNewTab == v) {
152             openNewTab();
153         } else if (mMore == v) {
154             showMenu();
155         }
156     }
157 
onCloseTab(Tab tab)158     private void onCloseTab(Tab tab) {
159         if (tab != null) {
160             if (tab == mUiController.getCurrentTab()) {
161                 mUiController.closeCurrentTab();
162             } else {
163                 mUiController.closeTab(tab);
164             }
165         }
166     }
167 
openNewTab()168     private void openNewTab() {
169         // need to call openTab explicitely with setactive false
170         final Tab tab = mUiController.openTab(BrowserSettings.getInstance().getHomePage(),
171                 false, false, false);
172         if (tab != null) {
173             mUiController.setBlockEvents(true);
174             final int tix = mUi.mTabControl.getTabPosition(tab);
175             mScroller.setOnLayoutListener(new OnLayoutListener() {
176 
177                 @Override
178                 public void onLayout(int l, int t, int r, int b) {
179                     mUi.hideNavScreen(tix, true);
180                     switchToTab(tab);
181                 }
182             });
183             mScroller.handleDataChanged(tix);
184             mUiController.setBlockEvents(false);
185         }
186     }
187 
switchToTab(Tab tab)188     private void switchToTab(Tab tab) {
189         if (tab != mUi.getActiveTab()) {
190             mUiController.setActiveTab(tab);
191         }
192     }
193 
close(int position)194     protected void close(int position) {
195         close(position, true);
196     }
197 
close(int position, boolean animate)198     protected void close(int position, boolean animate) {
199         mUi.hideNavScreen(position, animate);
200     }
201 
getTabView(int pos)202     protected NavTabView getTabView(int pos) {
203         return mScroller.getTabView(pos);
204     }
205 
206     class TabAdapter extends BaseAdapter {
207 
208         Context context;
209         TabControl tabControl;
210 
TabAdapter(Context ctx, TabControl tc)211         public TabAdapter(Context ctx, TabControl tc) {
212             context = ctx;
213             tabControl = tc;
214         }
215 
216         @Override
getCount()217         public int getCount() {
218             return tabControl.getTabCount();
219         }
220 
221         @Override
getItem(int position)222         public Tab getItem(int position) {
223             return tabControl.getTab(position);
224         }
225 
getItemId(int position)226         public long getItemId(int position) {
227             return position;
228         }
229 
230         @Override
getView(final int position, View convertView, ViewGroup parent)231         public View getView(final int position, View convertView, ViewGroup parent) {
232             final NavTabView tabview = new NavTabView(mActivity);
233             final Tab tab = getItem(position);
234             tabview.setWebView(tab);
235             mTabViews.put(tab, tabview.mImage);
236             tabview.setOnClickListener(new OnClickListener() {
237                 @Override
238                 public void onClick(View v) {
239                     if (tabview.isClose(v)) {
240                         mScroller.animateOut(tabview);
241                     } else if (tabview.isTitle(v)) {
242                         switchToTab(tab);
243                         mUi.getTitleBar().setSkipTitleBarAnimations(true);
244                         close(position, false);
245                         mUi.editUrl(false, true);
246                         mUi.getTitleBar().setSkipTitleBarAnimations(false);
247                     } else if (tabview.isWebView(v)) {
248                         close(position);
249                     }
250                 }
251             });
252             return tabview;
253         }
254 
255     }
256 
257     @Override
onThumbnailUpdated(Tab t)258     public void onThumbnailUpdated(Tab t) {
259         View v = mTabViews.get(t);
260         if (v != null) {
261             v.invalidate();
262         }
263     }
264 
265 }
266