mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-04-20 22:23:37 +00:00
message status updates are coded but not yet tested.
This commit is contained in:
parent
b2d8b30d5b
commit
7506d712ff
9 changed files with 157 additions and 130 deletions
|
|
@ -6,36 +6,17 @@ import com.geeksville.android.BuildUtils.isEmulator
|
|||
import com.geeksville.android.Logging
|
||||
import com.geeksville.mesh.DataPacket
|
||||
import com.geeksville.mesh.MeshProtos
|
||||
import com.geeksville.mesh.MessageStatus
|
||||
import com.geeksville.mesh.utf8
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* the model object for a text message
|
||||
*
|
||||
* if errorMessage is set then we had a problem sending this message
|
||||
*/
|
||||
data class TextMessage(
|
||||
val from: String,
|
||||
val text: String,
|
||||
val date: Date = Date(),
|
||||
val errorMessage: String? = null
|
||||
) {
|
||||
/// We can auto init from data packets
|
||||
constructor(payload: DataPacket) : this(
|
||||
payload.from!!,
|
||||
payload.bytes!!.toString(utf8),
|
||||
date = Date(payload.rxTime)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
class MessagesState(private val ui: UIViewModel) : Logging {
|
||||
private val testTexts = listOf(
|
||||
TextMessage(
|
||||
DataPacket(
|
||||
"+16508765310",
|
||||
"I found the cache"
|
||||
),
|
||||
TextMessage(
|
||||
DataPacket(
|
||||
"+16508765311",
|
||||
"Help! I've fallen and I can't get up."
|
||||
)
|
||||
|
|
@ -44,44 +25,47 @@ class MessagesState(private val ui: UIViewModel) : Logging {
|
|||
// If the following (unused otherwise) line is commented out, the IDE preview window works.
|
||||
// if left in the preview always renders as empty.
|
||||
val messages =
|
||||
object : MutableLiveData<List<TextMessage>>(if (isEmulator) testTexts else listOf()) {
|
||||
object : MutableLiveData<List<DataPacket>>(if (isEmulator) testTexts else listOf()) {
|
||||
|
||||
}
|
||||
|
||||
/// add a message our GUI list of past msgs
|
||||
private fun addMessage(m: TextMessage) {
|
||||
fun addMessage(m: DataPacket) {
|
||||
// FIXME - don't just slam in a new list each time, it probably causes extra drawing.
|
||||
messages.value = messages.value!! + m
|
||||
}
|
||||
|
||||
/// Add a message that was encapsulated in a data packet
|
||||
fun addMessage(payload: DataPacket) = addMessage(TextMessage(payload))
|
||||
fun updateStatus(id: Int, status: MessageStatus) {
|
||||
// Super inefficent but this is rare
|
||||
val msgs = messages.value!!
|
||||
|
||||
msgs.find { it.id == id }?.let { p ->
|
||||
if (p.status != status) {
|
||||
p.status = status
|
||||
// Trigger an expensive complete redraw FIXME
|
||||
messages.value = msgs
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Send a message and added it to our GUI log
|
||||
fun sendMessage(str: String, dest: String = DataPacket.ID_BROADCAST) {
|
||||
var error: String? = null
|
||||
|
||||
val service = ui.meshService
|
||||
val p = DataPacket(
|
||||
dest,
|
||||
str.toByteArray(utf8),
|
||||
MeshProtos.Data.Type.CLEAR_TEXT_VALUE
|
||||
)
|
||||
if (service != null)
|
||||
try {
|
||||
service.send(
|
||||
DataPacket(
|
||||
dest,
|
||||
str.toByteArray(utf8),
|
||||
MeshProtos.Data.Type.CLEAR_TEXT_VALUE
|
||||
)
|
||||
)
|
||||
service.send(p)
|
||||
} catch (ex: RemoteException) {
|
||||
error = "Error: ${ex.message}"
|
||||
p.errorMessage = "Error: ${ex.message}"
|
||||
}
|
||||
else
|
||||
error = "Error: No Mesh service"
|
||||
p.errorMessage = "Error: No Mesh service"
|
||||
|
||||
addMessage(
|
||||
TextMessage(
|
||||
ui.nodeDB.myId.value!!,
|
||||
str,
|
||||
errorMessage = error
|
||||
)
|
||||
)
|
||||
addMessage(p)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue