@ -25,7 +25,6 @@ import com.tailscale.ipn.ui.util.PeerCategorizer
import com.tailscale.ipn.ui.util.PeerSet
import com.tailscale.ipn.ui.util.PeerSet
import com.tailscale.ipn.ui.util.TimeUtil
import com.tailscale.ipn.ui.util.TimeUtil
import com.tailscale.ipn.ui.util.set
import com.tailscale.ipn.ui.util.set
import java.time.Duration
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.Job
import kotlinx.coroutines.Job
@ -34,6 +33,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.launch
import kotlinx.coroutines.launch
import java.time.Duration
class MainViewModelFactory ( private val vpnViewModel : VpnViewModel ) : ViewModelProvider . Factory {
class MainViewModelFactory ( private val vpnViewModel : VpnViewModel ) : ViewModelProvider . Factory {
@Suppress ( " UNCHECKED_CAST " )
@Suppress ( " UNCHECKED_CAST " )
@ -60,6 +60,8 @@ class MainViewModel(private val vpnViewModel: VpnViewModel) : IpnViewModel() {
// Permission to prepare VPN
// Permission to prepare VPN
private var vpnPermissionLauncher : ActivityResultLauncher < Intent > ? = null
private var vpnPermissionLauncher : ActivityResultLauncher < Intent > ? = null
private val _requestVpnPermission = MutableStateFlow ( false )
val requestVpnPermission : StateFlow < Boolean > = _requestVpnPermission
// The list of peers
// The list of peers
private val _peers = MutableStateFlow < List < PeerSet > > ( emptyList ( ) )
private val _peers = MutableStateFlow < List < PeerSet > > ( emptyList ( ) )
@ -187,6 +189,10 @@ class MainViewModel(private val vpnViewModel: VpnViewModel) : IpnViewModel() {
}
}
}
}
fun maybeRequestVpnPermission ( ) {
_requestVpnPermission . value = true
}
fun showVPNPermissionLauncherIfUnauthorized ( ) {
fun showVPNPermissionLauncherIfUnauthorized ( ) {
val vpnIntent = VpnService . prepare ( App . get ( ) )
val vpnIntent = VpnService . prepare ( App . get ( ) )
if ( vpnIntent != null ) {
if ( vpnIntent != null ) {
@ -195,6 +201,7 @@ class MainViewModel(private val vpnViewModel: VpnViewModel) : IpnViewModel() {
vpnViewModel . setVpnPrepared ( true )
vpnViewModel . setVpnPrepared ( true )
startVPN ( )
startVPN ( )
}
}
_requestVpnPermission . value = false // reset
}
}
fun toggleVpn ( desiredState : Boolean ) {
fun toggleVpn ( desiredState : Boolean ) {