Merge "Handling missing RECORD_AUDIO permission." into lmp-preview-dev
diff --git a/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java b/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java
index 53d6011..ce4faf3 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java
@@ -31,7 +31,9 @@
 import android.support.v17.leanback.R;
 
 /**
- * A fragment to handle searches
+ * <p>A fragment to handle searches.</p>
+ *
+ * <p>Note: Your application will need to request android.permission.RECORD_AUDIO</p>
  */
 public class SearchFragment extends Fragment {
     private static final String TAG = SearchFragment.class.getSimpleName();
@@ -62,6 +64,9 @@
          * <p>This is called as soon as the query changes; it is up to the application to add a
          * delay before actually executing the queries if needed.</p>
          *
+         * <p>This method might not always be called before onQueryTextSubmit gets called, in
+         * particular for voice input cases.</p>
+         *
          * @param newQuery The current search query.
          * @return whether the results changed or not.
          */
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java b/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java
index ae717ab..75a66c6 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java
@@ -15,6 +15,7 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.graphics.Color;
 import android.graphics.drawable.Drawable;
@@ -46,7 +47,9 @@
 import java.util.List;
 
 /**
- * SearchBar is a search widget.
+ * <p>SearchBar is a search widget.</p>
+ *
+ * <p>Note: Your application will need to request android.permission.RECORD_AUDIO</p>
  */
 public class SearchBar extends RelativeLayout {
     private static final String TAG = SearchBar.class.getSimpleName();
@@ -68,7 +71,10 @@
         public void onSearchQueryChange(String query);
 
         /**
-         * Method invoked when the search query is submitted.
+         * <p>Method invoked when the search query is submitted.</p>
+         *
+         * <p>This method can be called without a preceeding onSearchQueryChange,
+         * in particular in the case of a voice input.</p>
          *
          * @param query The query being submitted.
          */
@@ -110,6 +116,8 @@
 
     public SearchBar(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
+        enforceAudioRecordPermission();
+
         Resources r = getResources();
 
         LayoutInflater inflater = LayoutInflater.from(getContext());
@@ -519,5 +527,12 @@
         }
     }
 
+    private void enforceAudioRecordPermission() {
+        String permission = "android.permission.RECORD_AUDIO";
+        int res = getContext().checkCallingOrSelfPermission(permission);
+        if (PackageManager.PERMISSION_GRANTED != res) {
+            throw new IllegalStateException("android.premission.RECORD_AUDIO required for search");
+        }
+    }
 
 }