2020-02-17 13:34:52 -08:00
|
|
|
package com.geeksville.mesh.model
|
|
|
|
|
|
2020-02-17 18:46:20 -08:00
|
|
|
import android.os.RemoteException
|
2020-04-08 09:53:04 -07:00
|
|
|
import androidx.lifecycle.MutableLiveData
|
2020-02-25 10:48:54 -08:00
|
|
|
import com.geeksville.android.BuildUtils.isEmulator
|
2020-02-17 13:34:52 -08:00
|
|
|
import com.geeksville.android.Logging
|
2020-04-19 11:47:34 -07:00
|
|
|
import com.geeksville.mesh.DataPacket
|
2020-02-17 18:46:20 -08:00
|
|
|
import com.geeksville.mesh.MeshProtos
|
|
|
|
|
import com.geeksville.mesh.utf8
|
2020-02-17 13:34:52 -08:00
|
|
|
import java.util.*
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* the model object for a text message
|
2020-02-17 15:39:49 -08:00
|
|
|
*
|
|
|
|
|
* if errorMessage is set then we had a problem sending this message
|
2020-02-17 13:34:52 -08:00
|
|
|
*/
|
2020-02-17 15:39:49 -08:00
|
|
|
data class TextMessage(
|
|
|
|
|
val from: String,
|
|
|
|
|
val text: String,
|
|
|
|
|
val date: Date = Date(),
|
|
|
|
|
val errorMessage: String? = null
|
2020-04-19 11:47:34 -07:00
|
|
|
) {
|
|
|
|
|
/// We can auto init from data packets
|
|
|
|
|
constructor(payload: DataPacket) : this(
|
2020-05-30 15:48:50 -07:00
|
|
|
payload.from!!,
|
|
|
|
|
payload.bytes!!.toString(utf8),
|
2020-04-19 11:47:34 -07:00
|
|
|
date = Date(payload.rxTime)
|
|
|
|
|
)
|
|
|
|
|
}
|
2020-02-17 13:34:52 -08:00
|
|
|
|
|
|
|
|
|
2020-04-08 09:53:04 -07:00
|
|
|
class MessagesState(private val ui: UIViewModel) : Logging {
|
|
|
|
|
private val testTexts = listOf(
|
2020-02-17 13:34:52 -08:00
|
|
|
TextMessage(
|
2020-02-17 13:46:13 -08:00
|
|
|
"+16508765310",
|
2020-02-17 13:34:52 -08:00
|
|
|
"I found the cache"
|
|
|
|
|
),
|
|
|
|
|
TextMessage(
|
2020-02-17 13:46:13 -08:00
|
|
|
"+16508765311",
|
2020-02-17 13:34:52 -08:00
|
|
|
"Help! I've fallen and I can't get up."
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// If the following (unused otherwise) line is commented out, the IDE preview window works.
|
|
|
|
|
// if left in the preview always renders as empty.
|
2020-04-08 09:53:04 -07:00
|
|
|
val messages =
|
|
|
|
|
object : MutableLiveData<List<TextMessage>>(if (isEmulator) testTexts else listOf()) {
|
|
|
|
|
|
|
|
|
|
}
|
2020-02-17 13:34:52 -08:00
|
|
|
|
2020-02-17 18:46:20 -08:00
|
|
|
/// add a message our GUI list of past msgs
|
2020-04-19 11:47:34 -07:00
|
|
|
private fun addMessage(m: TextMessage) {
|
|
|
|
|
// FIXME - don't just slam in a new list each time, it probably causes extra drawing.
|
2020-04-08 09:53:04 -07:00
|
|
|
messages.value = messages.value!! + m
|
2020-02-17 13:34:52 -08:00
|
|
|
}
|
2020-02-17 18:46:20 -08:00
|
|
|
|
2020-04-19 11:47:34 -07:00
|
|
|
/// Add a message that was encapsulated in a data packet
|
|
|
|
|
fun addMessage(payload: DataPacket) = addMessage(TextMessage(payload))
|
|
|
|
|
|
2020-02-17 18:46:20 -08:00
|
|
|
/// Send a message and added it to our GUI log
|
2020-05-30 15:48:50 -07:00
|
|
|
fun sendMessage(str: String, dest: String = DataPacket.ID_BROADCAST) {
|
2020-02-17 18:46:20 -08:00
|
|
|
var error: String? = null
|
2020-04-08 09:53:04 -07:00
|
|
|
val service = ui.meshService
|
2020-02-17 18:46:20 -08:00
|
|
|
if (service != null)
|
|
|
|
|
try {
|
2020-05-30 15:48:50 -07:00
|
|
|
service.send(
|
|
|
|
|
DataPacket(
|
|
|
|
|
dest,
|
|
|
|
|
str.toByteArray(utf8),
|
|
|
|
|
MeshProtos.Data.Type.CLEAR_TEXT_VALUE
|
|
|
|
|
)
|
2020-02-17 18:46:20 -08:00
|
|
|
)
|
|
|
|
|
} catch (ex: RemoteException) {
|
|
|
|
|
error = "Error: ${ex.message}"
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
error = "Error: No Mesh service"
|
|
|
|
|
|
2020-04-08 09:53:04 -07:00
|
|
|
addMessage(
|
2020-02-17 18:46:20 -08:00
|
|
|
TextMessage(
|
2020-04-08 09:53:04 -07:00
|
|
|
ui.nodeDB.myId.value!!,
|
2020-02-17 18:46:20 -08:00
|
|
|
str,
|
|
|
|
|
errorMessage = error
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
}
|
2020-02-17 13:34:52 -08:00
|
|
|
}
|