Use new callback for search by intent.

Change-Id: I3e3eafa50a93ad55f55bff0bb5b0b6efdda48bbb
diff --git a/samples/SupportLeanbackDemos/AndroidManifest.xml b/samples/SupportLeanbackDemos/AndroidManifest.xml
index b02e3bf..95f7a2c 100644
--- a/samples/SupportLeanbackDemos/AndroidManifest.xml
+++ b/samples/SupportLeanbackDemos/AndroidManifest.xml
@@ -6,8 +6,6 @@
 
     <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="19" />
 
-    <uses-permission android:name="android.permission.RECORD_AUDIO" />
-
     <application
         android:label="@string/app_name"
         android:icon="@drawable/ic_launcher"
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchActivity.java
index 437bd72..e872018 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchActivity.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchActivity.java
@@ -15,14 +15,50 @@
 
 import android.app.Activity;
 import android.os.Bundle;
+import android.support.v17.leanback.app.SearchFragment;
+import android.support.v17.leanback.widget.SpeechRecognitionCallback;
+import android.util.Log;
 
 public class SearchActivity extends Activity
 {
+    private static final String TAG = "SearchActivity";
+    private static boolean DEBUG = true;
+
+    /** If using internal speech recognizer, you must have RECORD_AUDIO permission */
+    private static boolean USE_INTERNAL_SPEECH_RECOGNIZER = false;
+    private static final int REQUEST_SPEECH = 1;
+
+    private SearchFragment mFragment;
+    private SpeechRecognitionCallback mSpeechRecognitionCallback;
+
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.search);
+
+        mFragment = (SearchFragment) getFragmentManager().findFragmentById(R.id.search_fragment);
+
+        if (!USE_INTERNAL_SPEECH_RECOGNIZER) {
+            mSpeechRecognitionCallback = new SpeechRecognitionCallback() {
+                @Override
+                public void recognizeSpeech() {
+                    if (DEBUG) Log.v(TAG, "recognizeSpeech");
+                    startActivityForResult(mFragment.getRecognizerIntent(), REQUEST_SPEECH);
+                }
+            };
+            mFragment.setSpeechRecognitionCallback(mSpeechRecognitionCallback);
+        }
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (DEBUG) Log.v(TAG, "onActivityResult requestCode=" + requestCode +
+                " resultCode=" + resultCode +
+                " data=" + data);
+        if (requestCode == REQUEST_SPEECH && resultCode == RESULT_OK) {
+            mFragment.setSearchQuery(data, true);
+        }
     }
 }
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchFragment.java
index 7d277cf..ff063c5 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchFragment.java
@@ -17,10 +17,11 @@
     implements android.support.v17.leanback.app.SearchFragment.SearchResultProvider {
     private static final String TAG = "leanback.SearchFragment";
     private static final int NUM_ROWS = 3;
-    private static final int SEARCH_DELAY_MS = 300;
+    private static final int SEARCH_DELAY_MS = 1000;
 
     private ArrayObjectAdapter mRowsAdapter;
     private Handler mHandler = new Handler();
+    private String mQuery;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -43,10 +44,7 @@
     public boolean onQueryTextChange(String newQuery) {
         Log.i(TAG, String.format("Search Query Text Change %s", newQuery));
         mRowsAdapter.clear();
-        if (!TextUtils.isEmpty(newQuery)) {
-            mHandler.removeCallbacks(mDelayedLoad);
-            mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
-        }
+        loadQuery(newQuery);
         return true;
     }
 
@@ -54,11 +52,16 @@
     public boolean onQueryTextSubmit(String query) {
         Log.i(TAG, String.format("Search Query Text Submit %s", query));
         mRowsAdapter.clear();
-        if (!TextUtils.isEmpty(query)) {
-            mHandler.removeCallbacks(mDelayedLoad);
+        loadQuery(query);
+        return true;
+    }
+
+    private void loadQuery(String query) {
+        mQuery = query;
+        mHandler.removeCallbacks(mDelayedLoad);
+        if (!TextUtils.isEmpty(query) && !query.equals("nil")) {
             mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
         }
-        return true;
     }
 
     private void loadRows() {
@@ -66,7 +69,7 @@
             ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new StringPresenter());
             listRowAdapter.add("Hello world");
             listRowAdapter.add("This is a test");
-            HeaderItem header = new HeaderItem(i, "Row " + i, null);
+            HeaderItem header = new HeaderItem(i, mQuery + " results row " + i, null);
             mRowsAdapter.add(new ListRow(header, listRowAdapter));
         }
     }