Extract data holder classes from SettingsImporter
This commit is contained in:
parent
81d7e45ab9
commit
5a4e576d79
6 changed files with 118 additions and 130 deletions
|
@ -0,0 +1,18 @@
|
||||||
|
package com.fsck.k9.preferences
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to list the contents of an import file/stream.
|
||||||
|
*
|
||||||
|
* @see SettingsImporter.getImportStreamContents
|
||||||
|
*/
|
||||||
|
data class ImportContents(
|
||||||
|
/**
|
||||||
|
* True, if the import file contains global settings.
|
||||||
|
*/
|
||||||
|
val globalSettings: Boolean,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of accounts found in the import file.
|
||||||
|
*/
|
||||||
|
val accounts: List<AccountDescription>,
|
||||||
|
)
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.fsck.k9.preferences
|
||||||
|
|
||||||
|
data class ImportResults(
|
||||||
|
@JvmField val globalSettings: Boolean,
|
||||||
|
@JvmField val importedAccounts: List<AccountDescriptionPair>,
|
||||||
|
@JvmField val erroneousAccounts: List<AccountDescription>,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class AccountDescriptionPair(
|
||||||
|
@JvmField val original: AccountDescription,
|
||||||
|
@JvmField val imported: AccountDescription,
|
||||||
|
@JvmField val overwritten: Boolean,
|
||||||
|
@JvmField val authorizationNeeded: Boolean,
|
||||||
|
@JvmField val incomingPasswordNeeded: Boolean,
|
||||||
|
@JvmField val outgoingPasswordNeeded: Boolean,
|
||||||
|
@JvmField val incomingServerName: String,
|
||||||
|
@JvmField val outgoingServerName: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class AccountDescription(
|
||||||
|
@JvmField val name: String,
|
||||||
|
@JvmField val uuid: String,
|
||||||
|
)
|
|
@ -0,0 +1,67 @@
|
||||||
|
package com.fsck.k9.preferences
|
||||||
|
|
||||||
|
import com.fsck.k9.mail.AuthType
|
||||||
|
|
||||||
|
internal class Imported {
|
||||||
|
@JvmField var contentVersion: Int = 0
|
||||||
|
|
||||||
|
@JvmField var globalSettings: ImportedSettings? = null
|
||||||
|
|
||||||
|
@JvmField var accounts: Map<String, ImportedAccount>? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class ImportedSettings {
|
||||||
|
@JvmField var settings = mutableMapOf<String, String>()
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class ImportedAccount {
|
||||||
|
@JvmField var uuid: String? = null
|
||||||
|
|
||||||
|
@JvmField var name: String? = null
|
||||||
|
|
||||||
|
@JvmField var incoming: ImportedServer? = null
|
||||||
|
|
||||||
|
@JvmField var outgoing: ImportedServer? = null
|
||||||
|
|
||||||
|
@JvmField var settings: ImportedSettings? = null
|
||||||
|
|
||||||
|
@JvmField var identities: List<ImportedIdentity>? = null
|
||||||
|
|
||||||
|
@JvmField var folders: List<ImportedFolder>? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class ImportedServer {
|
||||||
|
@JvmField var type: String? = null
|
||||||
|
|
||||||
|
@JvmField var host: String? = null
|
||||||
|
|
||||||
|
@JvmField var port: String? = null
|
||||||
|
|
||||||
|
@JvmField var connectionSecurity: String? = null
|
||||||
|
|
||||||
|
@JvmField var authenticationType: AuthType? = null
|
||||||
|
|
||||||
|
@JvmField var username: String? = null
|
||||||
|
|
||||||
|
@JvmField var password: String? = null
|
||||||
|
|
||||||
|
@JvmField var clientCertificateAlias: String? = null
|
||||||
|
|
||||||
|
@JvmField var extras: ImportedSettings? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class ImportedIdentity {
|
||||||
|
@JvmField var name: String? = null
|
||||||
|
|
||||||
|
@JvmField var email: String? = null
|
||||||
|
|
||||||
|
@JvmField var description: String? = null
|
||||||
|
|
||||||
|
@JvmField var settings: ImportedSettings? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class ImportedFolder {
|
||||||
|
@JvmField var name: String? = null
|
||||||
|
|
||||||
|
@JvmField var settings: ImportedSettings? = null
|
||||||
|
}
|
|
@ -40,76 +40,6 @@ import static java.util.Collections.unmodifiableMap;
|
||||||
|
|
||||||
|
|
||||||
public class SettingsImporter {
|
public class SettingsImporter {
|
||||||
|
|
||||||
/**
|
|
||||||
* Class to list the contents of an import file/stream.
|
|
||||||
*
|
|
||||||
* @see SettingsImporter#getImportStreamContents(InputStream)
|
|
||||||
*/
|
|
||||||
public static class ImportContents {
|
|
||||||
/**
|
|
||||||
* True, if the import file contains global settings.
|
|
||||||
*/
|
|
||||||
public final boolean globalSettings;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The list of accounts found in the import file. Never {@code null}.
|
|
||||||
*/
|
|
||||||
public final List<AccountDescription> accounts;
|
|
||||||
|
|
||||||
private ImportContents(boolean globalSettings, List<AccountDescription> accounts) {
|
|
||||||
this.globalSettings = globalSettings;
|
|
||||||
this.accounts = accounts;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class AccountDescription {
|
|
||||||
public final String name;
|
|
||||||
public final String uuid;
|
|
||||||
|
|
||||||
private AccountDescription(String name, String uuid) {
|
|
||||||
this.name = name;
|
|
||||||
this.uuid = uuid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class AccountDescriptionPair {
|
|
||||||
public final AccountDescription original;
|
|
||||||
public final AccountDescription imported;
|
|
||||||
public final boolean overwritten;
|
|
||||||
public final boolean authorizationNeeded;
|
|
||||||
public final boolean incomingPasswordNeeded;
|
|
||||||
public final boolean outgoingPasswordNeeded;
|
|
||||||
public final String incomingServerName;
|
|
||||||
public final String outgoingServerName;
|
|
||||||
|
|
||||||
private AccountDescriptionPair(AccountDescription original, AccountDescription imported,
|
|
||||||
boolean overwritten, boolean authorizationNeeded, boolean incomingPasswordNeeded,
|
|
||||||
boolean outgoingPasswordNeeded, String incomingServerName, String outgoingServerName) {
|
|
||||||
this.original = original;
|
|
||||||
this.imported = imported;
|
|
||||||
this.overwritten = overwritten;
|
|
||||||
this.authorizationNeeded = authorizationNeeded;
|
|
||||||
this.incomingPasswordNeeded = incomingPasswordNeeded;
|
|
||||||
this.outgoingPasswordNeeded = outgoingPasswordNeeded;
|
|
||||||
this.incomingServerName = incomingServerName;
|
|
||||||
this.outgoingServerName = outgoingServerName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ImportResults {
|
|
||||||
public final boolean globalSettings;
|
|
||||||
public final List<AccountDescriptionPair> importedAccounts;
|
|
||||||
public final List<AccountDescription> erroneousAccounts;
|
|
||||||
|
|
||||||
private ImportResults(boolean globalSettings, List<AccountDescriptionPair> importedAccounts,
|
|
||||||
List<AccountDescription> erroneousAccounts) {
|
|
||||||
this.globalSettings = globalSettings;
|
|
||||||
this.importedAccounts = importedAccounts;
|
|
||||||
this.erroneousAccounts = erroneousAccounts;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses an import {@link InputStream} and returns information on whether it contains global
|
* Parses an import {@link InputStream} and returns information on whether it contains global
|
||||||
* settings and/or account settings. For all account configurations found, the name of the
|
* settings and/or account settings. For all account configurations found, the name of the
|
||||||
|
@ -1080,52 +1010,4 @@ public class SettingsImporter {
|
||||||
return ConnectionSecurity.SSL_TLS_REQUIRED;
|
return ConnectionSecurity.SSL_TLS_REQUIRED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
static class Imported {
|
|
||||||
public int contentVersion;
|
|
||||||
public ImportedSettings globalSettings;
|
|
||||||
public Map<String, ImportedAccount> accounts;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class ImportedSettings {
|
|
||||||
public Map<String, String> settings = new HashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
static class ImportedAccount {
|
|
||||||
public String uuid;
|
|
||||||
public String name;
|
|
||||||
public ImportedServer incoming;
|
|
||||||
public ImportedServer outgoing;
|
|
||||||
public ImportedSettings settings;
|
|
||||||
public List<ImportedIdentity> identities;
|
|
||||||
public List<ImportedFolder> folders;
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
static class ImportedServer {
|
|
||||||
public String type;
|
|
||||||
public String host;
|
|
||||||
public String port;
|
|
||||||
public String connectionSecurity;
|
|
||||||
public AuthType authenticationType;
|
|
||||||
public String username;
|
|
||||||
public String password;
|
|
||||||
public String clientCertificateAlias;
|
|
||||||
public ImportedSettings extras;
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
static class ImportedIdentity {
|
|
||||||
public String name;
|
|
||||||
public String email;
|
|
||||||
public String description;
|
|
||||||
public ImportedSettings settings;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class ImportedFolder {
|
|
||||||
public String name;
|
|
||||||
public ImportedSettings settings;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,19 +12,13 @@ import assertk.assertions.isEmpty
|
||||||
import assertk.assertions.isEqualTo
|
import assertk.assertions.isEqualTo
|
||||||
import assertk.assertions.isFalse
|
import assertk.assertions.isFalse
|
||||||
import assertk.assertions.isInstanceOf
|
import assertk.assertions.isInstanceOf
|
||||||
|
import assertk.assertions.isNotNull
|
||||||
import assertk.assertions.isTrue
|
import assertk.assertions.isTrue
|
||||||
import assertk.assertions.key
|
import assertk.assertions.key
|
||||||
import assertk.assertions.prop
|
import assertk.assertions.prop
|
||||||
import com.fsck.k9.K9RobolectricTest
|
import com.fsck.k9.K9RobolectricTest
|
||||||
import com.fsck.k9.Preferences
|
import com.fsck.k9.Preferences
|
||||||
import com.fsck.k9.mail.AuthType
|
import com.fsck.k9.mail.AuthType
|
||||||
import com.fsck.k9.preferences.SettingsImporter.AccountDescription
|
|
||||||
import com.fsck.k9.preferences.SettingsImporter.AccountDescriptionPair
|
|
||||||
import com.fsck.k9.preferences.SettingsImporter.ImportContents
|
|
||||||
import com.fsck.k9.preferences.SettingsImporter.ImportResults
|
|
||||||
import com.fsck.k9.preferences.SettingsImporter.ImportedAccount
|
|
||||||
import com.fsck.k9.preferences.SettingsImporter.ImportedIdentity
|
|
||||||
import com.fsck.k9.preferences.SettingsImporter.ImportedServer
|
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
@ -130,7 +124,7 @@ class SettingsImporterTest : K9RobolectricTest() {
|
||||||
|
|
||||||
val results = SettingsImporter.parseSettings(inputStream, true, accountUuids, true)
|
val results = SettingsImporter.parseSettings(inputStream, true, accountUuids, true)
|
||||||
|
|
||||||
assertThat(results.accounts).all {
|
assertThat(results.accounts).isNotNull().all {
|
||||||
hasSize(1)
|
hasSize(1)
|
||||||
key(accountUuid).all {
|
key(accountUuid).all {
|
||||||
prop(ImportedAccount::uuid).isEqualTo(accountUuid)
|
prop(ImportedAccount::uuid).isEqualTo(accountUuid)
|
||||||
|
@ -161,11 +155,12 @@ class SettingsImporterTest : K9RobolectricTest() {
|
||||||
|
|
||||||
val results = SettingsImporter.parseSettings(inputStream, true, accountUuids, true)
|
val results = SettingsImporter.parseSettings(inputStream, true, accountUuids, true)
|
||||||
|
|
||||||
assertThat(results.accounts).all {
|
assertThat(results.accounts).isNotNull().all {
|
||||||
hasSize(1)
|
hasSize(1)
|
||||||
key(accountUuid).all {
|
key(accountUuid).all {
|
||||||
prop(ImportedAccount::uuid).isEqualTo(accountUuid)
|
prop(ImportedAccount::uuid).isEqualTo(accountUuid)
|
||||||
prop(ImportedAccount::identities).extracting(ImportedIdentity::email).containsExactly("user@gmail.com")
|
prop(ImportedAccount::identities).isNotNull()
|
||||||
|
.extracting(ImportedIdentity::email).containsExactly("user@gmail.com")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -191,8 +186,10 @@ class SettingsImporterTest : K9RobolectricTest() {
|
||||||
val results = SettingsImporter.parseSettings(inputStream, true, accountUuids, false)
|
val results = SettingsImporter.parseSettings(inputStream, true, accountUuids, false)
|
||||||
|
|
||||||
assertThat(results.accounts)
|
assertThat(results.accounts)
|
||||||
|
.isNotNull()
|
||||||
.key(accountUuid)
|
.key(accountUuid)
|
||||||
.prop(ImportedAccount::incoming)
|
.prop(ImportedAccount::incoming)
|
||||||
|
.isNotNull()
|
||||||
.prop(ImportedServer::authenticationType)
|
.prop(ImportedServer::authenticationType)
|
||||||
.isEqualTo(AuthType.CRAM_MD5)
|
.isEqualTo(AuthType.CRAM_MD5)
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,8 +12,9 @@ import androidx.lifecycle.viewModelScope
|
||||||
import app.k9mail.feature.settings.import.SettingsImportExternalContract.AccountActivator
|
import app.k9mail.feature.settings.import.SettingsImportExternalContract.AccountActivator
|
||||||
import com.fsck.k9.helper.SingleLiveEvent
|
import com.fsck.k9.helper.SingleLiveEvent
|
||||||
import com.fsck.k9.helper.measureRealtimeMillisWithResult
|
import com.fsck.k9.helper.measureRealtimeMillisWithResult
|
||||||
|
import com.fsck.k9.preferences.ImportContents
|
||||||
|
import com.fsck.k9.preferences.ImportResults
|
||||||
import com.fsck.k9.preferences.SettingsImporter
|
import com.fsck.k9.preferences.SettingsImporter
|
||||||
import com.fsck.k9.preferences.SettingsImporter.ImportResults
|
|
||||||
import com.fsck.k9.ui.base.bundle.getEnum
|
import com.fsck.k9.ui.base.bundle.getEnum
|
||||||
import com.fsck.k9.ui.base.bundle.putEnum
|
import com.fsck.k9.ui.base.bundle.putEnum
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
@ -380,7 +381,7 @@ internal class SettingsImportViewModel(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun readSettings(contentUri: Uri): SettingsImporter.ImportContents {
|
private fun readSettings(contentUri: Uri): ImportContents {
|
||||||
return context.contentResolver.openInputStream(contentUri).use { inputStream ->
|
return context.contentResolver.openInputStream(contentUri).use { inputStream ->
|
||||||
SettingsImporter.getImportStreamContents(inputStream)
|
SettingsImporter.getImportStreamContents(inputStream)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue