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