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.ViewConfiguration; 28import android.view.ViewGroup; 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 39import com.android.browser.NavTabScroller.OnLayoutListener; 40import com.android.browser.NavTabScroller.OnRemoveListener; 41import com.android.browser.TabControl.OnThumbnailUpdatedListener; 42import com.android.browser.UI.ComboViews; 43 44import java.util.HashMap; 45 46public 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 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 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 91 public boolean onMenuItemClick(MenuItem item) { 92 return mUiController.onOptionsItemSelected(item); 93 } 94 95 protected float getToolbarHeight() { 96 return mActivity.getResources().getDimension(R.dimen.toolbar_height); 97 } 98 99 @Override 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 111 public void refreshAdapter() { 112 mScroller.handleDataChanged( 113 mUiController.getTabControl().getTabPosition(mUi.getActiveTab())); 114 } 115 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 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 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 mTabViews.remove(tab); 166 } 167 } 168 169 private void openNewTab() { 170 // need to call openTab explicitely with setactive false 171 final Tab tab = mUiController.openTab(BrowserSettings.getInstance().getHomePage(), 172 false, false, false); 173 if (tab != null) { 174 mUiController.setBlockEvents(true); 175 final int tix = mUi.mTabControl.getTabPosition(tab); 176 mScroller.setOnLayoutListener(new OnLayoutListener() { 177 178 @Override 179 public void onLayout(int l, int t, int r, int b) { 180 final int pos = mUi.mTabControl.getTabPosition(tab); 181 mUi.hideNavScreen(pos, true); 182 switchToTab(tab); 183 } 184 }); 185 mScroller.handleDataChanged(tix); 186 mUiController.setBlockEvents(false); 187 } 188 } 189 190 private void switchToTab(Tab tab) { 191 if (tab != mUi.getActiveTab()) { 192 mUiController.setActiveTab(tab); 193 } 194 } 195 196 protected void close(int position) { 197 close(position, true); 198 } 199 200 protected void close(int position, boolean animate) { 201 mUi.hideNavScreen(position, animate); 202 } 203 204 protected NavTabView getTabView(int pos) { 205 return mScroller.getTabView(pos); 206 } 207 208 class TabAdapter extends BaseAdapter { 209 210 Context context; 211 TabControl tabControl; 212 213 public TabAdapter(Context ctx, TabControl tc) { 214 context = ctx; 215 tabControl = tc; 216 } 217 218 @Override 219 public int getCount() { 220 return tabControl.getTabCount(); 221 } 222 223 @Override 224 public Tab getItem(int position) { 225 return tabControl.getTab(position); 226 } 227 228 public long getItemId(int position) { 229 return position; 230 } 231 232 @Override 233 public View getView(final int position, View convertView, ViewGroup parent) { 234 final NavTabView tabview = new NavTabView(mActivity); 235 final Tab tab = getItem(position); 236 tabview.setWebView(tab); 237 mTabViews.put(tab, tabview.mImage); 238 tabview.setOnClickListener(new OnClickListener() { 239 @Override 240 public void onClick(View v) { 241 if (tabview.isClose(v)) { 242 mScroller.animateOut(tabview); 243 mTabViews.remove(tab); 244 } else if (tabview.isTitle(v)) { 245 switchToTab(tab); 246 mUi.getTitleBar().setSkipTitleBarAnimations(true); 247 close(position, false); 248 mUi.editUrl(false, true); 249 mUi.getTitleBar().setSkipTitleBarAnimations(false); 250 } else if (tabview.isWebView(v)) { 251 close(position); 252 } 253 } 254 }); 255 return tabview; 256 } 257 258 } 259 260 @Override 261 public void onThumbnailUpdated(Tab t) { 262 View v = mTabViews.get(t); 263 if (v != null) { 264 v.invalidate(); 265 } 266 } 267 268} 269