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

Commit 543e7d96 authored by Jonathan Klee's avatar Jonathan Klee
Browse files

refactor: improve Stores abstraction

parent 8f9c2102
Loading
Loading
Loading
Loading
Loading
+55 −32
Original line number Diff line number Diff line
@@ -32,12 +32,19 @@ import javax.inject.Singleton

@Singleton
class Stores @Inject constructor(
    private val playStoreRepository: PlayStoreRepository,
    private val cleanApkAppsRepository: CleanApkAppsRepository,
    private val cleanApkPwaRepository: CleanApkPwaRepository,
    private val appLoungePreference: AppLoungePreference
    playStoreRepository: PlayStoreRepository,
    cleanApkAppsRepository: CleanApkAppsRepository,
    cleanApkPwaRepository: CleanApkPwaRepository,
    appLoungePreference: AppLoungePreference
) {

    private val storeConfigs: Map<Source, StoreConfig> = buildStoreConfigs(
        playStoreRepository,
        cleanApkAppsRepository,
        cleanApkPwaRepository,
        appLoungePreference
    )

    /**
     * Retrieves a map of enabled store repositories based on user preferences.
     *
@@ -45,38 +52,54 @@ class Stores @Inject constructor(
     * the values are their corresponding [StoreRepository] instances.
     */
    fun getStores(): Map<Source, StoreRepository> {
        val showOpenSourceApps = appLoungePreference.isOpenSourceSelected()
        val showPwaApps = appLoungePreference.isPWASelected()
        val showPlayStoreApps = appLoungePreference.isPlayStoreSelected()

        return buildMap {
            if (showPlayStoreApps) {
                put(PLAY_STORE, playStoreRepository)
            }
            if (showOpenSourceApps) {
                put(OPEN_SOURCE, cleanApkAppsRepository)
            }
            if (showPwaApps) {
                put(PWA, cleanApkPwaRepository)
            }
        }
        return storeConfigs
            .filterValues { it.isEnabled() }
            .mapValues { it.value.repository }
    }

    fun getStore(source: Source): StoreRepository? = getStores()[source]

    fun enableStore(source: Source) = when (source) {
        OPEN_SOURCE -> appLoungePreference.enableOpenSource()
        PWA -> appLoungePreference.enablePwa()
        PLAY_STORE -> appLoungePreference.enablePlayStore()
        else -> error("No matching Store found for $source.")
    }
    fun enableStore(source: Source) =
        storeConfigs[source]?.enable?.invoke()
            ?: error("No matching Store found for $source.")

    fun disableStore(source: Source) = when (source) {
        OPEN_SOURCE -> appLoungePreference.disableOpenSource()
        PWA -> appLoungePreference.disablePwa()
        PLAY_STORE -> appLoungePreference.disablePlayStore()
        else -> error("No matching Store found for $source.")
    }
    fun disableStore(source: Source) =
        storeConfigs[source]?.disable?.invoke()
            ?: error("No matching Store found for $source.")

    fun isStoreEnabled(source: Source): Boolean = getStores().containsKey(source)
    fun isStoreEnabled(source: Source): Boolean =
        storeConfigs[source]?.isEnabled?.invoke() == true
}

internal data class StoreConfig(
    val repository: StoreRepository,
    val isEnabled: () -> Boolean,
    val enable: () -> Unit,
    val disable: () -> Unit,
)

internal fun buildStoreConfigs(
    playStoreRepository: PlayStoreRepository,
    cleanApkAppsRepository: CleanApkAppsRepository,
    cleanApkPwaRepository: CleanApkPwaRepository,
    appLoungePreference: AppLoungePreference
): Map<Source, StoreConfig> = mapOf(
    PLAY_STORE to StoreConfig(
        repository = playStoreRepository,
        isEnabled = { appLoungePreference.isPlayStoreSelected() },
        enable = { appLoungePreference.enablePlayStore() },
        disable = { appLoungePreference.disablePlayStore() },
    ),
    OPEN_SOURCE to StoreConfig(
        repository = cleanApkAppsRepository,
        isEnabled = { appLoungePreference.isOpenSourceSelected() },
        enable = { appLoungePreference.enableOpenSource() },
        disable = { appLoungePreference.disableOpenSource() },
    ),
    PWA to StoreConfig(
        repository = cleanApkPwaRepository,
        isEnabled = { appLoungePreference.isPWASelected() },
        enable = { appLoungePreference.enablePwa() },
        disable = { appLoungePreference.disablePwa() },
    ),
)
+76 −0
Original line number Diff line number Diff line
package foundation.e.apps.data

import com.google.common.truth.Truth.assertThat
import foundation.e.apps.data.cleanapk.repositories.CleanApkAppsRepository
import foundation.e.apps.data.cleanapk.repositories.CleanApkPwaRepository
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.playstore.PlayStoreRepository
import foundation.e.apps.data.preference.AppLoungePreference
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import org.junit.Before
import org.junit.Test

class StoreConfigTest {

    private val playStoreRepository: PlayStoreRepository = mockk(relaxed = true)
    private val cleanApkAppsRepository: CleanApkAppsRepository = mockk(relaxed = true)
    private val cleanApkPwaRepository: CleanApkPwaRepository = mockk(relaxed = true)
    private val preference: AppLoungePreference = mockk(relaxed = true)

    @Before
    fun setup() {
        every { preference.isPlayStoreSelected() } returns true
        every { preference.isOpenSourceSelected() } returns false
        every { preference.isPWASelected() } returns true
    }

    @Test
    fun buildStoreConfigsFiltersByPreference() {
        val configs = buildStoreConfigs(
            playStoreRepository,
            cleanApkAppsRepository,
            cleanApkPwaRepository,
            preference
        )

        assertThat(configs.keys).containsExactly(Source.PLAY_STORE, Source.PWA, Source.OPEN_SOURCE)

        val enabled = configs[Source.PLAY_STORE]!!.isEnabled.invoke()
        val disabled = configs[Source.OPEN_SOURCE]!!.isEnabled.invoke()

        assertThat(enabled).isTrue()
        assertThat(disabled).isFalse()
    }

    @Test
    fun storeConfigDelegatesEnableDisable() {
        val configs = buildStoreConfigs(
            playStoreRepository,
            cleanApkAppsRepository,
            cleanApkPwaRepository,
            preference
        )

        configs[Source.PWA]!!.enable.invoke()
        configs[Source.PWA]!!.disable.invoke()

        verify { preference.enablePwa() }
        verify { preference.disablePwa() }
    }

    @Test
    fun storeConfigHoldsRepositoryReference() {
        val configs = buildStoreConfigs(
            playStoreRepository,
            cleanApkAppsRepository,
            cleanApkPwaRepository,
            preference
        )

        assertThat(configs[Source.PLAY_STORE]!!.repository).isSameInstanceAs(playStoreRepository)
        assertThat(configs[Source.OPEN_SOURCE]!!.repository).isSameInstanceAs(cleanApkAppsRepository)
        assertThat(configs[Source.PWA]!!.repository).isSameInstanceAs(cleanApkPwaRepository)
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -61,4 +61,9 @@ class StoresTest {
        assertThat(enabled).isTrue()
        assertThat(disabled).isFalse()
    }

    @Test(expected = IllegalStateException::class)
    fun enableStoreThrowsForUnknownSource() {
        stores.enableStore(Source.SYSTEM_APP)
    }
}