<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!--
+ Copyright 2009, The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:fitsSystemWindows="true"
- android:orientation="horizontal"
+ android:id="@+id/search_plate"
android:layout_width="fill_parent"
- android:background="@drawable/tab_selected"
- android:layout_height="45dip">
- <ImageView android:id="@+id/favicon"
- android:layout_height="20dip"
- android:layout_width="20dip"
- android:layout_marginLeft="6dip"
- android:layout_marginRight="6dip"
- android:layout_gravity="center_vertical"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingLeft="12dip"
+ android:paddingRight="12dip"
+ android:paddingTop="0dip"
+ android:paddingBottom="16dip"
+ android:background="@*android:drawable/search_plate_global" >
+
+ <ProgressBar android:id="@+id/progress_horizontal"
+ style="?android:attr/progressBarStyleHorizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="5dip"
+ android:max="100"
/>
- <!-- layout which contains the title, progress bar, and url -->
+
<LinearLayout
- android:orientation="vertical"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:layout_height="wrap_content">
- <!-- This part contains the favicon and the progress bar -->
- <LinearLayout
- android:orientation="vertical"
- android:layout_marginTop="0dip"
- android:layout_height="wrap_content"
- android:layout_width="fill_parent"
- >
- <!-- need to make this no wider than the horizontal progress bar -->
- <TextView android:id="@+id/title"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginLeft="6dip"
- android:layout_marginTop="0dip"
- android:textSize="14dip"
- android:textColor="@color/white"
- android:textStyle="bold"
- android:singleLine="true"
- android:padding="0dip"
- />
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <TextView android:id="@+id/url"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="6dip"
- android:textSize="11dip"
- android:padding="0dip"
- android:textColor="@color/white"
- android:singleLine="true"
- />
- <ProgressBar android:id="@+id/progress_circular"
- style="?android:attr/progressBarStyleSmallTitle"
- android:layout_marginLeft="3dip"
- android:layout_gravity="center_vertical"
- android:max="100"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <ImageView android:id="@+id/lock_icon"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_alignBottom="@id/title"
- android:layout_alignParentRight="true"
- android:visibility="gone"/>
- </LinearLayout>
- <ProgressBar android:id="@+id/progress_horizontal"
- style="?android:attr/progressBarStyleHorizontal"
- android:layout_width="fill_parent"
- android:layout_weight="1"
- android:layout_height="5dip"
- android:max="100" />
- </LinearLayout>
- </LinearLayout>
- <!-- This buttons will change look/functionality -->
- <ImageView android:id="@+id/rt_button"
- android:layout_width="52dip"
+ android:id="@+id/search_edit_frame"
+ android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:src="@drawable/ic_close_tab"/>
+ android:layout_marginTop="3dip"
+ android:orientation="horizontal">
+
+ <TextView
+ android:id="@+id/title"
+ android:background="@*android:drawable/textfield_search"
+ android:layout_height="40dip"
+ android:layout_width="0dip"
+ android:layout_weight="1.0"
+ android:paddingLeft="8dip"
+ android:paddingRight="6dip"
+ android:singleLine="true"
+ android:ellipsize="end"
+ />
+ <ProgressBar android:id="@+id/progress_circular"
+ style="?android:attr/progressBarStyleSmallTitle"
+ android:layout_width="40dip"
+ android:layout_height="40dip"
+ android:layout_marginLeft="3dip"
+ android:max="100"
+ />
+ <ImageView
+ android:id="@+id/rt_btn"
+ android:layout_width="40dip"
+ android:layout_height="40dip"
+ android:layout_marginLeft="8dip"
+ android:scaleType="fitXY"
+ android:background="@*android:drawable/btn_search_dialog_voice"
+ android:src="@drawable/ic_menu_bookmark"
+ />
+ </LinearLayout>
</LinearLayout>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/MAIN_MENU">
- <item android:id="@+id/goto_menu_id"
- android:title="@string/goto_dot"
- android:alphabeticShortcut="l"
- android:icon="@android:drawable/ic_menu_search"/>
<item android:id="@+id/stop_reload_menu_id"
android:alphabeticShortcut="r" />
- <item android:id="@+id/add_bookmark_menu_id"
- android:title="@string/save_to_bookmarks"
- android:icon="@drawable/ic_menu_bookmark" />
- <item android:id="@+id/back_menu_id"
- android:title="@string/back"
- android:drawable="@*android:drawable/ic_menu_back"
- android:alphabeticShortcut="j" />
+ <item android:id="@+id/new_tab_menu_id"
+ android:title="@string/new_tab"
+ android:icon="@drawable/ic_add_tab" />
+ <item android:id="@+id/close_menu_id"
+ android:icon="@drawable/ic_btn_close_panel"
+ android:title="@string/tab_picker_remove_tab"
+ android:alphabeticShortcut="w" />
<item android:id="@+id/forward_menu_id"
android:title="@string/forward"
android:alphabeticShortcut="k"
android:icon="@*android:drawable/ic_menu_forward" />
+ <item android:id="@+id/add_bookmark_menu_id"
+ android:title="@string/save_to_bookmarks"
+ android:icon="@drawable/ic_menu_bookmark" />
<item android:id="@+id/find_menu_id"
android:title="@string/find_dot"
android:alphabeticShortcut="f" />
android:visible="false" />
</group>
<group android:id="@+id/MAIN_SHORTCUT_MENU" android:visible="false">
- <item android:id="@+id/close_menu_id"
- android:alphabeticShortcut="w" />
<item android:id="@+id/homepage_menu_id"
android:alphabeticShortcut=" " />
<item android:id="@+id/classic_history_menu_id"
android:alphabeticShortcut="7" />
<item android:id="@+id/window_eight_menu_id"
android:alphabeticShortcut="8" />
+ <item android:id="@+id/back_menu_id"
+ android:title="@string/back"
+ android:drawable="@*android:drawable/ic_menu_back"
+ android:alphabeticShortcut="j" />
+ <item android:id="@+id/goto_menu_id"
+ android:title="@string/goto_dot"
+ android:alphabeticShortcut="l"
+ android:icon="@android:drawable/ic_menu_search"/>
</group>
<!-- these items are toggled in and out of @+id/stop_reload_menu_id -->
<item android:id="@+id/stop_menu_id"
- android:title="@string/stop"
+ android:title="@string/stop"
android:icon="@*android:drawable/ic_menu_stop"
android:visible="false" />
<item android:id="@+id/reload_menu_id"
- android:title="@string/reload"
- android:icon="@*android:drawable/ic_menu_refresh"
+ android:title="@string/reload"
+ android:icon="@*android:drawable/ic_menu_refresh"
android:visible="false" />
</menu>
<!-- The name of the application. -->
<string name="application_name">Browser</string>
+ <!-- Name of menu item of a new tab. Also used in the title bar when displaying a new tab -->
+ <string name="new_tab">New tab</string>
<!-- Name of tab containing bookmarks -->
<string name="tab_bookmarks">Bookmarks</string>
<!-- Name of tab containing the user's most visited websites, organized by number of visits -->
}
if (CUSTOM_BROWSER_BAR) {
+ mTitleBar.init(this);
// Create title bars for all of the tabs that have been created
for (int i = 0; i < mTabControl.getTabCount(); i ++) {
WebView view = mTabControl.getTab(i).getWebView();
mTitleBar.addTab(view, false);
}
- mTitleBar.setBrowserActivity(this);
mTitleBar.setCurrentTab(mTabControl.getCurrentIndex());
}
}
}
+ @Override
+ public boolean onMenuOpened(int featureId, Menu menu) {
+ mTitleBar.setVisibility(View.VISIBLE);
+ return true;
+ }
+
/**
* onSaveInstanceState(Bundle map)
* onSaveInstanceState is called right before onStop(). The map contains
}
switch (item.getItemId()) {
// -- Main menu
+ case R.id.new_tab_menu_id:
+ openTabAndShow(EMPTY_URL_DATA, false, null);
+ bookmarksOrHistoryPicker(false, true);
+ break;
+
case R.id.goto_menu_id:
bookmarksOrHistoryPicker(false, false);
break;
menu.findItem(R.id.forward_menu_id)
.setEnabled(canGoForward);
+ menu.findItem(R.id.new_tab_menu_id).setEnabled(
+ mTabControl.getTabCount() < TabControl.MAX_TABS);
+
// decide whether to show the share link option
PackageManager pm = getPackageManager();
Intent send = new Intent(Intent.ACTION_SEND);
*/
public class TitleBar extends LinearLayout {
private TextView mTitle;
- private TextView mUrl;
private Drawable mCloseDrawable;
private ImageView mRtButton;
private ProgressBar mCircularProgress;
private ProgressBar mHorizontalProgress;
- private ImageView mFavicon;
- private ImageView mLockIcon; // FIXME: Needs to be below the favicon
+ private Drawable mFavicon;
+ private Drawable mLockIcon;
+ private Drawable mStopDrawable;
+ private Drawable mBookmarkDrawable;
private boolean mInLoad;
- private boolean mTitleSet;
private WebView mWebView;
+ private BrowserActivity mBrowserActivity;
- public TitleBar(Context context, WebView webview) {
+ public TitleBar(Context context, WebView webview, BrowserActivity ba) {
super(context, null);
LayoutInflater factory = LayoutInflater.from(context);
factory.inflate(R.layout.title_bar, this);
+ mBrowserActivity = ba;
mTitle = (TextView) findViewById(R.id.title);
- mUrl = (TextView) findViewById(R.id.url);
-
- mRtButton = (ImageView) findViewById(R.id.rt_button);
+ mTitle.setCompoundDrawablePadding(5);
+ mRtButton = (ImageView) findViewById(R.id.rt_btn);
+ mRtButton.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ if (mInLoad) {
+ if (mWebView != null) {
+ mWebView.stopLoading();
+ }
+ } else {
+ mBrowserActivity.bookmarksOrHistoryPicker(false, false);
+ }
+ }
+ });
mCircularProgress = (ProgressBar) findViewById(R.id.progress_circular);
mHorizontalProgress = (ProgressBar) findViewById(
R.id.progress_horizontal);
- mFavicon = (ImageView) findViewById(R.id.favicon);
- mLockIcon = (ImageView) findViewById(R.id.lock_icon);
mWebView = webview;
}
}
/**
- * Determine whether a point (from a touch) hits the right button.
- */
- /* package */ boolean hitRightButton(int x, int y) {
- Rect hitRect = new Rect();
- mRtButton.getHitRect(hitRect);
- return hitRect.contains(x - getLeft(), y - getTop());
- }
-
- /**
* Return whether the associated WebView is currently loading. Needed to
* determine whether a click should stop the load or close the tab.
*/
* Set a new Drawable for the Favicon.
*/
/* package */ void setFavicon(Drawable d) {
- mFavicon.setImageDrawable(d);
+ if (d != null) {
+ d.setBounds(0, 0, 20, 20);
+ }
+ mTitle.setCompoundDrawables(d, null, mLockIcon, null);
+ mFavicon = d;
}
/**
* Set the Drawable for the lock icon, or null to hide it.
*/
/* package */ void setLock(Drawable d) {
- if (d == null) {
- mLockIcon.setVisibility(View.GONE);
- } else {
- mLockIcon.setImageDrawable(d);
- mLockIcon.setVisibility(View.VISIBLE);
+ if (d != null) {
+ d.setBounds(0, 0, 20, 20);
}
+ mTitle.setCompoundDrawables(mFavicon, null, d, null);
+ mLockIcon = d;
}
/**
if (newProgress == mCircularProgress.getMax()) {
mCircularProgress.setVisibility(View.GONE);
mHorizontalProgress.setVisibility(View.GONE);
- mRtButton.setVisibility(View.VISIBLE);
- mUrl.setVisibility(View.VISIBLE);
- if (mCloseDrawable != null) {
- mRtButton.setImageDrawable(mCloseDrawable);
+ if (mBookmarkDrawable != null) {
+ mRtButton.setImageDrawable(mBookmarkDrawable);
}
mInLoad = false;
- if (!mTitleSet) {
- mTitle.setText(mUrl.getText());
- mUrl.setText(null);
- mTitleSet = true;
- }
} else {
mCircularProgress.setProgress(newProgress);
mHorizontalProgress.setProgress(newProgress);
mCircularProgress.setVisibility(View.VISIBLE);
mHorizontalProgress.setVisibility(View.VISIBLE);
- mUrl.setVisibility(View.VISIBLE);
- if (mCloseDrawable == null) {
- // The drawable was assigned in the xml file, so it already
- // exists. Keep a pointer to it when we switch to the resource
- // so we can easily switch back.
- mCloseDrawable = mRtButton.getDrawable();
+ if (mBookmarkDrawable == null) {
+ mBookmarkDrawable = mRtButton.getDrawable();
+ }
+ if (mStopDrawable == null) {
+ mRtButton.setImageResource(
+ com.android.internal.R.drawable.ic_menu_stop);
+ mStopDrawable = mRtButton.getDrawable();
+ } else {
+ mRtButton.setImageDrawable(mStopDrawable);
}
- mRtButton.setImageResource(
- com.android.internal.R.drawable.ic_menu_stop);
mInLoad = true;
}
}
* Update the title and url.
*/
/* package */ void setTitleAndUrl(CharSequence title, CharSequence url) {
- if (url != null) {
- url = BrowserActivity.buildTitleUrl(url.toString());
- }
- if (null == title) {
- if (mInLoad) {
- mTitleSet = false;
- mTitle.setText(R.string.title_bar_loading);
- } else {
- // If the page has no title, put the url in the title space
- // and leave the url blank.
- mTitle.setText(url);
- mUrl.setText(null);
- mTitleSet = true;
- return;
- }
+ if (url == null) {
+ mTitle.setText(R.string.title_bar_loading);
} else {
- mTitle.setText(title);
- mTitleSet = true;
+ mTitle.setText(BrowserActivity.buildTitleUrl(url.toString()));
}
- mUrl.setText(url);
}
/* package */ void setToTabPicker() {
setLock(null);
mCircularProgress.setVisibility(View.GONE);
mHorizontalProgress.setVisibility(View.GONE);
- mUrl.setVisibility(View.INVISIBLE);
}
}
implements AdapterView.OnItemSelectedListener {
private Vector<TitleBar> mTitleBars;
private BrowserActivity mBrowserActivity;
- private View mNewButton;
private int mCount;
private TitleAdapter mTitleAdapter;
private boolean mIgnoreSelectedListener;
super(context, attrs);
mTitleBars = new Vector<TitleBar>(TabControl.MAX_TABS);
mCount = 0;
- // Now create the Plus button that goes on the right.
- LayoutInflater factory = LayoutInflater.from(context);
- mNewButton = factory.inflate(R.layout.new_window_button, null);
mTitleAdapter = new TitleAdapter();
setAdapter(mTitleAdapter);
setCallbackDuringFling(false);
return;
}
int newSelection = mCount;
- TitleBar titleBar = new TitleBar(getContext(), view);
+ TitleBar titleBar = new TitleBar(getContext(), view, mBrowserActivity);
mTitleBars.add(titleBar);
mCount++;
- if (TabControl.MAX_TABS == mCount) {
- mNewButton.setEnabled(false);
- }
// Need to refresh our list
setAdapter(mTitleAdapter);
mIgnoreSelectedListener = true;
*/
public boolean performItemClick(View view, int position, long id) {
if (!(view instanceof TitleBar)) {
- // For new window button
return super.performItemClick(view, position, id);
}
// If we have no mLastTouchUp, this was not called from onSingleTapUp,
if (titleBar != getTitleBarAt(position)) {
return false;
}
- if (titleBar.hitRightButton((int) mLastTouchUp.getX() - mScrollX,
- (int) mLastTouchUp.getY() - mScrollY)) {
- if (titleBar.isInLoad()) {
- WebView webView = titleBar.getWebView();
- if (null == webView) {
- // FIXME: How did we get into this situation?
- return false;
- }
- webView.stopLoading();
- } else {
- mBrowserActivity.closeCurrentWindow();
- }
- } else {
- mBrowserActivity.bookmarksOrHistoryPicker(false, false);
- }
+ mBrowserActivity.onSearchRequested();
return true;
}
* Remove the tab at the given position.
*/
/* package */ void removeTab(int position) {
- if (TabControl.MAX_TABS == mCount) {
- mNewButton.setEnabled(true);
- }
mTitleBars.remove(position);
mCount--;
// Need to refresh our list
/**
* Set the owning BrowserActivity. Necessary so that we can call methods
- * on it.
+ * on it. Only called once before adding any title bars.
*/
- /* package */ void setBrowserActivity(final BrowserActivity ba) {
+ /* package */ void init(final BrowserActivity ba) {
mBrowserActivity = ba;
- View.OnClickListener listener = new View.OnClickListener() {
- public void onClick(View v) {
- ba.openTabAndShow(BrowserActivity.EMPTY_URL_DATA, false, null);
- ba.bookmarksOrHistoryPicker(false, true);
- }
- };
- mNewButton.findViewById(R.id.button).setOnClickListener(listener);
}
/**
public void registerDataSetObserver(DataSetObserver observer) {}
public void unregisterDataSetObserver(DataSetObserver observer) {}
public int getCount() {
- // To account for new window
- return mCount + 1;
+ return mCount;
}
public Object getItem(int position) {
return null;
return true;
}
public View getView(int position, View convertView, ViewGroup parent) {
- if (mCount == position) {
- return mNewButton;
- }
TitleBar titleBar = getTitleBarAt(position);
Gallery.LayoutParams lp;
- int desiredWidth = TitleBarSet.this.getWidth()
- - (2 * mNewButton.getWidth());
+ int desiredWidth = TitleBarSet.this.getWidth();
ViewGroup.LayoutParams old = titleBar.getLayoutParams();
if (old == null || !(old instanceof Gallery.LayoutParams)) {
lp = new Gallery.LayoutParams(desiredWidth,