Skip to content

Commit e2f9650

Browse files
committed
Refactor into new viewmodel
1 parent 2377535 commit e2f9650

File tree

6 files changed

+50
-20
lines changed

6 files changed

+50
-20
lines changed

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/ServerIpOverridesCell.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ fun ServerIpOverridesCell(
3434
inactiveColor: Color = MaterialTheme.colorScheme.error,
3535
) {
3636
BaseCell(
37+
modifier = modifier,
3738
iconView = {
3839
Box(
3940
modifier =
@@ -65,6 +66,7 @@ fun ServerIpOverridesCell(
6566
)
6667
.padding(horizontal = Dimens.smallPadding, vertical = Dimens.mediumPadding)
6768
)
68-
}
69+
},
70+
isRowEnabled = false
6971
)
7072
}

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ResetServerIpOverridesConfirmationDialog.kt

+19-9
Original file line numberDiff line numberDiff line change
@@ -9,39 +9,49 @@ import androidx.compose.ui.Modifier
99
import androidx.compose.ui.res.stringResource
1010
import androidx.compose.ui.tooling.preview.Preview
1111
import com.ramcosta.composedestinations.annotation.Destination
12-
import com.ramcosta.composedestinations.result.EmptyResultBackNavigator
13-
import com.ramcosta.composedestinations.result.ResultBackNavigator
12+
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
13+
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
1414
import com.ramcosta.composedestinations.spec.DestinationStyle
1515
import net.mullvad.mullvadvpn.R
1616
import net.mullvad.mullvadvpn.compose.button.NegativeButton
1717
import net.mullvad.mullvadvpn.compose.button.PrimaryButton
18+
import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle
1819
import net.mullvad.mullvadvpn.lib.theme.AppTheme
20+
import net.mullvad.mullvadvpn.viewmodel.ResetServerIpOverridesConfirmationUiSideEffect
21+
import net.mullvad.mullvadvpn.viewmodel.ResetServerIpOverridesConfirmationViewModel
22+
import org.koin.androidx.compose.koinViewModel
1923

2024
@Preview
2125
@Composable
2226
private fun PreviewResetServerIpOverridesConfirmationDialog() {
23-
AppTheme { ResetServerIpOverridesConfirmationDialog(EmptyResultBackNavigator()) }
27+
AppTheme { ResetServerIpOverridesConfirmationDialog(EmptyDestinationsNavigator) }
2428
}
2529

