Home | History | Annotate | Download | only in browser
      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 
     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