android: Fix of StackoverflowError (#1322)

* android: Fix of StackoverflowError

* Break

* Comment

* Update apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt

* Revert "Update apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt"

This reverts commit ea8015e01d.

Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
This commit is contained in:
Stanislav Dmitrenko 2022-11-11 16:33:45 +03:00 committed by GitHub
parent adfe20b54c
commit c8b2bcb064
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -264,8 +264,20 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a
private fun startReceiver() { private fun startReceiver() {
Log.d(TAG, "ChatController startReceiver") Log.d(TAG, "ChatController startReceiver")
if (receiverStarted) return if (receiverStarted) return
thread(name="receiver") { receiverStarted = true
GlobalScope.launch { withContext(Dispatchers.IO) { recvMspLoop() } } CoroutineScope(Dispatchers.IO).launch {
while (true) {
/** Global [ctrl] can be null. It's needed for having the same [ChatModel] that already made in [ChatController] without the need
* to change it everywhere in code after changing a database.
* Since it can be changed in background thread, making this check to prevent NullPointerException */
val ctrl = ctrl
if (ctrl == null) {
receiverStarted = false
break
}
val msg = recvMsg(ctrl)
if (msg != null) processReceivedMsg(msg)
}
} }
} }
@ -291,26 +303,18 @@ open class ChatController(var ctrl: ChatCtrl?, val ntfManager: NtfManager, val a
} }
} }
private suspend fun recvMsg(ctrl: ChatCtrl): CR? { private fun recvMsg(ctrl: ChatCtrl): CR? {
return withContext(Dispatchers.IO) { val json = chatRecvMsgWait(ctrl, MESSAGE_TIMEOUT)
val json = chatRecvMsgWait(ctrl, MESSAGE_TIMEOUT) return if (json == "") {
if (json == "") { null
null } else {
} else { val r = APIResponse.decodeStr(json).resp
val r = APIResponse.decodeStr(json).resp Log.d(TAG, "chatRecvMsg: ${r.responseType}")
Log.d(TAG, "chatRecvMsg: ${r.responseType}") if (r is CR.Response || r is CR.Invalid) Log.d(TAG, "chatRecvMsg json: $json")
if (r is CR.Response || r is CR.Invalid) Log.d(TAG, "chatRecvMsg json: $json") r
r
}
} }
} }
private suspend fun recvMspLoop() {
val msg = recvMsg(ctrl ?: return)
if (msg != null) processReceivedMsg(msg)
recvMspLoop()
}
suspend fun apiGetActiveUser(): User? { suspend fun apiGetActiveUser(): User? {
val r = sendCmd(CC.ShowActiveUser()) val r = sendCmd(CC.ShowActiveUser())
if (r is CR.ActiveUser) return r.user if (r is CR.ActiveUser) return r.user