Try harder to determine backup file extension

pull/820/head
Alex Baker 7 years ago
parent de29c3473f
commit 65292e7ae6

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

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

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

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

@ -886,4 +886,5 @@ File %1$s contained %2$s.\n\n
<string name="third_party_licenses">Third-party licenses</string>
<string name="changelog">Changelog</string>
<string name="version_string">Version %s</string>
<string name="invalid_backup_file">Invalid backup file</string>
</resources>

Loading…
Cancel
Save