|
|
|
@ -28,6 +28,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api
|
|
|
|
import androidx.compose.material3.Icon
|
|
|
|
import androidx.compose.material3.Icon
|
|
|
|
import androidx.compose.material3.IconButton
|
|
|
|
import androidx.compose.material3.IconButton
|
|
|
|
import androidx.compose.material3.ListItem
|
|
|
|
import androidx.compose.material3.ListItem
|
|
|
|
|
|
|
|
import androidx.compose.material3.ListItemDefaults
|
|
|
|
import androidx.compose.material3.MaterialTheme
|
|
|
|
import androidx.compose.material3.MaterialTheme
|
|
|
|
import androidx.compose.material3.Scaffold
|
|
|
|
import androidx.compose.material3.Scaffold
|
|
|
|
import androidx.compose.material3.SearchBar
|
|
|
|
import androidx.compose.material3.SearchBar
|
|
|
|
@ -57,8 +58,10 @@ import com.tailscale.ipn.ui.model.IpnLocal
|
|
|
|
import com.tailscale.ipn.ui.model.Permission
|
|
|
|
import com.tailscale.ipn.ui.model.Permission
|
|
|
|
import com.tailscale.ipn.ui.model.Permissions
|
|
|
|
import com.tailscale.ipn.ui.model.Permissions
|
|
|
|
import com.tailscale.ipn.ui.model.Tailcfg
|
|
|
|
import com.tailscale.ipn.ui.model.Tailcfg
|
|
|
|
import com.tailscale.ipn.ui.theme.containerListItem
|
|
|
|
|
|
|
|
import com.tailscale.ipn.ui.theme.listItem
|
|
|
|
import com.tailscale.ipn.ui.theme.listItem
|
|
|
|
|
|
|
|
import com.tailscale.ipn.ui.theme.primaryListItem
|
|
|
|
|
|
|
|
import com.tailscale.ipn.ui.theme.secondaryButton
|
|
|
|
|
|
|
|
import com.tailscale.ipn.ui.theme.surfaceContainerListItem
|
|
|
|
import com.tailscale.ipn.ui.util.Lists
|
|
|
|
import com.tailscale.ipn.ui.util.Lists
|
|
|
|
import com.tailscale.ipn.ui.util.LoadingIndicator
|
|
|
|
import com.tailscale.ipn.ui.util.LoadingIndicator
|
|
|
|
import com.tailscale.ipn.ui.util.PeerSet
|
|
|
|
import com.tailscale.ipn.ui.util.PeerSet
|
|
|
|
@ -88,7 +91,7 @@ fun MainView(navigation: MainViewNavigation, viewModel: MainViewModel = viewMode
|
|
|
|
val username = viewModel.userName
|
|
|
|
val username = viewModel.userName
|
|
|
|
|
|
|
|
|
|
|
|
ListItem(
|
|
|
|
ListItem(
|
|
|
|
colors = MaterialTheme.colorScheme.containerListItem,
|
|
|
|
colors = MaterialTheme.colorScheme.surfaceContainerListItem,
|
|
|
|
leadingContent = {
|
|
|
|
leadingContent = {
|
|
|
|
val isOn = viewModel.vpnToggleState.collectAsState(initial = false)
|
|
|
|
val isOn = viewModel.vpnToggleState.collectAsState(initial = false)
|
|
|
|
TintedSwitch(
|
|
|
|
TintedSwitch(
|
|
|
|
@ -151,6 +154,7 @@ fun ExitNodeStatus(navAction: () -> Unit, viewModel: MainViewModel) {
|
|
|
|
val peer = exitNodeId?.let { id -> netmap.value?.Peers?.find { it.StableID == id } }
|
|
|
|
val peer = exitNodeId?.let { id -> netmap.value?.Peers?.find { it.StableID == id } }
|
|
|
|
val location = peer?.Hostinfo?.Location
|
|
|
|
val location = peer?.Hostinfo?.Location
|
|
|
|
val name = peer?.ComputedName
|
|
|
|
val name = peer?.ComputedName
|
|
|
|
|
|
|
|
val active = peer != null
|
|
|
|
|
|
|
|
|
|
|
|
Box(modifier = Modifier.background(color = MaterialTheme.colorScheme.surfaceContainer)) {
|
|
|
|
Box(modifier = Modifier.background(color = MaterialTheme.colorScheme.surfaceContainer)) {
|
|
|
|
Box(
|
|
|
|
Box(
|
|
|
|
@ -160,6 +164,9 @@ fun ExitNodeStatus(navAction: () -> Unit, viewModel: MainViewModel) {
|
|
|
|
.fillMaxWidth()) {
|
|
|
|
.fillMaxWidth()) {
|
|
|
|
ListItem(
|
|
|
|
ListItem(
|
|
|
|
modifier = Modifier.clickable { navAction() },
|
|
|
|
modifier = Modifier.clickable { navAction() },
|
|
|
|
|
|
|
|
colors =
|
|
|
|
|
|
|
|
if (active) MaterialTheme.colorScheme.primaryListItem
|
|
|
|
|
|
|
|
else ListItemDefaults.colors(),
|
|
|
|
overlineContent = {
|
|
|
|
overlineContent = {
|
|
|
|
Text(
|
|
|
|
Text(
|
|
|
|
stringResource(R.string.exit_node),
|
|
|
|
stringResource(R.string.exit_node),
|
|
|
|
@ -184,9 +191,11 @@ fun ExitNodeStatus(navAction: () -> Unit, viewModel: MainViewModel) {
|
|
|
|
},
|
|
|
|
},
|
|
|
|
trailingContent = {
|
|
|
|
trailingContent = {
|
|
|
|
if (peer != null) {
|
|
|
|
if (peer != null) {
|
|
|
|
Button(onClick = { viewModel.disableExitNode() }) {
|
|
|
|
Button(
|
|
|
|
Text(stringResource(R.string.disable))
|
|
|
|
colors = MaterialTheme.colorScheme.secondaryButton,
|
|
|
|
}
|
|
|
|
onClick = { viewModel.disableExitNode() }) {
|
|
|
|
|
|
|
|
Text(stringResource(R.string.disable))
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|