Remove RecognizerApi

pull/253/head
Alex Baker 10 years ago
parent 502c31bfbc
commit 1522dae01b

@ -73,15 +73,13 @@ import com.todoroo.astrid.timers.TimerControlSet;
import com.todoroo.astrid.timers.TimerPlugin;
import com.todoroo.astrid.ui.DateChangedAlerts;
import com.todoroo.astrid.ui.DeadlineControlSet;
import com.todoroo.astrid.ui.EditNotesControlSet;
import com.todoroo.astrid.ui.DescriptionControlSet;
import com.todoroo.astrid.ui.EditTitleControlSet;
import com.todoroo.astrid.ui.HideUntilControlSet;
import com.todoroo.astrid.ui.ImportanceControlSet;
import com.todoroo.astrid.ui.PopupControlSet;
import com.todoroo.astrid.ui.ReminderControlSet;
import com.todoroo.astrid.utility.Flags;
import com.todoroo.astrid.voice.VoiceInputAssistant;
import com.todoroo.astrid.voice.VoiceRecognizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -146,7 +144,6 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
// --- request codes
private static final int REQUEST_VOICE_RECOG = 10;
public static final int REQUEST_CODE_RECORD = 30;
public static final int REQUEST_CODE_ATTACH_FILE = 40;
public static final int REQUEST_CODE_BEAST_MODE = 50;
@ -178,7 +175,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
// --- UI components
private EditNotesControlSet notesControlSet = null;
private DescriptionControlSet notesControlSet = null;
private FilesControlSet filesControlSet = null;
private TimerActionControlSet timerAction;
private EditText title;
@ -199,9 +196,6 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
/** whether task should be saved when this activity exits */
private boolean shouldSaveState = true;
/** voice assistant for notes-creation */
private VoiceInputAssistant voiceNoteAssistant;
private EditText notesEditText;
private Dialog whenDialog;
@ -391,7 +385,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
controlSetMap.put(getString(R.string.TEA_ctrl_importance_pref),
importanceControl);
notesControlSet = new EditNotesControlSet(preferences, getActivity());
notesControlSet = new DescriptionControlSet(preferences, getActivity());
notesEditText = (EditText) notesControlSet.getView().findViewById(
R.id.notes);
controls.add(notesControlSet);
@ -507,22 +501,8 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
private class TaskEditBackgroundLoader extends Thread {
public void onUiThread() {
// prepare and set listener for voice-button
if (getActivity() != null) {
if (VoiceRecognizer.voiceInputAvailable(getActivity())) {
ImageButton voiceAddNoteButton = (ImageButton) notesControlSet.getView().findViewById(
R.id.voiceAddNoteButton);
voiceAddNoteButton.setVisibility(View.VISIBLE);
int prompt = R.string.voice_edit_note_prompt;
voiceNoteAssistant = new VoiceInputAssistant(voiceAddNoteButton, REQUEST_VOICE_RECOG);
voiceNoteAssistant.setAppend();
voiceNoteAssistant.setLanguageModel(RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
if (VoiceRecognizer.voiceInputAvailable(ContextManager.getContext())) {
voiceNoteAssistant.configureMicrophoneButton(TaskEditFragment.this, prompt);
} else {
voiceNoteAssistant.hideVoiceButton();
}
}
// todo: is this necessary?
loadMoreContainer();
}
}
@ -542,7 +522,6 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
onUiThread();
}
});
}
}
@ -957,16 +936,6 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
if (editNotes != null && editNotes.activityResult(requestCode, resultCode, data)) {
return;
} else if (requestCode == REQUEST_VOICE_RECOG
&& resultCode == Activity.RESULT_OK) {
// handle the result of voice recognition, put it into the
// appropiate textfield
voiceNoteAssistant.handleActivityResult(requestCode, resultCode, data, notesEditText);
// write the voicenote into the model, or it will be deleted by
// onResume.populateFields
// (due to the activity-change)
notesControlSet.writeToModel(model);
} else if (requestCode == REQUEST_CODE_RECORD && resultCode == Activity.RESULT_OK) {
String recordedAudioPath = data.getStringExtra(AACRecordingActivity.RESULT_OUTFILE);
String recordedAudioName = data.getStringExtra(AACRecordingActivity.RESULT_FILENAME);

@ -10,7 +10,6 @@ import android.app.AlertDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.speech.SpeechRecognizer;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v4.widget.DrawerLayout;
@ -20,11 +19,10 @@ import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.actfm.TagSettingsActivity;
import com.todoroo.astrid.actfm.TagSettingsActivityTablet;
import com.todoroo.astrid.actfm.TagViewFragment;
@ -40,10 +38,9 @@ import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksListFragment;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.tags.TagFilterExposer;
import com.todoroo.astrid.ui.QuickAddBar;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.utility.Flags;
import com.todoroo.astrid.voice.VoiceRecognizer;
import com.todoroo.astrid.voice.VoiceInputAssistant;
import org.tasks.R;
import org.tasks.preferences.ActivityPreferences;
@ -51,15 +48,15 @@ import org.tasks.ui.NavigationDrawerFragment;
import javax.inject.Inject;
import static com.todoroo.astrid.voice.RecognizerApi.RecognizerApiListener;
import static com.todoroo.astrid.voice.VoiceRecognizer.voiceInputAvailable;
import static com.todoroo.astrid.voice.VoiceInputAssistant.voiceInputAvailable;
import static org.tasks.ui.NavigationDrawerFragment.OnFilterItemClickedListener;
public class TaskListActivity extends AstridActivity implements OnPageChangeListener, OnFilterItemClickedListener, RecognizerApiListener {
public class TaskListActivity extends AstridActivity implements OnPageChangeListener, OnFilterItemClickedListener {
@Inject TagDataDao tagDataDao;
@Inject ActivityPreferences preferences;
@Inject GtasksPreferenceService gtasksPreferenceService;
@Inject VoiceInputAssistant voiceInputAssistant;
private NavigationDrawerFragment navigationDrawer;
@ -319,6 +316,16 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Callback<String> quickAddTask = new Callback<String>() {
@Override
public void apply(String title) {
getTaskListFragment().quickAddBar.quickAddTask(title);
}
};
if (voiceInputAssistant.handleActivityResult(requestCode, resultCode, data, quickAddTask)) {
return;
}
if ((requestCode == NavigationDrawerFragment.REQUEST_NEW_LIST ||
requestCode == TaskListFragment.ACTIVITY_REQUEST_NEW_FILTER) &&
resultCode == Activity.RESULT_OK) {
@ -454,7 +461,7 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList
TaskListFragment tlf = getTaskListFragment();
switch(item.getItemId()) {
case R.id.menu_voice_add:
getTaskListFragment().startVoiceRecognition();
voiceInputAssistant.startVoiceRecognitionActivity(R.string.voice_create_prompt);
return true;
case R.id.menu_sort:
AlertDialog dialog = SortSelectionActivity.createDialog(
@ -493,45 +500,4 @@ public class TaskListActivity extends AstridActivity implements OnPageChangeList
public boolean isDrawerOpen() {
return navigationDrawer.isDrawerOpen();
}
// Voice recognizer callbacks
@Override
public void onSpeechResult(String result) {
TaskListFragment tlf = getTaskListFragment();
if (tlf != null) {
tlf.quickAddBar.quickAddTask(result);
}
}
@Override
public void onSpeechError(int error) {
TaskListFragment tlf = getTaskListFragment();
if (tlf != null) {
QuickAddBar quickAdd = tlf.quickAddBar;
if (quickAdd != null) {
VoiceRecognizer vr = getTaskListFragment().getVoiceRecognizer();
if (vr != null) {
vr.cancel();
}
}
}
int errorStr = 0;
switch(error) {
case SpeechRecognizer.ERROR_NETWORK:
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
errorStr = R.string.speech_err_network;
break;
case SpeechRecognizer.ERROR_NO_MATCH:
Toast.makeText(this, R.string.speech_err_no_match, Toast.LENGTH_LONG).show();
break;
default:
errorStr = R.string.speech_err_default;
break;
}
if (errorStr > 0) {
DialogUtilities.okDialog(this, getString(errorStr), null);
}
}
}

@ -71,7 +71,6 @@ import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.timers.TimerPlugin;
import com.todoroo.astrid.ui.QuickAddBar;
import com.todoroo.astrid.utility.Flags;
import com.todoroo.astrid.voice.VoiceRecognizer;
import com.todoroo.astrid.widget.TasksWidget;
import org.slf4j.Logger;
@ -220,10 +219,6 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
emptyView.setRefreshing(ongoing);
}
public VoiceRecognizer getVoiceRecognizer() {
return voiceRecognizer;
}
/**
* Container Activity must implement this interface and we ensure that it
* does during the onAttach() callback
@ -491,31 +486,6 @@ public class TaskListFragment extends InjectingListFragment implements OnSortSel
* ======================================================================
*/
@Override
public void onStart() {
super.onStart();
setupRecognizerApi();
}
@Override
public void onStop() {
super.onStop();
destroyRecognizerApi();
}
private VoiceRecognizer voiceRecognizer;
public void setupRecognizerApi() {
voiceRecognizer = VoiceRecognizer.instantiateVoiceRecognizer(getActivity(), (TaskListActivity) getActivity());
}
public void destroyRecognizerApi() {
voiceRecognizer.destroyRecognizerApi();
}
public void startVoiceRecognition() {
voiceRecognizer.startVoiceRecognition(getActivity(), this);
}
@Override
public void onResume() {
super.onResume();

@ -9,6 +9,7 @@ import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.text.TextUtils;
import android.view.LayoutInflater;
@ -31,8 +32,6 @@ import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskAttachment;
import com.todoroo.astrid.ui.PopupControlSet;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.voice.RecognizerApi;
import com.todoroo.astrid.voice.RecognizerApi.PlaybackExceptionHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -177,12 +176,29 @@ public class FilesControlSet extends PopupControlSet {
}
}
public static interface PlaybackExceptionHandler {
public void playbackFailed();
}
private static void play(String file, PlaybackExceptionHandler handler) {
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(file);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (Exception e) {
log.error(e.getMessage(), e);
handler.playbackFailed();
}
}
private void showFile(final TaskAttachment m) {
final String fileType = m.containsNonNullValue(TaskAttachment.CONTENT_TYPE) ? m.getContentType() : TaskAttachment.FILE_TYPE_OTHER;
final String filePath = m.getFilePath();
if (fileType.startsWith(TaskAttachment.FILE_TYPE_AUDIO)) {
RecognizerApi.play(m.getFilePath(), new PlaybackExceptionHandler() {
play(m.getFilePath(), new PlaybackExceptionHandler() {
@Override
public void playbackFailed() {
showFromIntent(filePath, fileType);

@ -23,13 +23,13 @@ import org.tasks.preferences.ActivityPreferences;
import static org.tasks.preferences.ResourceResolver.getResource;
public class EditNotesControlSet extends PopupControlSet {
public class DescriptionControlSet extends PopupControlSet {
protected EditText editText;
protected TextView notesPreview;
protected ImageView image;
public EditNotesControlSet(ActivityPreferences preferences, Activity activity) {
public DescriptionControlSet(ActivityPreferences preferences, Activity activity) {
super(preferences, activity, R.layout.control_set_notes, R.layout.control_set_notes_display, R.string.TEA_note_label);
image = (ImageView) getDisplayView().findViewById(R.id.display_row_icon);
}

@ -1,181 +0,0 @@
package com.todoroo.astrid.voice;
import android.annotation.TargetApi;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
@TargetApi(8)
public class RecognizerApi implements RecognitionListener {
private static final Logger log = LoggerFactory.getLogger(RecognizerApi.class);
public static interface PlaybackExceptionHandler {
public void playbackFailed();
}
private Context context;
public static interface RecognizerApiListener {
public void onSpeechResult(String result);
public void onSpeechError(int error);
}
private RecognizerApiListener mListener;
public RecognizerApi(Context context) {
this.context = context;
sr = SpeechRecognizer.createSpeechRecognizer(context);
}
public void setListener(RecognizerApiListener listener) {
this.mListener = listener;
}
public static void play(String file, PlaybackExceptionHandler handler) {
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(file);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (Exception e) {
log.error(e.getMessage(), e);
handler.playbackFailed();
}
}
private long speechStarted = 0;
private SpeechRecognizer sr;
private ProgressDialog speakPd;
private ProgressDialog processingPd;
public void start(String callingPackage, String speakNowMessage) {
sr.setRecognitionListener(this);
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, callingPackage);
speechStarted = 0;
baos.reset();
speakPd = new ProgressDialog(context);
speakPd.setMessage(speakNowMessage);
speakPd.setIndeterminate(true);
speakPd.setCancelable(true);
speakPd.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
sr.cancel();
onEndOfSpeech();
}
});
speakPd.show();
sr.startListening(intent);
speechStarted = System.currentTimeMillis();
}
public void cancel() {
sr.cancel();
}
public void destroy() {
sr.setRecognitionListener(null);
sr.destroy();
}
// --- RecognitionListener methods --- //
private ByteArrayOutputStream baos = new ByteArrayOutputStream();
@Override
public void onBeginningOfSpeech() {
}
@Override
public void onBufferReceived(byte[] buffer) {
if (speechStarted > 0) {
try {
baos.write(buffer);
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
}
@Override
public void onEndOfSpeech() {
speakPd.dismiss();
if (speechStarted == 0)
return;
processingPd = new ProgressDialog(context);
processingPd.setMessage("");
processingPd.setIndeterminate(true);
processingPd.setCancelable(true);
processingPd.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
sr.cancel();
}
});
processingPd.show();
}
@Override
public void onError(int error) {
log.error("Error code " + error, new RuntimeException());
if (mListener != null) {
mListener.onSpeechError(error);
}
}
@Override
public void onEvent(int arg0, Bundle arg1) {
//
}
@Override
public void onPartialResults(Bundle partialResults) {
onResults(partialResults);
}
@Override
public void onReadyForSpeech(Bundle arg0) {
}
@Override
public void onResults(Bundle results) {
processingPd.dismiss();
ArrayList<String> strings = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
if (mListener != null) {
mListener.onSpeechResult(strings == null || strings.size() == 0 ? "" : strings.get(0));
}
}
@Override
public void onRmsChanged(float arg0) {
}
}

@ -6,7 +6,10 @@
package com.todoroo.astrid.voice;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.speech.RecognizerIntent;
import android.support.v4.app.Fragment;
import android.view.View;
@ -14,6 +17,7 @@ import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.service.ContextManager;
import junit.framework.Assert;
@ -23,6 +27,10 @@ import org.slf4j.LoggerFactory;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* This class handles taking voice-input and appends the text to the registered EditText-instance.
@ -35,13 +43,27 @@ import java.util.ArrayList;
*
* @author Arne Jans
*/
@Singleton
public class VoiceInputAssistant {
private static final Logger log = LoggerFactory.getLogger(VoiceInputAssistant.class);
/** requestcode for activityresult from voicerecognizer-intent */
public static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
/**
* Call this to see if your phone supports voiceinput in its current configuration.
* If this method returns false, it could also mean that Google Voicesearch is simply
* not installed.
* If this method returns true, internal use of it enables the registered microphone-button.
*
* @return whether this phone supports voiceinput
*/
public static boolean voiceInputAvailable(Context context) {
PackageManager pm = context.getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(
new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
return (activities.size() != 0);
}
/**
* This requestcode is used to differentiate between multiple microphone-buttons on a single fragment.
* Use the mightier constructor to specify your own requestCode in this case for every additional use on an fragment.
@ -49,62 +71,15 @@ public class VoiceInputAssistant {
*/
private int requestCode = VOICE_RECOGNITION_REQUEST_CODE;
private Activity activity;
private final ImageButton voiceButton;
private boolean append = false;
private String languageModel = RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH;
/**
* @param languageModel the languageModel to set
*/
public void setLanguageModel(String languageModel) {
this.languageModel = languageModel;
}
/** Sets whether voice input will append into field */
public void setAppend() {
this.append = true;
}
/**
* This constructor can be called from a widget with a voice-button calling a dummy-activity.
*
* @param activity dummy-activity that starts the voice-request.
*/
@Inject
public VoiceInputAssistant(Activity activity) {
this.activity = activity;
this.voiceButton = null;
}
/**
* Creates a new VoiceInputAssistance-instance for use with a specified button and textfield.
* If you need more than one microphone-button on a given fragment, use the other constructor.
*
* @param voiceButton the microphone-Button
*/
public VoiceInputAssistant(ImageButton voiceButton) {
Assert.assertNotNull("A VoiceInputAssistant without a voiceButton makes no sense!", voiceButton);
this.voiceButton = voiceButton;
}
/**
* The param requestCode is used to differentiate between multiple
* microphone-buttons on a single fragment.
* Use the this constructor to specify your own requestCode in
* this case for every additional use on a fragment.
* If you only use one microphone-button on a fragment,
* you can leave it to its default, VOICE_RECOGNITION_REQUEST_CODE.
*
*
* @param requestCode has to be unique in a single fragment-context,
* dont use VOICE_RECOGNITION_REQUEST_CODE, this is reserved for the other constructor
*/
public VoiceInputAssistant(ImageButton voiceButton, int requestCode) {
this(voiceButton);
if (requestCode == VOICE_RECOGNITION_REQUEST_CODE) {
throw new InvalidParameterException("You have to specify a unique requestCode for this VoiceInputAssistant!");
}
this.requestCode = requestCode;
}
/**
@ -113,19 +88,12 @@ public class VoiceInputAssistant {
*
* @param prompt Specify the R.string.string_id resource for the prompt-text during voice-recognition here
*/
public void startVoiceRecognitionActivity(Fragment fragment, int prompt) {
public void startVoiceRecognitionActivity(int prompt) {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, languageModel);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, ContextManager.getContext().getString(prompt));
String detailMessage = "Error! No Fragment or Activity was registered to handle this voiceinput-request!";
if (activity != null) {
activity.startActivityForResult(intent, requestCode);
} else if (fragment != null) {
fragment.startActivityForResult(intent, requestCode);
} else {
log.error(detailMessage, new IllegalStateException(detailMessage));
}
activity.startActivityForResult(intent, requestCode);
}
/**
@ -140,7 +108,7 @@ public class VoiceInputAssistant {
*
* @param activityRequestCode if this equals the requestCode specified by constructor, then results of voice-recognition
*/
public boolean handleActivityResult(int activityRequestCode, int resultCode, Intent data, EditText textField) {
public boolean handleActivityResult(int activityRequestCode, int resultCode, Intent data, Callback<String> onVoiceRecognition) {
boolean result = false;
// handle the result of voice recognition, put it into the textfield
if (activityRequestCode == this.requestCode) {
@ -158,29 +126,11 @@ public class VoiceInputAssistant {
recognizedSpeech = recognizedSpeech.substring(0, 1).toUpperCase() +
recognizedSpeech.substring(1).toLowerCase();
if(append) {
textField.setText((textField.getText() + " " + recognizedSpeech).trim());
} else {
textField.setText(recognizedSpeech);
}
onVoiceRecognition.apply(recognizedSpeech);
}
}
}
return result;
}
public void configureMicrophoneButton(final Fragment fragment, final int prompt) {
voiceButton.setVisibility(View.VISIBLE);
voiceButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startVoiceRecognitionActivity(fragment, prompt);
}
});
}
public void hideVoiceButton() {
voiceButton.setVisibility(View.GONE);
}
}

@ -1,99 +0,0 @@
/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.voice;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.support.v4.app.Fragment;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.voice.RecognizerApi.RecognizerApiListener;
import org.tasks.R;
import java.util.List;
@TargetApi(8)
public class VoiceRecognizer {
protected RecognizerApi recognizerApi;
protected VoiceInputAssistant voiceInputAssistant;
public static boolean speechRecordingAvailable(Context context) {
return AndroidUtilities.getSdkVersion() >= 8 &&
SpeechRecognizer.isRecognitionAvailable(context);
}
/**
* Call this to see if your phone supports voiceinput in its current configuration.
* If this method returns false, it could also mean that Google Voicesearch is simply
* not installed.
* If this method returns true, internal use of it enables the registered microphone-button.
*
* @return whether this phone supports voiceinput
*/
public static boolean voiceInputAvailable(Context context) {
PackageManager pm = context.getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(
new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
return (activities.size() != 0);
}
private VoiceRecognizer() {
//
}
private static VoiceRecognizer instance = null;
public static VoiceRecognizer instantiateVoiceRecognizer(Activity activity, RecognizerApiListener listener) {
synchronized(VoiceRecognizer.class) {
if (instance == null) {
instance = new VoiceRecognizer();
}
}
if (speechRecordingAvailable(activity)) {
if (instance.recognizerApi != null) {
instance.recognizerApi.destroy();
}
instance.recognizerApi = new RecognizerApi(activity);
instance.recognizerApi.setListener(listener);
} else {
instance.voiceInputAssistant = new VoiceInputAssistant(activity);
}
return instance;
}
public void startVoiceRecognition(Context context, Fragment fragment) {
if (speechRecordingAvailable(context) && recognizerApi != null) {
recognizerApi.start(Constants.PACKAGE, context.getString(R.string.audio_speak_now));
} else {
int prompt = R.string.voice_create_prompt;
voiceInputAssistant.startVoiceRecognitionActivity(fragment, prompt);
}
}
public void destroyRecognizerApi() {
if (instance != null && instance.recognizerApi != null) {
instance.recognizerApi.destroy();
instance.recognizerApi = null;
}
}
public void cancel() {
if (instance != null && instance.recognizerApi != null) {
instance.recognizerApi.cancel();
}
}
}

@ -22,19 +22,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<!-- Voice Add Note Button -->
<ImageButton
android:id="@+id/voiceAddNoteButton"
android:layout_width="39dip"
android:layout_height="39dip"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:background="@android:color/transparent"
android:scaleType="center"
android:src="?attr/ic_action_mic"
android:layout_gravity="top"
android:visibility="gone" />
<EditText
android:id="@+id/notes"
android:layout_width="wrap_content"

@ -247,15 +247,11 @@
<string name="locale_notification">Вие имате $NUM съвпадения: $FILTER</string>
<string name="EPr_powerpack_header">Резервни копия</string>
<string name="EPr_powerpack_summary">Напомняния за пропуснати повиквания, гласово въвеждане и разни настройки</string>
<string name="speech_err_network">Мрежова грешка! Разпознаване на говор изисква връзка с мрежата за да работи.</string>
<string name="speech_err_no_match">За съжаление, аз не можах да разбера това! Моля, опитайте отново.</string>
<string name="speech_err_default">Съжаляваме, възникна грешка при разпознаване на говор. Моля, опитайте отново.</string>
<string name="premium_attach_file">Прикачи файл</string>
<string name="premium_record_audio">Запис на бележка</string>
<string name="premium_remove_file_confirm">Сигурни ли сте? Не може да бъде отменено</string>
<string name="audio_recording_title">Записване на Аудио</string>
<string name="audio_stop_recording">Спри Записването</string>
<string name="audio_speak_now">Говорете Сега!</string>
<string name="search_market_audio"> Не е намерен плейър, който да работи с този тип аудио. Бихте ли искали да изтеглите аудио плейър от Android Market?</string>
<string name="search_market_audio_title">Не е намерен аудио плейър</string>
<string name="search_market_pdf">Не е намерен PDF четец. Бихте ли искали да си изтеглите PDF четец от Android Market?</string>
@ -344,7 +340,6 @@
<string name="TEA_timer_comment_stopped">тази задача е приключена на:</string>
<string name="TEA_timer_comment_spent">Отделено време:</string>
<string name="voice_create_prompt">Говорете за да създадете задача</string>
<string name="voice_edit_note_prompt">Говорете за да зададете описание на задача</string>
<string name="EPr_voiceInputEnabled_title">Гласово въвеждане</string>
<string name="EPr_voiceRemindersEnabled_title">Гласови напомняния</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks ще изтоваря имената на задачите по време на напомняния за задача</string>

@ -327,15 +327,11 @@
<string name="locale_notification">Máš $NUM se značkou $FILTER</string>
<string name="EPr_powerpack_header">Další nastavení</string>
<string name="EPr_powerpack_summary">Upomínky na zmeškané hovory, nastavení pro hlasové zadávání a další</string>
<string name="speech_err_network">Chyba sítě! Rozpoznávání řeči vyžaduje funkční síťové připojení.</string>
<string name="speech_err_no_match">Je mi líto, ale nerozuměla jsem! Zkuste to znovu.</string>
<string name="speech_err_default">Rozpoznávání řeči narazilo na problém. Zkuste to prosím znovu.</string>
<string name="premium_attach_file">Přiložit soubor</string>
<string name="premium_record_audio">Nahrát poznámku</string>
<string name="premium_remove_file_confirm">Skutečně? Nebude cesty zpět</string>
<string name="audio_recording_title">Nahrávám zvuk</string>
<string name="audio_stop_recording">Ukončit záznam</string>
<string name="audio_speak_now">Hovořte!</string>
<string name="search_market_audio_title">Audio přehrávač nebyl nalezen</string>
<string name="search_market_pdf_title">Chybí prohlížeč PDF</string>
<string name="search_market_ms">Chybí prohlížeč MS Office. Přejete si ho stáhnout z Android Marketu?</string>
@ -487,7 +483,6 @@
<string name="TEA_timer_comment_stopped">skončil tento úkol:</string>
<string name="TEA_timer_comment_spent">Strávený čas:</string>
<string name="voice_create_prompt">Mluvte pro vytvoření úkolu</string>
<string name="voice_edit_note_prompt">Namluvit popis úkolu</string>
<string name="EPr_voiceRemindersEnabled_title">Hlasové upomínky</string>
<string name="widget_mini">Úkoly</string>
<string name="EPr_use_dark_theme_widget">Tmavé téma widgetu</string>

@ -326,15 +326,11 @@
<string name="locale_notification">Du hast $NUM Übereinstimmungen mit: $FILTER</string>
<string name="EPr_powerpack_header">Premium und erweiterte Einstellungen</string>
<string name="EPr_powerpack_summary">Verpasste Anruf Erinnerungen, Spracheingabe und Andere Einstellungen</string>
<string name="speech_err_network">Netzwerkfehler! Spracherkennung benötigt eine Internetverbindung um zu funktionieren.</string>
<string name="speech_err_no_match">Entschuldigung! Ich konnte das nicht verstehen! Bitte versuchen Sie es erneut.</string>
<string name="speech_err_default">Tut uns leid, die Spracherkennung konnte das nicht verarbeiten. Bitte versuchen Sie es erneut.</string>
<string name="premium_attach_file">Datei anhängen</string>
<string name="premium_record_audio">Notiz aufzeichnen</string>
<string name="premium_remove_file_confirm">Sind Sie sicher? Das kann nicht rückgängig gemacht werden</string>
<string name="audio_recording_title">Audio aufnehmen</string>
<string name="audio_stop_recording">Aufnahme stoppen</string>
<string name="audio_speak_now">Sprechen Sie jetzt!</string>
<string name="search_market_audio">Dieser Dateityp kann nicht geöffnet werden. Möchten Sie einen Audio-Player von Google Play herunterladen?</string>
<string name="search_market_audio_title">Es wurde kein Audio-Player gefunden</string>
<string name="search_market_pdf">Dieser Dateityp kann nicht geöffnet werden. Möchten Sie einen PDF-Reader von Google Play herunterladen?</string>
@ -491,7 +487,6 @@
<string name="TEA_timer_comment_stopped">Bearbeitung abgebrochen:</string>
<string name="TEA_timer_comment_spent">Benötigte Zeit:</string>
<string name="voice_create_prompt">Sprechen Sie, um eine Aufgabe anzulegen</string>
<string name="voice_edit_note_prompt">Sprechen Sie, um Aufgabennotizen zu setzen</string>
<string name="EPr_voiceInputEnabled_title">Spracheingabe aktivieren</string>
<string name="EPr_voiceRemindersEnabled_title">Sprach-Erinnerungen</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks wird Aufgabennamen bei der Erinnerung aussprechen</string>

@ -253,8 +253,6 @@
<string name="gtasks_error_accountManager">Σφάλμα στον διαχειριστή επαφών της συσκευής σας. Παρακαλώ αποσυνδεθείτε και συνδεθείτε ξανά απο τις ρυθμίσεις του Google Tasks.</string>
<string name="gtasks_error_background_sync_auth">Σφάλμα αυθεντικοποίησης στο παρασκήνιο. Παρακαλώ δοκιμάστε να συγχρονίσετε όσο τρέχει το Tasks.</string>
<string name="EPr_powerpack_header">Προηγμένες ρυθμίσεις</string>
<string name="speech_err_no_match">Συγγνώμη δεν το κατάλαβα αυτό! Ξαναπροσπάθησε.</string>
<string name="speech_err_default">Συγγνώμη η αναγνώριση φωνής αντιμετώπισε σφάλμα. Παρακαλώ ξαναπροσπαθήστε.</string>
<string name="premium_attach_file">Προσθήκη αρχείου</string>
<string name="premium_record_audio">Καταγραφή σημείωσης</string>
<string name="premium_remove_file_confirm">Είστε σίγουρος; Δεν μπορεί να ακυρωθεί</string>
@ -360,7 +358,6 @@
<string name="TEA_timer_comment_stopped">σταμάτησε να εκτελεί το καθήκον:</string>
<string name="TEA_timer_comment_spent">Χρόνος που πέρασε</string>
<string name="voice_create_prompt">Μιλήστε για να δημιουργήσετε καθήκον</string>
<string name="voice_edit_note_prompt">Μιλήστε για να οριίσετε περιγραφή καθήκοντος</string>
<string name="EPr_voiceInputEnabled_title">Εισαγωγή φωνής</string>
<string name="EPr_voiceRemindersEnabled_title">Φωνητικές υπενθυμίσεις</string>
<string name="widget_mini">Καθήκοντα</string>

@ -333,15 +333,11 @@ Tasks podría no avisarle cuanto venza una tarea.\n</string>
<string name="locale_notification">Tiene $NUM que coincide con: $FILTER</string>
<string name="EPr_powerpack_header">Premium y configuraciones varias</string>
<string name="EPr_powerpack_summary">Recordatorios de llamadas perdidas, reconocimiento de voz y ajustes varios</string>
<string name="speech_err_network">¡Error en la red! El reconocimiento de voz requiere una conexión de red para funcionar.</string>
<string name="speech_err_no_match">Lo siento. ¡No lo comprendo! Por favor, inténtalo de nuevo.</string>
<string name="speech_err_default">Lo siento. Ha habido un error en el reconocimiento de voz. Por favor, Inténtalo de nuevo.</string>
<string name="premium_attach_file">Adjuntar un archivo</string>
<string name="premium_record_audio">Grabar una nota</string>
<string name="premium_remove_file_confirm">Está seguro? No se puede deshacer</string>
<string name="audio_recording_title">Grabando Audio</string>
<string name="audio_stop_recording">Detener grabación</string>
<string name="audio_speak_now">Hable ahora!</string>
<string name="search_market_audio">No se ha encontrado programa para reproducir ese tipo de audio. ¿Te gustaría descargar un reproductor de audio desde el Android Market?</string>
<string name="search_market_audio_title">No se encontró reproductor de audio</string>
<string name="search_market_pdf">No se encontró lector de archivos PDF. ¿Desea descargar uno de Android Market?</string>
@ -499,7 +495,6 @@ Tasks podría no avisarle cuanto venza una tarea.\n</string>
<string name="TEA_timer_comment_stopped">dejó de hacer esta tarea:</string>
<string name="TEA_timer_comment_spent">Tiempo dedicado:</string>
<string name="voice_create_prompt">Hable para crear una tarea</string>
<string name="voice_edit_note_prompt">Hable para establecer notas de tarea</string>
<string name="EPr_voiceInputEnabled_title">Ingreso por voz</string>
<string name="EPr_voiceRemindersEnabled_title">Avisos de voz</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks dirá los nombres de las tareas durante los avisos</string>

@ -328,15 +328,11 @@
<string name="locale_notification">Vous avez $NUM correspondant(s) : $FILTER</string>
<string name="EPr_powerpack_header">Premium et réglages divers</string>
<string name="EPr_powerpack_summary">Rappel des appels manqués, commande vocale et paramètres divers</string>
<string name="speech_err_network">Problème de connexion réseau. La reconaissance vocale demande une connexion internet pour fonctionner.</string>
<string name="speech_err_no_match">Excusez-moi, je n\'ais pas compris! Veuillez répeter.</string>
<string name="speech_err_default">Excusez-moi, la reconaissance vocale a rencontrer une erreur. Veuillez réessayer.</string>
<string name="premium_attach_file">Joindre un fichier</string>
<string name="premium_record_audio">Enregistrer un commentaire</string>
<string name="premium_remove_file_confirm">Ètes-vous certain? Cette opération est irréversible</string>
<string name="audio_recording_title">Enregistrement Audio</string>
<string name="audio_stop_recording">Arrêter l\'enregistrement</string>
<string name="audio_speak_now">Veuillez parler!</string>
<string name="search_market_audio">Aucun lecteur supporte ce format audio. Voulez-vous télécharger un lecteur audio du Play Store?</string>
<string name="search_market_audio_title">Aucun lecteur audio trouvé</string>
<string name="search_market_pdf">Aucun logiciel permettant de lire les fichiers PDF n\'a été trouvé. Souhaitez vous en télécharger un à partir de Android Market ?</string>
@ -493,7 +489,6 @@
<string name="TEA_timer_comment_stopped">Cette tâche a été arretée :</string>
<string name="TEA_timer_comment_spent">Temps passé :</string>
<string name="voice_create_prompt">Parlez pour créer une nouvelle tâche</string>
<string name="voice_edit_note_prompt">Parlez pour définir les notes de la tâche</string>
<string name="EPr_voiceInputEnabled_title">Entrée voix</string>
<string name="EPr_voiceRemindersEnabled_title">Rappels vocaux</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks donnera le nom de la tâche</string>

@ -300,15 +300,11 @@ Se visualizzi questo errore più volte, ti consigliamo di cancellare tutti i dat
<string name="locale_notification">Hai $NUM corrispondenti: $FILTER</string>
<string name="EPr_powerpack_header">Impostazioni Premium e varie</string>
<string name="EPr_powerpack_summary">Promemoria chiamate mancate, comandi vocali e impostazioni varie</string>
<string name="speech_err_network">Errore di rete! Il riconoscimento vocale richiede una connessione di rete per funzionare.</string>
<string name="speech_err_no_match">Mi dispiace, non riesco a capire! Si prega di riprovare.</string>
<string name="speech_err_default">Ci dispiace, si è verificato un errore nel riconoscimento vocale. Si prega di riprovare.</string>
<string name="premium_attach_file">Allega un file</string>
<string name="premium_record_audio">Registra una nota</string>
<string name="premium_remove_file_confirm">Se sicuro? Non può essere eseguito</string>
<string name="audio_recording_title">Registrazione Audio</string>
<string name="audio_stop_recording">Fine Registrazione</string>
<string name="audio_speak_now">Parla ora!</string>
<string name="search_market_audio">Non è stato trovato nessun lettore per quel tipo di audio. Vuoi scaricarne uno da Android Market?</string>
<string name="search_market_audio_title">Non è stato trovato nessun riproduttore audio</string>
<string name="search_market_pdf">Non è stato trovato nessun lettore di file PDF. Vuoi scaricare un lettore di file PDF da Google Play (Android Market)?</string>
@ -443,7 +439,6 @@ Se visualizzi questo errore più volte, ti consigliamo di cancellare tutti i dat
<string name="TEA_timer_comment_stopped">fine attività</string>
<string name="TEA_timer_comment_spent">Tempo speso:</string>
<string name="voice_create_prompt">Parla per creare un\'attività</string>
<string name="voice_edit_note_prompt">Parla per aggiungere le note</string>
<string name="EPr_voiceInputEnabled_title">Voce</string>
<string name="EPr_voiceRemindersEnabled_title">Promemoria vocali</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks pronuncerà il nome dell\'attività durante i promemoria</string>

@ -333,15 +333,11 @@
<string name="locale_notification">יש לך $NUM המתאימים: $FILTER</string>
<string name="EPr_powerpack_header">פרימיום והגדרות שונות</string>
<string name="EPr_powerpack_summary">תזכורת קולית הוחמצה, קלט קולי והגדרות כלליות</string>
<string name="speech_err_network">שגיאת חיבור! זיהוי דיבור דורש חיבור לאינטרנט.</string>
<string name="speech_err_no_match">סליחה, לא הבנתי! אנא נסה שוב.</string>
<string name="speech_err_default">סליחה, מזהה הדיבור נתקל בבעיה. אנא נסה שנית.</string>
<string name="premium_attach_file">צרף קובץ</string>
<string name="premium_record_audio">הקלד הערה</string>
<string name="premium_remove_file_confirm">בטוח? לא ניתן לבטל את הפעולה</string>
<string name="audio_recording_title">מקליטה שֵׁמַע</string>
<string name="audio_stop_recording">הפסק הקלטה</string>
<string name="audio_speak_now">דַּבֵּר כעת!</string>
<string name="search_market_audio">לא מצאתי נגן לסוג זה של קובץ שֵׁמַע. הֲתִּרְצֶה להוריד נגן מחנות גוגל?</string>
<string name="search_market_audio_title">לא נמצא נגן לקבצי שֵׁמַע</string>
<string name="search_market_pdf">לא מצאתי קורא קבצי PDF. הֲתִּרְצֶה להוריד קורא קבצי PDF מחנות היישומים?</string>
@ -494,7 +490,6 @@
<string name="TEA_timer_comment_stopped">הפסק ביצוע של משימה זו:</string>
<string name="TEA_timer_comment_spent">זמן שהושקע:</string>
<string name="voice_create_prompt">דַּבֵּר כדי ליצור משימה</string>
<string name="voice_edit_note_prompt">דַּבֵּר כדי לקבוע את ההערות למשימה</string>
<string name="EPr_voiceInputEnabled_title">קלט קולי</string>
<string name="EPr_voiceRemindersEnabled_title">תזכורות קוליות</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">אסטריד תאמר את שם המשימה כחלק מהתזכורת</string>

@ -335,15 +335,11 @@
<string name="locale_notification">$FILTER の検索結果: $NUM 件</string>
<string name="EPr_powerpack_header">拡張設定</string>
<string name="EPr_powerpack_summary">応答しなかった呼び出しのリマインダー, 音声入力, およびその他の設定</string>
<string name="speech_err_network">ネットワークエラー! 音声認識の動作はネットワーク接続が必要です</string>
<string name="speech_err_no_match">申し訳ありません, 認識できませんでした! もう一度試してください.</string>
<string name="speech_err_default">申し訳ありません, 音声認識でエラーが発生しました. もう一度試してください.</string>
<string name="premium_attach_file">ファイルを添付</string>
<string name="premium_record_audio">注釈を記録</string>
<string name="premium_remove_file_confirm">よろしいですか? 取り消しできません</string>
<string name="audio_recording_title">音声を録音中</string>
<string name="audio_stop_recording">録音を停止</string>
<string name="audio_speak_now">話してください!</string>
<string name="search_market_audio">そのオーディオ形式を再生するプレイヤーがありません. Google Play からオーディオプレイヤーをダウンロードしますか?</string>
<string name="search_market_audio_title">オーディオプレイヤーがありません</string>
<string name="search_market_pdf">PDF リーダーがありません. PDF リーダーを Google Play からダウンロードしますか?</string>
@ -501,7 +497,6 @@
<string name="TEA_timer_comment_stopped">このタスクの実行を中止しました:</string>
<string name="TEA_timer_comment_spent">消費時間:</string>
<string name="voice_create_prompt">話してタスクを作成してください</string>
<string name="voice_edit_note_prompt">話してタスク概要を設定してください</string>
<string name="EPr_voiceInputEnabled_title">音声入力</string>
<string name="EPr_voiceRemindersEnabled_title">音声リマインダー</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks はタスクリマインダーでタスク名を話します</string>

@ -339,15 +339,11 @@
<string name="locale_notification">$NUM 개의 일정이 일치합니다: $FILTER</string>
<string name="EPr_powerpack_header">프리미엄과 기타 설정</string>
<string name="EPr_powerpack_summary">부재중 전화 알림, 음성 입력과 기타 설정</string>
<string name="speech_err_network">네트워크 에러! 음성인식이 동작하려면 네트워크 연결이 필요합니다.</string>
<string name="speech_err_no_match">죄송하지만 알아듣지 못했습니다! 다시 말해 주세요.</string>
<string name="speech_err_default">죄송하지만 음성 인식에 에러가 발생했습니다. 다시 시도해 주세요.</string>
<string name="premium_attach_file">파일 첨부</string>
<string name="premium_record_audio">노트 기록</string>
<string name="premium_remove_file_confirm">정말입니까? 되돌릴 수 없습니다</string>
<string name="audio_recording_title">오디오 녹음 중</string>
<string name="audio_stop_recording">녹음 중단</string>
<string name="audio_speak_now">지금 말하세요!</string>
<string name="search_market_audio">이런 형식의 오디오를 다룰 수 있는 재생기가 없습니다. 안드로이드 마켓에서 다운로드할까요?</string>
<string name="search_market_audio_title">오디오 재생기 없음</string>
<string name="search_market_pdf">PDF 리더가 없습니다. 안드로이드 마켓에서 PDF 리더를 다운로드할까요?</string>
@ -503,7 +499,6 @@
<string name="TEA_timer_comment_stopped">이 일정 중지:</string>
<string name="TEA_timer_comment_spent">소요 시간:</string>
<string name="voice_create_prompt">일정을 만들려면 말하세요</string>
<string name="voice_edit_note_prompt">일정의 내용을 말하세요</string>
<string name="EPr_voiceInputEnabled_title">음성 입력</string>
<string name="EPr_voiceRemindersEnabled_title">음성 알림</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">일정 알림기간 동안 일정 이름을 직접 말해 줍니다</string>

@ -226,7 +226,6 @@
<string name="TPl_notification">Tidtaker aktiv for %s!</string>
<string name="TFE_workingOn">Oppgaver med tidtaker</string>
<string name="voice_create_prompt">Snakk for å skape en oppgave</string>
<string name="voice_edit_note_prompt">Snakk for å sette oppgavenotater</string>
<string name="EPr_voiceInputEnabled_title">Taleinndata</string>
<string name="EPr_voiceRemindersEnabled_title">Talepåminnelser</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks vil lese opp oppgaver ved påminnelse</string>

@ -332,15 +332,11 @@
<string name="locale_notification">Er zijn $NUM taken voor: $FILTER</string>
<string name="EPr_powerpack_header">Premium en diverse instellingen</string>
<string name="EPr_powerpack_summary">Gemiste oproepen herinneringen, spraakinvoer en diverse instellingen</string>
<string name="speech_err_network">Netwerkfout! Spraakherkenning heeft een netwerkverbinding nodig.</string>
<string name="speech_err_no_match">Sorry, ik begrijp je niet! Probeer het opnieuw.</string>
<string name="speech_err_default">Sorry, spraakherkenning ondervond een fout. Graag opnieuw proberen.</string>
<string name="premium_attach_file">Een bestand bijvoegen</string>
<string name="premium_record_audio">Een notitie opnemen</string>
<string name="premium_remove_file_confirm">Weet je het zeker? Dit kan niet ongedaan gemaakt worden</string>
<string name="audio_recording_title">Bezig met opname</string>
<string name="audio_stop_recording">Opname stoppen</string>
<string name="audio_speak_now">Spreek nu!</string>
<string name="search_market_audio">Geen mediaspeler gevonden die dit type audio-bestand ondersteunt. Wil je een mediaspeler downloaden via de Android Market?</string>
<string name="search_market_audio_title">Geen mediaspeler gevonden</string>
<string name="search_market_pdf">Geen PDF-lezer gevonden. Wil je een PDF-lezer downloaden via de Android Market?</string>
@ -497,7 +493,6 @@
<string name="TEA_timer_comment_stopped">taak gestopt:</string>
<string name="TEA_timer_comment_spent">Gebruikte tijd:</string>
<string name="voice_create_prompt">Spreek om taak te maken</string>
<string name="voice_edit_note_prompt">Spreek notities van taak in</string>
<string name="EPr_voiceInputEnabled_title">Spraakinvoer</string>
<string name="EPr_voiceRemindersEnabled_title">Gesproken herinneringen</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Bij herinneringen zullen de taaknamen uitgesproken worden</string>

@ -332,15 +332,11 @@ i odzyskanie zadań z kopi zapasowej (Settings-&gt;Sync and backup-&gt;Backup-&g
<string name="locale_notification">Masz $NUM pasujących: $FILTER</string>
<string name="EPr_powerpack_header">Ustawienia Premium i inne</string>
<string name="EPr_powerpack_summary">Przypomniania nieodebranych połączeń, polecenia głosowe i inne ustawienia</string>
<string name="speech_err_network">Błąd sieci! Rozpoznawanie mowy wymaga połączenia z siecią.</string>
<string name="speech_err_no_match">Przepraszam, nie zrozumiałem! Powtórz, proszę.</string>
<string name="speech_err_default">Przepraszamy, rozpoznawanie mowy napotkało na błąd. Proszę spróbować ponownie.</string>
<string name="premium_attach_file">Dołącz plik</string>
<string name="premium_record_audio">Nagraj notatkę</string>
<string name="premium_remove_file_confirm">Jesteś pewny? Tych zmian nie można odwrócić</string>
<string name="audio_recording_title">Nagrywanie dźwięku</string>
<string name="audio_stop_recording">Zakończ nagrywanie</string>
<string name="audio_speak_now">Mów!</string>
<string name="search_market_audio">Nie znaleziono odtwarzacza, który byłby w stanie odtworzyć ten plik. Czy chciałbyś pobrać odtwarzacz z Android Market?</string>
<string name="search_market_audio_title">Nie znaleziono odtwarzacza</string>
<string name="search_market_pdf">Nie znaleziono czytnika PDF. Czy chciałbyć pobrać czytnik z Android Market?</string>
@ -498,7 +494,6 @@ i odzyskanie zadań z kopi zapasowej (Settings-&gt;Sync and backup-&gt;Backup-&g
<string name="TEA_timer_comment_stopped">zakończono zadanie:</string>
<string name="TEA_timer_comment_spent">Czas spędzony:</string>
<string name="voice_create_prompt">Mów by utworzyć zadanie</string>
<string name="voice_edit_note_prompt">Mów by ustawić notatkę zadania</string>
<string name="EPr_voiceInputEnabled_title">Polecenia głosowe</string>
<string name="EPr_voiceRemindersEnabled_title">Przypomnienia głosowe</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks będzie mówił nazwę zadania podczas przypomnienia</string>

@ -313,15 +313,11 @@
<string name="locale_notification">Você tem $NUM resultados: $FILTER</string>
<string name="EPr_powerpack_header">Configurações de Premium e misc.</string>
<string name="EPr_powerpack_summary">Lembretes de chamadas perdidas, entrada de voz e configurações diversas</string>
<string name="speech_err_network">Erro de rede! Reconhecimento de fala requer uma conexão com a rede para funcionar.</string>
<string name="speech_err_no_match">Desculpe, eu não consegui entender! Por favor tente de novo.</string>
<string name="speech_err_default">Desculpa, reconhecimento de fala encontrou um erro. Por favor, tente novamente.</string>
<string name="premium_attach_file">Anexar um arquivo</string>
<string name="premium_record_audio">Gravar uma nota</string>
<string name="premium_remove_file_confirm">Você tem certeza? Não pode ser desfeito</string>
<string name="audio_recording_title">Gravando Áudio</string>
<string name="audio_stop_recording">Parar Gravação</string>
<string name="audio_speak_now">Fale Agora!</string>
<string name="search_market_audio">\"Não foi encontrado um reprodutor que manipule este tipo de áudio. Você gostaria de baixar um reprodutor de áudio no Android Market?\"</string>
<string name="search_market_audio_title">Não foi encontrado um reprodutor de áudio</string>
<string name="search_market_pdf">Nenhum leitor de PDF foi encontrado. Você gostaria de baixar um leitor de PDF no Android Market?</string>
@ -465,7 +461,6 @@
<string name="TEA_timer_comment_stopped">parou a tarefa:</string>
<string name="TEA_timer_comment_spent">Tempo gasto:</string>
<string name="voice_create_prompt">Fale para criar uma tarefa</string>
<string name="voice_edit_note_prompt">Fale para completar as notas da tarefa</string>
<string name="EPr_voiceInputEnabled_title">Entrada de voz</string>
<string name="EPr_voiceRemindersEnabled_title">Lembretes de voz</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks irá falar o nome das tarefas durante os lembretes</string>

@ -338,15 +338,11 @@ das tarefas através de um backup em Definições-&gt;Sincronização e backup-&
<string name="locale_notification">Tem $NUM ocorrências para: $FILTER</string>
<string name="EPr_powerpack_header">Definições avançadas</string>
<string name="EPr_powerpack_summary">Lembretes de chamadas, entrada por voz e outras definições</string>
<string name="speech_err_network">Erro de rede! O reconhecimento de voz requer uma ligação de rede ativa.</string>
<string name="speech_err_no_match">Não consegui perceber! Tente novamente.</string>
<string name="speech_err_default">O reconhecimento de voz detetou um erro. Tente novamente.</string>
<string name="premium_attach_file">Anexar um ficheiro</string>
<string name="premium_record_audio">Gravar uma nota</string>
<string name="premium_remove_file_confirm">Tem a certeza? A ação não pode ser anulada!</string>
<string name="audio_recording_title">Gravação áudio</string>
<string name="audio_stop_recording">Parar gravação</string>
<string name="audio_speak_now">Falar agora!</string>
<string name="search_market_audio">Não foi encontrado um reprodutor para gerir este tipo de áudio. Gostaria de transferir um reprodutor na loja Google?</string>
<string name="search_market_audio_title">Reprodutor áudio não encontrado</string>
<string name="search_market_pdf">Nenhum leitor PDF encontrado. Gostaria de transferir um leitor de PDF na loja Google?</string>
@ -503,7 +499,6 @@ das tarefas através de um backup em Definições-&gt;Sincronização e backup-&
<string name="TEA_timer_comment_stopped">parou de fazer esta tarefa:</string>
<string name="TEA_timer_comment_spent">Tempo gasto:</string>
<string name="voice_create_prompt">Falar para criar uma tarefa</string>
<string name="voice_edit_note_prompt">Falar para definir a descrição</string>
<string name="EPr_voiceInputEnabled_title">Entrada por voz</string>
<string name="EPr_voiceRemindersEnabled_title">Lembretes de voz</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">O Tasks irá reproduzir o nome da tarefa durante os lembretes</string>

@ -336,15 +336,11 @@
<string name="locale_notification">Число соответствий $FILTER: $NUM</string>
<string name="EPr_powerpack_header">Премиум и другие настройки</string>
<string name="EPr_powerpack_summary">Напоминания о пропущенных звонках, голосовой ввод и другие настройки</string>
<string name="speech_err_network">Ошибка подключения! Для голосового распознавания требуется интернет соединение.</string>
<string name="speech_err_no_match">Извините, я не расслышал! Повторите, пожалуйста.</string>
<string name="speech_err_default">Извините, ошибка службы голосового распознавания. Попробуйте, еще раз.</string>
<string name="premium_attach_file">Прикрепить файл</string>
<string name="premium_record_audio">Записать заметку</string>
<string name="premium_remove_file_confirm">Вы уверены? Это не может быть отменено.</string>
<string name="audio_recording_title">Запись голоса.</string>
<string name="audio_stop_recording">Остановить запись</string>
<string name="audio_speak_now">Говорите!</string>
<string name="search_market_audio">Не найден проигрыватель для этого типа аудио. Хотите скачать его с Google Plus?</string>
<string name="search_market_audio_title">Не найдено проигрывателя.</string>
<string name="search_market_pdf">Не найдена программа для просмотра PDF файлов. Хотите скачать её с Play Market?</string>
@ -502,7 +498,6 @@
<string name="TEA_timer_comment_stopped">зада завершилась:</string>
<string name="TEA_timer_comment_spent">Времени потрачено:</string>
<string name="voice_create_prompt">Говорите чтобы создать задачу</string>
<string name="voice_edit_note_prompt">Произнесите заметки задачи</string>
<string name="EPr_voiceInputEnabled_title">Голосовой ввод</string>
<string name="EPr_voiceRemindersEnabled_title">Голосовые напоминания</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks должен произносить название задач во время напоминаний</string>

@ -334,15 +334,11 @@
<string name="locale_notification">$NUM jih ustreza: $FILTER</string>
<string name="EPr_powerpack_header">Napredne nastavitve</string>
<string name="EPr_powerpack_summary">Opomniki zgrešenih klicev, vnos glasu in razne nastavitve</string>
<string name="speech_err_network">Napaka na omrežju! Prepoznava govora za delovanje potrebuje omrežno povezavo.</string>
<string name="speech_err_no_match">Žal tega nisem razumel. Prosim poskusite ponovno.</string>
<string name="speech_err_default">Žal je pri prepoznavi govora prišlo do napake. Prosimo poskusite ponovno.</string>
<string name="premium_attach_file">Pripni datoteko</string>
<string name="premium_record_audio">Posnemi opombo</string>
<string name="premium_remove_file_confirm">Ste prepričani? Tega ni mogoče razveljaviti</string>
<string name="audio_recording_title">Snemam zvok</string>
<string name="audio_stop_recording">Prekini snemanje</string>
<string name="audio_speak_now">Začnite govoriti!</string>
<string name="search_market_audio">Ni ustreznega predvajalnika. Želite naložiti predvajalnik zvoka z Android tržnice?</string>
<string name="search_market_audio_title">Nisem našel predvajalnika zvoka</string>
<string name="search_market_pdf">Ne najdem PDF bralnika. Ga želite naložiti z Android tržnice?</string>
@ -499,7 +495,6 @@
<string name="TEA_timer_comment_stopped">ta opravek končal:</string>
<string name="TEA_timer_comment_spent">Porabljen čas:</string>
<string name="voice_create_prompt">Glasovno ustvari opravek</string>
<string name="voice_edit_note_prompt">Govorite za opis opravka</string>
<string name="EPr_voiceInputEnabled_title">Vnos glasu</string>
<string name="EPr_voiceRemindersEnabled_title">Glasovni opomniki</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Aplikacija Opravki bo med opominjanjem glede opravkov izgovarjala nazive opravkov</string>

@ -323,15 +323,11 @@ och återställer dina aktuella uppgifter från en backup
<string name="locale_notification">Du har $NUM som matchar: $FILTER</string>
<string name="EPr_powerpack_header">Premium och övriga inställningar</string>
<string name="EPr_powerpack_summary">Påminnelser för missade samtal, röstinmatning samt övriga inställningar</string>
<string name="speech_err_network">Nätverksfel! Taligenkänning kräver internetaccess för att fungera.</string>
<string name="speech_err_no_match">Ursäkta, jag förstod inte det där. Vänligen försök igen.</string>
<string name="speech_err_default">Taligenkänning misslyckades. Vänligen försök igen.</string>
<string name="premium_attach_file">Bifoga fil</string>
<string name="premium_record_audio">Spela in en anteckning</string>
<string name="premium_remove_file_confirm">Är du säker? Detta kan inte ångras</string>
<string name="audio_recording_title">Spelar in ljud</string>
<string name="audio_stop_recording">Avsluta inspelning</string>
<string name="audio_speak_now">Prata nu!</string>
<string name="search_market_audio">Ingen spelare hittades för denna ljudtyp. Skulle du vilja ladda ned en ljudspelare från Google Play?</string>
<string name="search_market_audio_title">Ingen ljudspelare hittades</string>
<string name="search_market_pdf">Ingen PDF-läsare hittades. Skulle du vilja ladda ned en från Google Play?</string>
@ -485,7 +481,6 @@ och återställer dina aktuella uppgifter från en backup
<string name="TEA_timer_comment_stopped">slutade arbeta med uppgiften:</string>
<string name="TEA_timer_comment_spent">Nedlagt tid:</string>
<string name="voice_create_prompt">Prata för att skapa uppgift</string>
<string name="voice_edit_note_prompt">Prata för att sätta uppgiftens anteckningar</string>
<string name="EPr_voiceInputEnabled_title">Röstindata</string>
<string name="EPr_voiceRemindersEnabled_title">Röstpåminnelser</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks läser upp uppgifterna vid påminnelse</string>

@ -300,15 +300,11 @@
<string name="locale_notification">$FILTER konumunda $NUM var</string>
<string name="EPr_powerpack_header">Gelişmiş ayarlar</string>
<string name="EPr_powerpack_summary">Çağrı hatırlatıcılar, ses girdileri ve çeşitli ayarlar</string>
<string name="speech_err_network">Ağ hatası! Konuşmanın tanınması çalışması için bir ağ bağlantısına gerek duyar.</string>
<string name="speech_err_no_match">Üzgünüm, bunu anlayamadım! Lütfen yeniden deneyin.</string>
<string name="speech_err_default">Üzgünüm, konuşma tanınma işlevi hata verdi. Lütfen yeniden deneyin.</string>
<string name="premium_attach_file">Bir dosya ekle</string>
<string name="premium_record_audio">Bir not kaydet</string>
<string name="premium_remove_file_confirm">Emin misiniz? Geri döndürülemez</string>
<string name="audio_recording_title">Ses Kaydediliyor</string>
<string name="audio_stop_recording">Kaydı Durdur</string>
<string name="audio_speak_now">Şimdi Konuşun!</string>
<string name="search_market_audio">Bu ses türünü çalan bir oynatıcı bulunamadı. Google Play\'den bir ses yürütücüsü indirmek iste misiniz?</string>
<string name="search_market_audio_title">Ses oynatıcı bulunamadı</string>
<string name="search_market_pdf">PDF okuyucu bulunamadı. Google Play\'den bir PDF okuyucu indirmek iste misiniz?</string>
@ -450,7 +446,6 @@
<string name="TEA_timer_comment_stopped">bu görevden vazgeç:</string>
<string name="TEA_timer_comment_spent">Harcanan zaman:</string>
<string name="voice_create_prompt">Yeni görev için konuş</string>
<string name="voice_edit_note_prompt">Görev notları için konuş</string>
<string name="EPr_voiceInputEnabled_title">Ses Girişi</string>
<string name="EPr_voiceRemindersEnabled_title">Sesli Hatırlatmalar</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks görev isimlerini görev hatırlatmaları sırasında söyleyecek</string>

@ -339,15 +339,11 @@
<string name="locale_notification">Число відповідностей $FILTER: $NUM</string>
<string name="EPr_powerpack_header">Розширені налаштування</string>
<string name="EPr_powerpack_summary">Нагадування про пропущені дзвінки, голосове введення та інші установки</string>
<string name="speech_err_network">Помилка підключення! Для голосового розпізнавання потрібно інтернет з\'єднання.</string>
<string name="speech_err_no_match">Вибачте, я не розчув! Повторіть, будь ласка.</string>
<string name="speech_err_default">Вибачте, помилка служби голосового розпізнавання. Спробуйте, ще раз.</string>
<string name="premium_attach_file">Прикріпити файл</string>
<string name="premium_record_audio">Записати замітку</string>
<string name="premium_remove_file_confirm">Ви впевнені? Це не може бути скасовано.</string>
<string name="audio_recording_title">Запис аудіо</string>
<string name="audio_stop_recording">Зупинити запис</string>
<string name="audio_speak_now">Говоріть зараз!</string>
<string name="search_market_audio">Не знайдене програвач для цього типу аудіо. Хочете завантажити його з Play Market?</string>
<string name="search_market_audio_title">Не знайдено погравача</string>
<string name="search_market_pdf">Не знайдено програма для перегляду PDF файлів. Хочете завантажити її з Android Play Market?</string>

@ -280,15 +280,11 @@
<string name="locale_notification">您有 $NUM 符合: $FILTER</string>
<string name="EPr_powerpack_header">高级和其它设置</string>
<string name="EPr_powerpack_summary">未接电话提醒,语音输入和其它设置</string>
<string name="speech_err_network">网络出错!语音识别需要网络连接才能运作。</string>
<string name="speech_err_no_match">对不起,我听不明白喔!请再说一次吧。</string>
<string name="speech_err_default">对不起,语音识别遇到出错。请重新再试。</string>
<string name="premium_attach_file">附上一份文件</string>
<string name="premium_record_audio">录制一条便笺</string>
<string name="premium_remove_file_confirm">您确定吗?无法恢复的喔</string>
<string name="audio_recording_title">正在录制音频</string>
<string name="audio_stop_recording">停止录制</string>
<string name="audio_speak_now">现在请讲!</string>
<string name="search_market_audio">找不到播放器来处理这种音频类型。您想从安卓市场上下载一个音频播放器吗?</string>
<string name="search_market_audio_title">找不到音频播放器</string>
<string name="search_market_pdf">找不到 PDF 阅读器。您想从安卓市场上下载一个PDF 阅读器吗?</string>
@ -431,7 +427,6 @@
<string name="TEA_timer_comment_stopped">已经停止了这项任务:</string>
<string name="TEA_timer_comment_spent">已经花费时间:</string>
<string name="voice_create_prompt">请说话以建立任务</string>
<string name="voice_edit_note_prompt">请说话以设定任务备注</string>
<string name="EPr_voiceInputEnabled_title">语音输入</string>
<string name="EPr_voiceRemindersEnabled_title">语音提醒</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks在任务提醒时会以语音说出任务名称</string>

@ -317,15 +317,11 @@
<string name="locale_notification">您有 $NUM 符合: $FILTER</string>
<string name="EPr_powerpack_header">高級和其它設置</string>
<string name="EPr_powerpack_summary">未接電話提醒,語音輸入和其它設置</string>
<string name="speech_err_network">網絡出錯!語音識別需要網絡連接才能運作。</string>
<string name="speech_err_no_match">對不起,我聽不明白喔!請再說一次吧。</string>
<string name="speech_err_default">對不起,語音識別遇到出錯。請重新再試。</string>
<string name="premium_attach_file">附上一份文件</string>
<string name="premium_record_audio">錄製一條便箋</string>
<string name="premium_remove_file_confirm">您確定嗎?無法恢復的喔</string>
<string name="audio_recording_title">正在錄製音頻</string>
<string name="audio_stop_recording">停止錄製</string>
<string name="audio_speak_now">現在請講!</string>
<string name="search_market_audio">找不到播放器來處理這種音頻類型。您想從安卓市場上下載一個音頻播放器嗎?</string>
<string name="search_market_audio_title">找不到音頻播放器</string>
<string name="search_market_pdf">找不到PDF 閱讀器。您想從安卓市場上下載一個PDF 閱讀器嗎?</string>
@ -473,7 +469,6 @@
<string name="TEA_timer_comment_stopped">已經停止了這項任務工作:</string>
<string name="TEA_timer_comment_spent">已經花費時間:</string>
<string name="voice_create_prompt">請說話以建立工作</string>
<string name="voice_edit_note_prompt">請說話以設定工作備註</string>
<string name="EPr_voiceInputEnabled_title">語音輸入</string>
<string name="EPr_voiceRemindersEnabled_title">語音提醒</string>
<string name="EPr_voiceRemindersEnabled_desc_enabled">Tasks在工作提醒時會以語音說出工作名稱</string>

@ -1,17 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="speech_err_network">Network error! Speech recognition requires a network connection to work.</string>
<string name="speech_err_no_match">Sorry, I couldn\'t understand that! Please try again.</string>
<string name="speech_err_default">Sorry, speech recognition encountered an error. Please try again.</string>
<string name="premium_attach_file">Attach a file</string>
<string name="premium_record_audio">Record a note</string>
<string name="premium_remove_file_confirm">Are you sure? Cannot be undone</string>
<string name="audio_recording_title">Recording Audio</string>
<string name="audio_stop_recording">Stop Recording</string>
<string name="audio_speak_now">Speak Now!</string>
<string name="search_market_audio">No player found to handle that audio type. Would you like to download an audio player from the Android Market?</string>
<string name="search_market_audio_title">No audio player found</string>

@ -3,8 +3,7 @@
<!-- Voice Add Prompt Text -->
<string name="voice_create_prompt">Speak to create a task</string>
<string name="voice_edit_note_prompt">Speak to set task description</string>
<string name="EPr_voiceInputEnabled_title">Voice input</string>
<!-- slide 38f: Preference: Voice reminders if TTS-service is available -->
<string name="EPr_voiceRemindersEnabled_title">Voice reminders</string>

Loading…
Cancel
Save