Loading app/src/main/java/foundation/e/apps/data/install/core/InstallationEnqueuer.kt +40 −23 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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) ) } } } } app/src/test/java/foundation/e/apps/installProcessor/InstallationEnqueuerTest.kt +7 −7 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -112,7 +112,7 @@ class InstallationEnqueuerTest { storageSpaceChecker, networkStatusChecker ) preflightChecker = PreEnqueueChecker( preEnqueueChecker = PreEnqueueChecker( downloadUrlRefresher, appManagerWrapper, ageLimiter, Loading @@ -120,7 +120,7 @@ class InstallationEnqueuerTest { ) enqueuer = InstallationEnqueuer( context, preflightChecker, preEnqueueChecker, appManagerWrapper, sessionRepository, playStoreAuthStore, Loading Loading @@ -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 { Loading @@ -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) Loading Loading
app/src/main/java/foundation/e/apps/data/install/core/InstallationEnqueuer.kt +40 −23 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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) ) } } } }
app/src/test/java/foundation/e/apps/installProcessor/InstallationEnqueuerTest.kt +7 −7 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -112,7 +112,7 @@ class InstallationEnqueuerTest { storageSpaceChecker, networkStatusChecker ) preflightChecker = PreEnqueueChecker( preEnqueueChecker = PreEnqueueChecker( downloadUrlRefresher, appManagerWrapper, ageLimiter, Loading @@ -120,7 +120,7 @@ class InstallationEnqueuerTest { ) enqueuer = InstallationEnqueuer( context, preflightChecker, preEnqueueChecker, appManagerWrapper, sessionRepository, playStoreAuthStore, Loading Loading @@ -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 { Loading @@ -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) Loading