diff --git a/res/drawable-anydpi-v24/ic_done.xml b/res/drawable-anydpi-v24/ic_done.xml
new file mode 100644
index 00000000..5402faa3
--- /dev/null
+++ b/res/drawable-anydpi-v24/ic_done.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/res/drawable-anydpi-v24/ic_notification.xml b/res/drawable-anydpi-v24/ic_notification.xml
deleted file mode 100644
index 0b078c79..00000000
--- a/res/drawable-anydpi-v24/ic_notification.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/res/drawable-hdpi/ic_done.png b/res/drawable-hdpi/ic_done.png
new file mode 100644
index 00000000..b15291e4
Binary files /dev/null and b/res/drawable-hdpi/ic_done.png differ
diff --git a/res/drawable-hdpi/ic_notification.png b/res/drawable-hdpi/ic_notification.png
deleted file mode 100644
index 599f02e3..00000000
Binary files a/res/drawable-hdpi/ic_notification.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_done.png b/res/drawable-mdpi/ic_done.png
new file mode 100644
index 00000000..22b4845e
Binary files /dev/null and b/res/drawable-mdpi/ic_done.png differ
diff --git a/res/drawable-mdpi/ic_notification.png b/res/drawable-mdpi/ic_notification.png
deleted file mode 100644
index aeb07b78..00000000
Binary files a/res/drawable-mdpi/ic_notification.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_done.png b/res/drawable-xhdpi/ic_done.png
new file mode 100644
index 00000000..bb600dcc
Binary files /dev/null and b/res/drawable-xhdpi/ic_done.png differ
diff --git a/res/drawable-xhdpi/ic_notification.png b/res/drawable-xhdpi/ic_notification.png
deleted file mode 100644
index 832d3ad4..00000000
Binary files a/res/drawable-xhdpi/ic_notification.png and /dev/null differ
diff --git a/res/drawable-xxhdpi/ic_done.png b/res/drawable-xxhdpi/ic_done.png
new file mode 100644
index 00000000..e1b6e524
Binary files /dev/null and b/res/drawable-xxhdpi/ic_done.png differ
diff --git a/res/drawable-xxhdpi/ic_notification.png b/res/drawable-xxhdpi/ic_notification.png
deleted file mode 100644
index 1b3ff500..00000000
Binary files a/res/drawable-xxhdpi/ic_notification.png and /dev/null differ
diff --git a/res/layout/mainview.xml b/res/layout/mainview.xml
index fc687549..3ee4a495 100644
--- a/res/layout/mainview.xml
+++ b/res/layout/mainview.xml
@@ -48,7 +48,7 @@
android:longClickable="true"
android:paddingLeft="2dp"
android:paddingRight="2dp"
- android:text="@string/soft_key_mid"
+ android:text="@android:string/ok"
android:textColor="@color/button_text" />
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 1fbe753c..30e497c7 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -2,6 +2,7 @@
Настройки на Traditional T9
Затвори
+ Завършено
Възникна неочаквана грешка.
Добави
@@ -17,10 +18,11 @@
Зареди свой речник
Изтрий речник
- Неуспешно зареждане. Невалидна дума \"%1$s\" на ред %2$d за език \"%3$s\".
- Зареждането на речник е отменено.
- Несупешно зареждане на речник за език \"%1$s\" (%2$s).
- Готово
+ Неуспешно зареждане. Невалидна дума \"%1$s\" на ред %2$d за език \"%3$s\".
+ Зареждането на речник е отменено.
+ Несупешно зареждане на речник за език \"%1$s\" (%2$s).
+ Неуспешно зареждане на речник.
+ Зареждането на речник приключи.
Зареждане на речник (%1$s)…
Зареждане на вашия речник…
Зареждане на речник
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 037731c0..dce4b7b8 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -2,6 +2,7 @@
Configuration Traditional T9
Fermer
+ Fini
Une erreur inattendue s\'est produite.
Ajouter
@@ -16,9 +17,10 @@
Charger le dictionnaire utilisateur
Supprimer le dictionaire
- Echec du chargement de dictionnaire pour langue «%1$s» (%2$s).
- Chargement du dictionnaire annulée.
- Terminé
+ Echec du chargement de dictionnaire pour langue «%1$s» (%2$s).
+ Chargement du dictionnaire annulée.
+ Echec du chargement de dictionnaire.
+ Chargement du dictionnaire terminé.
Chargement du dictionnaire (%1$s)…
Chargement du dictionnaire utilisateur…
Charger le dictionnaire
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index a3c4ca2a..c89472b4 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -2,6 +2,7 @@
Traditional T9 Impostazioni
Chiudi
+ Completato
Si è verificato un errore imprevisto.
Aggiungere
@@ -16,11 +17,12 @@
Carica dizionario utente
Eliminare il dizionario
- Caricamento dizionario annullato.
- Terminato
- Caricamento dizionario (%1$s)…
+ Caricamento del dizionario annullato.
+ Caricamento del dizionario non riuscito.
+ Caricamento del dizionario terminato.
+ Caricamento del dizionario (%1$s)…
Caricamento dizionario utente…
- Caricamento dizionario
+ Caricamento del dizionario
Impossibile caricare. Dizionario per “%1$s” non trovato.
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 47941b2a..f8e018ef 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -2,6 +2,7 @@
Traditional T9 настройки
Закрыть
+ Выполнено
Произошла непредвиденная ошибка.
Добавить
@@ -17,9 +18,10 @@
Загрузить свой словарь
Очистить словарь
- Загрузка словаря отменена.
- Ошибка загрузки словаря для языка «%1$s» (%2$s).
- Завершена
+ Загрузка словаря отменена.
+ Ошибка загрузки словаря для языка «%1$s» (%2$s).
+ Ошибка загрузки словаря.
+ Загрузка словаря завершена.
Загрузка словаря (%1$s)…
Загрузка пользовательского словаря…
Загрузить словарь
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 3b8b9080..01bfc6c2 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -2,6 +2,7 @@
Налаштування Traditional T9
Закрити
+ Зроблено
Сталася неочікувана помилка.
Додати
@@ -16,9 +17,10 @@
Завантажити свій словник
Очистити словник
- Завантаження словника скасовано.
- Помилка завантаження словника для мови «%1$s» (%2$s).
- Завершено
+ Завантаження словника скасовано.
+ Помилка завантаження словника для мови «%1$s» (%2$s).
+ Помилка завантаження словника.
+ Завантаження словника завершено.
Завантаження словника (%1$s)…
Завантаження словника користувача…
Завантажити словник
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e05a1639..d450abe8 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4,8 +4,8 @@
Traditional T9
Traditional T9 Settings
Close
+ Completed
Unexpected error occurred.
- OK
Add
Blank word not added.
@@ -21,10 +21,11 @@
SDcard/traditionalt9/user.lang.dict (lang: en/ru/de/fr)
Clear dictionary
- Loading failed. Invalid word \"%1$s\" on line %2$d of language \"%3$s\".
- Dictionary import cancelled.
- Failed importing dictionary for language \"%1$s\" (%2$s).
- Done
+ Loading failed. Invalid word \"%1$s\" on line %2$d of language \"%3$s\".
+ Dictionary load cancelled.
+ Failed loading the dictionary for language \"%1$s\" (%2$s).
+ Dictionary load failed.
+ Dictionary load completed.
Loading dictionary (%1$s)…
Loading user dictionary…
Load dictionary
diff --git a/src/io/github/sspanak/tt9/ui/DictionaryLoadingBar.java b/src/io/github/sspanak/tt9/ui/DictionaryLoadingBar.java
index 38ce4c71..eead0dc8 100644
--- a/src/io/github/sspanak/tt9/ui/DictionaryLoadingBar.java
+++ b/src/io/github/sspanak/tt9/ui/DictionaryLoadingBar.java
@@ -5,13 +5,21 @@ import android.app.NotificationManager;
import android.content.Context;
import android.content.res.Resources;
import android.os.Build;
+import android.os.Bundle;
import androidx.core.app.NotificationCompat;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
import io.github.sspanak.tt9.R;
+import io.github.sspanak.tt9.db.DictionaryImportException;
+import io.github.sspanak.tt9.languages.InvalidLanguageCharactersException;
+import io.github.sspanak.tt9.languages.InvalidLanguageException;
import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.LanguageCollection;
+
public class DictionaryLoadingBar {
private static final int NOTIFICATION_ID = 1;
private static final String NOTIFICATION_CHANNEL_ID = "loading-notifications";
@@ -21,6 +29,8 @@ public class DictionaryLoadingBar {
private final Resources resources;
private int maxProgress = 0;
+ private int progress = 0;
+ private boolean hasFailed = false;
DictionaryLoadingBar(Context context) {
@@ -40,12 +50,49 @@ public class DictionaryLoadingBar {
}
notificationBuilder
- .setSmallIcon(R.drawable.ic_notification)
+ .setSmallIcon(android.R.drawable.stat_notify_sync)
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
.setOnlyAlertOnce(true);
}
+ public void setFileCount(int count) {
+ maxProgress = count * 100;
+ }
+
+
+ public boolean isCompleted() {
+ return progress >= maxProgress;
+ }
+
+
+ public boolean isFailed() {
+ return hasFailed;
+ }
+
+
+ public void show(Bundle data) {
+ String error = data.getString("error", null);
+
+ if (error != null) {
+ hasFailed = true;
+ showError(
+ error,
+ data.getInt("languageId", -1),
+ data.getLong("fileLine", -1),
+ data.getString("word", "")
+ );
+ } else {
+ hasFailed = false;
+ showProgress(
+ data.getInt("currentFile", 0),
+ data.getInt("progress", 0),
+ data.getInt("languageId", -1)
+ );
+ }
+ }
+
+
private String generateTitle(int languageId) {
Language lang = LanguageCollection.getLanguage(languageId);
@@ -57,36 +104,78 @@ public class DictionaryLoadingBar {
}
- public void show(int currentFile, int currentFileProgress, int languageId) {
- int totalProgress = 100 * currentFile + currentFileProgress;
+ private void showProgress(int currentFile, int currentFileProgress, int languageId) {
+ progress = 100 * currentFile + currentFileProgress;
if (currentFileProgress < 0) {
hide();
- return;
- } else if (totalProgress >= maxProgress) {
- notificationBuilder
- .setContentTitle(generateTitle(-1))
- .setContentText(resources.getString(R.string.dictionary_loaded))
- .setOngoing(false)
- .setProgress(0, 0, false);
+ } else if (progress >= maxProgress) {
+ renderProgress(
+ generateTitle(-1),
+ resources.getString(R.string.completed),
+ 0,
+ 0
+ );
} else {
- notificationBuilder
- .setContentTitle(generateTitle(languageId))
- .setContentText(currentFileProgress + "%")
- .setOngoing(true)
- .setProgress(maxProgress, totalProgress, false);
+ renderProgress(
+ generateTitle(languageId),
+ currentFileProgress + "%",
+ progress,
+ maxProgress
+ );
}
+ }
+
+
+ private void showError(String errorType, int langId, long line, String word) {
+ Language lang = LanguageCollection.getLanguage(langId);
+ String message;
+
+ if (lang == null || errorType.equals(InvalidLanguageException.class.getSimpleName())) {
+ message = resources.getString(R.string.add_word_invalid_language);
+ } else if (errorType.equals(DictionaryImportException.class.getSimpleName()) || errorType.equals(InvalidLanguageCharactersException.class.getSimpleName())) {
+ String languageName = lang.getName();
+ message = resources.getString(R.string.dictionary_load_bad_char, word, line, languageName);
+ } else if (errorType.equals(IOException.class.getSimpleName()) || errorType.equals(FileNotFoundException.class.getSimpleName())) {
+ String languageName = lang.getName();
+ message = resources.getString(R.string.dictionary_not_found, languageName);
+ } else {
+ String languageName = lang.getName();
+ message = resources.getString(R.string.dictionary_load_error, languageName, errorType);
+ }
+
+ renderError(generateTitle(-1), message);
+ }
+
+
+ private void hide() {
+ manager.cancel(NOTIFICATION_ID);
+ }
+
+
+ private void renderError(String title, String message) {
+ NotificationCompat.BigTextStyle bigMessage = new NotificationCompat.BigTextStyle();
+ bigMessage.setBigContentTitle(title);
+ bigMessage.bigText(message);
+
+ notificationBuilder
+ .setSmallIcon(android.R.drawable.stat_notify_error)
+ .setStyle(bigMessage)
+ .setOngoing(false)
+ .setProgress(0, 0, false);
manager.notify(NOTIFICATION_ID, notificationBuilder.build());
}
- public void hide() {
- manager.cancel(NOTIFICATION_ID);
- }
+ private void renderProgress(String title, String message, int progress, int maxProgress) {
+ notificationBuilder
+ .setSmallIcon(progress < maxProgress ? android.R.drawable.stat_notify_sync : R.drawable.ic_done)
+ .setOngoing(progress < maxProgress)
+ .setProgress(maxProgress, progress, false)
+ .setContentTitle(title)
+ .setContentText(message);
-
- public void setFileCount(int count) {
- maxProgress = count * 100;
+ manager.notify(NOTIFICATION_ID, notificationBuilder.build());
}
}
diff --git a/src/io/github/sspanak/tt9/ui/TraditionalT9Settings.java b/src/io/github/sspanak/tt9/ui/TraditionalT9Settings.java
index 9693cc68..fceca14f 100644
--- a/src/io/github/sspanak/tt9/ui/TraditionalT9Settings.java
+++ b/src/io/github/sspanak/tt9/ui/TraditionalT9Settings.java
@@ -1,6 +1,5 @@
package io.github.sspanak.tt9.ui;
-import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.DialogInterface;
@@ -14,17 +13,12 @@ import android.view.View;
import android.widget.ListAdapter;
import android.widget.ListView;
-import java.io.FileNotFoundException;
-import java.io.IOException;
import java.util.ArrayList;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.db.DictionaryDb;
import io.github.sspanak.tt9.db.DictionaryImportAlreadyRunningException;
-import io.github.sspanak.tt9.db.DictionaryImportException;
import io.github.sspanak.tt9.db.DictionaryLoader;
-import io.github.sspanak.tt9.languages.InvalidLanguageCharactersException;
-import io.github.sspanak.tt9.languages.InvalidLanguageException;
import io.github.sspanak.tt9.languages.Language;
import io.github.sspanak.tt9.languages.LanguageCollection;
import io.github.sspanak.tt9.preferences.T9Preferences;
@@ -117,22 +111,11 @@ public class TraditionalT9Settings extends ListActivity implements DialogInterfa
Handler loadHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
- String error = msg.getData().getString("error", null);
-
- if (error != null) {
- progressBar.hide();
- handleError(
- error,
- msg.getData().getInt("languageId", -1),
- msg.getData().getLong("fileLine", -1),
- msg.getData().getString("word", "")
- );
- } else {
- progressBar.show(
- msg.getData().getInt("currentFile", 0),
- msg.getData().getInt("progress", 0),
- msg.getData().getInt("languageId", -1)
- );
+ progressBar.show(msg.getData());
+ if (progressBar.isCompleted()) {
+ UI.toast(mContext, R.string.dictionary_loaded);
+ } else if (progressBar.isFailed()) {
+ UI.toast(mContext, R.string.dictionary_load_failed);
}
}
};
@@ -145,37 +128,7 @@ public class TraditionalT9Settings extends ListActivity implements DialogInterfa
loader.load(loadHandler, languages);
} catch (DictionaryImportAlreadyRunningException e) {
loader.stop();
- UI.toast(this, getString(R.string.dictionary_import_cancelled));
+ UI.toast(this, getString(R.string.dictionary_load_cancelled));
}
}
-
- private void handleError(String errorType, int langId, long line, String word) {
- Language lang = LanguageCollection.getLanguage(langId);
- String message;
-
- if (lang == null || errorType.equals(InvalidLanguageException.class.getSimpleName())) {
- message = getString(R.string.add_word_invalid_language);
- } else if (errorType.equals(DictionaryImportException.class.getSimpleName()) || errorType.equals(InvalidLanguageCharactersException.class.getSimpleName())) {
- String languageName = lang.getName();
- message = getString(R.string.dictionary_import_bad_char, word, line, languageName);
- } else if (errorType.equals(IOException.class.getSimpleName()) || errorType.equals(FileNotFoundException.class.getSimpleName())) {
- String languageName = lang.getName();
- message = getString(R.string.dictionary_not_found, languageName);
- } else {
- String languageName = lang.getName();
- message = getString(R.string.dictionary_import_error, languageName, errorType);
- }
-
- showErrorDialog(getString(R.string.dictionary_load_title), message);
- }
-
- private void showErrorDialog(CharSequence title, CharSequence msg) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder
- .setMessage(msg)
- .setTitle(title)
- .setNeutralButton(android.R.string.ok, (dialog, id) -> dialog.dismiss());
- AlertDialog dialog = builder.create();
- dialog.show();
- }
}