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

Unverified Commit 03423313 authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé
Browse files

feat(core-preference): add avatar account settings and migration

parent 966f58ae
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import com.fsck.k9.preferences.Settings.PseudoEnumSetting;
import com.fsck.k9.preferences.Settings.SettingsDescription;
import com.fsck.k9.preferences.Settings.StringSetting;
import com.fsck.k9.preferences.Settings.V;
import com.fsck.k9.preferences.upgrader.AccountSettingsUpgraderTo104;
import com.fsck.k9.preferences.upgrader.AccountSettingsUpgraderTo53;
import com.fsck.k9.preferences.upgrader.AccountSettingsUpgraderTo54;
import com.fsck.k9.preferences.upgrader.AccountSettingsUpgraderTo74;
@@ -33,6 +34,7 @@ import net.thunderbird.core.android.account.MessageFormat;
import net.thunderbird.core.android.account.QuoteStyle;
import net.thunderbird.core.android.account.ShowPictures;
import net.thunderbird.core.android.account.SortType;
import net.thunderbird.feature.account.storage.profile.AvatarTypeDto;
import net.thunderbird.feature.mail.folder.api.SpecialFolderSelection;
import net.thunderbird.feature.notification.NotificationLight;
import static com.fsck.k9.preferences.upgrader.AccountSettingsUpgraderTo53.FOLDER_NONE;
@@ -289,6 +291,18 @@ class AccountSettingsDescriptions {
        s.put("sendClientInfo", Settings.versions(
                new V(91, new BooleanSetting(true))
        ));
        s.put("avatarType", Settings.versions(
                new V(104, new EnumSetting<>(AvatarTypeDto.class, AvatarTypeDto.MONOGRAM))
        ));
        s.put("avatarMonogram", Settings.versions(
            new V(104, new StringSetting("XX"))
        ));
        s.put("avatarImageUri", Settings.versions(
            new V(104, new StringSetting(null))
        ));
        s.put("avatarIconName", Settings.versions(
            new V(104, new StringSetting(null))
        ));
        // note that there is no setting for openPgpProvider, because this will have to be set up together
        // with the actual provider after import anyways.

@@ -301,6 +315,7 @@ class AccountSettingsDescriptions {
        u.put(80, new AccountSettingsUpgraderTo80());
        u.put(81, new AccountSettingsUpgraderTo81());
        u.put(91, new AccountSettingsUpgraderTo91());
        u.put(104, new AccountSettingsUpgraderTo104());

        UPGRADERS = Collections.unmodifiableMap(u);
    }
+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ class Settings {
     *
     * @see SettingsExporter
     */
    public static final int VERSION = 103;
    public static final int VERSION = 104;

    static Map<String, Object> validate(int version, Map<String, TreeMap<Integer, SettingsDescription<?>>> settings,
            Map<String, String> importedSettings, boolean useDefaultValues) {
+37 −0
Original line number Diff line number Diff line
package com.fsck.k9.preferences.upgrader

import com.fsck.k9.preferences.SettingsUpgrader

/**
 * Upgrades account settings by adding an avatar monogram based on the user's name or email.
 */
class AccountSettingsUpgraderTo104 : SettingsUpgrader {
    override fun upgrade(settings: MutableMap<String, Any?>) {
        val name = settings[NAME_KEY] as? String
        val email = settings[EMAIL_KEY] as? String
        settings[AVATAR_MONOGRAM_KEY] = getAvatarMonogram(name, email)
    }

    private fun getAvatarMonogram(name: String?, email: String?): String {
        return if (name != null && name.isNotEmpty()) {
            composeAvatarMonogram(name)
        } else if (email != null && email.isNotEmpty()) {
            composeAvatarMonogram(email)
        } else {
            AVATAR_MONOGRAM_DEFAULT
        }
    }

    private fun composeAvatarMonogram(name: String): String {
        return name.replace(" ", "").take(2).uppercase()
    }

    private companion object {

        const val NAME_KEY = "name"
        const val EMAIL_KEY = "email"
        const val AVATAR_MONOGRAM_KEY = "avatarMonogram"

        const val AVATAR_MONOGRAM_DEFAULT = "XX"
    }
}
+133 −0
Original line number Diff line number Diff line
package com.fsck.k9.preferences.upgrader

import assertk.assertThat
import assertk.assertions.isEqualTo
import kotlin.test.Test

class AccountSettingsUpgraderTo104Test {

    private val testSubject = AccountSettingsUpgraderTo104()

    @Test
    fun `should set avatar monogram from name when available`() {
        // Arrange
        val name = "John Doe"
        val settings = createSettings(
            name = name,
        )
        val expected = createExpectedSettings(
            name = name,
            monogram = "JO",
        )

        // Act
        testSubject.upgrade(settings)

        // Assert
        assertThat(settings).isEqualTo(expected)
    }

    @Test
    fun `should set avatar monogram from name with removed spaces when available`() {
        // Arrange
        val name = "J Doe"
        val settings = createSettings(
            name = name,
        )
        val expected = createExpectedSettings(
            name = name,
            monogram = "JD",
        )

        // Act
        testSubject.upgrade(settings)

        // Assert
        assertThat(settings).isEqualTo(expected)
    }

    @Test
    fun `should set avatar monogram from email when name is not available`() {
        // Arrange
        val email = "test@example.com"
        val settings = createSettings(
            email = email,
        )
        val expected = createExpectedSettings(
            email = email,
            monogram = "TE",
        )

        // Act
        testSubject.upgrade(settings)

        // Assert
        assertThat(settings).isEqualTo(expected)
    }

    @Test
    fun `should set avatar monogram to default when no name or email found`() {
        // Arrange
        val settings = createSettings()
        val expected = createExpectedSettings(
            monogram = AVATAR_MONOGRAM_DEFAULT,
        )

        // Act
        testSubject.upgrade(settings)

        // Assert
        assertThat(settings).isEqualTo(expected)
    }

    @Test
    fun `should set avatar monogram to default when name and email are empty`() {
        // Arrange
        val settings = createSettings(
            name = "",
            email = "",
        )
        val expected = createExpectedSettings(
            name = "",
            email = "",
            monogram = AVATAR_MONOGRAM_DEFAULT,
        )

        // Act
        testSubject.upgrade(settings)

        // Assert
        assertThat(settings).isEqualTo(expected)
    }

    private fun createSettings(
        name: String? = null,
        email: String? = null,
    ): MutableMap<String, Any?> {
        return mutableMapOf<String, Any?>().apply {
            if (name != null) this[NAME_KEY] = name
            if (email != null) this[EMAIL_KEY] = email
        }
    }

    private fun createExpectedSettings(
        name: String? = null,
        email: String? = null,
        monogram: String,
    ): Map<String, Any?> {
        return mutableMapOf<String, Any?>().apply {
            if (name != null) this[NAME_KEY] = name
            if (email != null) this[EMAIL_KEY] = email
            this[AVATAR_MONOGRAM_KEY] = monogram
        }
    }

    private companion object {

        const val NAME_KEY = "name"
        const val EMAIL_KEY = "email"
        const val AVATAR_MONOGRAM_KEY = "avatarMonogram"

        const val AVATAR_MONOGRAM_DEFAULT = "XX"
    }
}
+0 −1
Original line number Diff line number Diff line
@@ -15,7 +15,6 @@ dependencies {

    testImplementation(projects.core.logging.testing)
    testImplementation(projects.mail.testing)
    testImplementation(projects.core.logging.testing)
    testImplementation(projects.feature.telemetry.noop)
    testImplementation(libs.robolectric)
    testImplementation(libs.commons.io)
Loading