1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_IMPL_ANDROID_H_
6#define CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_IMPL_ANDROID_H_
7
8#include <jni.h>
9
10#include "base/android/scoped_java_ref.h"
11#include "base/memory/ref_counted.h"
12#include "base/memory/scoped_ptr.h"
13#include "content/browser/speech/speech_recognizer.h"
14#include "content/public/common/speech_recognition_error.h"
15#include "content/public/common/speech_recognition_result.h"
16
17namespace content {
18
19class SpeechRecognitionEventListener;
20
21class CONTENT_EXPORT SpeechRecognizerImplAndroid : public SpeechRecognizer {
22 public:
23  SpeechRecognizerImplAndroid(SpeechRecognitionEventListener* listener,
24                              int session_id);
25
26  // SpeechRecognizer methods.
27  virtual void StartRecognition(const std::string& device_id) OVERRIDE;
28  virtual void AbortRecognition() OVERRIDE;
29  virtual void StopAudioCapture() OVERRIDE;
30  virtual bool IsActive() const OVERRIDE;
31  virtual bool IsCapturingAudio() const OVERRIDE;
32
33  // Called from Java methods via JNI.
34  void OnAudioStart(JNIEnv* env, jobject obj);
35  void OnSoundStart(JNIEnv* env, jobject obj);
36  void OnSoundEnd(JNIEnv* env, jobject obj);
37  void OnAudioEnd(JNIEnv* env, jobject obj);
38  void OnRecognitionResults(JNIEnv* env, jobject obj, jobjectArray strings,
39                            jfloatArray floats, jboolean interim);
40  void OnRecognitionError(JNIEnv* env, jobject obj, jint error);
41  void OnRecognitionEnd(JNIEnv* env, jobject obj);
42
43  static bool RegisterSpeechRecognizer(JNIEnv* env);
44
45 private:
46  enum State {
47    STATE_IDLE = 0,
48    STATE_CAPTURING_AUDIO,
49    STATE_AWAITING_FINAL_RESULT
50  };
51
52  void StartRecognitionOnUIThread(
53      std::string language, bool continuous, bool interim_results);
54  void OnRecognitionResultsOnIOThread(SpeechRecognitionResults const &results);
55
56  virtual ~SpeechRecognizerImplAndroid();
57
58  base::android::ScopedJavaGlobalRef<jobject> j_recognition_;
59  State state_;
60
61  DISALLOW_COPY_AND_ASSIGN(SpeechRecognizerImplAndroid);
62};
63
64}  // namespace content
65
66#endif  // CONTENT_BROWSER_SPEECH_SPEECH_RECOGNIZER_IMPL_ANDROID_H_
67