NavScreen.java revision 9ef259af433edc5aeb11b5d5d94dc9acc697c61e
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 17package com.android.browser; 18 19import android.app.Activity; 20import android.content.Context; 21import android.content.res.Configuration; 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.BaseAdapter; 30import android.widget.FrameLayout; 31import android.widget.ImageButton; 32import android.widget.ImageView; 33import android.widget.LinearLayout; 34import android.widget.PopupMenu; 35import android.widget.PopupMenu.OnMenuItemClickListener; 36import android.widget.RelativeLayout; 37import android.widget.TextView; 38 39public class NavScreen extends RelativeLayout 40 implements OnClickListener, OnMenuItemClickListener { 41 42 UiController mUiController; 43 PhoneUi mUi; 44 Tab mTab; 45 Activity mActivity; 46 47 ImageButton mRefresh; 48 ImageButton mForward; 49 ImageButton mBookmarks; 50 ImageButton mMore; 51 ImageButton mNewTab; 52 ImageButton mNewIncognito; 53 FrameLayout mHolder; 54 55 TextView mTitle; 56 ImageView mFavicon; 57 ImageButton mCloseTab; 58 59 NavTabGallery mScroller; 60 TabAdapter mAdapter; 61 int mOrientation; 62 63 public NavScreen(Activity activity, UiController ctl, PhoneUi ui) { 64 super(activity); 65 mActivity = activity; 66 mUiController = ctl; 67 mUi = ui; 68 mOrientation = activity.getResources().getConfiguration().orientation; 69 init(); 70 } 71 72 protected Tab getSelectedTab() { 73 return (Tab) mScroller.getSelectedItem(); 74 } 75 76 protected void showMenu() { 77 PopupMenu popup = new PopupMenu(mContext, mMore); 78 Menu menu = popup.getMenu(); 79 popup.getMenuInflater().inflate(R.menu.browser, menu); 80 menu.setGroupVisible(R.id.NAV_MENU, false); 81 popup.setOnMenuItemClickListener(this); 82 popup.show(); 83 } 84 85 @Override 86 public boolean onMenuItemClick(MenuItem item) { 87 return mUiController.onOptionsItemSelected(item); 88 } 89 90 protected float getToolbarHeight() { 91 return mActivity.getResources().getDimension(R.dimen.toolbar_height); 92 } 93 94 // for configuration changes 95 @Override 96 protected void onConfigurationChanged(Configuration newconfig) { 97 if (newconfig.orientation != mOrientation) { 98 int selIx = mScroller.getSelectionIndex(); 99 removeAllViews(); 100 mOrientation = newconfig.orientation; 101 init(); 102 mScroller.setSelection(selIx); 103 mAdapter.notifyDataSetChanged(); 104 } 105 } 106 107 private void init() { 108 LayoutInflater.from(mContext).inflate(R.layout.nav_screen, this); 109 mBookmarks = (ImageButton) findViewById(R.id.bookmarks); 110 mNewTab = (ImageButton) findViewById(R.id.newtab); 111 mNewIncognito = (ImageButton) findViewById(R.id.newincognito); 112 mMore = (ImageButton) findViewById(R.id.more); 113 mBookmarks.setOnClickListener(this); 114 mNewTab.setOnClickListener(this); 115 mNewIncognito.setOnClickListener(this); 116 mMore.setOnClickListener(this); 117 mScroller = (NavTabGallery) findViewById(R.id.scroller); 118 mAdapter = new TabAdapter(mContext, mUiController.getTabControl()); 119 mScroller.setAdapter(mAdapter); 120 mScroller.setOrientation(mOrientation == Configuration.ORIENTATION_LANDSCAPE 121 ? LinearLayout.HORIZONTAL : LinearLayout.VERTICAL); 122 // update state for active tab 123 mScroller.setSelection(mUiController.getTabControl().getTabPosition(mUi.getActiveTab())); 124 } 125 126 @Override 127 public void onClick(View v) { 128 WebView web = (mTab != null) ? mTab.getWebView() : null; 129 if (web != null) { 130 if (mForward == v) { 131 mUi.hideNavScreen(true); 132 web.goForward(); 133 } else if (mRefresh == v) { 134 mUi.hideNavScreen(true); 135 web.reload(); 136 } 137 } 138 if (mBookmarks == v) { 139 mUi.hideNavScreen(false); 140 switchToSelected(); 141 mUiController.bookmarksOrHistoryPicker(false); 142 } else if (mNewTab == v) { 143 openNewTab(); 144 } else if (mMore == v) { 145 showMenu(); 146 } else if (mNewIncognito == v) { 147 mUi.hideNavScreen(true); 148 mUiController.openIncognitoTab(); 149 } else if (mTitle == v) { 150 mUi.getTitleBar().setSkipTitleBarAnimations(true); 151 close(false); 152 mUi.editUrl(false); 153 mUi.getTitleBar().setSkipTitleBarAnimations(false); 154 } 155 } 156 157 private void onCloseTab(Tab tab) { 158 if (tab != null) { 159 switchToSelected(); 160 mUiController.closeCurrentTab(); 161 mAdapter.notifyDataSetChanged(); 162 } 163 } 164 165 private void openNewTab() { 166 // need to call openTab explicitely with setactive false 167 Tab tab = mUiController.openTab(BrowserSettings.getInstance().getHomePage(), 168 false, false, false); 169 mAdapter.notifyDataSetChanged(); 170 if (tab != null) { 171 // set tab as the selected in flipper, then hide 172 final int tix = mUi.mTabControl.getTabPosition(tab); 173 mScroller.setSelection(tix); 174 postDelayed(new Runnable() { 175 @Override 176 public void run() { 177 mUi.hideNavScreen(true); 178 switchToSelected(); 179 } 180 }, 100); 181 } 182 } 183 184 private void switchToSelected() { 185 Tab tab = (Tab) mScroller.getSelectedItem(); 186 if (tab != mUi.getActiveTab()) { 187 mUiController.setActiveTab(tab); 188 } 189 } 190 191 protected void close() { 192 close(true); 193 } 194 195 protected void close(boolean animate) { 196 mUi.hideNavScreen(animate); 197 } 198 199 class TabAdapter extends BaseAdapter { 200 201 Context context; 202 TabControl tabControl; 203 204 public TabAdapter(Context ctx, TabControl tc) { 205 context = ctx; 206 tabControl = tc; 207 } 208 209 @Override 210 public int getCount() { 211 return tabControl.getTabCount(); 212 } 213 214 @Override 215 public Tab getItem(int position) { 216 return tabControl.getTab(position); 217 } 218 219 public long getItemId(int position) { 220 return position; 221 } 222 223 @Override 224 public View getView(final int position, View convertView, ViewGroup parent) { 225 final NavTabView tabview = new NavTabView(mActivity); 226 final Tab tab = getItem(position); 227 tabview.setWebView(mUi, tab); 228 tabview.setOnClickListener(new OnClickListener() { 229 @Override 230 public void onClick(View v) { 231 if (tabview.isClose(v)) { 232 onCloseTab((Tab) (mScroller.getSelectedItem())); 233 } else if (tabview.isTitle(v)) { 234 mUi.getTitleBar().setSkipTitleBarAnimations(true); 235 close(false); 236 mUi.editUrl(false); 237 mUi.getTitleBar().setSkipTitleBarAnimations(false); 238 } else if (tabview.isWebView(v)) { 239 mScroller.setSelection(position); 240 close(); 241 242 } 243 } 244 }); 245 return tabview; 246 } 247 248 } 249 250} 251