diff options
-rw-r--r-- | res/layout/title_bar.xml | 29 | ||||
-rw-r--r-- | res/values-xlarge/integers.xml | 19 | ||||
-rw-r--r-- | res/values/integers.xml | 2 | ||||
-rw-r--r-- | src/com/android/browser/PhoneUi.java | 2 | ||||
-rw-r--r-- | src/com/android/browser/TitleBar.java | 171 | ||||
-rw-r--r-- | src/com/android/browser/TitleBarBase.java | 74 | ||||
-rw-r--r-- | src/com/android/browser/TitleBarXLarge.java | 71 | ||||
-rw-r--r-- | src/com/android/browser/UrlInputView.java | 9 |
8 files changed, 148 insertions, 229 deletions
diff --git a/res/layout/title_bar.xml b/res/layout/title_bar.xml index 9bfba35..a73fdca 100644 --- a/res/layout/title_bar.xml +++ b/res/layout/title_bar.xml @@ -23,7 +23,7 @@ android:paddingRight="12dip" android:paddingTop="2dip" android:paddingBottom="1dip" - android:background="@drawable/search_plate_browser" > + android:background="@drawable/bg_urlbar" > <ProgressBar android:id="@+id/progress_horizontal" style="?android:attr/progressBarStyleHorizontal" @@ -40,13 +40,13 @@ > <LinearLayout android:id="@+id/title_bg" - android:background="@drawable/title_text" android:layout_width="0dip" android:layout_weight="1.0" - android:layout_height="wrap_content" + android:layout_height="48dip" android:layout_marginBottom="4dip" android:gravity="center_vertical" android:orientation="horizontal" + android:background="@drawable/url_background" > <ImageView android:id="@+id/favicon" android:layout_width="20dip" @@ -59,16 +59,25 @@ android:layout_marginLeft="6dip" android:visibility="gone" /> - <TextView - android:id="@+id/title" - android:layout_height="wrap_content" + <com.android.browser.UrlInputView + android:id="@+id/url_input" + android:focusable="true" android:layout_width="0dip" android:layout_weight="1.0" - android:layout_marginLeft="3dip" - android:gravity="center_vertical" + android:layout_height="match_parent" + android:layout_marginLeft="16dip" + android:paddingLeft="0dip" + android:paddingRight="0dip" + android:background="@null" + android:textAppearance="?android:attr/textAppearanceMedium" + android:hint="@string/search_hint" android:singleLine="true" android:ellipsize="end" - /> + android:lines="1" + android:scrollHorizontally="true" + android:inputType="textUri" + android:imeOptions="actionGo" + style="@style/Suggestions" /> </LinearLayout> <ImageView android:id="@+id/stop" android:background="@drawable/stop_background" @@ -78,7 +87,7 @@ android:src="@drawable/ic_btn_stop_v2" android:visibility="gone" /> - <ImageView + <ImageButton android:id="@+id/rt_btn" android:layout_width="wrap_content" android:layout_height="match_parent" diff --git a/res/values-xlarge/integers.xml b/res/values-xlarge/integers.xml new file mode 100644 index 0000000..abdafbf --- /dev/null +++ b/res/values-xlarge/integers.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2010 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 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. +--> +<resources + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- The number of lines in the suggestions dropdown in landscape --> + <integer name="max_suggest_lines_landscape">5</integer> + <!-- The number of lines in the suggestions dropdown in portrait --> + <integer name="max_suggest_lines_portrait">12</integer> +</resources> diff --git a/res/values/integers.xml b/res/values/integers.xml index a0b7ae3..3356f77 100644 --- a/res/values/integers.xml +++ b/res/values/integers.xml @@ -15,7 +15,7 @@ <!-- The number of lines in the suggestions dropdown in landscape --> <integer name="max_suggest_lines_landscape">5</integer> <!-- The number of lines in the suggestions dropdown in portrait --> - <integer name="max_suggest_lines_portrait">12</integer> + <integer name="max_suggest_lines_portrait">4</integer> <!-- The maximum number of open tabs --> <integer name="max_tabs">16</integer> <!-- The duration of the tab animations in millisecs --> diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java index cfe7351..a7b7834 100644 --- a/src/com/android/browser/PhoneUi.java +++ b/src/com/android/browser/PhoneUi.java @@ -49,7 +49,7 @@ public class PhoneUi extends BaseUi { */ public PhoneUi(Activity browser, UiController controller) { super(browser, controller); - mTitleBar = new TitleBar(mActivity, mUiController); + mTitleBar = new TitleBar(mActivity, mUiController, this); // mTitleBar will be always be shown in the fully loaded mode on // phone mTitleBar.setProgress(100); diff --git a/src/com/android/browser/TitleBar.java b/src/com/android/browser/TitleBar.java index b8ad2ef..7b5482a 100644 --- a/src/com/android/browser/TitleBar.java +++ b/src/com/android/browser/TitleBar.java @@ -16,8 +16,6 @@ package com.android.browser; -import com.android.common.speech.LoggingEvents; - import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; @@ -25,8 +23,6 @@ import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; -import android.os.Handler; -import android.os.Message; import android.speech.RecognizerIntent; import android.text.SpannableString; import android.text.Spanned; @@ -37,23 +33,20 @@ import android.util.TypedValue; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuInflater; -import android.view.MotionEvent; import android.view.View; -import android.view.ViewConfiguration; +import android.view.View.OnFocusChangeListener; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ProgressBar; -import android.widget.TextView; /** * This class represents a title bar for a particular "tab" or "window" in the * browser. */ -public class TitleBar extends TitleBarBase { +public class TitleBar extends TitleBarBase implements OnFocusChangeListener { private Activity mActivity; - private UiController mController; - private TextView mTitle; - private ImageView mRtButton; + private ImageButton mRtButton; private Drawable mCircularProgress; private ProgressBar mHorizontalProgress; private ImageView mStopButton; @@ -61,35 +54,33 @@ public class TitleBar extends TitleBarBase { private Drawable mVoiceDrawable; private boolean mInLoad; private View mTitleBg; - private MyHandler mHandler; private Intent mVoiceSearchIntent; - private boolean mInVoiceMode; private Drawable mVoiceModeBackground; private Drawable mNormalBackground; - private Drawable mLoadingBackground; private ImageSpan mArcsSpan; private int mLeftMargin; private int mRightMargin; - private static int LONG_PRESS = 1; - - public TitleBar(Activity activity, UiController controller) { - super(activity); - mHandler = new MyHandler(); + public TitleBar(Activity activity, UiController controller, PhoneUi ui) { + super(activity, controller, ui); LayoutInflater factory = LayoutInflater.from(activity); factory.inflate(R.layout.title_bar, this); mActivity = activity; - mController = controller; - mTitle = (TextView) findViewById(R.id.title); - mTitle.setCompoundDrawablePadding(5); + mUrlInput = (UrlInputView) findViewById(R.id.url_input); + mUrlInput.setCompoundDrawablePadding(5); + mUrlInput.setContainer(this); + mUrlInput.setSelectAllOnFocus(true); + mUrlInput.setController(mUiController); + mUrlInput.setUrlInputListener(this); + mUrlInput.setOnFocusChangeListener(this); mTitleBg = findViewById(R.id.title_bg); mLockIcon = (ImageView) findViewById(R.id.lock); mFavicon = (ImageView) findViewById(R.id.favicon); mStopButton = (ImageView) findViewById(R.id.stop); - mRtButton = (ImageView) findViewById(R.id.rt_btn); + mRtButton = (ImageButton) findViewById(R.id.rt_btn); Resources resources = activity.getResources(); mCircularProgress = resources.getDrawable( com.android.internal.R.drawable.search_spinner); @@ -125,30 +116,10 @@ public class TitleBar extends TitleBarBase { mVoiceModeBackground = resources.getDrawable( R.drawable.title_voice); mNormalBackground = mTitleBg.getBackground(); - mLoadingBackground = resources.getDrawable(R.drawable.title_loading); mArcsSpan = new ImageSpan(activity, R.drawable.arcs, ImageSpan.ALIGN_BASELINE); } - private class MyHandler extends Handler { - @Override - public void handleMessage(Message msg) { - if (msg.what == LONG_PRESS) { - // Prevent the normal action from happening by setting the title - // bar's state to false. - mTitleBg.setPressed(false); - // Need to call a special method on BrowserActivity for when the - // fake title bar is up, because its ViewGroup does not show a - // context menu. - // TODO: - // this test is not valid for all UIs; fix later - if (getParent() != null) { - mActivity.openContextMenu(TitleBar.this); - } - } - } - }; - @Override public void createContextMenu(ContextMenu menu) { MenuInflater inflater = mActivity.getMenuInflater(); @@ -156,93 +127,6 @@ public class TitleBar extends TitleBarBase { mActivity.onCreateContextMenu(menu, this, null); } - @Override - public boolean onTouchEvent(MotionEvent event) { - ImageView button = mInLoad ? mStopButton : mRtButton; - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - // Make all touches hit either the textfield or the button, - // depending on which side of the right edge of the textfield - // they hit. - if ((int) event.getX() > mTitleBg.getRight()) { - button.setPressed(true); - } else { - mTitleBg.setPressed(true); - mHandler.sendMessageDelayed(mHandler.obtainMessage( - LONG_PRESS), - ViewConfiguration.getLongPressTimeout()); - } - break; - case MotionEvent.ACTION_MOVE: - int slop = ViewConfiguration.get(mActivity) - .getScaledTouchSlop(); - if ((int) event.getY() > getHeight() + slop) { - // We only trigger the actions in ACTION_UP if one or the - // other is pressed. Since the user moved off the title - // bar, mark both as not pressed. - mTitleBg.setPressed(false); - button.setPressed(false); - mHandler.removeMessages(LONG_PRESS); - break; - } - int x = (int) event.getX(); - int titleRight = mTitleBg.getRight(); - if (mTitleBg.isPressed() && x > titleRight + slop) { - mTitleBg.setPressed(false); - mHandler.removeMessages(LONG_PRESS); - } else if (button.isPressed() && x < titleRight - slop) { - button.setPressed(false); - } - break; - case MotionEvent.ACTION_CANCEL: - button.setPressed(false); - mTitleBg.setPressed(false); - mHandler.removeMessages(LONG_PRESS); - break; - case MotionEvent.ACTION_UP: - if (button.isPressed()) { - if (mInVoiceMode) { - if (mController.getTabControl().getCurrentTab() - .voiceSearchSourceIsGoogle()) { - Intent i = new Intent( - LoggingEvents.ACTION_LOG_EVENT); - i.putExtra(LoggingEvents.EXTRA_EVENT, - LoggingEvents.VoiceSearch.RETRY); - mActivity.sendBroadcast(i); - } - mActivity.startActivity(mVoiceSearchIntent); - } else if (mInLoad) { - mController.stopLoading(); - } else { - mController.bookmarkCurrentPage( - AddBookmarkPage.DEFAULT_FOLDER_ID, true); - } - button.setPressed(false); - } else if (mTitleBg.isPressed()) { - mHandler.removeMessages(LONG_PRESS); - if (mInVoiceMode) { - if (mController.getTabControl().getCurrentTab() - .voiceSearchSourceIsGoogle()) { - Intent i = new Intent( - LoggingEvents.ACTION_LOG_EVENT); - i.putExtra(LoggingEvents.EXTRA_EVENT, - LoggingEvents.VoiceSearch.N_BEST_REVEAL); - mActivity.sendBroadcast(i); - } - mController.showVoiceSearchResults( - mTitle.getText().toString().trim()); - } else { - mController.editUrl(); - } - mTitleBg.setPressed(false); - } - break; - default: - break; - } - return true; - } - /** * Change the TitleBar to or from voice mode. If there is no package to * handle voice search, the TitleBar cannot be set to voice mode. @@ -255,7 +139,7 @@ public class TitleBar extends TitleBarBase { if (mInVoiceMode) { mRtButton.setImageDrawable(mVoiceDrawable); titleDrawable = mVoiceModeBackground; - mTitle.setEllipsize(null); + mUrlInput.setEllipsize(null); mRtButton.setVisibility(View.VISIBLE); mStopButton.setVisibility(View.GONE); mTitleBg.setBackgroundDrawable(titleDrawable); @@ -263,20 +147,17 @@ public class TitleBar extends TitleBarBase { mRightMargin, mTitleBg.getPaddingBottom()); } else { if (mInLoad) { - titleDrawable = mLoadingBackground; mRtButton.setVisibility(View.GONE); mStopButton.setVisibility(View.VISIBLE); } else { - titleDrawable = mNormalBackground; mRtButton.setVisibility(View.VISIBLE); mStopButton.setVisibility(View.GONE); mRtButton.setImageDrawable(mBookmarkDrawable); } - mTitle.setEllipsize(TextUtils.TruncateAt.END); - mTitleBg.setBackgroundDrawable(titleDrawable); + mUrlInput.setEllipsize(TextUtils.TruncateAt.END); mTitleBg.setPadding(mLeftMargin, 0, mRightMargin, 0); } - mTitle.setSingleLine(!mInVoiceMode); + mUrlInput.setSingleLine(!mInVoiceMode); } /** @@ -285,7 +166,7 @@ public class TitleBar extends TitleBarBase { @Override void setProgress(int newProgress) { if (newProgress >= mHorizontalProgress.getMax()) { - mTitle.setCompoundDrawables(null, null, null, null); + mUrlInput.setCompoundDrawables(null, null, null, null); ((Animatable) mCircularProgress).stop(); mHorizontalProgress.setVisibility(View.INVISIBLE); if (!mInVoiceMode) { @@ -303,12 +184,11 @@ public class TitleBar extends TitleBarBase { // are attached to a window before starting the animation, // preventing a potential race condition // (fix for bug http://b/2115736) - mTitle.setCompoundDrawables(null, null, mCircularProgress, + mUrlInput.setCompoundDrawables(null, null, mCircularProgress, null); ((Animatable) mCircularProgress).start(); mHorizontalProgress.setVisibility(View.VISIBLE); if (!mInVoiceMode) { - mTitleBg.setBackgroundDrawable(mLoadingBackground); mTitleBg.setPadding(mLeftMargin, 0, mRightMargin, 0); mRtButton.setVisibility(View.GONE); mStopButton.setVisibility(View.VISIBLE); @@ -326,7 +206,7 @@ public class TitleBar extends TitleBarBase { @Override void setDisplayTitle(String title) { if (title == null) { - mTitle.setText(R.string.new_tab); + mUrlInput.setText(R.string.new_tab); } else { if (mInVoiceMode) { // Add two spaces. The second one will be replaced with an @@ -336,10 +216,17 @@ public class TitleBar extends TitleBarBase { int end = spannable.length(); spannable.setSpan(mArcsSpan, end - 1, end, Spanned.SPAN_MARK_POINT); - mTitle.setText(spannable); + mUrlInput.setText(spannable); } else { - mTitle.setText(title); + mUrlInput.setText(title); } } } + + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (v == mUrlInput && hasFocus) { + mActivity.closeOptionsMenu(); + } + } } diff --git a/src/com/android/browser/TitleBarBase.java b/src/com/android/browser/TitleBarBase.java index 1e944f1..f62e0e4 100644 --- a/src/com/android/browser/TitleBarBase.java +++ b/src/com/android/browser/TitleBarBase.java @@ -16,13 +16,19 @@ package com.android.browser; +import com.android.browser.UrlInputView.UrlInputListener; + +import android.app.SearchManager; import android.content.Context; +import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.PaintDrawable; +import android.os.Bundle; +import android.speech.RecognizerResultsIntent; import android.view.Gravity; import android.view.View; import android.widget.AbsoluteLayout; @@ -32,15 +38,21 @@ import android.widget.LinearLayout; /** * Base class for a title bar used by the browser. */ -public class TitleBarBase extends LinearLayout { +public class TitleBarBase extends LinearLayout implements UrlInputListener { // These need to be set by the subclass. protected ImageView mFavicon; protected ImageView mLockIcon; protected Drawable mGenericFavicon; + protected UiController mUiController; + protected BaseUi mBaseUi; + protected UrlInputView mUrlInput; + protected boolean mInVoiceMode; - public TitleBarBase(Context context) { + public TitleBarBase(Context context, UiController controller, BaseUi ui) { super(context, null); + mUiController = controller; + mBaseUi = ui; mGenericFavicon = context.getResources().getDrawable( R.drawable.app_web_browser_sm); } @@ -98,4 +110,62 @@ public class TitleBarBase extends LinearLayout { } } + // UrlInputListener implementation + + /** + * callback from suggestion dropdown + * user selected a suggestion + */ + @Override + public void onAction(String text, String extra, String source) { + mUiController.getCurrentTopWebView().requestFocus(); + mBaseUi.hideTitleBar(); + Intent i = new Intent(); + String action = null; + if (UrlInputView.VOICE.equals(source)) { + action = RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS; + source = null; + } else { + action = Intent.ACTION_SEARCH; + } + i.setAction(action); + i.putExtra(SearchManager.QUERY, text); + if (extra != null) { + i.putExtra(SearchManager.EXTRA_DATA_KEY, extra); + } + if (source != null) { + Bundle appData = new Bundle(); + appData.putString(com.android.common.Search.SOURCE, source); + i.putExtra(SearchManager.APP_DATA, appData); + } + mUiController.handleNewIntent(i); + setDisplayTitle(text); + } + + @Override + public void onDismiss() { + final Tab currentTab = mBaseUi.getActiveTab(); + mBaseUi.hideTitleBar(); + post(new Runnable() { + public void run() { + clearFocus(); + if ((currentTab != null) && !mInVoiceMode) { + setDisplayTitle(currentTab.getUrl()); + } + } + }); + } + + /** + * callback from the suggestion dropdown + * copy text to input field and stay in edit mode + */ + @Override + public void onCopySuggestion(String text) { + mUrlInput.setText(text, true); + if (text != null) { + mUrlInput.setSelection(text.length()); + } + } + } diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java index f44006d..2aa5bb9 100644 --- a/src/com/android/browser/TitleBarXLarge.java +++ b/src/com/android/browser/TitleBarXLarge.java @@ -16,18 +16,13 @@ package com.android.browser; -import com.android.browser.UrlInputView.UrlInputListener; import com.android.browser.search.SearchEngine; import android.app.Activity; -import android.app.SearchManager; import android.content.Context; -import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.speech.RecognizerResultsIntent; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; @@ -48,12 +43,11 @@ import java.util.List; * tabbed title bar for xlarge screen browser */ public class TitleBarXLarge extends TitleBarBase - implements UrlInputListener, OnClickListener, OnFocusChangeListener, + implements OnClickListener, OnFocusChangeListener, TextWatcher { private static final int PROGRESS_MAX = 100; - private UiController mUiController; private XLargeUi mUi; private Drawable mStopDrawable; @@ -73,18 +67,15 @@ public class TitleBarXLarge extends TitleBarBase private View mVoiceSearch; private View mVoiceSearchIndicator; private PageProgressView mProgressView; - private UrlInputView mUrlInput; private Drawable mFocusDrawable; private Drawable mUnfocusDrawable; - private boolean mInVoiceMode; private boolean mInLoad; private boolean mUseQuickControls; public TitleBarXLarge(Activity activity, UiController controller, XLargeUi ui) { - super(activity); - mUiController = controller; + super(activity, controller, ui); mUi = ui; Resources resources = activity.getResources(); mStopDrawable = resources.getDrawable(R.drawable.ic_stop_holo_dark); @@ -276,64 +267,6 @@ public class TitleBarXLarge extends TitleBarBase } } - // UrlInputListener implementation - - /** - * callback from suggestion dropdown - * user selected a suggestion - */ - @Override - public void onAction(String text, String extra, String source) { - mUiController.getCurrentTopWebView().requestFocus(); - mUi.hideTitleBar(); - Intent i = new Intent(); - String action = null; - if (UrlInputView.VOICE.equals(source)) { - action = RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS; - source = null; - } else { - action = Intent.ACTION_SEARCH; - } - i.setAction(action); - i.putExtra(SearchManager.QUERY, text); - if (extra != null) { - i.putExtra(SearchManager.EXTRA_DATA_KEY, extra); - } - if (source != null) { - Bundle appData = new Bundle(); - appData.putString(com.android.common.Search.SOURCE, source); - i.putExtra(SearchManager.APP_DATA, appData); - } - mUiController.handleNewIntent(i); - setDisplayTitle(text); - } - - @Override - public void onDismiss() { - final Tab currentTab = mUi.getActiveTab(); - mUi.hideTitleBar(); - post(new Runnable() { - public void run() { - TitleBarXLarge.this.clearFocus(); - if ((currentTab != null) && !mInVoiceMode) { - setDisplayTitle(currentTab.getUrl()); - } - } - }); - } - - /** - * callback from the suggestion dropdown - * copy text to input field and stay in edit mode - */ - @Override - public void onCopySuggestion(String text) { - mUrlInput.setText(text, true); - if (text != null) { - mUrlInput.setSelection(text.length()); - } - } - private void setEditMode(boolean edit) { if (edit) { mUrlInput.setDropDownWidth(mUrlContainer.getWidth()); diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java index 6817b36..1f15b32 100644 --- a/src/com/android/browser/UrlInputView.java +++ b/src/com/android/browser/UrlInputView.java @@ -137,7 +137,7 @@ public class UrlInputView extends AutoCompleteTextView } private void setupDropDown() { - int width = mContainer.getWidth(); + int width = mContainer != null ? mContainer.getWidth() : getWidth(); if (width != getDropDownWidth()) { setDropDownWidth(width); } @@ -160,6 +160,9 @@ public class UrlInputView extends AutoCompleteTextView @Override public void onFocusChange(View v, boolean hasFocus) { + if (mWrappedFocusListener != null) { + mWrappedFocusListener.onFocusChange(v, hasFocus); + } if (hasFocus) { forceIme(); if (mInVoiceMode) { @@ -169,9 +172,6 @@ public class UrlInputView extends AutoCompleteTextView } else { finishInput(null, null, null); } - if (mWrappedFocusListener != null) { - mWrappedFocusListener.onFocusChange(v, hasFocus); - } } public void setUrlInputListener(UrlInputListener listener) { @@ -179,6 +179,7 @@ public class UrlInputView extends AutoCompleteTextView } public void forceIme() { + mInputManager.focusIn(this); mInputManager.showSoftInput(this, 0); } |