// Copyright (c) Tailscale Inc & AUTHORS // SPDX-License-Identifier: BSD-3-Clause package com.tailscale.ipn.ui.viewModel import androidx.lifecycle.viewModelScope import com.tailscale.ipn.mdm.MDMSettings import com.tailscale.ipn.ui.localapi.Client import com.tailscale.ipn.ui.notifier.Notifier import com.tailscale.ipn.ui.util.LoadingIndicator import com.tailscale.ipn.ui.util.set import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch data class SettingsNav( val onNavigateToBugReport: () -> Unit, val onNavigateToAbout: () -> Unit, val onNavigateToDNSSettings: () -> Unit, val onNavigateToTailnetLock: () -> Unit, val onNavigateToMDMSettings: () -> Unit, val onNavigateToManagedBy: () -> Unit, val onNavigateToUserSwitcher: () -> Unit, val onNavigateToPermissions: () -> Unit, val onNavigateBackHome: () -> Unit, val onBackToSettings: () -> Unit, ) class SettingsViewModel : IpnViewModel() { // Display name for the logged in user val isAdmin: StateFlow = MutableStateFlow(false) val managedByOrganization = MDMSettings.managedByOrganizationName.flow // True if tailnet lock is enabled. nil if not yet known. val tailNetLockEnabled: StateFlow = MutableStateFlow(null) // True if tailscaleDNS is enabled. nil if not yet known. val corpDNSEnabled: StateFlow = MutableStateFlow(null) init { viewModelScope.launch { Notifier.netmap.collect { netmap -> isAdmin.set(netmap?.SelfNode?.isAdmin ?: false) } } Client(viewModelScope).tailnetLockStatus { result -> result.onSuccess { status -> tailNetLockEnabled.set(status.Enabled) } LoadingIndicator.stop() } viewModelScope.launch { Notifier.prefs.collect { it?.let { corpDNSEnabled.set(it.CorpDNS) } ?: run { corpDNSEnabled.set(null) } } } } }