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

Verified Commit 3b342b55 authored by Fahim M. Choudhury's avatar Fahim M. Choudhury
Browse files

refactor: improve InstallationEnqueuer class's readability

parent 92d0fc61
Loading
Loading
Loading
Loading
+40 −23
Original line number Diff line number Diff line
@@ -48,23 +48,27 @@ class InstallationEnqueuer @Inject constructor(
        isSystemApp: Boolean = false
    ): Boolean {
        return runCatching {
            dispatchAnonymousPaidAppWarning(appInstall, isSystemApp)
            when {
                isEnqueueingPaidAppInAnonymousMode(appInstall, isSystemApp) -> {
                    dispatchAnonymousPaidAppWarning()
                    false
                }

            val canEnqueue = canEnqueue(appInstall, isAnUpdate)
            if (canEnqueue) {
                canEnqueue(appInstall, isAnUpdate) -> {
                    appManagerWrapper.updateAwaiting(appInstall)

                // Use only for update work for now. For installation work, see InstallOrchestrator#observeDownloads()
                    // Enqueueing installation work is managed by InstallOrchestrator#observeDownloads().
                    // This method only handles update work.
                    if (isAnUpdate) {
                    val uniqueWorkName = InstallWorkManager.getUniqueWorkName(appInstall.packageName)
                    InstallWorkManager.enqueueWork(context, appInstall, true)
                    Timber.d("UPDATE: Successfully enqueued unique work: $uniqueWorkName")
                        enqueueUpdate(appInstall)
                    }
            } else {
                Timber.w("Can't enqueue ${appInstall.name}/${appInstall.packageName} for installation.")
                    true
                }

            canEnqueue
                else -> {
                    Timber.w("Can't enqueue ${appInstall.name}/${appInstall.packageName} for installation/update.")
                    false
                }
            }
        }.getOrElse { throwable ->
            when (throwable) {
                is CancellationException -> throw throwable
@@ -82,19 +86,32 @@ class InstallationEnqueuer @Inject constructor(
        }
    }

    private suspend fun isEnqueueingPaidAppInAnonymousMode(
        appInstall: AppInstall,
        isSystemApp: Boolean
    ): Boolean {
        val user = sessionRepository.awaitUser()
        if (!isSystemApp && (user == User.GOOGLE || user == User.ANONYMOUS)) {
            val authData = playStoreAuthStore.awaitAuthData()
            return !appInstall.isFree && authData?.isAnonymous == true
        } else {
            return false
        }
    }

    private fun enqueueUpdate(appInstall: AppInstall) {
        val uniqueWorkName = InstallWorkManager.getUniqueWorkName(appInstall.packageName)
        InstallWorkManager.enqueueWork(context, appInstall, true)
        Timber.d("UPDATE: Successfully enqueued unique work: $uniqueWorkName")
    }

    suspend fun canEnqueue(appInstall: AppInstall, isAnUpdate: Boolean = false): Boolean {
        return preEnqueueChecker.canEnqueue(appInstall, isAnUpdate)
    }

    private suspend fun dispatchAnonymousPaidAppWarning(appInstall: AppInstall, isSystemApp: Boolean) {
        val user = sessionRepository.awaitUser()
        if (!isSystemApp && (user == User.GOOGLE || user == User.ANONYMOUS)) {
            val authData = playStoreAuthStore.awaitAuthData()
            if (!appInstall.isFree && authData?.isAnonymous == true) {
    private suspend fun dispatchAnonymousPaidAppWarning() {
        appEventDispatcher.dispatch(
            AppEvent.ErrorMessageEvent(R.string.paid_app_anonymous_message)
        )
    }
}
    }
}
+7 −7
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ class InstallationEnqueuerTest {
    private lateinit var appManager: AppManager
    private lateinit var devicePreconditions: DevicePreconditions
    private lateinit var downloadUrlRefresher: DownloadUrlRefresher
    private lateinit var preflightChecker: PreEnqueueChecker
    private lateinit var preEnqueueChecker: PreEnqueueChecker
    private lateinit var enqueuer: InstallationEnqueuer

    @Before
@@ -112,7 +112,7 @@ class InstallationEnqueuerTest {
            storageSpaceChecker,
            networkStatusChecker
        )
        preflightChecker = PreEnqueueChecker(
        preEnqueueChecker = PreEnqueueChecker(
            downloadUrlRefresher,
            appManagerWrapper,
            ageLimiter,
@@ -120,7 +120,7 @@ class InstallationEnqueuerTest {
        )
        enqueuer = InstallationEnqueuer(
            context,
            preflightChecker,
            preEnqueueChecker,
            appManagerWrapper,
            sessionRepository,
            playStoreAuthStore,
@@ -186,8 +186,8 @@ class InstallationEnqueuerTest {
    }

    @Test
    fun enqueue_warnsAnonymousPaidUsersWithoutAborting() = runTest {
        val appInstall = createPwaInstall(isFree = false)
    fun enqueue_warnsAnonymousPaidUsersAndAborts() = runTest {
        val appInstall = createNativeInstall(isFree = false)

        mockkObject(InstallWorkManager)
        try {
@@ -203,11 +203,11 @@ class InstallationEnqueuerTest {

            val result = enqueuer.enqueue(appInstall)

            assertTrue(result)
            assertFalse(result)
            assertTrue(appEventDispatcher.events.any {
                it is AppEvent.ErrorMessageEvent && it.data == R.string.paid_app_anonymous_message
            })
            coVerify { appManagerWrapper.updateAwaiting(appInstall) }
            coVerify(exactly = 0) { appManagerWrapper.updateAwaiting(appInstall) }
            verify(exactly = 0) { InstallWorkManager.enqueueWork(any(), any(), any()) }
        } finally {
            unmockkObject(InstallWorkManager)