diff --git a/app/src/main/java/com/geeksville/mesh/model/Contact.kt b/app/src/main/java/com/geeksville/mesh/model/Contact.kt new file mode 100644 index 000000000..ea2723e99 --- /dev/null +++ b/app/src/main/java/com/geeksville/mesh/model/Contact.kt @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2025 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.geeksville.mesh.model + +data class Contact( + val contactKey: String, + val shortName: String, + val longName: String, + val lastMessageTime: String?, + val lastMessageText: String?, + val unreadCount: Int, + val messageCount: Int, + val isMuted: Boolean, + val isUnmessageable: Boolean, + val nodeColors: Pair? = null, +) diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index ecbf900bc..58c993d6d 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -19,7 +19,6 @@ package com.geeksville.mesh.model import android.app.Application import android.net.Uri -import android.os.RemoteException import androidx.compose.material3.SnackbarDuration import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarResult @@ -50,10 +49,8 @@ import org.meshtastic.core.data.repository.FirmwareReleaseRepository import org.meshtastic.core.data.repository.MeshLogRepository import org.meshtastic.core.data.repository.NodeRepository import org.meshtastic.core.data.repository.PacketRepository -import org.meshtastic.core.data.repository.RadioConfigRepository import org.meshtastic.core.database.entity.MyNodeEntity import org.meshtastic.core.database.entity.asDeviceVersion -import org.meshtastic.core.database.model.Node import org.meshtastic.core.datastore.UiPreferencesDataSource import org.meshtastic.core.model.util.toChannelSet import org.meshtastic.core.service.IMeshService @@ -63,13 +60,7 @@ import org.meshtastic.core.strings.R import org.meshtastic.core.ui.component.toSharedContact import org.meshtastic.proto.AdminProtos import org.meshtastic.proto.AppOnlyProtos -import org.meshtastic.proto.ConfigProtos.Config -import org.meshtastic.proto.LocalOnlyProtos.LocalConfig -import org.meshtastic.proto.LocalOnlyProtos.LocalModuleConfig import org.meshtastic.proto.MeshProtos -import org.meshtastic.proto.channelSet -import org.meshtastic.proto.config -import org.meshtastic.proto.copy import timber.log.Timber import javax.inject.Inject @@ -103,19 +94,6 @@ fun getInitials(fullName: String): String { private fun String.withoutEmojis(): String = filterNot { char -> char.isSurrogate() } -data class Contact( - val contactKey: String, - val shortName: String, - val longName: String, - val lastMessageTime: String?, - val lastMessageText: String?, - val unreadCount: Int, - val messageCount: Int, - val isMuted: Boolean, - val isUnmessageable: Boolean, - val nodeColors: Pair? = null, -) - @Suppress("LongParameterList", "LargeClass", "UnusedPrivateProperty") @HiltViewModel class UIViewModel @@ -123,7 +101,6 @@ class UIViewModel constructor( private val app: Application, private val nodeDB: NodeRepository, - private val radioConfigRepository: RadioConfigRepository, private val serviceRepository: ServiceRepository, radioInterfaceService: RadioInterfaceService, meshLogRepository: MeshLogRepository, @@ -193,20 +170,6 @@ constructor( val meshService: IMeshService? get() = serviceRepository.meshService - private val localConfig = MutableStateFlow(LocalConfig.getDefaultInstance()) - - val config - get() = localConfig.value - - private val _moduleConfig = MutableStateFlow(LocalModuleConfig.getDefaultInstance()) - val moduleConfig: StateFlow = _moduleConfig - val module - get() = _moduleConfig.value - - private val _channels = MutableStateFlow(channelSet {}) - val channels: StateFlow - get() = _channels - val unreadMessageCount = packetRepository .getUnreadCountTotal() @@ -217,9 +180,6 @@ constructor( val myNodeInfo: StateFlow get() = nodeDB.myNodeInfo - val ourNodeInfo: StateFlow - get() = nodeDB.ourNodeInfo - val snackBarHostState = SnackbarHostState() fun showSnackBar(text: Int) = showSnackBar(app.getString(text)) @@ -253,14 +213,6 @@ constructor( } .launchIn(viewModelScope) - radioConfigRepository.localConfigFlow.onEach { config -> localConfig.value = config }.launchIn(viewModelScope) - radioConfigRepository.moduleConfigFlow - .onEach { config -> _moduleConfig.value = config } - .launchIn(viewModelScope) - radioConfigRepository.channelSetFlow - .onEach { channelSet -> _channels.value = channelSet } - .launchIn(viewModelScope) - Timber.d("ViewModel created") } @@ -302,31 +254,11 @@ constructor( _requestChannelSet.value = null } - var region: Config.LoRaConfig.RegionCode - get() = config.lora.region - set(value) { - updateLoraConfig { it.copy { region = value } } - } - override fun onCleared() { super.onCleared() Timber.d("ViewModel cleared") } - private inline fun updateLoraConfig(crossinline body: (Config.LoRaConfig) -> Config.LoRaConfig) { - val data = body(config.lora) - setConfig(config { lora = data }) - } - - // Set the radio config (also updates our saved copy in preferences) - fun setConfig(config: Config) { - try { - meshService?.setConfig(config.toByteArray()) - } catch (ex: RemoteException) { - Timber.e(ex, "Set config error") - } - } - val tracerouteResponse: LiveData get() = serviceRepository.tracerouteResponse.asLiveData()