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);
+    }
+
 }