Skip to content

Commit ae1eb56

Browse files
committed
chore: use injected DispatcherProviderthroughout app for easier testability
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 94a0b19 commit ae1eb56

27 files changed

Lines changed: 109 additions & 64 deletions

File tree

apps/flipcash/features/backupkey/src/main/kotlin/com/flipcash/app/backupkey/internal/BackupKeyScreenViewModel.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.flipcash.app.backupkey.internal
22

33
import com.flipcash.app.accesskey.BaseAccessKeyViewModel
44
import com.flipcash.app.core.storage.MediaSaver
5+
import com.flipcash.libs.coroutines.DispatcherProvider
56
import com.flipcash.services.user.UserManager
67
import com.getcode.libs.qr.QRCodeGenerator
78
import com.getcode.opencode.managers.MnemonicManager
@@ -20,12 +21,14 @@ internal class BackupKeyScreenViewModel @Inject constructor(
2021
mediaSaver: MediaSaver,
2122
userManager: UserManager,
2223
qrCodeGenerator: QRCodeGenerator,
24+
dispatchers: DispatcherProvider,
2325
) : BaseAccessKeyViewModel(
2426
resources,
2527
mnemonicManager,
2628
mediaSaver,
2729
userManager,
28-
qrCodeGenerator
30+
qrCodeGenerator,
31+
dispatchers,
2932
) {
3033
suspend fun saveImage(): Result<Unit> = saveBitmapToFile().map {
3134
delay(150)

apps/flipcash/features/login/src/main/kotlin/com/flipcash/app/login/internal/LoginAccessKeyViewModel.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.flipcash.app.login.internal
33
import com.flipcash.app.accesskey.BaseAccessKeyViewModel
44
import com.flipcash.app.analytics.Button
55
import com.flipcash.app.analytics.FlipcashAnalyticsService
6+
import com.flipcash.libs.coroutines.DispatcherProvider
67
import com.flipcash.app.auth.AuthManager
78
import com.flipcash.app.core.storage.MediaSaver
89
import com.flipcash.app.featureflags.FeatureFlag
@@ -25,11 +26,12 @@ internal class LoginAccessKeyViewModel @Inject constructor(
2526
qrCodeGenerator: QRCodeGenerator,
2627
mediaSaver: MediaSaver,
2728
userManager: UserManager,
29+
dispatchers: DispatcherProvider,
2830
private val userFlags: UserFlagsCoordinator,
2931
private val featureFlags: FeatureFlagController,
3032
private val authManager: AuthManager,
3133
private val analytics: FlipcashAnalyticsService,
32-
): BaseAccessKeyViewModel(resources, mnemonicManager, mediaSaver, userManager, qrCodeGenerator) {
34+
): BaseAccessKeyViewModel(resources, mnemonicManager, mediaSaver, userManager, qrCodeGenerator, dispatchers) {
3335

3436
suspend fun onWroteDownInstead(): Result<Boolean> {
3537
trackButton(Button.WroteAccessKey)

apps/flipcash/features/login/src/main/kotlin/com/flipcash/app/login/internal/SeedInputViewModel.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,10 @@ import com.getcode.crypt.MnemonicPhrase
1111
import com.getcode.manager.BottomBarAction
1212
import com.getcode.manager.BottomBarManager
1313
import com.getcode.opencode.managers.MnemonicManager
14+
import com.flipcash.libs.coroutines.DispatcherProvider
1415
import com.getcode.util.resources.ResourceHelper
1516
import androidx.lifecycle.ViewModel
1617
import dagger.hilt.android.lifecycle.HiltViewModel
17-
import kotlinx.coroutines.CoroutineScope
18-
import kotlinx.coroutines.Dispatchers
1918
import kotlinx.coroutines.delay
2019
import kotlinx.coroutines.flow.MutableSharedFlow
2120
import kotlinx.coroutines.flow.MutableStateFlow
@@ -42,6 +41,7 @@ internal class SeedInputViewModel @Inject constructor(
4241
private val userFlags: UserFlagsCoordinator,
4342
private val resources: ResourceHelper,
4443
private val mnemonicManager: MnemonicManager,
44+
private val dispatchers: DispatcherProvider,
4545
) : ViewModel() {
4646
val uiFlow = MutableStateFlow(SeedInputUiModel())
4747
private val mnemonicCode = mnemonicManager.mnemonicCode
@@ -78,7 +78,7 @@ internal class SeedInputViewModel @Inject constructor(
7878
uiFlow.value.wordsString.trim().replace(Regex("(\\s)+"), " ").lowercase(Locale.getDefault()).split(" ")
7979
val mnemonic = MnemonicPhrase.newInstance(userWordList) ?: return
8080

81-
CoroutineScope(Dispatchers.IO).launch {
81+
viewModelScope.launch(dispatchers.IO) {
8282
val entropyB64: String
8383
try {
8484
entropyB64 = mnemonicManager.getEncodedBase64(mnemonic)

apps/flipcash/features/userflags/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,5 @@ android {
88

99
dependencies {
1010
implementation(project(":apps:flipcash:shared:userflags"))
11-
implementation(project(":libs:coroutines"))
1211
implementation(project(":libs:messaging"))
1312
}

apps/flipcash/shared/accesskey/src/main/kotlin/com/flipcash/app/accesskey/BaseAccessKeyViewModel.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import androidx.core.graphics.createBitmap
1313
import androidx.core.graphics.drawable.toBitmap
1414
import androidx.lifecycle.viewModelScope
1515
import com.flipcash.app.core.storage.MediaSaver
16+
import com.flipcash.libs.coroutines.DispatcherProvider
1617
import com.flipcash.app.theme.internal.Flipcash2ColorSpec
1718
import com.flipcash.services.user.UserManager
1819
import com.flipcash.shared.accesskey.R
@@ -27,8 +28,6 @@ import com.getcode.util.resources.ResourceHelper
2728
import com.getcode.utils.decodeBase64
2829
import androidx.lifecycle.ViewModel
2930
import com.getcode.view.LoadingSuccessState
30-
import kotlinx.coroutines.CoroutineScope
31-
import kotlinx.coroutines.Dispatchers
3231
import kotlinx.coroutines.flow.MutableStateFlow
3332
import kotlinx.coroutines.flow.distinctUntilChangedBy
3433
import kotlinx.coroutines.flow.filterNotNull
@@ -63,7 +62,8 @@ abstract class BaseAccessKeyViewModel(
6362
private val mnemonicManager: MnemonicManager,
6463
private val mediaSaver: MediaSaver,
6564
userManager: UserManager,
66-
private val qrCodeGenerator: QRCodeGenerator
65+
private val qrCodeGenerator: QRCodeGenerator,
66+
protected val dispatchers: DispatcherProvider,
6767
) : ViewModel() {
6868
val uiFlow = MutableStateFlow(AccessKeyUiModel())
6969

@@ -88,7 +88,7 @@ abstract class BaseAccessKeyViewModel(
8888
wordsFormatted = wordsFormatted
8989
)
9090

91-
CoroutineScope(Dispatchers.IO).launch {
91+
viewModelScope.launch(dispatchers.IO) {
9292
val accessKeyBitmap = createBitmapForExport(words = words, entropyB64 = entropyB64)
9393
val accessKeyBitmapDisplay =
9494
createBitmapForExport(drawBackground = true, words, entropyB64)
@@ -128,7 +128,7 @@ abstract class BaseAccessKeyViewModel(
128128
val bitmap = uiFlow.value.accessKeyBitmap
129129
?: return Result.failure(IllegalStateException("No access key?"))
130130

131-
return withContext(Dispatchers.IO) {
131+
return withContext(dispatchers.IO) {
132132
runCatching {
133133
val date: DateFormat = SimpleDateFormat("yyy-MM-dd-h-mm", Locale.CANADA)
134134
val filename = "Flipcash-Recovery-${date.format(Date())}.png"

apps/flipcash/shared/appsettings/src/main/kotlin/com/flipcash/app/appsettings/inject/AppSettingModule.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.flipcash.app.appsettings.inject
33
import android.content.Context
44
import com.flipcash.app.appsettings.AppSettingsController
55
import com.flipcash.app.appsettings.internal.InternalAppSettingsController
6+
import com.flipcash.libs.coroutines.DispatcherProvider
67
import dagger.Module
78
import dagger.Provides
89
import dagger.hilt.InstallIn
@@ -17,5 +18,6 @@ object AppSettingModule {
1718
@Singleton
1819
fun providesAppSettingsController(
1920
@ApplicationContext context: Context,
20-
): AppSettingsController = InternalAppSettingsController(context)
21+
dispatchers: DispatcherProvider,
22+
): AppSettingsController = InternalAppSettingsController(context, dispatchers)
2123
}

apps/flipcash/shared/appsettings/src/main/kotlin/com/flipcash/app/appsettings/internal/InternalAppSettingsController.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import androidx.datastore.preferences.preferencesDataStoreFile
1010
import com.flipcash.app.appsettings.AppSetting
1111
import com.flipcash.app.appsettings.AppSettingValue
1212
import com.flipcash.app.appsettings.AppSettingsController
13+
import com.flipcash.libs.coroutines.DispatcherProvider
1314
import kotlinx.coroutines.CoroutineScope
14-
import kotlinx.coroutines.Dispatchers
1515
import kotlinx.coroutines.SupervisorJob
1616
import kotlinx.coroutines.flow.Flow
1717
import kotlinx.coroutines.flow.SharingStarted
@@ -22,14 +22,15 @@ import kotlinx.coroutines.launch
2222

2323
class InternalAppSettingsController(
2424
private val context: Context,
25+
private val dispatchers: DispatcherProvider,
2526
) : AppSettingsController {
2627

2728
companion object {
2829
private val AppSettingValue.booleanPreferenceKey
2930
get() = booleanPreferencesKey(key)
3031
}
3132

32-
private val dataScope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
33+
private val dataScope: CoroutineScope = CoroutineScope(SupervisorJob() + dispatchers.IO)
3334
private val appSettings = PreferenceDataStoreFactory.create(
3435
corruptionHandler = ReplaceFileCorruptionHandler(
3536
produceNewData = { emptyPreferences() }
@@ -66,7 +67,7 @@ class InternalAppSettingsController(
6667
// TODO: analytics
6768
}
6869

69-
dataScope.launch(Dispatchers.IO) {
70+
dataScope.launch {
7071
appSettings.edit { prefs ->
7172
prefs[setting.booleanPreferenceKey] = value
7273
}

apps/flipcash/shared/appupdates/src/main/kotlin/com/flipcash/app/updates/inject/AppUpdateModule.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.flipcash.app.core.android.VersionInfo
55
import com.flipcash.app.updates.AppUpdateController
66
import com.flipcash.app.updates.internal.GooglePlayAppUpdateController
77
import com.flipcash.app.userflags.UserFlagsCoordinator
8-
import com.flipcash.services.user.UserManager
8+
import com.flipcash.libs.coroutines.DispatcherProvider
99
import dagger.Module
1010
import dagger.Provides
1111
import dagger.hilt.InstallIn
@@ -23,5 +23,6 @@ object AppUpdateModule {
2323
@ActivityContext context: Context,
2424
versionInfo: VersionInfo,
2525
userFlagsCoordinator: UserFlagsCoordinator,
26-
): AppUpdateController = GooglePlayAppUpdateController(context, versionInfo, userFlagsCoordinator)
26+
dispatchers: DispatcherProvider,
27+
): AppUpdateController = GooglePlayAppUpdateController(context, versionInfo, userFlagsCoordinator, dispatchers)
2728
}

apps/flipcash/shared/appupdates/src/main/kotlin/com/flipcash/app/updates/internal/GooglePlayAppUpdateController.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ import com.google.android.play.core.appupdate.AppUpdateManagerFactory
1515
import com.google.android.play.core.appupdate.AppUpdateOptions
1616
import com.google.android.play.core.install.model.AppUpdateType
1717
import com.google.android.play.core.install.model.UpdateAvailability
18+
import com.flipcash.libs.coroutines.DispatcherProvider
1819
import dagger.hilt.android.qualifiers.ActivityContext
1920
import dagger.hilt.android.scopes.ActivityScoped
2021
import kotlinx.coroutines.CoroutineScope
21-
import kotlinx.coroutines.Dispatchers
2222
import kotlinx.coroutines.SupervisorJob
2323
import kotlinx.coroutines.flow.MutableStateFlow
2424
import kotlinx.coroutines.flow.StateFlow
@@ -35,8 +35,9 @@ class GooglePlayAppUpdateController @Inject constructor(
3535
private val context: Context,
3636
private val versionInfo: VersionInfo,
3737
private val userFlags: UserFlagsCoordinator,
38+
private val dispatchers: DispatcherProvider,
3839
) : AppUpdateController {
39-
private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
40+
private val scope = CoroutineScope(dispatchers.IO + SupervisorJob())
4041

4142
private val appUpdateManager: AppUpdateManager = AppUpdateManagerFactory.create(context)
4243

apps/flipcash/shared/authentication/src/main/kotlin/com/flipcash/app/auth/AuthManager.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import com.getcode.opencode.controllers.TokenController
2121
import com.getcode.opencode.model.core.ID
2222
import com.getcode.utils.TraceManager
2323
import com.getcode.utils.TraceType
24+
import com.flipcash.libs.coroutines.DispatcherProvider
2425
import com.getcode.utils.network.retryable
2526
import com.getcode.utils.trace
2627
import kotlinx.coroutines.CoroutineScope
27-
import kotlinx.coroutines.Dispatchers
2828
import kotlinx.coroutines.coroutineScope
2929
import kotlinx.coroutines.flow.distinctUntilChanged
3030
import kotlinx.coroutines.flow.launchIn
@@ -49,8 +49,9 @@ class AuthManager @Inject constructor(
4949
private val appSettings: AppSettingsCoordinator,
5050
private val userFlags: UserFlagsCoordinator,
5151
private val contactCoordinator: ContactCoordinator,
52+
private val dispatchers: DispatcherProvider,
5253
// private val analytics: AnalyticsService,
53-
) : CoroutineScope by CoroutineScope(Dispatchers.IO) {
54+
) : CoroutineScope by CoroutineScope(dispatchers.IO) {
5455

5556
init {
5657
// Persist onboarding completion when the composable transitions Onboarding → Ready.

0 commit comments

Comments
 (0)