Loading app/core/build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ dependencies { testImplementation project(":backend:imap") testImplementation project(":mail:protocols:smtp") testImplementation project(":app:storage") testImplementation "org.jetbrains.kotlin:kotlin-reflect:${versions.kotlin}" testImplementation "org.robolectric:robolectric:${versions.robolectric}" testImplementation "junit:junit:${versions.junit}" testImplementation "com.google.truth:truth:${versions.truth}" Loading app/core/src/main/java/com/fsck/k9/AccountPreferenceSerializer.kt +3 −10 Original line number Diff line number Diff line Loading @@ -192,7 +192,7 @@ class AccountPreferenceSerializer( } @Synchronized fun save(storage: Storage, editor: StorageEditor, account: Account) { fun save(editor: StorageEditor, storage: Storage, account: Account) { val accountUuid = account.uuid if (!storage.getString("accountUuids", "").contains(account.uuid)) { Loading Loading @@ -294,13 +294,11 @@ class AccountPreferenceSerializer( } saveIdentities(account, storage, editor) editor.commit() } @Synchronized fun delete(storage: Storage, account: Account) { fun delete(editor: StorageEditor, storage: Storage, account: Account) { val accountUuid = account.uuid // Get the list of account UUIDs Loading @@ -314,8 +312,6 @@ class AccountPreferenceSerializer( } } val editor = storage.edit() // Only change the 'accountUuids' value if this account's UUID was listed before if (newUuids.size < uuids.size) { val accountUuids = Utility.combine(newUuids.toTypedArray(), ',') Loading Loading @@ -407,7 +403,6 @@ class AccountPreferenceSerializer( } deleteIdentities(account, storage, editor) // TODO: Remove preference settings that may exist for individual folders in the account. editor.commit() } @Synchronized Loading Loading @@ -450,9 +445,8 @@ class AccountPreferenceSerializer( } while (gotOne) } fun move(account: Account, storage: Storage, moveUp: Boolean) { fun move(editor: StorageEditor, account: Account, storage: Storage, moveUp: Boolean) { val uuids = storage.getString("accountUuids", "").split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() val editor = storage.edit() val newUuids = arrayOfNulls<String>(uuids.size) if (moveUp) { for (i in uuids.indices) { Loading @@ -475,7 +469,6 @@ class AccountPreferenceSerializer( } val accountUuids = Utility.combine(newUuids, ',') editor.putString("accountUuids", accountUuids) editor.commit() } private fun <T : Enum<T>> getEnumStringPref(storage: Storage, key: String, defaultEnum: T): T { Loading app/core/src/main/java/com/fsck/k9/K9.java +2 −2 Original line number Diff line number Diff line Loading @@ -383,7 +383,7 @@ public class K9 { preferences.saveAccount(account); } storage.edit() preferences.createStorageEditor() .remove("openPgpProvider") .remove("openPgpSupportSignOnly") .commit(); Loading Loading @@ -1075,7 +1075,7 @@ public class K9 { @Override protected Void doInBackground(Void... voids) { Preferences prefs = DI.get(Preferences.class); StorageEditor editor = prefs.getStorage().edit(); StorageEditor editor = prefs.createStorageEditor(); save(editor); editor.commit(); Loading app/core/src/main/java/com/fsck/k9/KoinModule.kt +2 −0 Original line number Diff line number Diff line Loading @@ -10,12 +10,14 @@ import com.fsck.k9.mail.ssl.TrustedSocketFactory import com.fsck.k9.mailstore.LocalStoreProvider import com.fsck.k9.mailstore.StorageManager import com.fsck.k9.power.TracingPowerManager import com.fsck.k9.preferences.StoragePersister import org.koin.dsl.module.applicationContext val mainModule = applicationContext { bean { Preferences.getPreferences(get()) } bean { get<Context>().resources } bean { StorageManager.getInstance(get()) } bean { StoragePersister(get()) } bean { LocalStoreProvider() } bean { TracingPowerManager.getPowerManager(get()) as PowerManager } bean { Contacts.getInstance(get()) } Loading app/core/src/main/java/com/fsck/k9/Preferences.java +34 −15 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import com.fsck.k9.mailstore.LocalStore; import com.fsck.k9.mailstore.LocalStoreProvider; import com.fsck.k9.preferences.Storage; import com.fsck.k9.preferences.StorageEditor; import com.fsck.k9.preferences.StoragePersister; import timber.log.Timber; Loading @@ -30,13 +31,15 @@ public class Preferences { private AccountPreferenceSerializer accountPreferenceSerializer; public static synchronized Preferences getPreferences(Context context) { if (preferences == null) { Context appContext = context.getApplicationContext(); CoreResourceProvider resourceProvider = DI.get(CoreResourceProvider.class); LocalKeyStoreManager localKeyStoreManager = DI.get(LocalKeyStoreManager.class); AccountPreferenceSerializer accountPreferenceSerializer = DI.get(AccountPreferenceSerializer.class); LocalStoreProvider localStoreProvider = DI.get(LocalStoreProvider.class); if (preferences == null) { preferences = new Preferences(appContext, resourceProvider, localStoreProvider, localKeyStoreManager, accountPreferenceSerializer); StoragePersister storagePersister = DI.get(StoragePersister.class); preferences = new Preferences(appContext, resourceProvider, storagePersister, localStoreProvider, localKeyStoreManager, accountPreferenceSerializer); } return preferences; } Loading @@ -49,24 +52,35 @@ public class Preferences { private final LocalStoreProvider localStoreProvider; private final CoreResourceProvider resourceProvider; private final LocalKeyStoreManager localKeyStoreManager; private final StoragePersister storagePersister; private Preferences(Context context, CoreResourceProvider resourceProvider, LocalStoreProvider localStoreProvider, LocalKeyStoreManager localKeyStoreManager, StoragePersister storagePersister, LocalStoreProvider localStoreProvider, LocalKeyStoreManager localKeyStoreManager, AccountPreferenceSerializer accountPreferenceSerializer) { storage = Storage.getStorage(context); this.storage = new Storage(); this.storagePersister = storagePersister; this.context = context; this.resourceProvider = resourceProvider; this.localStoreProvider = localStoreProvider; this.localKeyStoreManager = localKeyStoreManager; this.accountPreferenceSerializer = accountPreferenceSerializer; Map<String, String> persistedStorageValues = storagePersister.loadValues(); storage.replaceAll(persistedStorageValues); if (storage.isEmpty()) { Timber.i("Preferences storage is zero-size, importing from Android-style preferences"); StorageEditor editor = storage.edit(); StorageEditor editor = createStorageEditor(); editor.copy(context.getSharedPreferences("AndroidMail.Main", Context.MODE_PRIVATE)); editor.commit(); } } public StorageEditor createStorageEditor() { return new StorageEditor(storage, storagePersister); } @RestrictTo(Scope.TESTS) public void clearAccounts() { accounts = new HashMap<>(); Loading Loading @@ -160,7 +174,9 @@ public class Preferences { } LocalStore.removeAccount(account); DI.get(AccountPreferenceSerializer.class).delete(storage, account); StorageEditor storageEditor = createStorageEditor(); accountPreferenceSerializer.delete(storageEditor, storage, account); storageEditor.commit(); localKeyStoreManager.deleteCertificates(account); if (newAccount == account) { Loading Loading @@ -189,7 +205,7 @@ public class Preferences { } public void setDefaultAccount(Account account) { getStorage().edit().putString("defaultAccountUuid", account.getUuid()).commit(); createStorageEditor().putString("defaultAccountUuid", account.getUuid()).commit(); } public Storage getStorage() { Loading @@ -201,11 +217,12 @@ public class Preferences { } public void saveAccount(Account account) { StorageEditor editor = storage.edit(); ensureAssignedAccountNumber(account); processChangedValues(account); accountPreferenceSerializer.save(storage, editor, account); StorageEditor editor = createStorageEditor(); accountPreferenceSerializer.save(editor, storage, account); editor.commit(); } private void ensureAssignedAccountNumber(Account account) { Loading Loading @@ -265,7 +282,9 @@ public class Preferences { } public void move(Account account, boolean mUp) { accountPreferenceSerializer.move(account, storage, mUp); StorageEditor storageEditor = createStorageEditor(); accountPreferenceSerializer.move(storageEditor, account, storage, mUp); storageEditor.commit(); loadAccounts(); } } Loading
app/core/build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ dependencies { testImplementation project(":backend:imap") testImplementation project(":mail:protocols:smtp") testImplementation project(":app:storage") testImplementation "org.jetbrains.kotlin:kotlin-reflect:${versions.kotlin}" testImplementation "org.robolectric:robolectric:${versions.robolectric}" testImplementation "junit:junit:${versions.junit}" testImplementation "com.google.truth:truth:${versions.truth}" Loading
app/core/src/main/java/com/fsck/k9/AccountPreferenceSerializer.kt +3 −10 Original line number Diff line number Diff line Loading @@ -192,7 +192,7 @@ class AccountPreferenceSerializer( } @Synchronized fun save(storage: Storage, editor: StorageEditor, account: Account) { fun save(editor: StorageEditor, storage: Storage, account: Account) { val accountUuid = account.uuid if (!storage.getString("accountUuids", "").contains(account.uuid)) { Loading Loading @@ -294,13 +294,11 @@ class AccountPreferenceSerializer( } saveIdentities(account, storage, editor) editor.commit() } @Synchronized fun delete(storage: Storage, account: Account) { fun delete(editor: StorageEditor, storage: Storage, account: Account) { val accountUuid = account.uuid // Get the list of account UUIDs Loading @@ -314,8 +312,6 @@ class AccountPreferenceSerializer( } } val editor = storage.edit() // Only change the 'accountUuids' value if this account's UUID was listed before if (newUuids.size < uuids.size) { val accountUuids = Utility.combine(newUuids.toTypedArray(), ',') Loading Loading @@ -407,7 +403,6 @@ class AccountPreferenceSerializer( } deleteIdentities(account, storage, editor) // TODO: Remove preference settings that may exist for individual folders in the account. editor.commit() } @Synchronized Loading Loading @@ -450,9 +445,8 @@ class AccountPreferenceSerializer( } while (gotOne) } fun move(account: Account, storage: Storage, moveUp: Boolean) { fun move(editor: StorageEditor, account: Account, storage: Storage, moveUp: Boolean) { val uuids = storage.getString("accountUuids", "").split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() val editor = storage.edit() val newUuids = arrayOfNulls<String>(uuids.size) if (moveUp) { for (i in uuids.indices) { Loading @@ -475,7 +469,6 @@ class AccountPreferenceSerializer( } val accountUuids = Utility.combine(newUuids, ',') editor.putString("accountUuids", accountUuids) editor.commit() } private fun <T : Enum<T>> getEnumStringPref(storage: Storage, key: String, defaultEnum: T): T { Loading
app/core/src/main/java/com/fsck/k9/K9.java +2 −2 Original line number Diff line number Diff line Loading @@ -383,7 +383,7 @@ public class K9 { preferences.saveAccount(account); } storage.edit() preferences.createStorageEditor() .remove("openPgpProvider") .remove("openPgpSupportSignOnly") .commit(); Loading Loading @@ -1075,7 +1075,7 @@ public class K9 { @Override protected Void doInBackground(Void... voids) { Preferences prefs = DI.get(Preferences.class); StorageEditor editor = prefs.getStorage().edit(); StorageEditor editor = prefs.createStorageEditor(); save(editor); editor.commit(); Loading
app/core/src/main/java/com/fsck/k9/KoinModule.kt +2 −0 Original line number Diff line number Diff line Loading @@ -10,12 +10,14 @@ import com.fsck.k9.mail.ssl.TrustedSocketFactory import com.fsck.k9.mailstore.LocalStoreProvider import com.fsck.k9.mailstore.StorageManager import com.fsck.k9.power.TracingPowerManager import com.fsck.k9.preferences.StoragePersister import org.koin.dsl.module.applicationContext val mainModule = applicationContext { bean { Preferences.getPreferences(get()) } bean { get<Context>().resources } bean { StorageManager.getInstance(get()) } bean { StoragePersister(get()) } bean { LocalStoreProvider() } bean { TracingPowerManager.getPowerManager(get()) as PowerManager } bean { Contacts.getInstance(get()) } Loading
app/core/src/main/java/com/fsck/k9/Preferences.java +34 −15 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import com.fsck.k9.mailstore.LocalStore; import com.fsck.k9.mailstore.LocalStoreProvider; import com.fsck.k9.preferences.Storage; import com.fsck.k9.preferences.StorageEditor; import com.fsck.k9.preferences.StoragePersister; import timber.log.Timber; Loading @@ -30,13 +31,15 @@ public class Preferences { private AccountPreferenceSerializer accountPreferenceSerializer; public static synchronized Preferences getPreferences(Context context) { if (preferences == null) { Context appContext = context.getApplicationContext(); CoreResourceProvider resourceProvider = DI.get(CoreResourceProvider.class); LocalKeyStoreManager localKeyStoreManager = DI.get(LocalKeyStoreManager.class); AccountPreferenceSerializer accountPreferenceSerializer = DI.get(AccountPreferenceSerializer.class); LocalStoreProvider localStoreProvider = DI.get(LocalStoreProvider.class); if (preferences == null) { preferences = new Preferences(appContext, resourceProvider, localStoreProvider, localKeyStoreManager, accountPreferenceSerializer); StoragePersister storagePersister = DI.get(StoragePersister.class); preferences = new Preferences(appContext, resourceProvider, storagePersister, localStoreProvider, localKeyStoreManager, accountPreferenceSerializer); } return preferences; } Loading @@ -49,24 +52,35 @@ public class Preferences { private final LocalStoreProvider localStoreProvider; private final CoreResourceProvider resourceProvider; private final LocalKeyStoreManager localKeyStoreManager; private final StoragePersister storagePersister; private Preferences(Context context, CoreResourceProvider resourceProvider, LocalStoreProvider localStoreProvider, LocalKeyStoreManager localKeyStoreManager, StoragePersister storagePersister, LocalStoreProvider localStoreProvider, LocalKeyStoreManager localKeyStoreManager, AccountPreferenceSerializer accountPreferenceSerializer) { storage = Storage.getStorage(context); this.storage = new Storage(); this.storagePersister = storagePersister; this.context = context; this.resourceProvider = resourceProvider; this.localStoreProvider = localStoreProvider; this.localKeyStoreManager = localKeyStoreManager; this.accountPreferenceSerializer = accountPreferenceSerializer; Map<String, String> persistedStorageValues = storagePersister.loadValues(); storage.replaceAll(persistedStorageValues); if (storage.isEmpty()) { Timber.i("Preferences storage is zero-size, importing from Android-style preferences"); StorageEditor editor = storage.edit(); StorageEditor editor = createStorageEditor(); editor.copy(context.getSharedPreferences("AndroidMail.Main", Context.MODE_PRIVATE)); editor.commit(); } } public StorageEditor createStorageEditor() { return new StorageEditor(storage, storagePersister); } @RestrictTo(Scope.TESTS) public void clearAccounts() { accounts = new HashMap<>(); Loading Loading @@ -160,7 +174,9 @@ public class Preferences { } LocalStore.removeAccount(account); DI.get(AccountPreferenceSerializer.class).delete(storage, account); StorageEditor storageEditor = createStorageEditor(); accountPreferenceSerializer.delete(storageEditor, storage, account); storageEditor.commit(); localKeyStoreManager.deleteCertificates(account); if (newAccount == account) { Loading Loading @@ -189,7 +205,7 @@ public class Preferences { } public void setDefaultAccount(Account account) { getStorage().edit().putString("defaultAccountUuid", account.getUuid()).commit(); createStorageEditor().putString("defaultAccountUuid", account.getUuid()).commit(); } public Storage getStorage() { Loading @@ -201,11 +217,12 @@ public class Preferences { } public void saveAccount(Account account) { StorageEditor editor = storage.edit(); ensureAssignedAccountNumber(account); processChangedValues(account); accountPreferenceSerializer.save(storage, editor, account); StorageEditor editor = createStorageEditor(); accountPreferenceSerializer.save(editor, storage, account); editor.commit(); } private void ensureAssignedAccountNumber(Account account) { Loading Loading @@ -265,7 +282,9 @@ public class Preferences { } public void move(Account account, boolean mUp) { accountPreferenceSerializer.move(account, storage, mUp); StorageEditor storageEditor = createStorageEditor(); accountPreferenceSerializer.move(storageEditor, account, storage, mUp); storageEditor.commit(); loadAccounts(); } }