Loading app/src/main/java/foundation/e/apps/data/install/core/AppInstallationFacade.kt +10 −0 Original line number Diff line number Diff line Loading @@ -21,7 +21,9 @@ package foundation.e.apps.data.install.core import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.install.AppManagerWrapper import foundation.e.apps.data.installation.core.InstallationProcessor import foundation.e.apps.data.installation.model.AppInstall import foundation.e.apps.data.installation.model.InstallationResult import foundation.e.apps.domain.model.install.Status import javax.inject.Inject Loading Loading @@ -71,5 +73,13 @@ class AppInstallationFacade @Inject constructor( runInForeground: (suspend (String) -> Unit) ): Result<ResultStatus> { return installationProcessor.processInstall(fusedDownloadId, isItUpdateWork, runInForeground) .map { installationResult -> when (installationResult) { InstallationResult.OK -> ResultStatus.OK InstallationResult.TIMEOUT -> ResultStatus.TIMEOUT InstallationResult.UNKNOWN -> ResultStatus.UNKNOWN InstallationResult.RETRY -> ResultStatus.RETRY } } } } app/src/test/java/foundation/e/apps/installProcessor/AppInstallationFacadeTest.kt +3 −2 Original line number Diff line number Diff line Loading @@ -26,9 +26,10 @@ import foundation.e.apps.data.enums.Type import foundation.e.apps.data.install.AppManagerWrapper import foundation.e.apps.data.install.core.AppInstallationFacade import foundation.e.apps.data.install.core.InstallationEnqueuer import foundation.e.apps.data.install.core.InstallationProcessor import foundation.e.apps.data.install.core.InstallationRequest import foundation.e.apps.data.installation.model.AppInstall import foundation.e.apps.data.installation.model.InstallationResult import foundation.e.apps.data.installation.core.InstallationProcessor import foundation.e.apps.domain.model.install.Status import foundation.e.apps.util.MainCoroutineRule import io.mockk.coEvery Loading Loading @@ -115,7 +116,7 @@ class AppInstallationFacadeTest { fun processInstall_delegatesResult() = runTest { coEvery { installationProcessor.processInstall("123", false, any()) } returns Result.success(ResultStatus.OK) } returns Result.success(InstallationResult.OK) val result = appInstallationFacade.processInstall("123", false) { // _ignored_ Loading app/src/test/java/foundation/e/apps/installProcessor/InstallationProcessorTest.kt +1 −1 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ import foundation.e.apps.data.installation.repository.AppInstallRepository import foundation.e.apps.data.install.AppManager import foundation.e.apps.data.install.download.DownloadManagerUtils import foundation.e.apps.data.installation.model.AppInstall import foundation.e.apps.data.install.core.InstallationProcessor import foundation.e.apps.data.installation.core.InstallationProcessor import foundation.e.apps.data.install.core.helper.InstallationCompletionHandler import foundation.e.apps.domain.model.install.Status import foundation.e.apps.util.MainCoroutineRule Loading data/build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ dependencies { implementation libs.lifecycle.livedata.ktx implementation libs.room.ktx implementation libs.room.runtime implementation libs.timber ksp libs.room.compiler ksp libs.hilt.compile Loading app/src/main/java/foundation/e/apps/data/install/core/InstallationProcessor.kt→data/src/main/java/foundation/e/apps/data/installation/core/InstallationProcessor.kt +5 −23 Original line number Diff line number Diff line /* * Copyright (C) 2026 e Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. * */ package foundation.e.apps.data.install.core import foundation.e.apps.data.enums.ResultStatus package foundation.e.apps.data.installation.core import foundation.e.apps.data.installation.model.AppInstall import foundation.e.apps.data.installation.model.InstallationResult import foundation.e.apps.data.installation.port.InstallationAppManager import foundation.e.apps.data.installation.port.InstallationCompletionNotifier import foundation.e.apps.data.installation.port.InstallationDownloadStatusUpdater Loading @@ -43,7 +25,7 @@ class InstallationProcessor @Inject constructor( fusedDownloadId: String, isItUpdateWork: Boolean, runInForeground: suspend (String) -> Unit ): Result<ResultStatus> { ): Result<InstallationResult> { val appInstall = appInstallRepository.getDownloadById(fusedDownloadId) ?: return Result.failure( IllegalStateException("App can't be null here.") Loading Loading @@ -81,7 +63,7 @@ class InstallationProcessor @Inject constructor( startAppInstallationProcess(appInstall, isUpdateWork) Timber.i("doWork: RESULT SUCCESS: ${appInstall.name}") ResultStatus.OK InstallationResult.OK }.onFailure { exception -> if (exception is CancellationException) { throw exception Loading Loading
app/src/main/java/foundation/e/apps/data/install/core/AppInstallationFacade.kt +10 −0 Original line number Diff line number Diff line Loading @@ -21,7 +21,9 @@ package foundation.e.apps.data.install.core import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.install.AppManagerWrapper import foundation.e.apps.data.installation.core.InstallationProcessor import foundation.e.apps.data.installation.model.AppInstall import foundation.e.apps.data.installation.model.InstallationResult import foundation.e.apps.domain.model.install.Status import javax.inject.Inject Loading Loading @@ -71,5 +73,13 @@ class AppInstallationFacade @Inject constructor( runInForeground: (suspend (String) -> Unit) ): Result<ResultStatus> { return installationProcessor.processInstall(fusedDownloadId, isItUpdateWork, runInForeground) .map { installationResult -> when (installationResult) { InstallationResult.OK -> ResultStatus.OK InstallationResult.TIMEOUT -> ResultStatus.TIMEOUT InstallationResult.UNKNOWN -> ResultStatus.UNKNOWN InstallationResult.RETRY -> ResultStatus.RETRY } } } }
app/src/test/java/foundation/e/apps/installProcessor/AppInstallationFacadeTest.kt +3 −2 Original line number Diff line number Diff line Loading @@ -26,9 +26,10 @@ import foundation.e.apps.data.enums.Type import foundation.e.apps.data.install.AppManagerWrapper import foundation.e.apps.data.install.core.AppInstallationFacade import foundation.e.apps.data.install.core.InstallationEnqueuer import foundation.e.apps.data.install.core.InstallationProcessor import foundation.e.apps.data.install.core.InstallationRequest import foundation.e.apps.data.installation.model.AppInstall import foundation.e.apps.data.installation.model.InstallationResult import foundation.e.apps.data.installation.core.InstallationProcessor import foundation.e.apps.domain.model.install.Status import foundation.e.apps.util.MainCoroutineRule import io.mockk.coEvery Loading Loading @@ -115,7 +116,7 @@ class AppInstallationFacadeTest { fun processInstall_delegatesResult() = runTest { coEvery { installationProcessor.processInstall("123", false, any()) } returns Result.success(ResultStatus.OK) } returns Result.success(InstallationResult.OK) val result = appInstallationFacade.processInstall("123", false) { // _ignored_ Loading
app/src/test/java/foundation/e/apps/installProcessor/InstallationProcessorTest.kt +1 −1 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ import foundation.e.apps.data.installation.repository.AppInstallRepository import foundation.e.apps.data.install.AppManager import foundation.e.apps.data.install.download.DownloadManagerUtils import foundation.e.apps.data.installation.model.AppInstall import foundation.e.apps.data.install.core.InstallationProcessor import foundation.e.apps.data.installation.core.InstallationProcessor import foundation.e.apps.data.install.core.helper.InstallationCompletionHandler import foundation.e.apps.domain.model.install.Status import foundation.e.apps.util.MainCoroutineRule Loading
data/build.gradle +1 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ dependencies { implementation libs.lifecycle.livedata.ktx implementation libs.room.ktx implementation libs.room.runtime implementation libs.timber ksp libs.room.compiler ksp libs.hilt.compile Loading
app/src/main/java/foundation/e/apps/data/install/core/InstallationProcessor.kt→data/src/main/java/foundation/e/apps/data/installation/core/InstallationProcessor.kt +5 −23 Original line number Diff line number Diff line /* * Copyright (C) 2026 e Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. * */ package foundation.e.apps.data.install.core import foundation.e.apps.data.enums.ResultStatus package foundation.e.apps.data.installation.core import foundation.e.apps.data.installation.model.AppInstall import foundation.e.apps.data.installation.model.InstallationResult import foundation.e.apps.data.installation.port.InstallationAppManager import foundation.e.apps.data.installation.port.InstallationCompletionNotifier import foundation.e.apps.data.installation.port.InstallationDownloadStatusUpdater Loading @@ -43,7 +25,7 @@ class InstallationProcessor @Inject constructor( fusedDownloadId: String, isItUpdateWork: Boolean, runInForeground: suspend (String) -> Unit ): Result<ResultStatus> { ): Result<InstallationResult> { val appInstall = appInstallRepository.getDownloadById(fusedDownloadId) ?: return Result.failure( IllegalStateException("App can't be null here.") Loading Loading @@ -81,7 +63,7 @@ class InstallationProcessor @Inject constructor( startAppInstallationProcess(appInstall, isUpdateWork) Timber.i("doWork: RESULT SUCCESS: ${appInstall.name}") ResultStatus.OK InstallationResult.OK }.onFailure { exception -> if (exception is CancellationException) { throw exception Loading