[android] Improve error handling when importing bookmarks

See #7149 #6944

Signed-off-by: Roman Tsisyk <roman@tsisyk.com>
This commit is contained in:
Roman Tsisyk 2024-01-31 13:08:25 +02:00
parent ede7eda0c0
commit 6ce3d36655
8 changed files with 190 additions and 40 deletions

View file

@ -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

View file

@ -201,17 +201,14 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment<Bookmark
}
@Override
public void onBookmarksFileLoaded(boolean success)
public void onBookmarksFileImportFailed()
{
// TODO: Is there a way to display several failure notifications?
// TODO: It would be helpful to see the file name that failed to import.
if (!success)
{
final View view = getView();
// TODO: how to get import button view to show snackbar above it?
if (view != null)
Utils.showSnackbar(requireActivity(), view, R.string.load_kmz_failed);
}
final View view = getView();
// TODO: how to get import button view to show snackbar above it?
if (view != null)
Utils.showSnackbar(requireActivity(), view, R.string.load_kmz_failed);
}
@Override

View file

@ -246,8 +246,16 @@ public enum BookmarkManager
tmpFile.delete();
}
for (BookmarksLoadingListener listener : mListeners)
listener.onBookmarksFileLoaded(success);
if (success)
{
for (BookmarksLoadingListener listener : mListeners)
listener.onBookmarksFileImportSuccessful();
}
else
{
for (BookmarksLoadingListener listener : mListeners)
listener.onBookmarksFileImportFailed();
}
}
// Called from JNI.
@ -426,11 +434,6 @@ public enum BookmarkManager
filename = cursor.getString(columnIndex);
}
}
catch (Exception ex)
{
Logger.e(TAG, ex + " while querying " + uri);
ex.printStackTrace();
}
}
if (filename == null)
@ -474,24 +477,36 @@ public enum BookmarkManager
@WorkerThread
public boolean importBookmarksFile(@NonNull ContentResolver resolver, @NonNull Uri uri, @NonNull File tempDir)
{
final String filename = getBookmarksFilenameFromUri(resolver, uri);
if (filename == null)
return false;
Logger.w(TAG, "Downloading bookmarks file " + uri + " with file name " + filename);
final File tempFile = new File(tempDir, filename);
Logger.w(TAG, "Importing bookmarks from " + uri);
try
{
final String filename = getBookmarksFilenameFromUri(resolver, uri);
if (filename == null)
{
Logger.w(TAG, "Could not find a supported file type in " + uri);
UiThread.run(() -> {
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

View file

@ -30,7 +30,7 @@ public class FaqFragment extends BaseMwmFragment
private void reportBug()
{
Utils.sendBugReport(requireActivity(), "");
Utils.sendBugReport(requireActivity(), "", "");
}
@Override

View file

@ -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)

View file

@ -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);

View file

@ -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);

View file

@ -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