add last online indicator

master
dfsek 1 year ago
parent c7e0b86d94
commit d35a87d46c
  1. 20
      app/src/main/java/com/dfsek/feldspar/ui/RoomActivity.kt
  2. 8
      app/src/main/java/com/dfsek/feldspar/ui/SpacesUI.kt
  3. 2
      app/src/main/java/com/dfsek/feldspar/ui/rooms/DirectMessagesActivity.kt
  4. 2
      app/src/main/java/com/dfsek/feldspar/ui/rooms/GroupMessagesActivity.kt
  5. 44
      app/src/main/java/com/dfsek/feldspar/ui/rooms/RoomsUI.kt

@ -27,6 +27,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.clipToBounds
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.input.pointer.pointerInput
@ -48,6 +49,8 @@ import coil.request.ImageRequest
import com.dfsek.feldspar.AppState
import com.dfsek.feldspar.state.ChatRoomState
import com.dfsek.feldspar.ui.rooms.Avatar
import com.dfsek.feldspar.ui.rooms.LastOnline
import com.dfsek.feldspar.ui.rooms.OnlineIndicator
import com.dfsek.feldspar.util.*
import com.dfsek.feldspar.util.compose_fixes.FixedDefaultFlingBehavior.Companion.fixedFlingBehavior
import com.dfsek.feldspar.util.vector.multipicker.toContentAttachmentData
@ -217,7 +220,22 @@ class RoomActivity : AppCompatActivity() {
Box(modifier = Modifier.fillMaxSize()) {
var roomName by remember { mutableStateOf("") }
Column(modifier = Modifier.fillMaxSize()) {
TopBar(roomName, Modifier.statusBarsPadding(), isSelectionOpen)
DynamicContent(roomState.room, {roomState.room.getRoomSummaryLive()}) {
val summary = it.orElse { roomState.room.roomSummary()!! }
TopBar(modifier = Modifier.statusBarsPadding(), isSelectionOpen = isSelectionOpen) {
Row(modifier = Modifier.align(Alignment.Center)) {
if(summary.isDirect) {
OnlineIndicator(summary, 16.dp, modifier = Modifier.align(Alignment.CenterVertically))
Divider(color = Color.White.copy(alpha = 0f), modifier = Modifier.width(10.dp))
}
Text(roomName, fontSize = 24.sp, color = MaterialTheme.colors.onSurface)
if(summary.isDirect) {
Divider(color = Color.White.copy(alpha = 0f), modifier = Modifier.width(10.dp))
LastOnline(summary, 14.sp, Modifier.align(Alignment.CenterVertically))
}
}
}
}
RoomMessages(roomState, scrollState, Modifier.weight(1f))
UserInput(
onMessageSent = { content ->

@ -27,6 +27,7 @@ import com.dfsek.feldspar.AppState
import com.dfsek.feldspar.ui.rooms.Avatar
import com.dfsek.feldspar.ui.rooms.DirectMessagesActivity
import com.dfsek.feldspar.ui.rooms.GroupMessagesActivity
import com.dfsek.feldspar.ui.rooms.OnlineIndicator
import com.dfsek.feldspar.ui.settings.SettingsDropdown
import com.dfsek.feldspar.util.compose_fixes.FixedDefaultFlingBehavior
import com.dfsek.feldspar.util.getPreviewText
@ -165,15 +166,16 @@ fun BackButton(modifier: Modifier = Modifier, isSelectionOpen: MutableState<Bool
@Composable
fun Activity.TopBar(
name: String,
modifier: Modifier,
isSelectionOpen: MutableState<Boolean>
name: String = "",
isSelectionOpen: MutableState<Boolean>,
center: @Composable BoxScope.() -> Unit = {Text(name, fontSize = 24.sp, modifier = Modifier.align(Alignment.Center), color = MaterialTheme.colors.onSurface)}
) {
Box (modifier = modifier
.background(MaterialTheme.colors.surface)
.fillMaxWidth()) {
BackButton(modifier = Modifier.align(Alignment.CenterStart), isSelectionOpen)
Text(name, fontSize = 24.sp, modifier = Modifier.align(Alignment.Center), color = MaterialTheme.colors.onSurface)
center.invoke(this)
SettingsDropdown(modifier = Modifier.align(Alignment.CenterEnd))
}
}

@ -23,7 +23,7 @@ class DirectMessagesActivity : AppCompatActivity() {
Surface(modifier = Modifier.fillMaxSize()) {
val selectionUIOpen = remember { mutableStateOf(false) }
Column {
TopBar("Direct Messages", modifier = Modifier, selectionUIOpen)
TopBar(name = "Direct Messages", modifier = Modifier, isSelectionOpen = selectionUIOpen)
RoomList(remember { RoomSummaryQueryParams.Builder().build() }) {
val reversed = it.sortedBy { it.latestPreviewableEvent?.root?.originServerTs }.reversed()
reversed.filter { it.isDirect }

@ -24,7 +24,7 @@ class GroupMessagesActivity : AppCompatActivity() {
Surface(modifier = Modifier.fillMaxSize()) {
val selectionUIOpen = remember { mutableStateOf(false) }
Column {
TopBar("Group Messages", modifier = Modifier, selectionUIOpen)
TopBar(name = "Group Messages", modifier = Modifier, isSelectionOpen = selectionUIOpen)
RoomList(remember {
RoomSummaryQueryParams.Builder().apply { spaceFilter = SpaceFilter.OrphanRooms }.build()
}) {

@ -10,6 +10,7 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.Colors
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
@ -21,6 +22,8 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage
@ -36,6 +39,10 @@ import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import kotlin.math.floor
import kotlin.random.Random
import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.DurationUnit
import kotlin.time.ExperimentalTime
val colors = listOf(
@ -86,6 +93,34 @@ fun Avatar(mxUrl: String?, size: Int, clip: Shape = CircleShape, name: String? =
}
}
@Composable
fun OnlineIndicator(room: RoomSummary, size: Dp, modifier: Modifier = Modifier) {
val onlineColor = if (room.directUserPresence?.isCurrentlyActive == true) Color.Green else Color.Gray
Box(
modifier = modifier
.size(size)
.clip(CircleShape)
.background(onlineColor),
contentAlignment = Alignment.Center
) {
}
}
@Composable
fun LastOnline(room: RoomSummary, size: TextUnit, modifier: Modifier) {
room.directUserPresence?.lastActiveAgo?.let {
it.milliseconds.toComponents { days, hours, minutes, seconds, nanoseconds ->
if(days > 0) "$days D"
else if(hours > 0) "$hours H"
else if(minutes > 0) "$minutes M"
else if(seconds > 0) "$seconds S"
else null
}?.let {
Text(it, fontSize = size, color = MaterialTheme.colors.onSurface, modifier = modifier)
}
}
}
@Composable
fun Activity.RoomEntry(room: RoomSummary) {
Row(modifier = Modifier.clickable {
@ -98,17 +133,10 @@ fun Activity.RoomEntry(room: RoomSummary) {
Box {
Avatar(room.avatarUrl, AppState.Preferences.dmAvatarSize, name = room.displayName)
if (room.isDirect) {
val onlineColor = if (room.directUserPresence?.isCurrentlyActive == true) Color.Green else Color.Gray
Box(
modifier = Modifier.size((AppState.Preferences.dmAvatarSize * 0.25).dp).clip(CircleShape)
.background(onlineColor).align(Alignment.BottomEnd),
contentAlignment = Alignment.Center
) {
}
OnlineIndicator(room, (AppState.Preferences.dmAvatarSize * 0.25).dp, modifier = Modifier.align(Alignment.BottomEnd))
}
}
Column {
Text(name, fontSize = 18.sp)
Text(lastContent?.getPreviewText() ?: "", fontSize = 12.sp)

Loading…
Cancel
Save