ref: caching joined rooms
This commit is contained in:
@@ -24,16 +24,25 @@ import ru.risdeveau.pixeldragon.token
|
|||||||
//
|
//
|
||||||
//}
|
//}
|
||||||
|
|
||||||
suspend fun getRooms(): List<String> {
|
suspend fun getJoinedRooms(): List<Room> {
|
||||||
|
val r = client.get("$baseUrl/joined_rooms")
|
||||||
|
{ bearerAuth(token) }
|
||||||
|
val rooms = JSONObject(r.bodyAsText()).getJSONArray("joined_rooms")
|
||||||
|
return List(
|
||||||
|
rooms.length()
|
||||||
|
) { i -> getRoom(rooms.getString(i), true) }
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun isJoined(id: String): Boolean {
|
||||||
val r = client.get("$baseUrl/joined_rooms")
|
val r = client.get("$baseUrl/joined_rooms")
|
||||||
{ bearerAuth(token) }
|
{ bearerAuth(token) }
|
||||||
val rooms = JSONObject(r.bodyAsText()).getJSONArray("joined_rooms")
|
val rooms = JSONObject(r.bodyAsText()).getJSONArray("joined_rooms")
|
||||||
return List<String>(
|
return List<String>(
|
||||||
rooms.length()
|
rooms.length()
|
||||||
) { i -> rooms.getString(i) }
|
) { i -> rooms.getString(i) }.contains(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun getRoom(rid: String): Room {
|
suspend fun getRoom(rid: String, joined: Boolean? = null): Room {
|
||||||
val direct = getAccountData(getMe()!!.userId, "m.direct")
|
val direct = getAccountData(getMe()!!.userId, "m.direct")
|
||||||
var directWith = ""
|
var directWith = ""
|
||||||
direct?.let {
|
direct?.let {
|
||||||
@@ -61,7 +70,7 @@ suspend fun getRoom(rid: String): Room {
|
|||||||
null,
|
null,
|
||||||
avatar,
|
avatar,
|
||||||
null,
|
null,
|
||||||
true, // TODO: insert actual value
|
joined ?: isJoined(rid),
|
||||||
if (directWith.isNotEmpty()) User.getById(directWith) else null
|
if (directWith.isNotEmpty()) User.getById(directWith) else null
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package ru.risdeveau.pixeldragon.repo
|
package ru.risdeveau.pixeldragon.repo
|
||||||
|
|
||||||
|
import ru.risdeveau.pixeldragon.api.getJoinedRooms
|
||||||
import ru.risdeveau.pixeldragon.api.getRoom
|
import ru.risdeveau.pixeldragon.api.getRoom
|
||||||
import ru.risdeveau.pixeldragon.db.cacheDb
|
import ru.risdeveau.pixeldragon.db.cacheDb
|
||||||
import ru.risdeveau.pixeldragon.db.isExpired
|
import ru.risdeveau.pixeldragon.db.isExpired
|
||||||
@@ -34,5 +35,13 @@ class Room (
|
|||||||
}
|
}
|
||||||
return cachedRoom!!.toDomain()
|
return cachedRoom!!.toDomain()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun getJoined(cached: Boolean = true): List<Room> {
|
||||||
|
val cacheJoined = cacheDb.roomDoa().getAllJoined()
|
||||||
|
if (cacheJoined.isEmpty()) {
|
||||||
|
return getJoinedRooms()
|
||||||
|
}
|
||||||
|
return List(cacheJoined.size) { i -> cacheJoined[i].toDomain() }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -86,7 +86,7 @@ fun EventItem(event: Event) {
|
|||||||
"m.room.message" -> Column(
|
"m.room.message" -> Column(
|
||||||
Modifier
|
Modifier
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.then (
|
.then(
|
||||||
if (event.sender != ME!!.userId)
|
if (event.sender != ME!!.userId)
|
||||||
Modifier.padding(end = 16.dp)
|
Modifier.padding(end = 16.dp)
|
||||||
else
|
else
|
||||||
@@ -106,8 +106,11 @@ fun EventItem(event: Event) {
|
|||||||
|
|
||||||
when (val msgtype = event.content.optString("msgtype", null)) {
|
when (val msgtype = event.content.optString("msgtype", null)) {
|
||||||
"m.text" -> when (event.content.optString("format")) {
|
"m.text" -> when (event.content.optString("format")) {
|
||||||
"org.matrix.custom.html" ->
|
"org.matrix.custom.html" -> {
|
||||||
|
if (event.content.getString("body") == event.content.getString("formatted_body"))
|
||||||
|
Text(event.content.getString("body"))
|
||||||
HtmlRenderer(event.content.getString("formatted_body"))
|
HtmlRenderer(event.content.getString("formatted_body"))
|
||||||
|
}
|
||||||
|
|
||||||
else -> Text(event.content.getString("body"))
|
else -> Text(event.content.getString("body"))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import androidx.compose.foundation.lazy.items
|
|||||||
import androidx.compose.foundation.lazy.rememberLazyListState
|
import androidx.compose.foundation.lazy.rememberLazyListState
|
||||||
import androidx.compose.foundation.shape.CircleShape
|
import androidx.compose.foundation.shape.CircleShape
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
import androidx.compose.material3.LinearProgressIndicator
|
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
@@ -29,17 +28,17 @@ import androidx.compose.runtime.remember
|
|||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
|
import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.navigation.NavController
|
import androidx.navigation.NavController
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import ru.risdeveau.pixeldragon.api.getRooms
|
|
||||||
import ru.risdeveau.pixeldragon.repo.Room
|
import ru.risdeveau.pixeldragon.repo.Room
|
||||||
import ru.risdeveau.pixeldragon.ui.item.MXCImage
|
import ru.risdeveau.pixeldragon.ui.item.MXCImage
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun RoomList(modifier: Modifier = Modifier, navController: NavController) {
|
fun RoomList(modifier: Modifier = Modifier, navController: NavController) {
|
||||||
var list by remember { mutableStateOf(listOf<String>()) }
|
var list by remember { mutableStateOf(listOf<Room>()) }
|
||||||
val listState = rememberLazyListState()
|
val listState = rememberLazyListState()
|
||||||
|
|
||||||
// if (itemState.scrollToTop) {
|
// if (itemState.scrollToTop) {
|
||||||
@@ -50,12 +49,12 @@ fun RoomList(modifier: Modifier = Modifier, navController: NavController) {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
list = withContext(Dispatchers.IO) { getRooms() }
|
list = withContext(Dispatchers.IO) { Room.getJoined() }
|
||||||
}
|
}
|
||||||
|
|
||||||
LazyColumn(modifier = modifier, state = listState) {
|
LazyColumn(modifier = modifier, state = listState) {
|
||||||
items(list) { rid ->
|
items(list) { room ->
|
||||||
RoomItem(rid = rid, navController = navController )
|
RoomItem(room = room, navController = navController )
|
||||||
}
|
}
|
||||||
|
|
||||||
item {
|
item {
|
||||||
@@ -67,72 +66,53 @@ fun RoomList(modifier: Modifier = Modifier, navController: NavController) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun RoomItem(modifier: Modifier = Modifier, rid: String, navController: NavController) {
|
fun RoomItem(modifier: Modifier = Modifier, room: Room, navController: NavController) {
|
||||||
var room by remember { mutableStateOf<Room?>(null) }
|
val avatarUrl = room.avatarUrl ?: (room.direct?.avatarUrl ?: "")
|
||||||
|
val name = room.name ?: (room.direct?.name ?: "Unnamed")
|
||||||
|
|
||||||
LaunchedEffect(Unit) {
|
Row(
|
||||||
room = withContext(Dispatchers.IO) { Room.getById(rid) }
|
modifier
|
||||||
}
|
.padding(8.dp)
|
||||||
|
.height((52 + 8 * 2).dp)
|
||||||
if (room != null) {
|
.fillMaxWidth()
|
||||||
val room = room!!
|
.background(
|
||||||
val avatarUrl = room.avatarUrl ?: (room.direct?.avatarUrl ?: "")
|
color =
|
||||||
|
|
||||||
Row(
|
|
||||||
modifier
|
|
||||||
.padding(8.dp)
|
|
||||||
.height((52 + 8 * 2).dp)
|
|
||||||
.fillMaxWidth()
|
|
||||||
.background(
|
|
||||||
color =
|
|
||||||
if (room.type == "m.space")
|
|
||||||
MaterialTheme.colorScheme.tertiary
|
|
||||||
else
|
|
||||||
MaterialTheme.colorScheme.background
|
|
||||||
)
|
|
||||||
.clip(RoundedCornerShape(12.dp))
|
|
||||||
.clickable {
|
|
||||||
if (room.type == "m.space")
|
if (room.type == "m.space")
|
||||||
navController.navigate("space/$rid")
|
MaterialTheme.colorScheme.tertiary
|
||||||
else
|
else
|
||||||
navController.navigate("room/$rid")
|
MaterialTheme.colorScheme.background
|
||||||
}
|
|
||||||
.padding(8.dp)
|
|
||||||
) {
|
|
||||||
MXCImage(
|
|
||||||
avatarUrl,
|
|
||||||
modifier = Modifier
|
|
||||||
.padding(end = 4.dp)
|
|
||||||
.height(52.dp)
|
|
||||||
.width(52.dp)
|
|
||||||
.let {
|
|
||||||
if (room.type == "m.space")
|
|
||||||
it.clip(RoundedCornerShape(12.dp))
|
|
||||||
else
|
|
||||||
it.clip(CircleShape)
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
Column {
|
.clip(RoundedCornerShape(12.dp))
|
||||||
Text(room.type)
|
.clickable {
|
||||||
Text(
|
if (room.type == "m.space")
|
||||||
room.name ?: "Unnamed",
|
navController.navigate("space/${room.id}")
|
||||||
maxLines = 1,
|
else
|
||||||
color = MaterialTheme.colorScheme.primary,
|
navController.navigate("room/${room.id}")
|
||||||
fontSize = MaterialTheme.typography.titleLarge.fontSize
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
.padding(8.dp)
|
||||||
} else {
|
) {
|
||||||
Row(
|
MXCImage(
|
||||||
modifier
|
avatarUrl,
|
||||||
.padding(8.dp)
|
modifier = Modifier
|
||||||
.height(80.dp)
|
.padding(end = 4.dp)
|
||||||
.fillMaxWidth()
|
.height(52.dp)
|
||||||
.background(MaterialTheme.colorScheme.background)
|
.width(52.dp)
|
||||||
.clip(RoundedCornerShape(16.dp))
|
.let {
|
||||||
.padding(8.dp)
|
if (room.type == "m.space")
|
||||||
) {
|
it.clip(RoundedCornerShape(12.dp))
|
||||||
LinearProgressIndicator(Modifier.fillMaxWidth())
|
else
|
||||||
|
it.clip(CircleShape)
|
||||||
|
},
|
||||||
|
ContentScale.Crop
|
||||||
|
)
|
||||||
|
Column {
|
||||||
|
Text(room.type)
|
||||||
|
Text(
|
||||||
|
name,
|
||||||
|
maxLines = 1,
|
||||||
|
color = MaterialTheme.colorScheme.primary,
|
||||||
|
fontSize = MaterialTheme.typography.titleLarge.fontSize
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user