Enable voice search
http://b/issue?id=3039695
send voice search intent
implement voice search title bar
also fixes another Urlbar focus handling bug
Change-Id: Icdcbec9ffff586d445545cc7fe86ca045022f381
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index 5890810..b680512 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -36,6 +36,8 @@
import android.webkit.WebView;
import android.widget.ImageView;
+import java.util.List;
+
/**
* tabbed title bar for xlarge screen browser
*/
@@ -62,10 +64,15 @@
private View mAllButton;
private View mClearButton;
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 mEditable;
public TitleBarXLarge(Activity activity, UiController controller,
XLargeUi ui) {
@@ -75,7 +82,12 @@
Resources resources = activity.getResources();
mStopDrawable = resources.getDrawable(R.drawable.ic_stop_normal);
mReloadDrawable = resources.getDrawable(R.drawable.ic_refresh_normal);
+ mFocusDrawable = resources.getDrawable(
+ R.drawable.textfield_active_holo_dark);
+ mUnfocusDrawable = resources.getDrawable(
+ R.drawable.textfield_default_holo_dark);
rebuildLayout(activity, true);
+ mInVoiceMode = false;
}
private void rebuildLayout(Context context, boolean rebuildData) {
@@ -98,7 +110,7 @@
mVoiceSearch = findViewById(R.id.voicesearch);
mProgressView = (PageProgressView) findViewById(R.id.progress);
mUrlContainer = findViewById(R.id.urlbar_focused);
-
+ mVoiceSearchIndicator = findViewById(R.id.voice_icon);
mBackButton.setOnClickListener(this);
mForwardButton.setOnClickListener(this);
mStar.setOnClickListener(this);
@@ -107,6 +119,7 @@
mSearchButton.setOnClickListener(this);
mGoButton.setOnClickListener(this);
mClearButton.setOnClickListener(this);
+ mVoiceSearch.setOnClickListener(this);
mUrlContainer.setOnClickListener(this);
mUrlInput.setUrlInputListener(this);
mUrlInput.setContainer(mUrlContainer);
@@ -117,9 +130,25 @@
setUrlMode(false);
}
+ public void setEditable(boolean editable) {
+ mEditable = editable;
+ mUrlInput.setFocusable(mEditable);
+ if (!mEditable) {
+ mUrlInput.setOnClickListener(this);
+ } else {
+ mUrlContainer.setOnClickListener(null);
+ }
+ }
+
@Override
public void onFocusChange(View view, boolean hasFocus) {
- setUrlMode(hasFocus);
+ if (!mEditable && hasFocus) {
+ mUi.editUrl(false);
+ } else {
+ setUrlMode(hasFocus);
+ }
+ mUrlContainer.setBackgroundDrawable(hasFocus
+ ? mFocusDrawable : mUnfocusDrawable);
}
public void setCurrentUrlIsBookmark(boolean isBookmark) {
@@ -133,9 +162,13 @@
* @param clearInput clear the input field
*/
void onEditUrl(boolean clearInput) {
- mUrlInput.requestFocusFromTouch();
+ if (!mUrlInput.hasFocus()) {
+ mUrlInput.requestFocus();
+ }
if (clearInput) {
mUrlInput.setText("");
+ } else if (mInVoiceMode) {
+ mUrlInput.showDropDown();
}
}
@@ -146,6 +179,8 @@
@Override
public void onClick(View v) {
if (mUrlInput == v) {
+ mUi.editUrl(false);
+ } else if (mUrlContainer == v) {
if (!mUrlInput.hasFocus()) {
mUi.editUrl(false);
}
@@ -169,6 +204,8 @@
}
} else if (mClearButton == v) {
clearOrClose();
+ } else if (mVoiceSearch == v) {
+ mUiController.startVoiceSearch();
}
}
@@ -224,7 +261,7 @@
mUi.hideFakeTitleBar();
setUrlMode(false);
// if top != null current must be set
- if (top != null) {
+ if ((top != null) && !mInVoiceMode) {
setDisplayTitle(mUiController.getCurrentWebView().getUrl());
}
}
@@ -248,6 +285,9 @@
mSearchButton.setVisibility(View.GONE);
mStar.setVisibility(View.GONE);
mClearButton.setVisibility(View.VISIBLE);
+ if (mInVoiceMode) {
+ mVoiceSearchIndicator.setVisibility(View.VISIBLE);
+ }
updateSearchMode();
} else {
mUrlInput.clearFocus();
@@ -256,6 +296,7 @@
mVoiceSearch.setVisibility(View.GONE);
mStar.setVisibility(View.VISIBLE);
mClearButton.setVisibility(View.GONE);
+ mVoiceSearchIndicator.setVisibility(View.GONE);
}
}
@@ -315,6 +356,8 @@
if (mUrlInput.hasFocus()) {
// check if input field is empty and adjust voice search state
updateSearchMode();
+ // clear voice mode when user types
+ setInVoiceMode(false, null);
}
}
@@ -326,4 +369,18 @@
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
+ // voicesearch
+
+ @Override
+ public void setInVoiceMode(boolean voicemode) {
+ setInVoiceMode(voicemode, null);
+ }
+
+ public void setInVoiceMode(boolean voicemode, List<String> voiceResults) {
+ mInVoiceMode = voicemode;
+ mUrlInput.setVoiceResults(voiceResults);
+ mVoiceSearchIndicator.setVisibility(mInVoiceMode
+ ? View.VISIBLE : View.GONE);
+ }
+
}