From 103bb93214082ee7ff7b7882082e0855ff87eb15 Mon Sep 17 00:00:00 2001 From: Dimo Karaivanov Date: Wed, 9 Nov 2022 11:07:27 +0200 Subject: [PATCH] * dictionary loading errors are now displayed in the progress notification * proper icons for dictionary loading status * a toast message appears when dictionary loads successfully or when it fails --- res/drawable-anydpi-v24/ic_done.xml | 15 ++ res/drawable-anydpi-v24/ic_notification.xml | 19 --- res/drawable-hdpi/ic_done.png | Bin 0 -> 261 bytes res/drawable-hdpi/ic_notification.png | Bin 412 -> 0 bytes res/drawable-mdpi/ic_done.png | Bin 0 -> 187 bytes res/drawable-mdpi/ic_notification.png | Bin 283 -> 0 bytes res/drawable-xhdpi/ic_done.png | Bin 0 -> 370 bytes res/drawable-xhdpi/ic_notification.png | Bin 470 -> 0 bytes res/drawable-xxhdpi/ic_done.png | Bin 0 -> 520 bytes res/drawable-xxhdpi/ic_notification.png | Bin 693 -> 0 bytes res/layout/mainview.xml | 2 +- res/values-bg/strings.xml | 10 +- res/values-fr/strings.xml | 8 +- res/values-it/strings.xml | 10 +- res/values-ru/strings.xml | 8 +- res/values-uk/strings.xml | 8 +- res/values/strings.xml | 11 +- .../sspanak/tt9/ui/DictionaryLoadingBar.java | 131 +++++++++++++++--- .../sspanak/tt9/ui/TraditionalT9Settings.java | 59 +------- 19 files changed, 165 insertions(+), 116 deletions(-) create mode 100644 res/drawable-anydpi-v24/ic_done.xml delete mode 100644 res/drawable-anydpi-v24/ic_notification.xml create mode 100644 res/drawable-hdpi/ic_done.png delete mode 100644 res/drawable-hdpi/ic_notification.png create mode 100644 res/drawable-mdpi/ic_done.png delete mode 100644 res/drawable-mdpi/ic_notification.png create mode 100644 res/drawable-xhdpi/ic_done.png delete mode 100644 res/drawable-xhdpi/ic_notification.png create mode 100644 res/drawable-xxhdpi/ic_done.png delete mode 100644 res/drawable-xxhdpi/ic_notification.png 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 0000000000000000000000000000000000000000..b15291e42543ac867c8b08db5bd8fdd165baeba6 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB&Um^whE&A8opO=)kOPmiWaC8% z#l;&uB|Ce4bdy#_ZAyb>m(*Nw^-_#b*x7x} zY_C>>!C>%DP}P*@uwZ8B*yMQ(JU`8Io-M5MRkjqV`8yUmnRua(Jo`KXW4{~kfp$Er zc{@W)pT3#7>d3JN7uuX1lrsxAQlPI}&I-Z1Cu@lLAS0|h^uj`j6@qtWJtF(IkP+4$ zx_qID^$7DpMp$=HAhC{EA$TX&Bg_XGVckK2#5!Vy;N7tvp?|p0f%ORe<%M?OHQv-e z1bJTcgm9-r`xdfCz$^HB5$<$o$3l&oxpwfb3U@hbsF7H|73vq(9TZ5c-wO2$>kbMe z))6f)*L#>Xdl)V6w1%+m(7uJxYh1I?6ZnO7hn~M{66=VTe;M*%XY4byd^een2>Tpn zfRrgty_xXW$#RLQ1(CaKuA5L-IsIACnh;B11>&bM7{t3 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_notification.png b/res/drawable-mdpi/ic_notification.png deleted file mode 100644 index aeb07b7877105f34d9a73d0e2cd43653dae0aa0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gjk33x*Ln`9lPJS)eE1eR(f7D7Ul`t)XEhuN6`8wTfjPF} f!RFROu2+G`PHXH&=+ z{s61+<{krvK(6ph-0(?HY2Bj7KOz2RrW++D+CLbYC-9;twKjSZ$a&{e_=6!(D!jpf zAy7KJL60HeCA`7UL+mHLzQP+Geu(ZN9$8~_hhI9^J+otoBi5@XYb|skaiMz^gY~bI zD*M`W!S9Cf8Qx(15Wd43d_P1T;f)MYS9pWw6Z;GgpUS=%eoxmz2;u+u1cPV*4t$s& Q3;+NC07*qoM6N<$f+XdmUH||9 literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_notification.png b/res/drawable-xhdpi/ic_notification.png deleted file mode 100644 index 832d3ad4a54a7aa75e514d8bedd6dc2dd44fcbaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezr3(FwXUKaSW-5dpn~sx7k3z)!51H z1c&57$y^Srh?qN%A5y1S0c3i z7SGZ+Z!12D%`WLprH@0c=;0POzi+C?cK&$#(&+8L*ltj{F#Vt?@01033)0U@1>A2vFiWkXhI!R5IhpN7reWk?<;x0t4-0!u; zVV3L6)nQXTBw>b diff --git a/res/drawable-xxhdpi/ic_done.png b/res/drawable-xxhdpi/ic_done.png new file mode 100644 index 0000000000000000000000000000000000000000..e1b6e524dc312cb74229f2a86a85285b09ec5e52 GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2U_9^X;uum9_x4u2HcOzy@sG8F zU7I=&O_erRiEG)R@bqexV3$$XA5X7`U4Lwnzia+2le6AEGx6Nd+E+Vg&b>V6bMCfn zFTT1!Kom>D(X@H%z29q}n{;;W*`;Th>gR3EFT7J)+57%{m8rzF?=${pKp`R-y`?{#(FF5%`!M*{5635%$Q9E*JZ)f32FU}31?#{-tZ z!aQ8xpUnUE_M96!pVEDu*&m&`C34s|X5mr$O$(I^&t)33Ms>9C9hrGBLneH|L5~&k z&n4?6o=-75%w;0LIr-?#2Vd82V1NHPk4fCDHqKs`=ikH!ZSw-39!;Bkefuf1f}GEe z(yN0Wh~HBwd3ZK4LsMv%#PNj>Jzf;aw6`fKwp#G*m*LbrTDa{Z^Ob&+)30TNdL9SZ z2mMqoRuKy7du))Z@zy%S>5i{}%I)Dydw4*cF&yu*?LvrlAZ$^L2 zleDwrJKH+0u0%vcL_|bHMC88);Ctt><{DVc+{W=OGk58@M_PNudlsR;fom}F^;H~C zlx=An#~s&kglBayWNNsM>g=?;cW4OSo*Ms6k! z%iH)A*K=UZyu`7_CpRyYHw>KJLAtlx;p1I0WHL1moSy^f^0kK5-0-}2@sB^_xaQY$ z;Aqgkn7fJNG4p!KQPvCfCI!yBU}1xDkeXJq;=C8qJE^L180{)`92gl>w>-w+HiI$Taz~#1b2rM>HtEJ6qdu zEiS0v 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(); - } }