From 65292e7ae649054d5f0ffe6c08b91acb276d1845 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 8 May 2019 16:29:27 -0500 Subject: [PATCH] Try harder to determine backup file extension --- .../org/tasks/dialogs/ImportTasksDialog.java | 46 ++++++++----------- .../main/java/org/tasks/files/FileHelper.java | 19 ++++++++ .../tasks/preferences/BasicPreferences.java | 10 +++- app/src/main/java/org/tasks/ui/Toaster.java | 4 ++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 51 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/org/tasks/dialogs/ImportTasksDialog.java b/app/src/main/java/org/tasks/dialogs/ImportTasksDialog.java index eb2032d94..b7e3769b7 100644 --- a/app/src/main/java/org/tasks/dialogs/ImportTasksDialog.java +++ b/app/src/main/java/org/tasks/dialogs/ImportTasksDialog.java @@ -2,13 +2,10 @@ package org.tasks.dialogs; import android.app.Dialog; import android.app.ProgressDialog; -import android.content.ContentResolver; import android.content.Context; import android.net.Uri; import android.os.Bundle; -import android.webkit.MimeTypeMap; import com.todoroo.astrid.backup.TasksXmlImporter; -import java.io.IOException; import javax.inject.Inject; import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracking; @@ -16,21 +13,25 @@ import org.tasks.backup.TasksJsonImporter; import org.tasks.injection.ForApplication; import org.tasks.injection.InjectingNativeDialogFragment; import org.tasks.injection.NativeDialogFragmentComponent; -import timber.log.Timber; +import org.tasks.ui.Toaster; public class ImportTasksDialog extends InjectingNativeDialogFragment { private static final String EXTRA_URI = "extra_uri"; + private static final String EXTRA_EXTENSION = "extra_extension"; + @Inject TasksXmlImporter xmlImporter; @Inject TasksJsonImporter jsonImporter; @Inject DialogBuilder dialogBuilder; @Inject Tracker tracker; @Inject @ForApplication Context context; + @Inject Toaster toaster; - public static ImportTasksDialog newImportTasksDialog(Uri data) { + public static ImportTasksDialog newImportTasksDialog(Uri data, String extension) { ImportTasksDialog importTasksDialog = new ImportTasksDialog(); Bundle args = new Bundle(); args.putParcelable(EXTRA_URI, data); + args.putString(EXTRA_EXTENSION, extension); importTasksDialog.setArguments(args); return importTasksDialog; } @@ -39,35 +40,26 @@ public class ImportTasksDialog extends InjectingNativeDialogFragment { public Dialog onCreateDialog(Bundle savedInstanceState) { Bundle arguments = getArguments(); Uri data = arguments.getParcelable(EXTRA_URI); + String extension = arguments.getString(EXTRA_EXTENSION); ProgressDialog progressDialog = dialogBuilder.newProgressDialog(); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.setCancelable(false); progressDialog.setIndeterminate(true); progressDialog.show(); setCancelable(false); - try { - String extension = - data.getScheme().equals(ContentResolver.SCHEME_CONTENT) - ? MimeTypeMap.getSingleton() - .getExtensionFromMimeType(context.getContentResolver().getType(data)) - : MimeTypeMap.getFileExtensionFromUrl(data.getPath()); - switch (extension) { - case "json": - jsonImporter.importTasks(getActivity(), data, progressDialog); - tracker.reportEvent(Tracking.Events.IMPORT_JSON); - break; - case "xml": - xmlImporter.importTasks(getActivity(), data, progressDialog); - tracker.reportEvent(Tracking.Events.IMPORT_XML); - break; - default: - throw new IOException("Invalid file type: " + extension); - } - return progressDialog; - } catch (IOException e) { - Timber.e(e); + switch (extension) { + case "json": + jsonImporter.importTasks(getActivity(), data, progressDialog); + tracker.reportEvent(Tracking.Events.IMPORT_JSON); + break; + case "xml": + xmlImporter.importTasks(getActivity(), data, progressDialog); + tracker.reportEvent(Tracking.Events.IMPORT_XML); + break; + default: + throw new RuntimeException("Invalid extension: " + extension); } - return null; + return progressDialog; } @Override diff --git a/app/src/main/java/org/tasks/files/FileHelper.java b/app/src/main/java/org/tasks/files/FileHelper.java index c08d3a895..a40c4a3dc 100644 --- a/app/src/main/java/org/tasks/files/FileHelper.java +++ b/app/src/main/java/org/tasks/files/FileHelper.java @@ -24,6 +24,7 @@ import android.webkit.MimeTypeMap; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.documentfile.provider.DocumentFile; +import com.google.common.base.Strings; import com.google.common.io.ByteStreams; import com.google.common.io.Files; import java.io.File; @@ -144,6 +145,24 @@ public class FileHelper { return null; } + public static String getExtension(Context context, Uri uri) { + if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { + String extension = + MimeTypeMap.getSingleton() + .getExtensionFromMimeType(context.getContentResolver().getType(uri)); + if (!Strings.isNullOrEmpty(extension)) { + return extension; + } + } + + String extension = MimeTypeMap.getFileExtensionFromUrl(uri.getPath()); + if (!Strings.isNullOrEmpty(extension)) { + return extension; + } + + return Files.getFileExtension(getFilename(context, uri)); + } + public static String getMimeType(Context context, Uri uri) { String filename = getFilename(context, uri); String extension = Files.getFileExtension(filename); diff --git a/app/src/main/java/org/tasks/preferences/BasicPreferences.java b/app/src/main/java/org/tasks/preferences/BasicPreferences.java index e4ac0d087..c68818d33 100644 --- a/app/src/main/java/org/tasks/preferences/BasicPreferences.java +++ b/app/src/main/java/org/tasks/preferences/BasicPreferences.java @@ -443,8 +443,14 @@ public class BasicPreferences extends InjectingPreferenceActivity } } else if (requestCode == REQUEST_PICKER) { if (resultCode == RESULT_OK) { - newImportTasksDialog(data.getData()).show(getFragmentManager(), FRAG_TAG_IMPORT_TASKS); - result.putBoolean(AppearancePreferences.EXTRA_RESTART, true); + Uri uri = data.getData(); + String extension = FileHelper.getExtension(this, uri); + if (!("json".equalsIgnoreCase(extension) || "xml".equalsIgnoreCase(extension))) { + toaster.longToast(R.string.invalid_backup_file); + } else { + newImportTasksDialog(uri, extension).show(getFragmentManager(), FRAG_TAG_IMPORT_TASKS); + result.putBoolean(AppearancePreferences.EXTRA_RESTART, true); + } } } else if (requestCode == RC_DRIVE_BACKUP) { boolean success = resultCode == RESULT_OK; diff --git a/app/src/main/java/org/tasks/ui/Toaster.java b/app/src/main/java/org/tasks/ui/Toaster.java index 88c98d7e1..2c0c8a950 100644 --- a/app/src/main/java/org/tasks/ui/Toaster.java +++ b/app/src/main/java/org/tasks/ui/Toaster.java @@ -21,6 +21,10 @@ public class Toaster { this.locale = locale; } + public void longToast(@StringRes int resId, String arg) { + longToast(context.getString(resId, arg)); + } + public void longToast(@StringRes int resId, int number) { longToast(context.getString(resId, locale.formatNumber(number))); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8441c7fa4..39defc9e9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -886,4 +886,5 @@ File %1$s contained %2$s.\n\n Third-party licenses Changelog Version %s + Invalid backup file