Skip to content

Commit a0ddc23

Browse files
committed
Improved handling of missing TTS and fixed control over maximum voice duration
1 parent 0b46dcc commit a0ddc23

File tree

18 files changed

+172
-65
lines changed

18 files changed

+172
-65
lines changed

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ android {
2929
defaultConfig {
3030
applicationId "nie.translator.rtranslator"
3131
targetSdkVersion 32 //32
32-
versionCode 15
33-
versionName '2.0.0'
32+
versionCode 16
33+
versionName '2.0.1'
3434
minSdkVersion 24
3535
externalNativeBuild {
3636
cmake {

app/src/main/java/nie/translator/rtranslator/GeneralActivity.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@
2222
import androidx.appcompat.app.AlertDialog;
2323
import androidx.fragment.app.FragmentActivity;
2424

25+
import javax.annotation.Nullable;
26+
2527

2628
public abstract class GeneralActivity extends FragmentActivity {
2729

28-
public void showMissingGoogleTTSDialog() {
30+
public void showMissingGoogleTTSDialog(@Nullable DialogInterface.OnClickListener continueListener) {
2931
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
3032
builder.setMessage(R.string.error_missing_tts);
3133
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@@ -42,6 +44,9 @@ public void onClick(DialogInterface dialog, int which) {
4244
}
4345
}
4446
});
47+
if(continueListener != null){
48+
builder.setNegativeButton(R.string.continue_without_tts, continueListener);
49+
}
4550
builder.create().show();
4651
}
4752

@@ -52,10 +57,10 @@ public void showGoogleTTSErrorDialog() {
5257
builder.create().show();
5358
}
5459

55-
public void showGoogleTTSErrorDialog(DialogInterface.OnClickListener retryListener) {
60+
public void showGoogleTTSErrorDialog(DialogInterface.OnClickListener continueListener) {
5661
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
5762
builder.setMessage(R.string.error_tts);
58-
builder.setPositiveButton(R.string.retry, retryListener);
63+
builder.setPositiveButton(R.string.continue_without_tts, continueListener);
5964
builder.setNegativeButton(R.string.exit, new DialogInterface.OnClickListener() {
6065
@Override
6166
public void onClick(DialogInterface dialog, int which) {

app/src/main/java/nie/translator/rtranslator/Global.java

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public void onDestroyed() {
118118
}
119119

120120
public void getLanguages(final boolean recycleResult, final GetLocalesListListener responseListener) {
121-
if (recycleResult && languages.size() > 0) {
121+
if (recycleResult && !languages.isEmpty()) {
122122
responseListener.onSuccess(languages);
123123
} else {
124124
TTS.getSupportedLanguages(this, new TTS.SupportedLanguagesListener() {
@@ -145,6 +145,48 @@ public void onError(int reason) {
145145
}
146146
}
147147

148+
public void getLanguages(final boolean recycleResult, boolean ignoreTTSError,final GetLocalesListListener responseListener) {
149+
if (recycleResult && !languages.isEmpty()) {
150+
responseListener.onSuccess(languages);
151+
} else {
152+
TTS.getSupportedLanguages(this, new TTS.SupportedLanguagesListener() {
153+
@Override
154+
public void onLanguagesListAvailable(ArrayList<CustomLocale> ttsLanguages) {
155+
ArrayList<CustomLocale> translatorLanguages = Translator.getSupportedLanguages(Global.this, Translator.NLLB);
156+
ArrayList<CustomLocale> speechRecognizerLanguages = Recognizer.getSupportedLanguages(Global.this);
157+
//we return only the languages compatible with the speech recognizer, the translator and the tts
158+
final ArrayList<CustomLocale> compatibleLanguages = new ArrayList<>();
159+
for (CustomLocale translatorLanguage : translatorLanguages) {
160+
if (CustomLocale.containsLanguage(ttsLanguages, translatorLanguage) && CustomLocale.containsLanguage(speechRecognizerLanguages, translatorLanguage)) {
161+
compatibleLanguages.add(translatorLanguage);
162+
}
163+
}
164+
languages = compatibleLanguages;
165+
responseListener.onSuccess(compatibleLanguages);
166+
}
167+
168+
@Override
169+
public void onError(int reason) {
170+
if(ignoreTTSError) {
171+
ArrayList<CustomLocale> translatorLanguages = Translator.getSupportedLanguages(Global.this, Translator.NLLB);
172+
ArrayList<CustomLocale> speechRecognizerLanguages = Recognizer.getSupportedLanguages(Global.this);
173+
//we return only the languages compatible with the speech recognizer, the translator and the tts
174+
final ArrayList<CustomLocale> compatibleLanguages = new ArrayList<>();
175+
for (CustomLocale translatorLanguage : translatorLanguages) {
176+
if (CustomLocale.containsLanguage(speechRecognizerLanguages, translatorLanguage)) {
177+
compatibleLanguages.add(translatorLanguage);
178+
}
179+
}
180+
languages = compatibleLanguages;
181+
responseListener.onSuccess(compatibleLanguages);
182+
}else{
183+
responseListener.onFailure(new int[]{reason}, 0);
184+
}
185+
}
186+
});
187+
}
188+
}
189+
148190
public Translator getTranslator() {
149191
return translator;
150192
}
@@ -195,7 +237,7 @@ public interface GetLocalesListListener {
195237
}
196238

197239
public void getLanguage(final boolean recycleResult, final GetLocaleListener responseListener) {
198-
getLanguages(true, new GetLocalesListListener() {
240+
getLanguages(true, true, new GetLocalesListListener() {
199241
@Override
200242
public void onSuccess(ArrayList<CustomLocale> languages) {
201243
CustomLocale predefinedLanguage = CustomLocale.getDefault();
@@ -234,7 +276,7 @@ public void onFailure(int[] reasons, long value) {
234276
}
235277

236278
public void getFirstLanguage(final boolean recycleResult, final GetLocaleListener responseListener) {
237-
getLanguages(true, new GetLocalesListListener() {
279+
getLanguages(true, true, new GetLocalesListListener() {
238280
@Override
239281
public void onSuccess(final ArrayList<CustomLocale> languages) {
240282
getLanguage(true, new GetLocaleListener() {
@@ -283,7 +325,7 @@ public void onFailure(int[] reasons, long value) {
283325
}
284326

285327
public void getSecondLanguage(final boolean recycleResult, final GetLocaleListener responseListener) {
286-
getLanguages(true, new GetLocalesListListener() {
328+
getLanguages(true, true, new GetLocalesListListener() {
287329
@Override
288330
public void onSuccess(ArrayList<CustomLocale> languages) {
289331
CustomLocale predefinedLanguage = CustomLocale.getDefault();

app/src/main/java/nie/translator/rtranslator/LoadingActivity.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ public void onResume() {
8484
} else if (global.getTranslator() != null && global.getSpeechRecognizer() != null) {
8585
startVoiceTranslationActivity();
8686
} else {
87-
initializeApp();
87+
initializeApp(false);
88+
//onFailure(new int[]{ErrorCodes.GOOGLE_TTS_ERROR}, 0);
8889
}
8990
}
9091

@@ -94,8 +95,8 @@ protected void onPause() {
9495
isVisible = false;
9596
}
9697

97-
private void initializeApp() {
98-
global.getLanguages(false, new Global.GetLocalesListListener() {
98+
private void initializeApp(boolean ignoreTTSError) {
99+
global.getLanguages(false, ignoreTTSError, new Global.GetLocalesListListener() {
99100
@Override
100101
public void onSuccess(ArrayList<CustomLocale> result) {
101102
global.initializeTranslator(new Translator.InitListener() {
@@ -148,7 +149,7 @@ public void run() {
148149
showGoogleTTSErrorDialog(new DialogInterface.OnClickListener() {
149150
@Override
150151
public void onClick(DialogInterface dialog, int which) {
151-
initializeApp();
152+
initializeApp(true);
152153
}
153154
});
154155
}
@@ -173,7 +174,7 @@ public void onClick(DialogInterface dialog, int which) {
173174
builder.setPositiveButton(R.string.retry, new DialogInterface.OnClickListener() {
174175
@Override
175176
public void onClick(DialogInterface dialogInterface, int i) {
176-
initializeApp();
177+
initializeApp(false);
177178
}
178179
});
179180
AlertDialog dialog = builder.create();
@@ -212,7 +213,12 @@ private void notifyMissingGoogleTTSDialog() {
212213
@Override
213214
public void run() {
214215
if (isVisible) {
215-
showMissingGoogleTTSDialog();
216+
showMissingGoogleTTSDialog(new DialogInterface.OnClickListener() {
217+
@Override
218+
public void onClick(DialogInterface dialog, int which) {
219+
initializeApp(true);
220+
}
221+
});
216222
}
217223
}
218224
});

app/src/main/java/nie/translator/rtranslator/access/DownloadFragment.java

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -193,24 +193,26 @@ public void run() {
193193
if (!error) {
194194
//we update the Gui according to the downloads status
195195
mainHandler.post(() -> {
196-
updateProgress();
197-
//we update the progressDescriptionText
198-
int indexOfRunningTransfer = getIndexOfRunningTransfer();
199-
if(indexOfRunningTransfer != -1){
200-
String downloadName = DOWNLOAD_NAMES[indexOfRunningTransfer];
201-
downloadName = downloadName.replace(".onnx", "");
202-
downloadName = downloadName.replace("_", " ");
203-
progressDescriptionText.setText(getString(R.string.description_transfer, downloadName));
204-
}else{
205-
SharedPreferences sharedPreferences = global.getSharedPreferences("default", Context.MODE_PRIVATE);
206-
long currentDownloadId = sharedPreferences.getLong("currentDownloadId", -1);
207-
if(currentDownloadId >= 0){
208-
int indexOfRunningDownload = downloader.findDownloadUrlIndex(currentDownloadId);
209-
if(indexOfRunningDownload >= 0){
210-
String downloadName = DOWNLOAD_NAMES[indexOfRunningDownload];
211-
downloadName = downloadName.replace(".onnx", "");
212-
downloadName = downloadName.replace("_", " ");
213-
progressDescriptionText.setText(getString(R.string.description_download, downloadName));
196+
if(getContext() != null) {
197+
updateProgress();
198+
//we update the progressDescriptionText
199+
int indexOfRunningTransfer = getIndexOfRunningTransfer();
200+
if (indexOfRunningTransfer != -1) {
201+
String downloadName = DOWNLOAD_NAMES[indexOfRunningTransfer];
202+
downloadName = downloadName.replace(".onnx", "");
203+
downloadName = downloadName.replace("_", " ");
204+
progressDescriptionText.setText(getString(R.string.description_transfer, downloadName));
205+
} else {
206+
SharedPreferences sharedPreferences = global.getSharedPreferences("default", Context.MODE_PRIVATE);
207+
long currentDownloadId = sharedPreferences.getLong("currentDownloadId", -1);
208+
if (currentDownloadId >= 0) {
209+
int indexOfRunningDownload = downloader.findDownloadUrlIndex(currentDownloadId);
210+
if (indexOfRunningDownload >= 0) {
211+
String downloadName = DOWNLOAD_NAMES[indexOfRunningDownload];
212+
downloadName = downloadName.replace(".onnx", "");
213+
downloadName = downloadName.replace("_", " ");
214+
progressDescriptionText.setText(getString(R.string.description_download, downloadName));
215+
}
214216
}
215217
}
216218
}

app/src/main/java/nie/translator/rtranslator/settings/LanguagePreference.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ private void showList() {
131131
reloadButton.setVisibility(View.GONE);
132132
progressBar.setVisibility(View.VISIBLE);
133133

134-
global.getLanguages(true, new Global.GetLocalesListListener() {
134+
global.getLanguages(true, true, new Global.GetLocalesListListener() {
135135
@Override
136136
public void onSuccess(final ArrayList<CustomLocale> languages) {
137137
global.getLanguage(false, new Global.GetLocaleListener() {
@@ -145,7 +145,7 @@ public void onSuccess(CustomLocale selectedLanguage) {
145145
listViewGui.setOnItemClickListener(new AdapterView.OnItemClickListener() {
146146
@Override
147147
public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
148-
global.getLanguages(true, new Global.GetLocalesListListener() {
148+
global.getLanguages(true, true, new Global.GetLocalesListListener() {
149149
@Override
150150
public void onSuccess(ArrayList<CustomLocale> result) {
151151
if (result.contains((CustomLocale) listView.getItem(position))) {

app/src/main/java/nie/translator/rtranslator/settings/SettingsFragment.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public void onClick(DialogInterface dialogInterface, int i) {
9393
break;
9494
}
9595
case ON_MISSING_GOOGLE_TTS:
96-
activity.showMissingGoogleTTSDialog();
96+
activity.showMissingGoogleTTSDialog(null);
9797
break;
9898

9999
}

app/src/main/java/nie/translator/rtranslator/settings/SupportTtsQualityPreference.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) {
6767
}
6868

6969
public void downloadLanguages() {
70-
global.getLanguages(false, new Global.GetLocalesListListener() {
70+
global.getLanguages(false, true, new Global.GetLocalesListListener() {
7171
@Override
7272
public void onSuccess(ArrayList<CustomLocale> result) {
7373
fragment.removeDownload();

app/src/main/java/nie/translator/rtranslator/tools/gui/ButtonSound.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ public ButtonSound(Context context, AttributeSet attrs, int defStyleAttr) {
3636
super(context, attrs, defStyleAttr);
3737
}
3838

39+
@Override
40+
public void deactivate(int reason) {
41+
super.deactivate(reason);
42+
if(reason == DEACTIVATED_FOR_TTS_ERROR) {
43+
setMute(true);
44+
}
45+
}
46+
3947
public boolean isMute() {
4048
return isMute;
4149
}

app/src/main/java/nie/translator/rtranslator/tools/gui/DeactivableButton.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import android.content.res.ColorStateList;
2121
import android.util.AttributeSet;
2222
import androidx.appcompat.widget.AppCompatImageButton;
23+
24+
import java.net.PortUnreachableException;
25+
2326
import javax.annotation.Nullable;
2427

2528
public class DeactivableButton extends AppCompatImageButton {
@@ -28,12 +31,14 @@ public class DeactivableButton extends AppCompatImageButton {
2831
public static final int DEACTIVATED_FOR_CREDIT_EXHAUSTED =2;
2932
public static final int DEACTIVATED_FOR_MISSING_MIC_PERMISSION =3;
3033
public static final int DEACTIVATED_FOR_MISSING_OR_WRONG_KEYFILE =4;
34+
public static final int DEACTIVATED_FOR_TTS_ERROR=5;
3135
protected int activationStatus=0;
3236
private OnClickListener activatedClickListener;
3337
private OnClickListener deactivatedClickListener;
3438
private OnClickListener deactivatedForCreditExhaustedClickListener;
3539
private OnClickListener deactivatedForMissingMicPermissionClickListener;
3640
private OnClickListener deactivatedForMissingOrWrongKeyfileClickListener;
41+
private OnClickListener deactivatedForTTSErrorClickListener;
3742
public static ColorStateList deactivatedColor;
3843
public static ColorStateList activatedColor;
3944
protected ColorStateList color;
@@ -85,6 +90,13 @@ public void setOnClickListenerForDeactivatedForMissingOrWrongKeyfile(@Nullable O
8590
}
8691
}
8792

93+
public void setOnClickListenerForTTSError(@Nullable OnClickListener l){
94+
deactivatedForTTSErrorClickListener = l;
95+
if(activationStatus == DEACTIVATED_FOR_TTS_ERROR){
96+
super.setOnClickListener(l);
97+
}
98+
}
99+
88100
public void deactivate(int reason){
89101
activationStatus=reason;
90102
switch (reason){
@@ -104,12 +116,18 @@ public void deactivate(int reason){
104116
super.setOnClickListener(deactivatedForMissingOrWrongKeyfileClickListener);
105117
break;
106118
}
119+
case DEACTIVATED_FOR_TTS_ERROR: {
120+
super.setOnClickListener(deactivatedForTTSErrorClickListener);
121+
break;
122+
}
107123
}
108124
}
109125

110126
public void activate(boolean start){
111-
activationStatus=ACTIVATED;
112-
super.setOnClickListener(activatedClickListener);
127+
if(activationStatus != DEACTIVATED_FOR_TTS_ERROR) {
128+
activationStatus = ACTIVATED;
129+
super.setOnClickListener(activatedClickListener);
130+
}
113131
}
114132

115133

0 commit comments

Comments
 (0)