1
1
package net.mullvad.mullvadvpn.compose.screen
2
2
3
+ import android.content.Intent
4
+ import androidx.activity.ComponentActivity
3
5
import androidx.activity.compose.rememberLauncherForActivityResult
4
6
import androidx.compose.foundation.layout.fillMaxSize
5
7
import androidx.compose.runtime.Composable
6
8
import androidx.compose.runtime.DisposableEffect
7
9
import androidx.compose.runtime.LaunchedEffect
8
10
import androidx.compose.ui.ExperimentalComposeUiApi
9
11
import androidx.compose.ui.Modifier
12
+ import androidx.compose.ui.platform.LocalContext
10
13
import androidx.compose.ui.semantics.semantics
11
14
import androidx.compose.ui.semantics.testTagsAsResourceId
12
15
import androidx.navigation.NavHostController
@@ -21,14 +24,17 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator
21
24
import com.ramcosta.composedestinations.rememberNavHostEngine
22
25
import com.ramcosta.composedestinations.utils.destination
23
26
import com.ramcosta.composedestinations.utils.rememberDestinationsNavigator
27
+ import kotlinx.coroutines.channels.awaitClose
28
+ import kotlinx.coroutines.flow.callbackFlow
29
+ import kotlinx.coroutines.flow.filter
24
30
import kotlinx.coroutines.flow.first
25
31
import kotlinx.coroutines.flow.map
26
32
import net.mullvad.mullvadvpn.compose.util.RequestVpnPermission
27
- import net.mullvad.mullvadvpn.viewmodel.ChangelogViewModel
33
+ import net.mullvad.mullvadvpn.lib.common.constant.KEY_REQUEST_VPN_PERMISSION
34
+ import net.mullvad.mullvadvpn.util.getActivity
28
35
import net.mullvad.mullvadvpn.viewmodel.DaemonScreenEvent
36
+ import net.mullvad.mullvadvpn.viewmodel.MullvadAppViewModel
29
37
import net.mullvad.mullvadvpn.viewmodel.NoDaemonViewModel
30
- import net.mullvad.mullvadvpn.viewmodel.VpnPermissionSideEffect
31
- import net.mullvad.mullvadvpn.viewmodel.VpnPermissionViewModel
32
38
import org.koin.androidx.compose.koinViewModel
33
39
34
40
private val changeLogDestinations = listOf (ConnectDestination , OutOfTimeDestination )
@@ -41,13 +47,27 @@ fun MullvadApp() {
41
47
val navigator: DestinationsNavigator = navHostController.rememberDestinationsNavigator()
42
48
43
49
val serviceVm = koinViewModel<NoDaemonViewModel >()
44
- val permissionVm = koinViewModel<VpnPermissionViewModel >()
50
+ val mullvadAppViewModel = koinViewModel<MullvadAppViewModel >()
45
51
46
52
DisposableEffect (Unit ) {
47
53
navHostController.addOnDestinationChangedListener(serviceVm)
48
54
onDispose { navHostController.removeOnDestinationChangedListener(serviceVm) }
49
55
}
50
56
57
+ // Get intents
58
+ val launchVpnPermission =
59
+ rememberLauncherForActivityResult(RequestVpnPermission ()) { _ ->
60
+ mullvadAppViewModel.connect()
61
+ }
62
+ val context = LocalContext .current
63
+ val activity = (context.getActivity() as ComponentActivity )
64
+ LaunchedEffect (navHostController) {
65
+ activity
66
+ .intents()
67
+ .filter { it.action == KEY_REQUEST_VPN_PERMISSION }
68
+ .collect { launchVpnPermission.launch(Unit ) }
69
+ }
70
+
51
71
DestinationsNavHost (
52
72
modifier = Modifier .semantics { testTagsAsResourceId = true }.fillMaxSize(),
53
73
engine = engine,
@@ -72,9 +92,8 @@ fun MullvadApp() {
72
92
}
73
93
74
94
// Globally show the changelog
75
- val changeLogsViewModel = koinViewModel<ChangelogViewModel >()
76
95
LaunchedEffect (Unit ) {
77
- changeLogsViewModel .uiSideEffect.collect {
96
+ mullvadAppViewModel .uiSideEffect.collect {
78
97
// Wait until we are in an acceptable destination
79
98
navHostController.currentBackStackEntryFlow
80
99
.map { it.destination() }
@@ -83,15 +102,15 @@ fun MullvadApp() {
83
102
navigator.navigate(ChangelogDestination (it))
84
103
}
85
104
}
105
+ }
86
106
87
- // Ask for VPN Permission
88
- val launchVpnPermission =
89
- rememberLauncherForActivityResult( RequestVpnPermission ()) { _ -> permissionVm.connect() }
90
- LaunchedEffect ( Unit ) {
91
- changeLogsViewModel.uiSideEffect.collect {
92
- if (it is VpnPermissionSideEffect . ShowDialog ) {
93
- launchVpnPermission.launch( Unit )
94
- }
95
- }
107
+ private fun ComponentActivity. intents () =
108
+ callbackFlow< Intent > {
109
+ send(intent)
110
+
111
+ val listener : ( Intent ) -> Unit = { trySend(it) }
112
+
113
+ addOnNewIntentListener(listener )
114
+
115
+ awaitClose { removeOnNewIntentListener(listener) }
96
116
}
97
- }
0 commit comments