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/SuggestionsAdapter.java b/src/com/android/browser/SuggestionsAdapter.java
index 6473dfd..4c0217c 100644
--- a/src/com/android/browser/SuggestionsAdapter.java
+++ b/src/com/android/browser/SuggestionsAdapter.java
@@ -23,7 +23,6 @@
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.AsyncTask;
-import android.os.Handler;
 import android.provider.BrowserContract;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
@@ -69,6 +68,7 @@
     int mLinesPortrait;
     int mLinesLandscape;
     Object mResultsLock = new Object();
+    List<String> mVoiceResults;
 
     interface CompletionListener {
 
@@ -92,6 +92,12 @@
         addSource(new CombinedCursor());
     }
 
+    void setVoiceResults(List<String> voiceResults) {
+        mVoiceResults = voiceResults;
+        notifyDataSetInvalidated();
+
+    }
+
     public void setLandscapeMode(boolean mode) {
         mLandscapeMode = mode;
         notifyDataSetChanged();
@@ -132,11 +138,18 @@
 
     @Override
     public int getCount() {
+        if (mVoiceResults != null) {
+            return mVoiceResults.size();
+        }
         return (mMixedResults == null) ? 0 : mMixedResults.getLineCount();
     }
 
     @Override
     public SuggestItem getItem(int position) {
+        if (mVoiceResults != null) {
+            return new SuggestItem(mVoiceResults.get(position), null,
+                    TYPE_SEARCH);
+        }
         if (mMixedResults == null) {
             return null;
         }
@@ -176,7 +189,7 @@
         View s1 = view.findViewById(R.id.suggest1);
         View s2 = view.findViewById(R.id.suggest2);
         View div = view.findViewById(R.id.suggestion_divider);
-        if (mLandscapeMode) {
+        if (mLandscapeMode  && (mVoiceResults == null)) {
             SuggestItem item = getItem(position);
             div.setVisibility(View.VISIBLE);
             if (item != null) {
@@ -310,25 +323,30 @@
         @Override
         protected FilterResults performFiltering(CharSequence constraint) {
             FilterResults res = new FilterResults();
-            if (TextUtils.isEmpty(constraint)) {
-                res.count = 0;
-                res.values = null;
-                return res;
-            }
-            startSuggestionsAsync(constraint);
-            List<SuggestItem> filterResults = new ArrayList<SuggestItem>();
-            if (constraint != null) {
-                for (CursorSource sc : mSources) {
-                    sc.runQuery(constraint);
+            if (mVoiceResults == null) {
+                if (TextUtils.isEmpty(constraint)) {
+                    res.count = 0;
+                    res.values = null;
+                    return res;
                 }
-                mixResults(filterResults);
+                startSuggestionsAsync(constraint);
+                List<SuggestItem> filterResults = new ArrayList<SuggestItem>();
+                if (constraint != null) {
+                    for (CursorSource sc : mSources) {
+                        sc.runQuery(constraint);
+                    }
+                    mixResults(filterResults);
+                }
+                synchronized (mResultsLock) {
+                    mFilterResults = filterResults;
+                }
+                SuggestionResults mixed = buildSuggestionResults();
+                res.count = mixed.getLineCount();
+                res.values = mixed;
+            } else {
+                res.count = mVoiceResults.size();
+                res.values = mVoiceResults;
             }
-            synchronized (mResultsLock) {
-                mFilterResults = filterResults;
-            }
-            SuggestionResults mixed = buildSuggestionResults();
-            res.count = mixed.getLineCount();
-            res.values = mixed;
             return res;
         }
 
@@ -348,8 +366,10 @@
 
         @Override
         protected void publishResults(CharSequence constraint, FilterResults fresults) {
-            mMixedResults = (SuggestionResults) fresults.values;
-            mListener.onFilterComplete(fresults.count);
+            if (fresults.values instanceof SuggestionResults) {
+                mMixedResults = (SuggestionResults) fresults.values;
+                mListener.onFilterComplete(fresults.count);
+            }
             notifyDataSetChanged();
         }