Merge "Type of search on headset key long press must depend on device state" into jb-dev
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index aa29444..da01c44 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -59,6 +59,7 @@
 import android.os.Vibrator;
 import android.provider.Settings;
 import android.provider.Settings.System;
+import android.speech.RecognizerIntent;
 import android.telephony.PhoneStateListener;
 import android.telephony.TelephonyManager;
 import android.util.Log;
@@ -3818,24 +3819,32 @@
      * Tell the system to start voice-based interactions / voice commands
      */
     private void startVoiceBasedInteractions(boolean needWakeLock) {
-        Intent voiceIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH);
+        Intent voiceIntent = null;
+        // select which type of search to launch:
+        // - screen on and device unlocked: action is ACTION_WEB_SEARCH
+        // - device locked or screen off: action is ACTION_VOICE_SEARCH_HANDS_FREE
+        //    with EXTRA_SECURE set to true if the device is securely locked
+        PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
+        boolean isLocked = mKeyguardManager != null && mKeyguardManager.isKeyguardLocked();
+        if (!isLocked && pm.isScreenOn()) {
+            voiceIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH);
+        } else {
+            voiceIntent = new Intent(RecognizerIntent.ACTION_VOICE_SEARCH_HANDS_FREE);
+            voiceIntent.putExtra(RecognizerIntent.EXTRA_SECURE,
+                    isLocked && mKeyguardManager.isKeyguardSecure());
+        }
+        // start the search activity
         if (needWakeLock) {
             mMediaEventWakeLock.acquire();
         }
-        voiceIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
-                | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
         try {
-            if (mKeyguardManager != null) {
-                // it's ok to start voice-based interactions when:
-                // - the device is locked but doesn't require a password to be unlocked
-                // - the device is not locked
-                if ((mKeyguardManager.isKeyguardLocked() && !mKeyguardManager.isKeyguardSecure())
-                        || !mKeyguardManager.isKeyguardLocked()) {
-                    mContext.startActivity(voiceIntent);
-                }
+            if (voiceIntent != null) {
+                voiceIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                        | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+                mContext.startActivity(voiceIntent);
             }
         } catch (ActivityNotFoundException e) {
-            Log.e(TAG, "Error launching activity for ACTION_WEB_SEARCH: " + e);
+            Log.w(TAG, "No activity for search: " + e);
         } finally {
             if (needWakeLock) {
                 mMediaEventWakeLock.release();
@@ -3843,20 +3852,6 @@
         }
     }
 
-    /**
-     * Verify whether it is safe to start voice-based interactions given the state of the system
-     * @return false is the Keyguard is locked and secure, true otherwise
-     */
-    private boolean safeToStartVoiceBasedInteractions() {
-        KeyguardManager keyguard =
-                (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
-        if (keyguard == null) {
-            return false;
-        }
-        
-        return true;
-    }
-
     private PowerManager.WakeLock mMediaEventWakeLock;
 
     private static final int WAKELOCK_RELEASE_ON_FINISHED = 1980; //magic number