From 17ebb4c613401eaaa7f11a1307c21fc7a319216a Mon Sep 17 00:00:00 2001
From: GoneUp
Date: Sat, 18 Feb 2017 00:22:23 +0100
Subject: [PATCH] Changed settings export to use the storage access framework
---
.../java/com/fsck/k9/activity/Accounts.java | 75 +++++++++++++++----
.../fsck/k9/preferences/SettingsExporter.java | 26 ++++++-
k9mail/src/main/res/values/strings.xml | 1 +
3 files changed, 87 insertions(+), 15 deletions(-)
diff --git a/k9mail/src/main/java/com/fsck/k9/activity/Accounts.java b/k9mail/src/main/java/com/fsck/k9/activity/Accounts.java
index 74765fd86..828df90ed 100644
--- a/k9mail/src/main/java/com/fsck/k9/activity/Accounts.java
+++ b/k9mail/src/main/java/com/fsck/k9/activity/Accounts.java
@@ -146,6 +146,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener {
private static final int ACTIVITY_REQUEST_PICK_SETTINGS_FILE = 1;
+ private static final int ACTIVITY_REQUEST_SAVE_SETTINGS_FILE = 2;
class AccountsHandler extends Handler {
private void setViewTitle() {
@@ -1290,7 +1291,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener {
getString(R.string.app_revision_url) +
""))
.append("
")
- .append(String.format(getString(R.string.app_copyright_fmt), year, year))
+ .append(String.format(getString(R.string.app_copyright_fmt), Integer.toString(year), Integer.toString(year)))
.append("
")
.append(getString(R.string.app_license))
.append("
");
@@ -1418,9 +1419,12 @@ public class Accounts extends K9ListActivity implements OnItemClickListener {
return;
}
switch (requestCode) {
- case ACTIVITY_REQUEST_PICK_SETTINGS_FILE:
- onImport(data.getData());
- break;
+ case ACTIVITY_REQUEST_PICK_SETTINGS_FILE:
+ onImport(data.getData());
+ break;
+ case ACTIVITY_REQUEST_SAVE_SETTINGS_FILE:
+ onExport(data);
+ break;
}
}
@@ -1883,16 +1887,47 @@ public class Accounts extends K9ListActivity implements OnItemClickListener {
}
- public void onExport(final boolean includeGlobals, final Account account) {
+ public static final String EXTRA_INC_GLOBALS = "include_globals";
+ public static final String EXTRA_ACCOUNTS = "accountUuids";
+ public void onExport(final boolean includeGlobals, final Account account) {
// TODO, prompt to allow a user to choose which accounts to export
- Set accountUuids = null;
+ ArrayList accountUuids = null;
if (account != null) {
- accountUuids = new HashSet();
+ accountUuids = new ArrayList<>();
accountUuids.add(account.getUuid());
}
- ExportAsyncTask asyncTask = new ExportAsyncTask(this, includeGlobals, accountUuids);
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
+ Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
+
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ intent.setType("text/plain");
+ intent.putExtra(Intent.EXTRA_TITLE, SettingsExporter.EXPORT_FILENAME);
+ intent.putStringArrayListExtra(EXTRA_ACCOUNTS, accountUuids);
+ intent.putExtra(EXTRA_INC_GLOBALS, includeGlobals);
+
+ PackageManager packageManager = getPackageManager();
+ List infos = packageManager.queryIntentActivities(intent, 0);
+
+ if (infos.size() > 0) {
+ startActivityForResult(Intent.createChooser(intent, null), ACTIVITY_REQUEST_SAVE_SETTINGS_FILE);
+ } else {
+ showDialog(DIALOG_NO_FILE_MANAGER);
+ }
+ } else {
+ //Pre-Kitkat
+ ExportAsyncTask asyncTask = new ExportAsyncTask(this, includeGlobals, accountUuids, null);
+ setNonConfigurationInstance(asyncTask);
+ asyncTask.execute();
+ }
+ }
+
+ public void onExport(Intent intent) {
+ boolean includeGlobals = intent.getBooleanExtra(EXTRA_INC_GLOBALS, false);
+ ArrayList accountUuids = intent.getStringArrayListExtra(EXTRA_ACCOUNTS);
+
+ ExportAsyncTask asyncTask = new ExportAsyncTask(this, includeGlobals, accountUuids, intent.getData());
setNonConfigurationInstance(asyncTask);
asyncTask.execute();
}
@@ -1904,13 +1939,17 @@ public class Accounts extends K9ListActivity implements OnItemClickListener {
private boolean mIncludeGlobals;
private Set mAccountUuids;
private String mFileName;
+ private Uri mUri;
private ExportAsyncTask(Accounts activity, boolean includeGlobals,
- Set accountUuids) {
+ List accountUuids, Uri uri) {
super(activity);
mIncludeGlobals = includeGlobals;
- mAccountUuids = accountUuids;
+ mUri = uri;
+ if (accountUuids != null) {
+ mAccountUuids = new HashSet<>(accountUuids);
+ }
}
@Override
@@ -1923,8 +1962,13 @@ public class Accounts extends K9ListActivity implements OnItemClickListener {
@Override
protected Boolean doInBackground(Void... params) {
try {
- mFileName = SettingsExporter.exportToFile(mContext, mIncludeGlobals,
+ if (mUri == null) {
+ mFileName = SettingsExporter.exportToFile(mContext, mIncludeGlobals,
mAccountUuids);
+ } else {
+ SettingsExporter.exportToUri(mContext, mIncludeGlobals, mAccountUuids, mUri);
+ }
+
} catch (SettingsImportExportException e) {
Timber.w(e, "Exception during export");
return false;
@@ -1942,8 +1986,13 @@ public class Accounts extends K9ListActivity implements OnItemClickListener {
removeProgressDialog();
if (success) {
- activity.showSimpleDialog(R.string.settings_export_success_header,
- R.string.settings_export_success, mFileName);
+ if (mFileName != null) {
+ activity.showSimpleDialog(R.string.settings_export_success_header,
+ R.string.settings_export_success, mFileName);
+ } else {
+ activity.showSimpleDialog(R.string.settings_export_success_header,
+ R.string.settings_export_success_generic);
+ }
} else {
//TODO: better error messages
activity.showSimpleDialog(R.string.settings_export_failed_header,
diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/SettingsExporter.java b/k9mail/src/main/java/com/fsck/k9/preferences/SettingsExporter.java
index 913173cde..1d6b112d2 100644
--- a/k9mail/src/main/java/com/fsck/k9/preferences/SettingsExporter.java
+++ b/k9mail/src/main/java/com/fsck/k9/preferences/SettingsExporter.java
@@ -15,6 +15,7 @@ import java.util.Set;
import java.util.TreeMap;
import android.content.Context;
+import android.net.Uri;
import android.os.Environment;
import timber.log.Timber;
import android.util.Xml;
@@ -32,7 +33,7 @@ import org.xmlpull.v1.XmlSerializer;
public class SettingsExporter {
- private static final String EXPORT_FILENAME = "settings.k9s";
+ public static final String EXPORT_FILENAME = "settings.k9s";
/**
* File format version number.
@@ -108,7 +109,28 @@ public class SettingsExporter {
}
}
- static void exportPreferences(Context context, OutputStream os, boolean includeGlobals, Set accountUuids)
+ public static void exportToUri(Context context, boolean includeGlobals, Set accountUuids, Uri uri)
+ throws SettingsImportExportException {
+
+ OutputStream os = null;
+ String filename = null;
+ try {
+ os = context.getContentResolver().openOutputStream(uri);
+ exportPreferences(context, os, includeGlobals, accountUuids);
+ } catch (Exception e) {
+ throw new SettingsImportExportException(e);
+ } finally {
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException ioe) {
+ Log.w(K9.LOG_TAG, "Couldn't close exported settings file: " + filename);
+ }
+ }
+ }
+ }
+
+ static void exportPreferences(Context context, OutputStream os, boolean includeGlobals, Set accountUuids)
throws SettingsImportExportException {
try {
diff --git a/k9mail/src/main/res/values/strings.xml b/k9mail/src/main/res/values/strings.xml
index 052485cd6..6fac436c3 100644
--- a/k9mail/src/main/res/values/strings.xml
+++ b/k9mail/src/main/res/values/strings.xml
@@ -975,6 +975,7 @@ Please submit bug reports, contribute new features and ask questions at
Importing settings…
Scanning file…
Saved exported settings to %s
+ Settings successfully exported
Imported global settings from %s
Imported %s from %s