kopia lustrzana https://github.com/meshtastic/Meshtastic-Android
begin making not ugly Messages view
rodzic
1a1847cd42
commit
0b8132ac00
1
TODO.md
1
TODO.md
|
@ -55,6 +55,7 @@ Do this "Signal app compatible" release relatively soon after the alpha release
|
||||||
# Medium priority
|
# Medium priority
|
||||||
Things for the betaish period.
|
Things for the betaish period.
|
||||||
|
|
||||||
|
* spend some quality power consumption tuning with https://developer.android.com/studio/profile/energy-profiler and https://developer.android.com/topic/performance/power/battery-historian
|
||||||
* only publish gps positions once every 5 mins while we are connected to our radio _and_ someone else is in the mesh
|
* only publish gps positions once every 5 mins while we are connected to our radio _and_ someone else is in the mesh
|
||||||
* Do PRIORITY_BALANCED_POWER_ACCURACY for our gps updates when no one in the mesh is nearer than 200 meters
|
* Do PRIORITY_BALANCED_POWER_ACCURACY for our gps updates when no one in the mesh is nearer than 200 meters
|
||||||
* fix slow rendering warnings in play console
|
* fix slow rendering warnings in play console
|
||||||
|
|
|
@ -17,10 +17,7 @@ import androidx.core.content.ContextCompat
|
||||||
import androidx.ui.core.setContent
|
import androidx.ui.core.setContent
|
||||||
import com.geeksville.android.Logging
|
import com.geeksville.android.Logging
|
||||||
import com.geeksville.mesh.service.*
|
import com.geeksville.mesh.service.*
|
||||||
import com.geeksville.mesh.ui.MeshApp
|
import com.geeksville.mesh.ui.*
|
||||||
import com.geeksville.mesh.ui.TextMessage
|
|
||||||
import com.geeksville.mesh.ui.UIState
|
|
||||||
import com.geeksville.mesh.ui.getInitials
|
|
||||||
import com.geeksville.util.exceptionReporter
|
import com.geeksville.util.exceptionReporter
|
||||||
import com.google.android.gms.auth.api.signin.GoogleSignIn
|
import com.google.android.gms.auth.api.signin.GoogleSignIn
|
||||||
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
|
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
|
||||||
|
@ -315,9 +312,10 @@ class MainActivity : AppCompatActivity(), Logging,
|
||||||
when (typ) {
|
when (typ) {
|
||||||
MeshProtos.Data.Type.CLEAR_TEXT_VALUE -> {
|
MeshProtos.Data.Type.CLEAR_TEXT_VALUE -> {
|
||||||
// FIXME - use the real time from the packet
|
// FIXME - use the real time from the packet
|
||||||
val modded = UIState.messages.value.toMutableList()
|
// FIXME - don't just slam in a new list each time, it probably causes extra drawing. Figure out how to be Compose smarter...
|
||||||
|
val modded = MessagesState.messages.value.toMutableList()
|
||||||
modded.add(TextMessage(Date(), sender, payload.toString(utf8)))
|
modded.add(TextMessage(Date(), sender, payload.toString(utf8)))
|
||||||
UIState.messages.value = modded
|
MessagesState.messages.value = modded
|
||||||
}
|
}
|
||||||
else -> TODO()
|
else -> TODO()
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,31 +48,6 @@ fun HomeContent() {
|
||||||
NodeInfoCard(it)
|
NodeInfoCard(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
UIState.messages.value.forEach {
|
|
||||||
Text("Text: ${it.text}")
|
|
||||||
}
|
|
||||||
|
|
||||||
val message = state { "text message" }
|
|
||||||
Surface(color = Color.Yellow) {
|
|
||||||
Row {
|
|
||||||
Clip(shape = RoundedCornerShape(15.dp)) {
|
|
||||||
Padding(padding = 15.dp) {
|
|
||||||
TextField(
|
|
||||||
value = message.value,
|
|
||||||
onValueChange = { message.value = it },
|
|
||||||
textStyle = TextStyle(
|
|
||||||
color = Color.DarkGray
|
|
||||||
),
|
|
||||||
imeAction = ImeAction.Send,
|
|
||||||
onImeActionPerformed = {
|
|
||||||
UILog.info("did IME action")
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val state = state { "fixme bob" }
|
val state = state { "fixme bob" }
|
||||||
Surface(color = Color.LightGray) {
|
Surface(color = Color.LightGray) {
|
||||||
Row {
|
Row {
|
||||||
|
@ -187,7 +162,7 @@ private fun AppContent(openDrawer: () -> Unit) {
|
||||||
|
|
||||||
VerticalScroller(modifier = LayoutFlexible(1f)) {
|
VerticalScroller(modifier = LayoutFlexible(1f)) {
|
||||||
when (screen) {
|
when (screen) {
|
||||||
Screen.messages -> HomeContent()
|
Screen.messages -> MessagesContent()
|
||||||
Screen.settings -> BTScanScreen()
|
Screen.settings -> BTScanScreen()
|
||||||
Screen.users -> HomeContent()
|
Screen.users -> HomeContent()
|
||||||
Screen.channel -> HomeContent()
|
Screen.channel -> HomeContent()
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
package com.geeksville.mesh.ui
|
||||||
|
|
||||||
|
import androidx.compose.Composable
|
||||||
|
import androidx.compose.mutableStateOf
|
||||||
|
import androidx.compose.state
|
||||||
|
import androidx.ui.core.Clip
|
||||||
|
import androidx.ui.core.Text
|
||||||
|
import androidx.ui.core.TextField
|
||||||
|
import androidx.ui.foundation.shape.corner.RoundedCornerShape
|
||||||
|
import androidx.ui.graphics.Color
|
||||||
|
import androidx.ui.input.ImeAction
|
||||||
|
import androidx.ui.layout.Column
|
||||||
|
import androidx.ui.layout.Padding
|
||||||
|
import androidx.ui.layout.Row
|
||||||
|
import androidx.ui.material.MaterialTheme
|
||||||
|
import androidx.ui.material.darkColorPalette
|
||||||
|
import androidx.ui.material.surface.Surface
|
||||||
|
import androidx.ui.text.TextStyle
|
||||||
|
import androidx.ui.tooling.preview.Preview
|
||||||
|
import androidx.ui.unit.dp
|
||||||
|
import com.geeksville.android.Logging
|
||||||
|
import com.geeksville.mesh.ui.MessagesState.messages
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
|
data class TextMessage(val date: Date, val from: String, val text: String)
|
||||||
|
|
||||||
|
|
||||||
|
object MessagesState : Logging {
|
||||||
|
val testTexts = listOf(
|
||||||
|
TextMessage(Date(), "+6508675310", "I found the cache"),
|
||||||
|
TextMessage(Date(), "+6508675311", "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.
|
||||||
|
val messages = mutableStateOf(MessagesState.testTexts)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun MessagesContent() {
|
||||||
|
Column {
|
||||||
|
|
||||||
|
Text("hi")
|
||||||
|
|
||||||
|
messages.value.forEach {
|
||||||
|
Text("Text: ${it.text}")
|
||||||
|
}
|
||||||
|
|
||||||
|
val message = state { "text message" }
|
||||||
|
Surface(color = Color.Yellow) {
|
||||||
|
Row {
|
||||||
|
Clip(shape = RoundedCornerShape(15.dp)) {
|
||||||
|
Padding(padding = 15.dp) {
|
||||||
|
TextField(
|
||||||
|
value = message.value,
|
||||||
|
onValueChange = { message.value = it },
|
||||||
|
textStyle = TextStyle(
|
||||||
|
color = Color.DarkGray
|
||||||
|
),
|
||||||
|
imeAction = ImeAction.Send,
|
||||||
|
onImeActionPerformed = {
|
||||||
|
MessagesState.info("did IME action")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Composable
|
||||||
|
fun previewMessagesView() {
|
||||||
|
// another bug? It seems modaldrawerlayout not yet supported in preview
|
||||||
|
MaterialTheme(colors = darkColorPalette()) {
|
||||||
|
MessagesContent()
|
||||||
|
}
|
||||||
|
}
|
|
@ -45,7 +45,11 @@ fun CompassHeading(modifier: Modifier1 = Modifier1.None, node: NodeInfo) {
|
||||||
@Composable
|
@Composable
|
||||||
fun NodeHeading(node: NodeInfo) {
|
fun NodeHeading(node: NodeInfo) {
|
||||||
ProvideEmphasis(emphasis = EmphasisLevels().high) {
|
ProvideEmphasis(emphasis = EmphasisLevels().high) {
|
||||||
Text(node.user?.longName ?: "unknown", style = MaterialTheme.typography().subtitle1)
|
Text(
|
||||||
|
node.user?.longName ?: "unknown",
|
||||||
|
style = MaterialTheme.typography().subtitle1
|
||||||
|
//modifier = LayoutWidth.Fill
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ import androidx.compose.Model
|
||||||
import androidx.compose.mutableStateOf
|
import androidx.compose.mutableStateOf
|
||||||
import com.geeksville.mesh.*
|
import com.geeksville.mesh.*
|
||||||
import com.google.android.gms.auth.api.signin.GoogleSignInClient
|
import com.google.android.gms.auth.api.signin.GoogleSignInClient
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
|
|
||||||
data class ScreenInfo(val icon: Int, val label: String)
|
data class ScreenInfo(val icon: Int, val label: String)
|
||||||
|
@ -24,8 +23,6 @@ object AppStatus {
|
||||||
var currentScreen: ScreenInfo = Screen.messages
|
var currentScreen: ScreenInfo = Screen.messages
|
||||||
}
|
}
|
||||||
|
|
||||||
data class TextMessage(val date: Date, val from: String, val text: String)
|
|
||||||
|
|
||||||
/// FIXME - figure out how to merge this staate with the AppStatus Model
|
/// FIXME - figure out how to merge this staate with the AppStatus Model
|
||||||
object UIState {
|
object UIState {
|
||||||
|
|
||||||
|
@ -66,16 +63,10 @@ object UIState {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val testTexts = listOf(
|
|
||||||
TextMessage(Date(), "+6508675310", "I found the cache"),
|
|
||||||
TextMessage(Date(), "+6508675311", "Help! I've fallen and I can't get up.")
|
|
||||||
)
|
|
||||||
|
|
||||||
/// A map from nodeid to to nodeinfo
|
/// A map from nodeid to to nodeinfo
|
||||||
val nodes = mutableStateOf(testNodes.map { it.user!!.id to it }.toMap())
|
val nodes = mutableStateOf(testNodes.map { it.user!!.id to it }.toMap())
|
||||||
|
|
||||||
val messages = mutableStateOf(testTexts)
|
|
||||||
|
|
||||||
/// Are we connected to our radio device
|
/// Are we connected to our radio device
|
||||||
val isConnected = mutableStateOf(false)
|
val isConnected = mutableStateOf(false)
|
||||||
|
|
||||||
|
|
|
@ -11,17 +11,28 @@ import androidx.ui.layout.Container
|
||||||
import androidx.ui.layout.LayoutSize
|
import androidx.ui.layout.LayoutSize
|
||||||
import androidx.ui.material.ripple.Ripple
|
import androidx.ui.material.ripple.Ripple
|
||||||
import androidx.ui.res.vectorResource
|
import androidx.ui.res.vectorResource
|
||||||
|
import androidx.ui.unit.dp
|
||||||
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun VectorImageButton(@DrawableRes id: Int, onClick: () -> Unit) {
|
fun VectorImageButton(@DrawableRes id: Int, onClick: () -> Unit) {
|
||||||
Ripple(bounded = false) {
|
Ripple(bounded = false) {
|
||||||
Clickable(onClick = onClick) {
|
Clickable(onClick = onClick) {
|
||||||
VectorImage(id = id)
|
VectorImage(id = id, modifier = LayoutSize(40.dp, 40.dp))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* fun AppBarIcon(icon: Image, onClick: () -> Unit) {
|
||||||
|
Container(width = ActionIconDiameter, height = ActionIconDiameter) {
|
||||||
|
Ripple(bounded = false) {
|
||||||
|
Clickable(onClick = onClick) {
|
||||||
|
SimpleImage(icon)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun VectorImage(
|
fun VectorImage(
|
||||||
modifier: Modifier = Modifier.None, @DrawableRes id: Int,
|
modifier: Modifier = Modifier.None, @DrawableRes id: Int,
|
||||||
|
|
Ładowanie…
Reference in New Issue