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

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

refactor: remove shared update state from AppInstallProcessor

Pass the update-work flag through the install flow explicitly so the async worker path no longer depends on mutable processor state between callbacks.
parent 2c1e4d90
Loading
Loading
Loading
Loading
+20 −22
Original line number Diff line number Diff line
@@ -73,8 +73,6 @@ class AppInstallProcessor @Inject constructor(
    @Inject
    lateinit var appManager: AppManager

    private var isItUpdateWork = false

    companion object {
        private const val TAG = "AppInstallProcessor"
    }
@@ -299,7 +297,7 @@ class AppInstallProcessor @Inject constructor(
            appInstall?.let {
                checkDownloadingState(appInstall)

                this.isItUpdateWork =
                val isUpdateWork =
                    isItUpdateWork && appInstallComponents.appManagerWrapper.isFusedDownloadInstalled(
                        appInstall
                    )
@@ -325,7 +323,7 @@ class AppInstallProcessor @Inject constructor(

                runInForeground.invoke(it.name)

                startAppInstallationProcess(it)
                startAppInstallationProcess(it, isUpdateWork)
            }
        } catch (e: Exception) {
            Timber.e(
@@ -355,15 +353,13 @@ class AppInstallProcessor @Inject constructor(
            appInstall
        ) || appInstall.status == Status.INSTALLING)

    private suspend fun checkUpdateWork(
        appInstall: AppInstall?
    ) {
        appUpdateCompletionHandler.onInstallFinished(appInstall, isItUpdateWork)
    private suspend fun checkUpdateWork(appInstall: AppInstall?, isUpdateWork: Boolean) {
        appUpdateCompletionHandler.onInstallFinished(appInstall, isUpdateWork)
    }

    private suspend fun startAppInstallationProcess(appInstall: AppInstall) {
    private suspend fun startAppInstallationProcess(appInstall: AppInstall, isUpdateWork: Boolean) {
        if (appInstall.isAwaiting()) {
            appInstallComponents.appManagerWrapper.downloadApp(appInstall, isItUpdateWork)
            appInstallComponents.appManagerWrapper.downloadApp(appInstall, isUpdateWork)
            Timber.i("===> doWork: Download started ${appInstall.name} ${appInstall.status}")
        }

@@ -373,7 +369,7 @@ class AppInstallProcessor @Inject constructor(
                isInstallRunning(it)
            }
            .collect { latestFusedDownload ->
                handleFusedDownload(latestFusedDownload, appInstall)
                handleFusedDownload(latestFusedDownload, appInstall, isUpdateWork)
            }
    }

@@ -386,35 +382,37 @@ class AppInstallProcessor @Inject constructor(
     */
    private suspend fun handleFusedDownload(
        latestAppInstall: AppInstall?,
        appInstall: AppInstall
        appInstall: AppInstall,
        isUpdateWork: Boolean
    ) {
        if (latestAppInstall == null) {
            Timber.d("===> download null: finish installation")
            finishInstallation(appInstall)
            finishInstallation(appInstall, isUpdateWork)
            return
        }

        handleFusedDownloadStatusCheckingException(latestAppInstall)
        handleFusedDownloadStatusCheckingException(latestAppInstall, isUpdateWork)
    }

    private fun isInstallRunning(it: AppInstall?) =
        it != null && it.status != Status.INSTALLATION_ISSUE

    private suspend fun handleFusedDownloadStatusCheckingException(
        download: AppInstall
        download: AppInstall,
        isUpdateWork: Boolean
    ) {
        try {
            handleFusedDownloadStatus(download)
            handleFusedDownloadStatus(download, isUpdateWork)
        } catch (e: Exception) {
            val message =
                "Handling install status is failed for ${download.packageName} exception: ${e.localizedMessage}"
            Timber.e(e, message)
            appInstallComponents.appManagerWrapper.installationIssue(download)
            finishInstallation(download)
            finishInstallation(download, isUpdateWork)
        }
    }

    private suspend fun handleFusedDownloadStatus(appInstall: AppInstall) {
    private suspend fun handleFusedDownloadStatus(appInstall: AppInstall, isUpdateWork: Boolean) {
        when (appInstall.status) {
            Status.AWAITING, Status.DOWNLOADING -> {
            }
@@ -432,7 +430,7 @@ class AppInstallProcessor @Inject constructor(

            Status.INSTALLED, Status.INSTALLATION_ISSUE -> {
                Timber.i("===> doWork: Installed/Failed: ${appInstall.name} ${appInstall.status}")
                finishInstallation(appInstall)
                finishInstallation(appInstall, isUpdateWork)
            }

            else -> {
@@ -440,12 +438,12 @@ class AppInstallProcessor @Inject constructor(
                    TAG,
                    "===> ${appInstall.name} is in wrong state ${appInstall.status}"
                )
                finishInstallation(appInstall)
                finishInstallation(appInstall, isUpdateWork)
            }
        }
    }

    private suspend fun finishInstallation(appInstall: AppInstall) {
        checkUpdateWork(appInstall)
    private suspend fun finishInstallation(appInstall: AppInstall, isUpdateWork: Boolean) {
        checkUpdateWork(appInstall, isUpdateWork)
    }
}