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(); - } }