owenclave / app/src/main/java/io/nekohasekai/sagernet/ui/compose/ViewModels.kt

github - dev - back to tree - upstream
package io.nekohasekai.sagernet.ui.compose import android.app.Application import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import io.nekohasekai.sagernet.database.DataStore import io.nekohasekai.sagernet.database.GroupManager import io.nekohasekai.sagernet.database.ProfileManager import io.nekohasekai.sagernet.database.ProxyEntity import io.nekohasekai.sagernet.database.ProxyGroup import io.nekohasekai.sagernet.database.RuleEntity import io.nekohasekai.sagernet.database.SagerDatabase import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch class ConfigurationViewModel(app: Application) : AndroidViewModel(app) { private val _profiles = MutableStateFlow>(emptyList()) val profiles: StateFlow> = _profiles.asStateFlow() private val _selectedProfileId = MutableStateFlow(DataStore.selectedProxy) val selectedProfileId: StateFlow = _selectedProfileId.asStateFlow() private val _currentGroup = MutableStateFlow(null) val currentGroup: StateFlow = _currentGroup.asStateFlow() fun loadProfiles() { viewModelScope.launch(Dispatchers.IO) { val groupId = DataStore.currentGroupId() val group = SagerDatabase.groupDao.getById(groupId) val list = SagerDatabase.proxyDao.getByGroup(groupId) _currentGroup.value = group _profiles.value = list _selectedProfileId.value = DataStore.selectedProxy } } fun selectProfile(profileId: Long) { DataStore.selectedProxy = profileId _selectedProfileId.value = profileId } fun deleteProfile(profileId: Long) { viewModelScope.launch(Dispatchers.IO) { val groupId = DataStore.currentGroupId() ProfileManager.deleteProfile(groupId, profileId) loadProfiles() } } } class GroupViewModel(app: Application) : AndroidViewModel(app) { private val _groups = MutableStateFlow>(emptyList()) val groups: StateFlow> = _groups.asStateFlow() fun loadGroups() { viewModelScope.launch(Dispatchers.IO) { _groups.value = SagerDatabase.groupDao.allGroups() } } fun deleteGroup(groupId: Long) { viewModelScope.launch(Dispatchers.IO) { io.nekohasekai.sagernet.database.GroupManager.deleteGroup(groupId) loadGroups() } } } class RouteViewModel(app: Application) : AndroidViewModel(app) { private val _rules = MutableStateFlow>(emptyList()) val rules: StateFlow> = _rules.asStateFlow() fun loadRules() { viewModelScope.launch(Dispatchers.IO) { _rules.value = SagerDatabase.rulesDao.allRules() } } fun deleteRule(ruleId: Long) { viewModelScope.launch(Dispatchers.IO) { SagerDatabase.rulesDao.deleteById(ruleId) loadRules() } } }