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