Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 4160a1b4 authored by Vincent Breitmoser's avatar Vincent Breitmoser Committed by GitHub
Browse files

Merge pull request #3775 from k9mail/extract-storage-persister

extract persistence logic from Storage into StoragePersister
parents d1c47012 216d51a0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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}"
+3 −10
Original line number Diff line number Diff line
@@ -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)) {
@@ -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
@@ -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(), ',')
@@ -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
@@ -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) {
@@ -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 {
+2 −2
Original line number Diff line number Diff line
@@ -383,7 +383,7 @@ public class K9 {
            preferences.saveAccount(account);
        }

        storage.edit()
        preferences.createStorageEditor()
                .remove("openPgpProvider")
                .remove("openPgpSupportSignOnly")
                .commit();
@@ -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();

+2 −0
Original line number Diff line number Diff line
@@ -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()) }
+34 −15
Original line number Diff line number Diff line
@@ -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;


@@ -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;
    }
@@ -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<>();
@@ -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) {
@@ -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() {
@@ -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) {
@@ -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