Return detailed information on imported accounts
This commit is contained in:
parent
71f423d029
commit
7e24377bb8
2 changed files with 82 additions and 20 deletions
|
@ -73,6 +73,7 @@ import com.fsck.k9.preferences.StorageImportExportException;
|
|||
import com.fsck.k9.preferences.StorageImporter;
|
||||
import com.fsck.k9.preferences.StorageImporter.AccountDescription;
|
||||
import com.fsck.k9.preferences.StorageImporter.ImportContents;
|
||||
import com.fsck.k9.preferences.StorageImporter.ImportResults;
|
||||
|
||||
|
||||
public class Accounts extends K9ListActivity implements OnItemClickListener, OnClickListener {
|
||||
|
@ -1166,6 +1167,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
|
|||
private boolean mOverwrite;
|
||||
private String mEncryptionKey;
|
||||
private InputStream mInputStream;
|
||||
private ImportResults mImportResults;
|
||||
|
||||
private ImportAsyncTask(boolean includeGlobals, List<String> accountUuids,
|
||||
boolean overwrite, String encryptionKey, InputStream is) {
|
||||
|
@ -1187,8 +1189,8 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
|
|||
@Override
|
||||
protected Boolean doInBackground(Void... params) {
|
||||
try {
|
||||
StorageImporter.importSettings(Accounts.this, mInputStream, mEncryptionKey,
|
||||
mIncludeGlobals, mAccountUuids, mOverwrite);
|
||||
mImportResults = StorageImporter.importSettings(Accounts.this, mInputStream,
|
||||
mEncryptionKey, mIncludeGlobals, mAccountUuids, mOverwrite);
|
||||
} catch (StorageImportExportException e) {
|
||||
Log.w(K9.LOG_TAG, "Exception during export", e);
|
||||
return false;
|
||||
|
@ -1199,9 +1201,13 @@ public class Accounts extends K9ListActivity implements OnItemClickListener, OnC
|
|||
@Override
|
||||
protected void onPostExecute(Boolean success) {
|
||||
if (success) {
|
||||
int imported = mImportResults.importedAccounts.size();
|
||||
|
||||
//TODO: display names of imported accounts (name from file *and* possibly new name)
|
||||
|
||||
showDialog(Accounts.this, R.string.settings_import_success_header,
|
||||
//FIXME: use correct number of imported accounts
|
||||
Accounts.this.getString(R.string.settings_import_success, 3, "unknown"));
|
||||
//FIXME: use correct file name
|
||||
Accounts.this.getString(R.string.settings_import_success, imported, "filename"));
|
||||
refresh();
|
||||
} else {
|
||||
//TODO: make the importer return an error code; translate that error code to a localized string here
|
||||
|
|
|
@ -70,6 +70,30 @@ public class StorageImporter {
|
|||
}
|
||||
}
|
||||
|
||||
public static class AccountDescriptionPair {
|
||||
public final AccountDescription original;
|
||||
public final AccountDescription imported;
|
||||
|
||||
private AccountDescriptionPair(AccountDescription original, AccountDescription imported) {
|
||||
this.original = original;
|
||||
this.imported = imported;
|
||||
}
|
||||
}
|
||||
|
||||
public static class ImportResults {
|
||||
public final boolean globalSettings;
|
||||
public final List<AccountDescriptionPair> importedAccounts;
|
||||
public final List<AccountDescription> errorneousAccounts;
|
||||
|
||||
private ImportResults(boolean globalSettings,
|
||||
List<AccountDescriptionPair> importedAccounts,
|
||||
List<AccountDescription> errorneousAccounts) {
|
||||
this.globalSettings = globalSettings;
|
||||
this.importedAccounts = importedAccounts;
|
||||
this.errorneousAccounts = errorneousAccounts;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isImportStreamEncrypted(Context context, InputStream inputStream) {
|
||||
return false;
|
||||
}
|
||||
|
@ -127,23 +151,34 @@ public class StorageImporter {
|
|||
* @param overwrite
|
||||
* @throws StorageImportExportException
|
||||
*/
|
||||
public static void importSettings(Context context, InputStream inputStream, String encryptionKey,
|
||||
public static ImportResults importSettings(Context context, InputStream inputStream, String encryptionKey,
|
||||
boolean globalSettings, List<String> accountUuids, boolean overwrite)
|
||||
throws StorageImportExportException {
|
||||
|
||||
try
|
||||
{
|
||||
boolean globalSettingsImported = false;
|
||||
List<AccountDescriptionPair> importedAccounts = new ArrayList<AccountDescriptionPair>();
|
||||
List<AccountDescription> errorneousAccounts = new ArrayList<AccountDescription>();
|
||||
|
||||
Imported imported = parseSettings(inputStream, globalSettings, accountUuids, overwrite, false);
|
||||
|
||||
Preferences preferences = Preferences.getPreferences(context);
|
||||
SharedPreferences storage = preferences.getPreferences();
|
||||
SharedPreferences.Editor editor = storage.edit();
|
||||
|
||||
if (globalSettings) {
|
||||
if (imported.globalSettings != null) {
|
||||
importGlobalSettings(editor, imported.globalSettings);
|
||||
} else {
|
||||
Log.w(K9.LOG_TAG, "Was asked to import global settings but none found.");
|
||||
try {
|
||||
SharedPreferences.Editor editor = storage.edit();
|
||||
if (imported.globalSettings != null) {
|
||||
importGlobalSettings(editor, imported.globalSettings);
|
||||
} else {
|
||||
Log.w(K9.LOG_TAG, "Was asked to import global settings but none found.");
|
||||
}
|
||||
if (editor.commit()) {
|
||||
globalSettingsImported = true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(K9.LOG_TAG, "Exception while importing global settings", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -152,9 +187,24 @@ public class StorageImporter {
|
|||
List<String> newUuids = new ArrayList<String>();
|
||||
for (String accountUuid : accountUuids) {
|
||||
if (imported.accounts.containsKey(accountUuid)) {
|
||||
String newUuid = importAccount(context, editor, imported.accounts.get(accountUuid), overwrite);
|
||||
if (newUuid != null) {
|
||||
newUuids.add(newUuid);
|
||||
ImportedAccount account = imported.accounts.get(accountUuid);
|
||||
try {
|
||||
SharedPreferences.Editor editor = storage.edit();
|
||||
|
||||
AccountDescriptionPair importResult = importAccount(context,
|
||||
editor, account, overwrite);
|
||||
|
||||
String newUuid = importResult.imported.uuid;
|
||||
if (!newUuid.equals(importResult.original.uuid)) {
|
||||
newUuids.add(newUuid);
|
||||
}
|
||||
if (editor.commit()) {
|
||||
importedAccounts.add(importResult);
|
||||
} else {
|
||||
errorneousAccounts.add(importResult.original);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorneousAccounts.add(new AccountDescription(account.name, account.uuid));
|
||||
}
|
||||
} else {
|
||||
Log.w(K9.LOG_TAG, "Was asked to import account with UUID " +
|
||||
|
@ -162,6 +212,8 @@ public class StorageImporter {
|
|||
}
|
||||
}
|
||||
|
||||
SharedPreferences.Editor editor = storage.edit();
|
||||
|
||||
if (newUuids.size() > 0) {
|
||||
String oldAccountUuids = storage.getString("accountUuids", "");
|
||||
String appendUuids = Utility.combine(newUuids.toArray(new String[0]), ',');
|
||||
|
@ -177,20 +229,21 @@ public class StorageImporter {
|
|||
editor.putString("defaultAccountUuid", accountUuids.get(0));
|
||||
}
|
||||
|
||||
if (!editor.commit()) {
|
||||
throw new StorageImportExportException("Failed to set default account");
|
||||
}
|
||||
} else {
|
||||
Log.w(K9.LOG_TAG, "Was asked to import at least one account but none found.");
|
||||
}
|
||||
}
|
||||
|
||||
if (!editor.commit()) {
|
||||
throw new StorageImportExportException("Couldn't save imported settings");
|
||||
}
|
||||
|
||||
preferences.loadAccounts();
|
||||
DateFormatter.clearChosenFormat();
|
||||
K9.loadPrefs(preferences);
|
||||
K9.setServicesEnabled(context);
|
||||
|
||||
return new ImportResults(globalSettingsImported, importedAccounts, errorneousAccounts);
|
||||
|
||||
} catch (StorageImportExportException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
|
@ -211,8 +264,10 @@ public class StorageImporter {
|
|||
}
|
||||
}
|
||||
|
||||
private static String importAccount(Context context, SharedPreferences.Editor editor,
|
||||
ImportedAccount account, boolean overwrite) {
|
||||
private static AccountDescriptionPair importAccount(Context context,
|
||||
SharedPreferences.Editor editor, ImportedAccount account, boolean overwrite) {
|
||||
|
||||
AccountDescription original = new AccountDescription(account.name, account.uuid);
|
||||
|
||||
// Validate input and ignore malformed values when possible
|
||||
Map<String, String> validatedSettings =
|
||||
|
@ -280,7 +335,8 @@ public class StorageImporter {
|
|||
|
||||
//TODO: sync folder settings with localstore?
|
||||
|
||||
return (overwrite && existingAccount != null) ? null : uuid;
|
||||
AccountDescription imported = new AccountDescription(accountName, uuid);
|
||||
return new AccountDescriptionPair(original, imported);
|
||||
}
|
||||
|
||||
private static void importIdentities(SharedPreferences.Editor editor, String uuid,
|
||||
|
|
Loading…
Reference in a new issue