Skip to content

Commit 01dc1bc

Browse files
committed
Add dropUnlessResumed
1 parent 001ef93 commit 01dc1bc

35 files changed

+174
-173
lines changed

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.compose.dialog
22

33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.res.stringResource
5+
import androidx.lifecycle.compose.dropUnlessResumed
56
import com.ramcosta.composedestinations.annotation.Destination
67
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
78
import com.ramcosta.composedestinations.spec.DestinationStyle
@@ -24,6 +25,6 @@ fun ContentBlockersInfoDialog(navigator: DestinationsNavigator) {
2425
stringResource(id = R.string.settings_changes_effect_warning_content_blocker)
2526
)
2627
},
27-
onDismiss = navigator::navigateUp
28+
onDismiss = dropUnlessResumed { navigator.navigateUp() }
2829
)
2930
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.res.stringResource
55
import androidx.compose.ui.tooling.preview.Preview
6+
import androidx.lifecycle.compose.dropUnlessResumed
67
import com.ramcosta.composedestinations.annotation.Destination
78
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
89
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -20,6 +21,6 @@ private fun PreviewCustomDnsInfoDialog() {
2021
fun CustomDnsInfoDialog(navigator: DestinationsNavigator) {
2122
InfoDialog(
2223
message = stringResource(id = R.string.settings_changes_effect_warning_content_blocker),
23-
onDismiss = navigator::navigateUp
24+
onDismiss = dropUnlessResumed { navigator.navigateUp() }
2425
)
2526
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.compose.dialog
22

33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.res.stringResource
5+
import androidx.lifecycle.compose.dropUnlessResumed
56
import com.ramcosta.composedestinations.annotation.Destination
67
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
78
import com.ramcosta.composedestinations.spec.DestinationStyle
@@ -19,6 +20,6 @@ fun DeviceNameInfoDialog(navigator: DestinationsNavigator) {
1920
appendLine()
2021
append(stringResource(id = R.string.device_name_info_third_paragraph))
2122
},
22-
onDismiss = navigator::navigateUp
23+
onDismiss = dropUnlessResumed { navigator.navigateUp() }
2324
)
2425
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ fun DiscardChangesDialog(resultBackNavigator: ResultBackNavigator<Boolean>) {
2424
dismissButton = {
2525
PrimaryButton(
2626
modifier = Modifier.focusRequester(FocusRequester()),
27-
onClick = dropUnlessResumed {resultBackNavigator.navigateBack()},
27+
onClick = dropUnlessResumed { resultBackNavigator.navigateBack() },
2828
text = stringResource(id = R.string.cancel)
2929
)
3030
},

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ fun DnsDialog(
7676
viewModel::onDnsInputChange,
7777
onSaveDnsClick = viewModel::onSaveDnsClick,
7878
onRemoveDnsClick = viewModel::onRemoveDnsClick,
79-
onDismiss = dropUnlessResumed { resultNavigator.navigateBack(result = DnsDialogResult.Cancel) }
79+
onDismiss =
80+
dropUnlessResumed { resultNavigator.navigateBack(result = DnsDialogResult.Cancel) }
8081
)
8182
}
8283

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.res.stringResource
55
import androidx.compose.ui.tooling.preview.Preview
6+
import androidx.lifecycle.compose.dropUnlessResumed
67
import com.ramcosta.composedestinations.annotation.Destination
78
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
89
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -26,6 +27,6 @@ fun LocalNetworkSharingInfoDialog(navigator: DestinationsNavigator) {
2627
appendLine(stringResource(id = R.string.local_network_sharing_additional_info))
2728
appendLine(textResource(id = R.string.local_network_sharing_ip_ranges))
2829
},
29-
onDismiss = navigator::navigateUp
30+
onDismiss = dropUnlessResumed { navigator.navigateUp() }
3031
)
3132
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.res.stringResource
55
import androidx.compose.ui.tooling.preview.Preview
6+
import androidx.lifecycle.compose.dropUnlessResumed
67
import com.ramcosta.composedestinations.annotation.Destination
78
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
89
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -20,6 +21,6 @@ private fun PreviewMalwareInfoDialog() {
2021
fun MalwareInfoDialog(navigator: DestinationsNavigator) {
2122
InfoDialog(
2223
message = stringResource(id = R.string.malware_info),
23-
onDismiss = navigator::navigateUp
24+
onDismiss = dropUnlessResumed { navigator.navigateUp() }
2425
)
2526
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.res.stringResource
55
import androidx.compose.ui.tooling.preview.Preview
6+
import androidx.lifecycle.compose.dropUnlessResumed
67
import com.ramcosta.composedestinations.annotation.Destination
78
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
89
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -20,6 +21,6 @@ private fun PreviewObfuscationInfoDialog() {
2021
fun ObfuscationInfoDialog(navigator: DestinationsNavigator) {
2122
InfoDialog(
2223
message = stringResource(id = R.string.obfuscation_info),
23-
onDismiss = navigator::navigateUp
24+
onDismiss = dropUnlessResumed { navigator.navigateUp() }
2425
)
2526
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.res.stringResource
55
import androidx.compose.ui.tooling.preview.Preview
6+
import androidx.lifecycle.compose.dropUnlessResumed
67
import com.ramcosta.composedestinations.annotation.Destination
78
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
89
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -21,6 +22,6 @@ fun QuantumResistanceInfoDialog(navigator: DestinationsNavigator) {
2122
InfoDialog(
2223
message = stringResource(id = R.string.quantum_resistant_info_first_paragaph),
2324
additionalInfo = stringResource(id = R.string.quantum_resistant_info_second_paragaph),
24-
onDismiss = navigator::navigateUp
25+
onDismiss = dropUnlessResumed { navigator.navigateUp() }
2526
)
2627
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ private fun PreviewReportProblemNoEmailDialog() {
3333
@Composable
3434
fun ReportProblemNoEmailDialog(resultBackNavigator: ResultBackNavigator<Boolean>) {
3535
AlertDialog(
36-
onDismissRequest = dropUnlessResumed {resultBackNavigator.navigateBack() },
36+
onDismissRequest = dropUnlessResumed { resultBackNavigator.navigateBack() },
3737
icon = {
3838
Icon(
3939
painter = painterResource(id = R.drawable.icon_alert),

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.res.stringResource
55
import androidx.compose.ui.tooling.preview.Preview
6+
import androidx.lifecycle.compose.dropUnlessResumed
67
import com.ramcosta.composedestinations.annotation.Destination
78
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
89
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -27,6 +28,6 @@ fun ServerIpOverridesInfoDialog(navigator: DestinationsNavigator) {
2728
appendLine()
2829
append(stringResource(id = R.string.server_ip_overrides_info_third_paragraph))
2930
},
30-
onDismiss = navigator::navigateUp
31+
onDismiss = dropUnlessResumed { navigator.navigateUp() }
3132
)
3233
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.res.stringResource
55
import androidx.compose.ui.tooling.preview.Preview
6+
import androidx.lifecycle.compose.dropUnlessResumed
67
import com.ramcosta.composedestinations.annotation.Destination
78
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
89
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -21,6 +22,6 @@ private fun PreviewUdpOverTcpPortInfoDialog() {
2122
fun UdpOverTcpPortInfoDialog(navigator: DestinationsNavigator) {
2223
InfoDialog(
2324
message = stringResource(id = R.string.udp_over_tcp_port_info),
24-
onDismiss = navigator::navigateUp
25+
onDismiss = dropUnlessResumed { navigator.navigateUp() }
2526
)
2627
}

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

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import androidx.compose.ui.Modifier
1616
import androidx.compose.ui.platform.testTag
1717
import androidx.compose.ui.res.stringResource
1818
import androidx.compose.ui.tooling.preview.Preview
19-
import androidx.lifecycle.compose.dropUnlessResumed
2019
import com.ramcosta.composedestinations.annotation.Destination
2120
import com.ramcosta.composedestinations.result.EmptyResultBackNavigator
2221
import com.ramcosta.composedestinations.result.ResultBackNavigator

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.os.Parcelable
44
import androidx.compose.runtime.Composable
55
import androidx.compose.ui.res.stringResource
66
import androidx.compose.ui.tooling.preview.Preview
7+
import androidx.lifecycle.compose.dropUnlessResumed
78
import com.ramcosta.composedestinations.annotation.Destination
89
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
910
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -40,6 +41,6 @@ fun WireguardPortInfoDialog(
4041
id = R.string.wireguard_port_info_port_range,
4142
argument.portRanges.asString()
4243
),
43-
onDismiss = navigator::navigateUp
44+
onDismiss = dropUnlessResumed { navigator.navigateUp() }
4445
)
4546
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.compose.runtime.Composable
77
import androidx.compose.ui.graphics.compositeOver
88
import androidx.compose.ui.res.stringResource
99
import androidx.compose.ui.tooling.preview.Preview
10+
import androidx.lifecycle.compose.dropUnlessResumed
1011
import com.ramcosta.composedestinations.annotation.Destination
1112
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
1213
import com.ramcosta.composedestinations.spec.DestinationStyle
@@ -24,7 +25,7 @@ private fun PreviewVerificationPendingDialog() {
2425
@Destination(style = DestinationStyle.Dialog::class)
2526
@Composable
2627
fun VerificationPendingDialog(navigator: DestinationsNavigator) {
27-
VerificationPendingDialog(onClose = navigator::navigateUp)
28+
VerificationPendingDialog(onClose = dropUnlessResumed { navigator.navigateUp() })
2829
}
2930

3031
@Composable

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

+8-11
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import androidx.compose.ui.res.painterResource
2424
import androidx.compose.ui.res.stringResource
2525
import androidx.compose.ui.tooling.preview.Preview
2626
import androidx.lifecycle.compose.collectAsStateWithLifecycle
27+
import androidx.lifecycle.compose.dropUnlessResumed
2728
import com.ramcosta.composedestinations.annotation.Destination
2829
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
2930
import com.ramcosta.composedestinations.navigation.popUpTo
@@ -123,9 +124,7 @@ fun Account(
123124
AccountScreen(
124125
state = state,
125126
uiSideEffect = vm.uiSideEffect,
126-
onRedeemVoucherClick = {
127-
navigator.navigate(RedeemVoucherDestination) { launchSingleTop = true }
128-
},
127+
onRedeemVoucherClick = dropUnlessResumed { navigator.navigate(RedeemVoucherDestination) },
129128
onManageAccountClick = vm::onManageAccountClick,
130129
onLogoutClick = vm::onLogoutClick,
131130
navigateToLogin = {
@@ -135,16 +134,14 @@ fun Account(
135134
}
136135
},
137136
onCopyAccountNumber = vm::onCopyAccountNumber,
138-
onBackClick = navigator::navigateUp,
139-
navigateToDeviceInfo = {
140-
navigator.navigate(DeviceNameInfoDialogDestination) { launchSingleTop = true }
141-
},
137+
onBackClick = dropUnlessResumed { navigator.navigateUp() },
138+
navigateToDeviceInfo =
139+
dropUnlessResumed { navigator.navigate(DeviceNameInfoDialogDestination) },
142140
onPurchaseBillingProductClick = { productId ->
143-
navigator.navigate(PaymentDestination(productId)) { launchSingleTop = true }
141+
navigator.navigate(PaymentDestination(productId), onlyIfResumed = true)
144142
},
145-
navigateToVerificationPendingDialog = {
146-
navigator.navigate(VerificationPendingDialogDestination) { launchSingleTop = true }
147-
}
143+
navigateToVerificationPendingDialog =
144+
dropUnlessResumed { navigator.navigate(VerificationPendingDialogDestination) }
148145
)
149146
}
150147

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import androidx.constraintlayout.compose.ConstrainedLayoutReference
4747
import androidx.constraintlayout.compose.ConstraintLayout
4848
import androidx.constraintlayout.compose.ConstraintLayoutScope
4949
import androidx.core.text.HtmlCompat
50+
import androidx.lifecycle.compose.dropUnlessResumed
5051
import com.ramcosta.composedestinations.annotation.Destination
5152
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
5253
import kotlinx.coroutines.launch
@@ -74,7 +75,7 @@ private fun PreviewAutoConnectAndLockdownModeScreen() {
7475
@Destination(style = SlideInFromRightTransition::class)
7576
@Composable
7677
fun AutoConnectAndLockdownMode(navigator: DestinationsNavigator) {
77-
AutoConnectAndLockdownModeScreen(onBackClick = navigator::navigateUp)
78+
AutoConnectAndLockdownModeScreen(onBackClick = dropUnlessResumed { navigator.navigateUp() })
7879
}
7980

8081
@OptIn(ExperimentalFoundationApi::class)

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

+6-11
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import androidx.compose.ui.res.stringResource
4444
import androidx.compose.ui.tooling.preview.Preview
4545
import androidx.lifecycle.Lifecycle
4646
import androidx.lifecycle.compose.collectAsStateWithLifecycle
47+
import androidx.lifecycle.compose.dropUnlessResumed
4748
import com.ramcosta.composedestinations.annotation.Destination
4849
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
4950
import com.ramcosta.composedestinations.navigation.popUpTo
@@ -143,12 +144,12 @@ fun Connect(
143144
openAccountPage(sideEffect.token)
144145
}
145146
is ConnectViewModel.UiSideEffect.OutOfTime ->
146-
navigator.navigate(OutOfTimeDestination, true) {
147+
navigator.navigate(OutOfTimeDestination) {
147148
launchSingleTop = true
148149
popUpTo(NavGraphs.root) { inclusive = true }
149150
}
150151
ConnectViewModel.UiSideEffect.RevokedDevice ->
151-
navigator.navigate(DeviceRevokedDestination, true) {
152+
navigator.navigate(DeviceRevokedDestination) {
152153
launchSingleTop = true
153154
popUpTo(NavGraphs.root) { inclusive = true }
154155
}
@@ -175,9 +176,7 @@ fun Connect(
175176
onReconnectClick = connectViewModel::onReconnectClick,
176177
onConnectClick = connectViewModel::onConnectClick,
177178
onCancelClick = connectViewModel::onCancelClick,
178-
onSwitchLocationClick = {
179-
navigator.navigate(SelectLocationDestination, true) { launchSingleTop = true }
180-
},
179+
onSwitchLocationClick = dropUnlessResumed { navigator.navigate(SelectLocationDestination) },
181180
onUpdateVersionClick = {
182181
val intent =
183182
Intent(
@@ -192,12 +191,8 @@ fun Connect(
192191
context.startActivity(intent)
193192
},
194193
onManageAccountClick = connectViewModel::onManageAccountClick,
195-
onSettingsClick = {
196-
navigator.navigate(SettingsDestination, true) { launchSingleTop = true }
197-
},
198-
onAccountClick = {
199-
navigator.navigate(AccountDestination, true) { launchSingleTop = true }
200-
},
194+
onSettingsClick = dropUnlessResumed { navigator.navigate(SettingsDestination) },
195+
onAccountClick = dropUnlessResumed { navigator.navigate(AccountDestination) },
201196
onDismissNewDeviceClick = connectViewModel::dismissNewDeviceNotification,
202197
)
203198
}

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

+8-6
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import androidx.compose.ui.platform.testTag
2626
import androidx.compose.ui.res.stringResource
2727
import androidx.compose.ui.tooling.preview.Preview
2828
import androidx.lifecycle.compose.collectAsStateWithLifecycle
29+
import androidx.lifecycle.compose.dropUnlessResumed
2930
import com.ramcosta.composedestinations.annotation.Destination
3031
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
3132
import com.ramcosta.composedestinations.result.NavResult
@@ -115,13 +116,14 @@ fun CustomListLocations(
115116
onSearchTermInput = customListsViewModel::onSearchTermInput,
116117
onSaveClick = customListsViewModel::save,
117118
onRelaySelectionClick = customListsViewModel::onRelaySelectionClick,
118-
onBackClick = {
119-
if (state.hasUnsavedChanges) {
120-
navigator.navigate(DiscardChangesDialogDestination) { launchSingleTop = true }
121-
} else {
122-
backNavigator.navigateBack()
119+
onBackClick =
120+
dropUnlessResumed {
121+
if (state.hasUnsavedChanges) {
122+
navigator.navigate(DiscardChangesDialogDestination)
123+
} else {
124+
backNavigator.navigateBack()
125+
}
123126
}
124-
}
125127
)
126128
}
127129

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

+12-11
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import androidx.compose.ui.res.painterResource
2323
import androidx.compose.ui.res.stringResource
2424
import androidx.compose.ui.tooling.preview.Preview
2525
import androidx.lifecycle.compose.collectAsStateWithLifecycle
26+
import androidx.lifecycle.compose.dropUnlessResumed
2627
import com.ramcosta.composedestinations.annotation.Destination
2728
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
2829
import com.ramcosta.composedestinations.result.NavResult
@@ -92,19 +93,19 @@ fun CustomLists(
9293
CustomListsScreen(
9394
state = state,
9495
snackbarHostState = snackbarHostState,
95-
addCustomList = {
96-
navigator.navigate(
97-
CreateCustomListDestination(),
98-
) {
99-
launchSingleTop = true
100-
}
101-
},
96+
addCustomList =
97+
dropUnlessResumed {
98+
navigator.navigate(
99+
CreateCustomListDestination(),
100+
)
101+
},
102102
openCustomList = { customList ->
103-
navigator.navigate(EditCustomListDestination(customListId = customList.id)) {
104-
launchSingleTop = true
105-
}
103+
navigator.navigate(
104+
EditCustomListDestination(customListId = customList.id),
105+
onlyIfResumed = true
106+
)
106107
},
107-
onBackClick = navigator::navigateUp
108+
onBackClick = dropUnlessResumed { navigator.navigateUp() }
108109
)
109110
}
110111

0 commit comments

Comments
 (0)