|
|
|
@ -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) |
|
|
|
|