forked from organicmaps/organicmaps
[android] Improve error handling when importing bookmarks
See #7149 #6944 Signed-off-by: Roman Tsisyk <roman@tsisyk.com>
This commit is contained in:
parent
ede7eda0c0
commit
6ce3d36655
8 changed files with 190 additions and 40 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -30,7 +30,7 @@ public class FaqFragment extends BaseMwmFragment
|
|||
|
||||
private void reportBug()
|
||||
{
|
||||
Utils.sendBugReport(requireActivity(), "");
|
||||
Utils.sendBugReport(requireActivity(), "", "");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue