diff --git a/android-aac-enc/AndroidManifest.xml b/android-aac-enc/AndroidManifest.xml index 46ada8375..6e89b76aa 100644 --- a/android-aac-enc/AndroidManifest.xml +++ b/android-aac-enc/AndroidManifest.xml @@ -16,7 +16,7 @@ android:label="@string/app_name" > + android:name=".RecognizerApi$Main" > diff --git a/android-aac-enc/src/com/todoroo/aacenc/Main.java b/android-aac-enc/src/com/todoroo/aacenc/RecognizerApi.java similarity index 54% rename from android-aac-enc/src/com/todoroo/aacenc/Main.java rename to android-aac-enc/src/com/todoroo/aacenc/RecognizerApi.java index 50ca926ae..d0700b2b0 100644 --- a/android-aac-enc/src/com/todoroo/aacenc/Main.java +++ b/android-aac-enc/src/com/todoroo/aacenc/RecognizerApi.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import android.app.Activity; import android.app.ProgressDialog; +import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.Intent; @@ -21,43 +22,44 @@ import android.view.View.OnClickListener; import android.widget.TextView; import android.widget.Toast; -public class Main extends Activity implements RecognitionListener { +public class RecognizerApi implements RecognitionListener { - private String AAC_FILE; - private String M4A_FILE = "/sdcard/audio.m4a"; + private String aacFile; - /** Called when the activity is first created. */ - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.main); - - File dir = getFilesDir(); - AAC_FILE = dir.toString() + "/audio.aac"; - - - findViewById(R.id.write).setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - write(); - } - }); - - findViewById(R.id.play).setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - play(); - } - }); - - sr = SpeechRecognizer.createSpeechRecognizer(this); + private Context context; + + public static interface RecognizerApiListener { + public void onSpeechResult(String result); + } + + private RecognizerApiListener mListener; + + public RecognizerApi(Context context) { + this.context = context; + + File dir = context.getFilesDir(); + aacFile = dir.toString() + "/audio.aac"; + + sr = SpeechRecognizer.createSpeechRecognizer(context); + } + + public void setTemporaryFile(String fileName) { + aacFile = context.getFilesDir().toString() + "/" + fileName; + } + + public String getTemporaryFile() { + return aacFile; + } + + public void setListener(RecognizerApiListener listener) { + this.mListener = listener; } - private void play() { + public void play(String file) { MediaPlayer mediaPlayer = new MediaPlayer(); try { - mediaPlayer.setDataSource(M4A_FILE); + mediaPlayer.setDataSource(file); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IllegalArgumentException e) { @@ -68,7 +70,7 @@ public class Main extends Activity implements RecognitionListener { throw new RuntimeException(e); } - Toast.makeText(Main.this, "Playing Audio", Toast.LENGTH_LONG).show(); + Toast.makeText(context, "Playing Audio", Toast.LENGTH_LONG).show(); } private AACEncoder encoder = new AACEncoder(); @@ -76,7 +78,7 @@ public class Main extends Activity implements RecognitionListener { private SpeechRecognizer sr; private ProgressDialog pd; - private void write() { + public void write() { sr.setRecognitionListener(this); Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); @@ -87,7 +89,7 @@ public class Main extends Activity implements RecognitionListener { speechStarted = 0; baos.reset(); - pd = new ProgressDialog(this); + pd = new ProgressDialog(context); pd.setMessage("Speak now..."); pd.setIndeterminate(true); pd.setCancelable(true); @@ -105,14 +107,31 @@ public class Main extends Activity implements RecognitionListener { speechStarted = System.currentTimeMillis(); } + public void convert(String toFile) { + try { + new AACToM4A().convert(context, aacFile, toFile); + + Toast.makeText(context, "File Saved!", Toast.LENGTH_LONG).show(); + } catch (IOException e) { + Toast.makeText(context, "Error :(", Toast.LENGTH_LONG).show(); + Log.e("ERROR", "error converting", e); + } + } + + public void destroy() { + sr.destroy(); + } + + // --- RecognitionListener methods --- // + + private ByteArrayOutputStream baos = new ByteArrayOutputStream(); + @Override public void onBeginningOfSpeech() { System.err.println("beginning"); } - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - @Override public void onBufferReceived(byte[] buffer) { if(speechStarted > 0) { @@ -124,12 +143,6 @@ public class Main extends Activity implements RecognitionListener { } } - @Override - protected void onStop() { - super.onStop(); - sr.destroy(); - } - @Override public void onEndOfSpeech() { pd.dismiss(); @@ -145,22 +158,13 @@ public class Main extends Activity implements RecognitionListener { System.err.println("computed sample rate: " + sampleRate); - encoder.init(64000, 1, sampleRate, 16, AAC_FILE); + encoder.init(64000, 1, sampleRate, 16, aacFile); encoder.encode(baos.toByteArray()); System.err.println("end"); encoder.uninit(); - - try { - new AACToM4A().convert(this, AAC_FILE, M4A_FILE); - - Toast.makeText(Main.this, "File Saved!", Toast.LENGTH_LONG).show(); - } catch (IOException e) { - Toast.makeText(Main.this, "Error :(", Toast.LENGTH_LONG).show(); - Log.e("ERROR", "error converting", e); - } } @Override @@ -185,11 +189,54 @@ public class Main extends Activity implements RecognitionListener { @Override public void onResults(Bundle results) { ArrayList strings = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); - ((TextView)findViewById(R.id.text)).setText( - strings.size() == 0 ? "" : strings.get(0)); + if (mListener != null) + mListener.onSpeechResult(strings.size() == 0 ? "" : strings.get(0)); } @Override public void onRmsChanged(float arg0) { } + + public static class Main extends Activity implements RecognizerApiListener { + private RecognizerApi api; + + private static final String M4A_FILE = "/sdcard/audio.m4a"; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + api = new RecognizerApi(this); + + setContentView(R.layout.main); + + findViewById(R.id.write).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + api.write(); + } + }); + + findViewById(R.id.play).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + api.play(M4A_FILE); + } + }); + + } + + @Override + protected void onDestroy() { + super.onDestroy(); + api.destroy(); + } + + @Override + public void onSpeechResult(String result) { + ((TextView)findViewById(R.id.text)).setText(result); + api.convert(M4A_FILE); + } + } } \ No newline at end of file diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 91e447e20..ad42a1f38 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -34,6 +34,7 @@ + diff --git a/astrid/src/com/todoroo/astrid/ui/QuickAddBar.java b/astrid/src/com/todoroo/astrid/ui/QuickAddBar.java index fd54d35c1..6a90864d6 100644 --- a/astrid/src/com/todoroo/astrid/ui/QuickAddBar.java +++ b/astrid/src/com/todoroo/astrid/ui/QuickAddBar.java @@ -22,10 +22,13 @@ import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import com.timsu.astrid.R; +import com.todoroo.aacenc.RecognizerApi; +import com.todoroo.aacenc.RecognizerApi.RecognizerApiListener; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; +import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.actfm.ActFmLoginActivity; @@ -50,7 +53,6 @@ import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.utility.Flags; -import com.todoroo.astrid.voice.VoiceInputAssistant; /** * Quick Add Bar lets you add tasks. @@ -58,7 +60,7 @@ import com.todoroo.astrid.voice.VoiceInputAssistant; * @author Tim Su * */ -public class QuickAddBar extends LinearLayout { +public class QuickAddBar extends LinearLayout implements RecognizerApiListener { private ImageButton voiceAddButton; private ImageButton quickAddButton; @@ -72,13 +74,16 @@ public class QuickAddBar extends LinearLayout { private EditPeopleControlSet peopleControl; private boolean usePeopleControl = true; + private String currentVoiceFile = null; + @Autowired AddOnService addOnService; @Autowired ExceptionService exceptionService; @Autowired TaskService taskService; @Autowired MetadataService metadataService; @Autowired ActFmPreferenceService actFmPreferenceService; - private VoiceInputAssistant voiceInputAssistant; + //private VoiceInputAssistant voiceInputAssistant; + private RecognizerApi recognizerApi; private Activity activity; private TaskListFragment fragment; @@ -100,6 +105,9 @@ public class QuickAddBar extends LinearLayout { activity = myActivity; fragment = myFragment; + recognizerApi = new RecognizerApi(activity); + recognizerApi.setListener(this); + DependencyInjectionService.getInstance().inject(this); LayoutInflater.from(activity).inflate(R.layout.quick_add_bar, this); @@ -150,9 +158,19 @@ public class QuickAddBar extends LinearLayout { int prompt = R.string.voice_edit_title_prompt; if (Preferences.getBoolean(R.string.p_voiceInputCreatesTask, false)) prompt = R.string.voice_create_prompt; - voiceInputAssistant = new VoiceInputAssistant(fragment, - voiceAddButton, quickAddBox); - voiceInputAssistant.configureMicrophoneButton(prompt); +// voiceInputAssistant = new VoiceInputAssistant(fragment, +// voiceAddButton, quickAddBox); +// voiceInputAssistant.configureMicrophoneButton(prompt); + findViewById(R.id.voiceAddButton).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (currentVoiceFile == null) + currentVoiceFile = Long.toString(DateUtilities.now()); + + recognizerApi.setTemporaryFile(currentVoiceFile); + recognizerApi.write(); + } + }); // set listener for extended addbutton quickAddButton.setOnLongClickListener(new OnLongClickListener() { @@ -170,7 +188,7 @@ public class QuickAddBar extends LinearLayout { if (addOnService.hasPowerPack() && Preferences.getBoolean(R.string.p_voiceInputEnabled, true) - && voiceInputAssistant.isVoiceInputAvailable()) { + /*&& voiceInputAssistant.isVoiceInputAvailable()*/) { voiceAddButton.setVisibility(View.VISIBLE); } else { voiceAddButton.setVisibility(View.GONE); @@ -319,6 +337,15 @@ public class QuickAddBar extends LinearLayout { } } + if (currentVoiceFile != null) { + String voiceFile = activity.getExternalFilesDir("audio").toString() + "/" + task.getId() + "_audio.mp4"; + System.err.println("Saving to " + voiceFile); + recognizerApi.convert(voiceFile); + currentVoiceFile = null; + + // TODO: attach to task + } + fragment.incrementFilterCount(); StatisticsService.reportEvent(StatisticsConstants.TASK_CREATED_TASKLIST); @@ -390,8 +417,8 @@ public class QuickAddBar extends LinearLayout { public boolean onActivityResult(int requestCode, int resultCode, Intent data) { // handle the result of voice recognition, put it into the textfield - if (voiceInputAssistant.handleActivityResult(requestCode, resultCode, - data)) { + if (false /*voiceInputAssistant.handleActivityResult(requestCode, resultCode, + data)*/) { // if user wants, create the task directly (with defaultvalues) // after saying it Flags.set(Flags.TLA_RESUMED_FROM_VOICE_ADD); @@ -413,6 +440,11 @@ public class QuickAddBar extends LinearLayout { return false; } + @Override + public void onSpeechResult(String result) { + quickAddBox.setText(result); + } + public void hideKeyboard() { InputMethodManager imm = (InputMethodManager) activity.getSystemService( Context.INPUT_METHOD_SERVICE);