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.Dialog;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.webkit.MimeTypeMap;
import com.todoroo.astrid.backup.TasksXmlImporter; import com.todoroo.astrid.backup.TasksXmlImporter;
import java.io.IOException;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking; import org.tasks.analytics.Tracking;
@ -16,21 +13,25 @@ import org.tasks.backup.TasksJsonImporter;
import org.tasks.injection.ForApplication; import org.tasks.injection.ForApplication;
import org.tasks.injection.InjectingNativeDialogFragment; import org.tasks.injection.InjectingNativeDialogFragment;
import org.tasks.injection.NativeDialogFragmentComponent; import org.tasks.injection.NativeDialogFragmentComponent;
import timber.log.Timber; import org.tasks.ui.Toaster;
public class ImportTasksDialog extends InjectingNativeDialogFragment { public class ImportTasksDialog extends InjectingNativeDialogFragment {
private static final String EXTRA_URI = "extra_uri"; private static final String EXTRA_URI = "extra_uri";
private static final String EXTRA_EXTENSION = "extra_extension";
@Inject TasksXmlImporter xmlImporter; @Inject TasksXmlImporter xmlImporter;
@Inject TasksJsonImporter jsonImporter; @Inject TasksJsonImporter jsonImporter;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject Tracker tracker; @Inject Tracker tracker;
@Inject @ForApplication Context context; @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(); ImportTasksDialog importTasksDialog = new ImportTasksDialog();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putParcelable(EXTRA_URI, data); args.putParcelable(EXTRA_URI, data);
args.putString(EXTRA_EXTENSION, extension);
importTasksDialog.setArguments(args); importTasksDialog.setArguments(args);
return importTasksDialog; return importTasksDialog;
} }
@ -39,35 +40,26 @@ public class ImportTasksDialog extends InjectingNativeDialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle arguments = getArguments(); Bundle arguments = getArguments();
Uri data = arguments.getParcelable(EXTRA_URI); Uri data = arguments.getParcelable(EXTRA_URI);
String extension = arguments.getString(EXTRA_EXTENSION);
ProgressDialog progressDialog = dialogBuilder.newProgressDialog(); ProgressDialog progressDialog = dialogBuilder.newProgressDialog();
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setCancelable(false); progressDialog.setCancelable(false);
progressDialog.setIndeterminate(true); progressDialog.setIndeterminate(true);
progressDialog.show(); progressDialog.show();
setCancelable(false); setCancelable(false);
try { switch (extension) {
String extension = case "json":
data.getScheme().equals(ContentResolver.SCHEME_CONTENT) jsonImporter.importTasks(getActivity(), data, progressDialog);
? MimeTypeMap.getSingleton() tracker.reportEvent(Tracking.Events.IMPORT_JSON);
.getExtensionFromMimeType(context.getContentResolver().getType(data)) break;
: MimeTypeMap.getFileExtensionFromUrl(data.getPath()); case "xml":
switch (extension) { xmlImporter.importTasks(getActivity(), data, progressDialog);
case "json": tracker.reportEvent(Tracking.Events.IMPORT_XML);
jsonImporter.importTasks(getActivity(), data, progressDialog); break;
tracker.reportEvent(Tracking.Events.IMPORT_JSON); default:
break; throw new RuntimeException("Invalid extension: " + extension);
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);
} }
return null; return progressDialog;
} }
@Override @Override

@ -24,6 +24,7 @@ import android.webkit.MimeTypeMap;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.documentfile.provider.DocumentFile; import androidx.documentfile.provider.DocumentFile;
import com.google.common.base.Strings;
import com.google.common.io.ByteStreams; import com.google.common.io.ByteStreams;
import com.google.common.io.Files; import com.google.common.io.Files;
import java.io.File; import java.io.File;
@ -144,6 +145,24 @@ public class FileHelper {
return null; 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) { public static String getMimeType(Context context, Uri uri) {
String filename = getFilename(context, uri); String filename = getFilename(context, uri);
String extension = Files.getFileExtension(filename); String extension = Files.getFileExtension(filename);

@ -443,8 +443,14 @@ public class BasicPreferences extends InjectingPreferenceActivity
} }
} else if (requestCode == REQUEST_PICKER) { } else if (requestCode == REQUEST_PICKER) {
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
newImportTasksDialog(data.getData()).show(getFragmentManager(), FRAG_TAG_IMPORT_TASKS); Uri uri = data.getData();
result.putBoolean(AppearancePreferences.EXTRA_RESTART, true); 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) { } else if (requestCode == RC_DRIVE_BACKUP) {
boolean success = resultCode == RESULT_OK; boolean success = resultCode == RESULT_OK;

@ -21,6 +21,10 @@ public class Toaster {
this.locale = locale; this.locale = locale;
} }
public void longToast(@StringRes int resId, String arg) {
longToast(context.getString(resId, arg));
}
public void longToast(@StringRes int resId, int number) { public void longToast(@StringRes int resId, int number) {
longToast(context.getString(resId, locale.formatNumber(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="third_party_licenses">Third-party licenses</string>
<string name="changelog">Changelog</string> <string name="changelog">Changelog</string>
<string name="version_string">Version %s</string> <string name="version_string">Version %s</string>
<string name="invalid_backup_file">Invalid backup file</string>
</resources> </resources>

Loading…
Cancel
Save