2630
@Destination(style = DestinationStyle.Dialog::class)
2731
@Composable
28-
fun ResetServerIpOverridesConfirmationDialog(
29-
resultNavigator: ResultBackNavigator<Boolean>,
30-
) {
32+
fun ResetServerIpOverridesConfirmationDialog(navigator: DestinationsNavigator) {
33+
val viewModel: ResetServerIpOverridesConfirmationViewModel = koinViewModel()
34+
CollectSideEffectWithLifecycle(viewModel.uiSideEffect) {
35+
when (it) {
36+
ResetServerIpOverridesConfirmationUiSideEffect.OverridesCleared ->
37+
navigator.navigateUp()
38+
}
39+
}
40+
3141
AlertDialog(
3242
containerColor = MaterialTheme.colorScheme.background,
3343
confirmButton = {
3444
NegativeButton(
3545
modifier = Modifier.fillMaxWidth(),
3646
text = stringResource(id = R.string.server_ip_overrides_reset_reset_button),
37-
onClick = { resultNavigator.navigateBack(result = true) }
47+
onClick = viewModel::clearAllOverrides
3848
)
3949
},
4050
dismissButton = {
4151
PrimaryButton(
4252
modifier = Modifier.fillMaxWidth(),
4353
text = stringResource(R.string.cancel),
44-
onClick = resultNavigator::navigateBack
54+
onClick = navigator::navigateUp
4555
)
4656
},
4757
title = {
@@ -57,6 +67,6 @@ fun ResetServerIpOverridesConfirmationDialog(
5767
style = MaterialTheme.typography.bodySmall,
5868
)
5969
},
60-
onDismissRequest = resultNavigator::navigateBack
70+
onDismissRequest = navigator::navigateUp
6171
)
6272
}

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ServerIpOverridesScreen.kt

-3
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,6 @@ private fun PreviewServerIpOverridesScreen() {
9696
fun ServerIpOverrides(
9797
navigator: DestinationsNavigator,
9898
importByTextResult: ResultRecipient<ImportOverridesByTextDestination, String>,
99-
clearAllOverrides:
100-
ResultRecipient<ResetServerIpOverridesConfirmationDialogDestination, Boolean>,
10199
) {
102100
val vm = koinViewModel<ServerIpOverridesViewModel>()
103101
val state by vm.uiState.collectAsStateWithLifecycle()
@@ -122,7 +120,6 @@ fun ServerIpOverrides(
122120
}
123121

124122
importByTextResult.OnNavResultValue(vm::importText)
125-
clearAllOverrides.OnNavResultValue { vm.clearAllOverrides() }
126123

127124
val openFileLauncher =
128125
rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) {

android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ import net.mullvad.mullvadvpn.viewmodel.OutOfTimeViewModel
6161
import net.mullvad.mullvadvpn.viewmodel.PaymentViewModel
6262
import net.mullvad.mullvadvpn.viewmodel.PrivacyDisclaimerViewModel
6363
import net.mullvad.mullvadvpn.viewmodel.ReportProblemViewModel
64+
import net.mullvad.mullvadvpn.viewmodel.ResetServerIpOverridesConfirmationViewModel
6465
import net.mullvad.mullvadvpn.viewmodel.SelectLocationViewModel
6566
import net.mullvad.mullvadvpn.viewmodel.ServerIpOverridesViewModel
6667
import net.mullvad.mullvadvpn.viewmodel.SettingsViewModel
@@ -183,6 +184,7 @@ val uiModule = module {
183184
viewModel { CustomListsViewModel(get(), get()) }
184185
viewModel { parameters -> DeleteCustomListConfirmationViewModel(parameters.get(), get()) }
185186
viewModel { ServerIpOverridesViewModel(get(), get(), get(), get()) }
187+
viewModel { ResetServerIpOverridesConfirmationViewModel(get()) }
186188

187189
// This view model must be single so we correctly attach lifecycle and share it with activity
188190
single { NoDaemonViewModel(get()) }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package net.mullvad.mullvadvpn.viewmodel
2+
3+
import androidx.lifecycle.ViewModel
4+
import androidx.lifecycle.viewModelScope
5+
import kotlinx.coroutines.channels.Channel
6+
import kotlinx.coroutines.flow.receiveAsFlow
7+
import kotlinx.coroutines.launch
8+
import net.mullvad.mullvadvpn.repository.RelayOverridesRepository
9+
10+
class ResetServerIpOverridesConfirmationViewModel(
11+
private val relayOverridesRepository: RelayOverridesRepository,
12+
) : ViewModel() {
13+
private val _uiSideEffect = Channel<ResetServerIpOverridesConfirmationUiSideEffect>()
14+
val uiSideEffect = _uiSideEffect.receiveAsFlow()
15+
16+
fun clearAllOverrides() =
17+
viewModelScope.launch {
18+
relayOverridesRepository.clearAllOverrides()
19+
_uiSideEffect.send(ResetServerIpOverridesConfirmationUiSideEffect.OverridesCleared)
20+
}
21+
}
22+
23+
sealed class ResetServerIpOverridesConfirmationUiSideEffect {
24+
data object OverridesCleared : ResetServerIpOverridesConfirmationUiSideEffect()
25+
}

android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ServerIpOverridesViewModel.kt

+1-7
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionState
2626
class ServerIpOverridesViewModel(
2727
private val contentResolver: ContentResolver,
2828
private val serviceConnectionManager: ServiceConnectionManager,
29-
private val relayOverridesRepository: RelayOverridesRepository,
29+
relayOverridesRepository: RelayOverridesRepository,
3030
private val settingsRepository: SettingsRepository
3131
) : ViewModel() {
3232

@@ -71,12 +71,6 @@ class ServerIpOverridesViewModel(
7171
}
7272
}
7373

74-
fun clearAllOverrides() =
75-
viewModelScope.launch {
76-
relayOverridesRepository.clearAllOverrides()
77-
_uiSideEffect.send(UiSideEffect.OverridesCleared)
78-
}
79-
8074
sealed interface UiSideEffect {
8175
data class ImportResult(val error: SettingsPatchError?) : UiSideEffect
8276

0 commit comments

Comments
 (0)