From 3c2711fc2853394324b044632b79ca67388df8f4 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Sun, 20 May 2012 12:07:03 -0700 Subject: [PATCH] Type of search on headset key long press must depend on device state When the user long presses on the headset key, the type of search that will launched must depend on the state of the device. The following logic is implemented: - 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. Bug 6518222 Change-Id: I318770346b8d83e44dfcd4154bcdb517ea7098b5 --- media/java/android/media/AudioService.java | 47 ++++++++++------------ 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index aa29444265fe3..da01c4424918a 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -59,6 +59,7 @@ import android.os.SystemProperties; 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 @@ public class AudioService extends IAudioService.Stub implements OnFinished { * 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 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } } - /** - * 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