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