From 6ce3d36655dff25095cc774dda439b11e1d937f7 Mon Sep 17 00:00:00 2001 From: Roman Tsisyk Date: Wed, 31 Jan 2024 13:08:25 +0200 Subject: [PATCH] [android] Improve error handling when importing bookmarks See #7149 #6944 Signed-off-by: Roman Tsisyk --- .../java/app/organicmaps/MwmActivity.java | 46 ++++++++- .../bookmarks/BookmarkCategoriesFragment.java | 13 +-- .../bookmarks/data/BookmarkManager.java | 58 ++++++++---- .../app/organicmaps/help/FaqFragment.java | 2 +- .../app/organicmaps/help/HelpFragment.java | 2 +- .../settings/StoragePathFragment.java | 2 +- .../main/java/app/organicmaps/util/Utils.java | 14 +-- data/strings/strings.txt | 93 +++++++++++++++++++ 8 files changed, 190 insertions(+), 40 deletions(-) diff --git a/android/app/src/main/java/app/organicmaps/MwmActivity.java b/android/app/src/main/java/app/organicmaps/MwmActivity.java index b681206c69..829d00b4eb 100644 --- a/android/app/src/main/java/app/organicmaps/MwmActivity.java +++ b/android/app/src/main/java/app/organicmaps/MwmActivity.java @@ -1975,10 +1975,50 @@ public class MwmActivity extends BaseMwmFragmentActivity RoutingController.get().start(); } - public void onBookmarksFileLoaded(boolean success) + @Override + public void onBookmarksFileUnsupported(@NonNull Uri uri) { - Utils.showSnackbar(this, findViewById(R.id.coordinator), - success ? R.string.load_kmz_successful : R.string.load_kmz_failed); + dismissAlertDialog(); + mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog) + .setTitle(R.string.load_kmz_title) + .setMessage(getString(R.string.unknown_file_type, uri)) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.report_a_bug, (dialog, which) -> Utils.sendBugReport(this, + getString(R.string.load_kmz_title), getString(R.string.unknown_file_type, uri))) + .setOnDismissListener(dialog -> mAlertDialog = null) + .show(); + } + + @Override + public void onBookmarksFileDownloadFailed(@NonNull Uri uri, @NonNull String error) + { + dismissAlertDialog(); + mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog) + .setTitle(R.string.load_kmz_title) + .setMessage(getString(R.string.failed_to_open_file, uri, error)) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.report_a_bug, (dialog, which) -> Utils.sendBugReport(this, + getString(R.string.load_kmz_title), getString(R.string.failed_to_open_file, uri, error))) + .setOnDismissListener(dialog -> mAlertDialog = null) + .show(); + } + + @Override + public void onBookmarksFileImportSuccessful() + { + Utils.showSnackbar(this, findViewById(R.id.coordinator), R.string.load_kmz_successful); + } + + @Override + public void onBookmarksFileImportFailed() + { + dismissAlertDialog(); + mAlertDialog = new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog) + .setTitle(R.string.load_kmz_title) + .setMessage(R.string.load_kmz_failed) + .setPositiveButton(R.string.ok, null) + .setOnDismissListener(dialog -> mAlertDialog = null) + .show(); } @Override diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkCategoriesFragment.java b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkCategoriesFragment.java index b120108366..269aa0ce96 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkCategoriesFragment.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarkCategoriesFragment.java @@ -201,17 +201,14 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment { + for (BookmarksLoadingListener listener : mListeners) + listener.onBookmarksFileUnsupported(uri); + }); + return false; + } + + Logger.d(TAG, "Downloading bookmarks file from " + uri + " into " + filename); + final File tempFile = new File(tempDir, filename); StorageUtils.copyFile(resolver, uri, tempFile); - } catch (IOException e) + Logger.d(TAG, "Downloaded bookmarks file from " + uri + " into " + filename); + UiThread.run(() -> loadBookmarksFile(tempFile.getAbsolutePath(), true)); + return true; + } + catch (IOException|SecurityException e) { - Logger.w(TAG, "Failed to download bookmarks file from " + uri, e); + Logger.e(TAG, "Could not download bookmarks file from " + uri, e); + UiThread.run(() -> { + for (BookmarksLoadingListener listener : mListeners) + listener.onBookmarksFileDownloadFailed(uri, e.toString()); + }); return false; } - - UiThread.run(() -> loadBookmarksFile(tempFile.getAbsolutePath(), true)); - - return true; } @WorkerThread @@ -902,7 +917,10 @@ public enum BookmarkManager { default void onBookmarksLoadingStarted() {} default void onBookmarksLoadingFinished() {} - default void onBookmarksFileLoaded(boolean success) {} + default void onBookmarksFileUnsupported(@NonNull Uri uri) {}; + default void onBookmarksFileDownloadFailed(@NonNull Uri uri, @NonNull String string) {}; + default void onBookmarksFileImportSuccessful() {}; + default void onBookmarksFileImportFailed() {}; } public interface BookmarksSortingListener diff --git a/android/app/src/main/java/app/organicmaps/help/FaqFragment.java b/android/app/src/main/java/app/organicmaps/help/FaqFragment.java index 81c376e92b..de0524e7a4 100644 --- a/android/app/src/main/java/app/organicmaps/help/FaqFragment.java +++ b/android/app/src/main/java/app/organicmaps/help/FaqFragment.java @@ -30,7 +30,7 @@ public class FaqFragment extends BaseMwmFragment private void reportBug() { - Utils.sendBugReport(requireActivity(), ""); + Utils.sendBugReport(requireActivity(), "", ""); } @Override diff --git a/android/app/src/main/java/app/organicmaps/help/HelpFragment.java b/android/app/src/main/java/app/organicmaps/help/HelpFragment.java index 5bc8a502e0..c6c128537e 100644 --- a/android/app/src/main/java/app/organicmaps/help/HelpFragment.java +++ b/android/app/src/main/java/app/organicmaps/help/HelpFragment.java @@ -125,7 +125,7 @@ public class HelpFragment extends BaseMwmFragment implements View.OnClickListene else if (id == R.id.faq) ((HelpActivity) requireActivity()).stackFragment(FaqFragment.class, getString(R.string.faq), null); else if (id == R.id.report) - Utils.sendBugReport(requireActivity(), ""); + Utils.sendBugReport(requireActivity(), "", ""); else if (id == R.id.support_us) Utils.openUrl(requireActivity(), getResources().getString(R.string.translated_om_site_url) + "support-us/"); else if (id == R.id.donate) diff --git a/android/app/src/main/java/app/organicmaps/settings/StoragePathFragment.java b/android/app/src/main/java/app/organicmaps/settings/StoragePathFragment.java index c393117424..3f6a36d618 100644 --- a/android/app/src/main/java/app/organicmaps/settings/StoragePathFragment.java +++ b/android/app/src/main/java/app/organicmaps/settings/StoragePathFragment.java @@ -131,7 +131,7 @@ public class StoragePathFragment extends BaseSettingsFragment new MaterialAlertDialogBuilder(requireActivity(), R.style.MwmTheme_AlertDialog) .setTitle(R.string.move_maps_error) .setPositiveButton(R.string.report_a_bug, - (dlg, which) -> Utils.sendBugReport(requireActivity(), "Error moving map files")) + (dlg, which) -> Utils.sendBugReport(requireActivity(), "Error moving map files", "")) .show(); } Framework.nativeChangeWritableDir(newPath); diff --git a/android/app/src/main/java/app/organicmaps/util/Utils.java b/android/app/src/main/java/app/organicmaps/util/Utils.java index c55e730807..7bde572c99 100644 --- a/android/app/src/main/java/app/organicmaps/util/Utils.java +++ b/android/app/src/main/java/app/organicmaps/util/Utils.java @@ -315,17 +315,16 @@ public class Utils /** * @param subject could be an empty string */ - public static void sendBugReport(@NonNull Activity activity, @NonNull String subject) + public static void sendBugReport(@NonNull Activity activity, @NonNull String subject, @NonNull String body) { subject = "Organic Maps Bugreport" + (TextUtils.isEmpty(subject) ? "" : ": " + subject); - LogsManager.INSTANCE.zipLogs(new SupportInfoWithLogsCallback(activity, subject, - Constants.Email.SUPPORT)); + LogsManager.INSTANCE.zipLogs(new SupportInfoWithLogsCallback(activity, subject, body, Constants.Email.SUPPORT)); } // TODO: Don't send logs with general feedback, send system information only (version, device name, connectivity, etc.) public static void sendFeedback(@NonNull Activity activity) { - LogsManager.INSTANCE.zipLogs(new SupportInfoWithLogsCallback(activity, "Organic Maps Feedback", + LogsManager.INSTANCE.zipLogs(new SupportInfoWithLogsCallback(activity, "Organic Maps Feedback", "", Constants.Email.SUPPORT)); } @@ -670,13 +669,16 @@ public class Utils @NonNull private final String mSubject; @NonNull + private final String mBody; + @NonNull private final String mEmail; private SupportInfoWithLogsCallback(@NonNull Activity activity, @NonNull String subject, - @NonNull String email) + @NonNull String body, @NonNull String email) { mActivityRef = new WeakReference<>(activity); mSubject = subject; + mBody = body; mEmail = email; } @@ -712,7 +714,7 @@ public class Utils intent.setType("message/rfc822"); } // Do this so some email clients don't complain about empty body. - intent.putExtra(Intent.EXTRA_TEXT, ""); + intent.putExtra(Intent.EXTRA_TEXT, mBody); try { activity.startActivity(intent); diff --git a/data/strings/strings.txt b/data/strings/strings.txt index c37b36dc66..7c41e364e6 100644 --- a/data/strings/strings.txt +++ b/data/strings/strings.txt @@ -4102,6 +4102,99 @@ zh-Hans = 书签上传失败。该文件可能已损坏或有缺陷。 zh-Hant = 書籤上傳失敗。 檔案可能有毀損或是不完全。 + [unknown_file_type] + comment = Failed to recognize the format of a bookmarks or tracks file. + tags = android + en = The file type is not recognized by the app:\n%1$@ + af = Die lêertipe word nie deur die toepassing herken nie:\n%1$@ + ar = لم يتعرف التطبيق على نوع الملف:\n%1$@ + az = Fayl növü tətbiq tərəfindən tanınmır:\n%1$@ + be = Прыкладанне не распазнае тып файла:\n%1$@ + bg = Типът на файла не се разпознава от приложението:\n%1$@ + ca = L'aplicació no reconeix el tipus de fitxer:\n%1$@ + cs = Typ souboru není aplikací rozpoznán:\n%1$@ + da = Filtypen genkendes ikke af appen:\n%1$@ + de = Der Dateityp wird von der App nicht erkannt:\n%1$@ + el = Ο τύπος αρχείου δεν αναγνωρίζεται από την εφαρμογή:\n%1$@ + es = La aplicación no reconoce el tipo de archivo:\n%1$@ + et = Rakendus ei tunnista failitüüpi:\n%1$@ + eu = Aplikazioak ez du fitxategi mota ezagutzen:\n%1$@ + fa = نوع فایل توسط برنامه تشخیص داده نمی شود:\n%1$@ + fi = Sovellus ei tunnista tiedostotyyppiä:\n%1$@ + fr = Le type de fichier n'est pas reconnu par l'appli :\n%1$@ + he = סוג הקובץ אינו מזוהה על ידי האפליקציה:\n%1$@ + hi = फ़ाइल प्रकार ऐप द्वारा पहचाना नहीं गया है:\n%1$@ + hu = Az alkalmazás nem ismeri fel a fájltípust:\n%1$@ + id = Jenis file tidak dikenali oleh aplikasi:\n%1$@ + it = Il tipo di file non è riconosciuto dall'applicazione:\n%1$@ + ja = ファイルタイプがアプリに認識されない:\n%1$@ + ko = 파일 형식이 앱에서 인식되지 않습니다:\n%1$@ + lt = Programa neatpažįsta failo tipo:\n%1$@ + mr = फाइल प्रकार ॲपद्वारे ओळखला जात नाही:\n%1$@ + nb = Filtypen gjenkjennes ikke av appen:\n%1$@ + nl = Het bestandstype wordt niet herkend door de app:\n%1$@ + pl = Typ pliku nie jest rozpoznawany przez aplikację:\n%1$@ + pt = O tipo de ficheiro não é reconhecido pela aplicação:\n%1$@ + pt-BR = O tipo de arquivo não é reconhecido pelo aplicativo:\n%1$@ + ro = Tipul de fișier nu este recunoscut de aplicație:\n%1$@ + ru = Тип файла не поддерживается приложением:\n%1$@ + sk = Aplikácia nerozpoznáva typ súboru:\n%1$@ + sv = Filtypen känns inte igen av appen:\n%1$@ + sw = Aina ya faili haitambuliwi na programu:\n%1$@ + th = แอปไม่รู้จักประเภทไฟล์:\n%1$@ + tr = Dosya türü uygulama tarafından tanınmıyor:\n%1$@ + uk = Тип файлу не розпізнається програмою:\n%1$@ + vi = Loại tệp không được ứng dụng nhận dạng:\n%1$@ + zh-Hans = 应用程序无法识别文件类型:\n%1$@ + zh-Hant = 應用程式無法識別該文件類型:\n%1$@ + + [failed_to_open_file] + comment = Failed to open a bookmarks or tracks file in Organic Maps. + tags = android + en = Failed to open file %1$@\n\n%2$@ + af = Kon nie lêer oopmaak nie %1$@\n\n%2$@ + ar = فشل فتح ملف %1$@\n\n%2$@ + az = Faylı açmaq alınmadı %1$@\n\n%2$@ + be = Не ўдалося адкрыць файл %1$@\n\n%2$@ + bg = Неуспешно отваряне на файл %1$@\n\n%2$@ + ca = No s'ha pogut obrir el fitxer %1$@\n\n%2$@ + cs = Nepodařilo se otevřít soubor %1$@\n\n%2$@ + da = Kunne ikke åbne filen %1$@\n\n%2$@ + de = Datei konnte nicht geöffnet werden %1$@\n\n%2$@ + el = Απέτυχε να ανοίξει αρχείο %1$@\n\n%2$@ + es = No se ha podido abrir el archivo %1$@\n\n%2$@ + es-MX = Fallo al abrir el archivo %1$@\n\n%2$@ + et = Faili avamine ebaõnnestus %1$@\n\n%2$@ + eu = Ezin izan da fitxategia ireki %1$@\n\n%2$@ + fa = فایل باز نشد %1$@\n\n%2$@ + fi = Tiedostoa ei onnistuttu avaamaan %1$@\n\n%2$@ + fr = Échec de l'ouverture du fichier %1$@\n\n%2$@ + he = נכשל בפתיחת הקובץ %1$@\n\n%2$@ + hi = फ़ाइल खोलने में असफल %1$@\n\n%2$@ + hu = Nem sikerült megnyitni a fájlt %1$@\n\n%2$@ + id = Gagal membuka file %1$@\n\n%2$@ + it = Impossibile aprire il file %1$@\n\n%2$@ + ja = ファイルを開けなかった %1$@\n\n%2$@ + ko = 파일을 열지 못했습니다 %1$@\n\n%2$@ + lt = Nepavyko atidaryti failo %1$@\n\n%2$@ + mr = फाइल उघडण्यात अयशस्वी%1$@\n\n%2$@ + nb = Kunne ikke åpne filen %1$@\n\n%2$@ + nl = Faalde om bestand te openen %1$@\n\n%2$@ + pl = Nie udało się otworzyć pliku %1$@\n\n%2$@ + pt = Falha ao abrir o ficheiro %1$@\n\n%2$@ + pt-BR = Falha ao abrir o arquivo %1$@\n\n%2$@ + ro = Nu a reușit să deschidă fișierul %1$@\n\n%2$@ + ru = Не удалось открыть файл %1$@\n\n%2$@ + sk = Nepodarilo sa otvoriť súbor %1$@\n\n%2$@ + sv = Det gick inte att öppna filen %1$@\n\n%2$@ + sw = Imeshindwa kufungua faili %1$@\n\n%2$@ + th = ไม่สามารถเปิดไฟล์ได้ %1$@\n\n%2$@ + tr = Dosya açılamadı %1$@\n\n%2$@ + uk = Не вдалося відкрити файл %1$@\n\n%2$@ + vi = Không thể mở tập tin %1$@\n\n%2$@ + zh-Hans = 打开文件失败 %1$@\n\n%2$@ + zh-Hant = 無法開啟文件 %1$@\n\n%2$@ + [edit] comment = resource for context menu tags = android,ios