From 28337b1306a1bd81e376cb13d677bddb58239f23 Mon Sep 17 00:00:00 2001 From: Sweetbread Date: Wed, 5 Nov 2025 01:23:35 +0300 Subject: [PATCH] ref: async and thread stuff --- .../java/ru/risdeveau/pixeldragon/api/Room.kt | 37 +++++++++++-------- .../ru/risdeveau/pixeldragon/repo/Room.kt | 20 ++++++++-- .../ru/risdeveau/pixeldragon/repo/User.kt | 9 ++++- 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/ru/risdeveau/pixeldragon/api/Room.kt b/app/src/main/java/ru/risdeveau/pixeldragon/api/Room.kt index 09c166b..c7d165f 100755 --- a/app/src/main/java/ru/risdeveau/pixeldragon/api/Room.kt +++ b/app/src/main/java/ru/risdeveau/pixeldragon/api/Room.kt @@ -9,6 +9,8 @@ import io.ktor.client.request.bearerAuth import io.ktor.client.request.get import io.ktor.client.statement.bodyAsText import io.ktor.http.HttpStatusCode +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope import org.json.JSONObject import ru.risdeveau.pixeldragon.baseUrl import ru.risdeveau.pixeldragon.client @@ -58,21 +60,26 @@ suspend fun getRoom(rid: String, joined: Boolean? = null): Room { } } - val name = getState(rid, "m.room.name", "name") - val type = getState(rid, "m.room.create", "type") ?: "m.room" - val creator = getState(rid, "m.room.create", "creator") - val avatar = getState(rid, "m.room.avatar", "url") - return Room( - rid, - name, - type, - creator, - null, - avatar, - null, - joined ?: isJoined(rid), - if (directWith.isNotEmpty()) User.getById(directWith) else null - ) + return coroutineScope { + val name = async { getState(rid, "m.room.name", "name") } + val type = async { getState(rid, "m.room.create", "type") ?: "m.room" } + val creator = async { getState(rid, "m.room.create", "creator") } + val avatar = async { getState(rid, "m.room.avatar", "url") } + val joined = async { joined ?: isJoined(rid) } + val direct = async { if (directWith.isNotEmpty()) User.getById(directWith) else null } + + Room( + rid, + name.await(), + type.await(), + creator.await(), + null, + avatar.await(), + null, + joined.await(), + direct.await() + ) + } } private suspend fun getState(rid: String, state: String, key: String): String? { diff --git a/app/src/main/java/ru/risdeveau/pixeldragon/repo/Room.kt b/app/src/main/java/ru/risdeveau/pixeldragon/repo/Room.kt index ca73f2f..fe1c96b 100755 --- a/app/src/main/java/ru/risdeveau/pixeldragon/repo/Room.kt +++ b/app/src/main/java/ru/risdeveau/pixeldragon/repo/Room.kt @@ -5,6 +5,9 @@ package ru.risdeveau.pixeldragon.repo +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import ru.risdeveau.pixeldragon.api.getJoinedRooms import ru.risdeveau.pixeldragon.api.getRoom import ru.risdeveau.pixeldragon.db.cacheDb @@ -32,8 +35,10 @@ class Room ( (!cached or (cachedRoom == null) or (cachedRoom?.isExpired() == true)) ) { val room = getRoom(id) - val cacheRoom = room.toEntity() - cacheDb.roomDoa().insert(cacheRoom) + CoroutineScope(Dispatchers.IO).launch { + val cacheRoom = room.toEntity() + cacheDb.roomDoa().insert(cacheRoom) + } return room } return cachedRoom!!.toDomain() @@ -41,8 +46,15 @@ class Room ( suspend fun getJoined(cached: Boolean = true): List { val cacheJoined = cacheDb.roomDoa().getAllJoined() - if (!isConnected() and cacheJoined.isEmpty()) { - return getJoinedRooms() + if (isConnected() and + (!cached or cacheJoined.isEmpty() or (cacheJoined.any { it.isExpired() })) + ) { + val rooms = getJoinedRooms() + CoroutineScope(Dispatchers.IO).launch { + val roomsDb = List(rooms.size) { i -> rooms[i].toEntity() } + cacheDb.roomDoa().insert(*roomsDb.toTypedArray()) + } + return rooms } return List(cacheJoined.size) { i -> cacheJoined[i].toDomain() } } diff --git a/app/src/main/java/ru/risdeveau/pixeldragon/repo/User.kt b/app/src/main/java/ru/risdeveau/pixeldragon/repo/User.kt index 0cd9a7b..c45bf20 100755 --- a/app/src/main/java/ru/risdeveau/pixeldragon/repo/User.kt +++ b/app/src/main/java/ru/risdeveau/pixeldragon/repo/User.kt @@ -6,6 +6,9 @@ package ru.risdeveau.pixeldragon.repo import android.util.Log +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import org.json.JSONObject import ru.risdeveau.pixeldragon.api.getUserProfile import ru.risdeveau.pixeldragon.db.cacheDb @@ -23,7 +26,7 @@ class User ( companion object { suspend fun getById(id: String, cached: Boolean = true): User? { val cachedUser = cacheDb.userDoa().getById(id) - if (!isConnected() and + if (isConnected() and (!cached or (cachedUser == null) or (cachedUser?.isExpired() == true)) ) { val userProfile = getUserProfile(id) @@ -37,7 +40,9 @@ class User ( userProfile.avatarUrl, userProfile.other ) - cacheDb.userDoa().insert(user.toEntity()) + CoroutineScope(Dispatchers.IO).launch { + cacheDb.userDoa().insert(user.toEntity()) + } return user } return cachedUser!!.toDomain()