Index: remoting/android/java/src/org/chromium/chromoting/CardboardDesktopActivity.java |
diff --git a/remoting/android/java/src/org/chromium/chromoting/CardboardDesktopActivity.java b/remoting/android/java/src/org/chromium/chromoting/CardboardDesktopActivity.java |
index 8289d0eba6b04e6b4fb0ac92ce0eb1f2adb5965e..df454a97dae4399d1bd35e22c054ff350cce46e6 100644 |
--- a/remoting/android/java/src/org/chromium/chromoting/CardboardDesktopActivity.java |
+++ b/remoting/android/java/src/org/chromium/chromoting/CardboardDesktopActivity.java |
@@ -4,14 +4,20 @@ |
package org.chromium.chromoting; |
+import android.content.Intent; |
import android.graphics.PointF; |
import android.os.Bundle; |
+import android.speech.RecognitionListener; |
+import android.speech.RecognizerIntent; |
+import android.speech.SpeechRecognizer; |
import com.google.vrtoolkit.cardboard.CardboardActivity; |
import com.google.vrtoolkit.cardboard.CardboardView; |
import org.chromium.chromoting.jni.JniInterface; |
+import java.util.ArrayList; |
+ |
/** |
* Virtual desktop activity for Cardboard. |
*/ |
@@ -21,6 +27,10 @@ public class CardboardDesktopActivity extends CardboardActivity { |
private boolean mSwitchToDesktopActivity; |
private CardboardDesktopRenderer mRenderer; |
+ private SpeechRecognizer mSpeechRecognizer; |
+ |
+ // Flag to indicate whether the speech recognizer is listening or not. |
+ private boolean mIsListening; |
@Override |
public void onCreate(Bundle savedInstanceState) { |
@@ -29,6 +39,7 @@ public class CardboardDesktopActivity extends CardboardActivity { |
mSwitchToDesktopActivity = false; |
CardboardView cardboardView = (CardboardView) findViewById(R.id.cardboard_view); |
mRenderer = new CardboardDesktopRenderer(this); |
+ mIsListening = false; |
// Associate a CardboardView.StereoRenderer with cardboardView. |
cardboardView.setRenderer(mRenderer); |
@@ -45,9 +56,13 @@ public class CardboardDesktopActivity extends CardboardActivity { |
TouchInputHandler.BUTTON_LEFT, true); |
JniInterface.sendMouseEvent((int) coordinates.x, (int) coordinates.y, |
TouchInputHandler.BUTTON_LEFT, false); |
- } else { |
+ } else if (mRenderer.isLookingLeftOfDesktop()) { |
+ // TODO(shichengfeng): Give a more polished UI (including menu icons |
+ // and visual indicator during when speech recognizer is listening). |
mSwitchToDesktopActivity = true; |
finish(); |
+ } else if (mRenderer.isLookingRightOfDesktop()) { |
+ listenForVoiceInput(); |
} |
} |
@@ -64,6 +79,9 @@ public class CardboardDesktopActivity extends CardboardActivity { |
if (!mSwitchToDesktopActivity) { |
JniInterface.enableVideoChannel(false); |
} |
+ if (mSpeechRecognizer != null) { |
+ mSpeechRecognizer.stopListening(); |
+ } |
} |
@Override |
@@ -80,5 +98,80 @@ public class CardboardDesktopActivity extends CardboardActivity { |
} else { |
JniInterface.enableVideoChannel(false); |
} |
+ if (mSpeechRecognizer != null) { |
+ mSpeechRecognizer.stopListening(); |
+ } |
+ } |
+ |
+ @Override |
+ protected void onDestroy() { |
+ super.onDestroy(); |
+ if (mSpeechRecognizer != null) { |
+ mSpeechRecognizer.cancel(); |
+ mSpeechRecognizer.destroy(); |
+ } |
+ } |
+ |
+ private void listenForVoiceInput() { |
+ if (mIsListening) { |
+ return; |
+ } |
+ |
+ if (mSpeechRecognizer == null) { |
+ if (SpeechRecognizer.isRecognitionAvailable(this)) { |
+ mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); |
+ mSpeechRecognizer.setRecognitionListener(new VoiceInputRecognitionListener()); |
+ } else { |
+ return; |
+ } |
+ } |
+ |
+ mIsListening = true; |
+ |
+ Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); |
+ |
+ // LANGUAGE_MODEL_FREE_FORM is used to improve dictation accuracy |
+ // for the voice keyboard. |
+ intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, |
+ RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); |
+ |
+ mSpeechRecognizer.startListening(intent); |
+ } |
+ |
+ private class VoiceInputRecognitionListener implements RecognitionListener { |
+ public void onReadyForSpeech(Bundle params) { |
+ } |
+ |
+ public void onBeginningOfSpeech() { |
+ } |
+ |
+ public void onRmsChanged(float rmsdB){ |
+ } |
+ |
+ public void onBufferReceived(byte[] buffer) { |
+ } |
+ |
+ public void onEndOfSpeech() { |
+ mIsListening = false; |
+ } |
+ |
+ public void onError(int error) { |
+ mIsListening = false; |
+ } |
+ |
+ public void onResults(Bundle results) { |
+ // TODO(shichengfeng): If necessary, provide a list of choices for user to pick. |
+ ArrayList<String> data = |
+ results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); |
+ if (!data.isEmpty()) { |
+ JniInterface.sendTextEvent(data.get(0)); |
+ } |
+ } |
+ |
+ public void onPartialResults(Bundle partialResults) { |
+ } |
+ |
+ public void onEvent(int eventType, Bundle params) { |
+ } |
} |
} |