Handle disconnection on resuming ChatActivity

This commit is contained in:
Matéo Duparc 2021-06-04 12:14:21 +02:00
parent ccb32b7fb6
commit 124182c66d
Signed by: hardcoresushi
GPG Key ID: 007F84120107191E
2 changed files with 52 additions and 43 deletions

View File

@ -91,60 +91,67 @@ class ChatActivity : ServiceBoundActivity() {
val binder = service as AIRAService.AIRABinder val binder = service as AIRAService.AIRABinder
airaService = binder.getService() airaService = binder.getService()
chatAdapter.clear() val session = airaService.sessions[sessionId]
val contact = airaService.contacts[sessionId] val contact = airaService.contacts[sessionId]
val avatar = if (contact == null) { if (session == null && contact == null) { //may happen when resuming activity after session disconnect
displayIconTrustLevel(false, false) onDisconnected()
sessionName = airaService.savedNames[sessionId]
airaService.savedAvatars[sessionId]
} else { } else {
displayIconTrustLevel(true, contact.verified) chatAdapter.clear()
sessionName = contact.name val avatar = if (contact == null) {
contact.avatar displayIconTrustLevel(false, false)
} sessionName = airaService.savedNames[sessionId]
val ipName = sessionName ?: airaService.sessions[sessionId]!!.ip airaService.savedAvatars[sessionId]
binding.toolbar.title.text = ipName } else {
if (avatar == null) { displayIconTrustLevel(true, contact.verified)
binding.toolbar.avatar.setTextAvatar(sessionName) sessionName = contact.name
} else { contact.avatar
AIRADatabase.loadAvatar(avatar)?.let { image ->
this@ChatActivity.avatar = image
binding.toolbar.avatar.setImageAvatar(image)
} }
} val ipName = sessionName ?: airaService.sessions[sessionId]!!.ip
if (contact != null) { binding.toolbar.title.text = ipName
loadMsgs(contact.uuid) if (avatar == null) {
} binding.toolbar.avatar.setTextAvatar(sessionName)
airaService.savedMsgs[sessionId]?.let { } else {
for (chatItem in it.asReversed()) { AIRADatabase.loadAvatar(avatar)?.let { image ->
chatAdapter.newLoadedMessage(chatItem) this@ChatActivity.avatar = image
binding.toolbar.avatar.setImageAvatar(image)
}
} }
} if (contact != null) {
airaService.receiveFileTransfers[sessionId]?.let { loadMsgs(contact.uuid)
if (it.shouldAsk) {
it.ask(this@ChatActivity, ipName)
} }
} airaService.savedMsgs[sessionId]?.let {
binding.recyclerChat.smoothScrollToPosition(chatAdapter.itemCount) for (chatItem in it.asReversed()) {
val showBottomPanel = { chatAdapter.newLoadedMessage(chatItem)
binding.bottomPanel.visibility = View.VISIBLE }
}
airaService.receiveFileTransfers[sessionId]?.let {
if (it.shouldAsk) {
it.ask(this@ChatActivity, ipName)
}
}
binding.recyclerChat.smoothScrollToPosition(chatAdapter.itemCount)
if (airaService.isOnline(sessionId)) {
binding.bottomPanel.visibility = View.VISIBLE
binding.recyclerChat.updatePadding(bottom = 0)
} else {
onDisconnected()
}
airaService.setSeen(sessionId, true)
} }
airaService.uiCallbacks = object : AIRAService.UiCallbacks { airaService.uiCallbacks = object : AIRAService.UiCallbacks {
override fun onConnectFailed(ip: String, errorMsg: String?) {} override fun onConnectFailed(ip: String, errorMsg: String?) {}
override fun onNewSession(sessionId: Int, ip: String) { override fun onNewSession(sessionId: Int, ip: String) {
if (this@ChatActivity.sessionId == sessionId) { if (this@ChatActivity.sessionId == sessionId) {
runOnUiThread { runOnUiThread {
showBottomPanel() binding.bottomPanel.visibility = View.VISIBLE
invalidateOptionsMenu()
} }
} }
} }
override fun onSessionDisconnect(sessionId: Int) { override fun onSessionDisconnect(sessionId: Int) {
if (this@ChatActivity.sessionId == sessionId) { if (this@ChatActivity.sessionId == sessionId) {
runOnUiThread { runOnUiThread {
val inputManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager onDisconnected()
inputManager.hideSoftInputFromWindow(binding.editMessage.windowToken, 0)
binding.bottomPanel.visibility = View.GONE
invalidateOptionsMenu()
} }
} }
} }
@ -197,17 +204,19 @@ class ChatActivity : ServiceBoundActivity() {
} }
} }
airaService.isAppInBackground = false airaService.isAppInBackground = false
if (airaService.isOnline(sessionId)) {
showBottomPanel()
binding.recyclerChat.updatePadding(bottom = 0)
}
airaService.setSeen(sessionId, true)
} }
override fun onServiceDisconnected(name: ComponentName?) {} override fun onServiceDisconnected(name: ComponentName?) {}
} }
} }
} }
private fun onDisconnected() {
val inputManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager.hideSoftInputFromWindow(binding.editMessage.windowToken, 0)
binding.bottomPanel.visibility = View.GONE
invalidateOptionsMenu()
}
private fun displayIconTrustLevel(isContact: Boolean, isVerified: Boolean) { private fun displayIconTrustLevel(isContact: Boolean, isVerified: Boolean) {
val setResource = fun (imageView: ImageView, resource: Int?) { val setResource = fun (imageView: ImageView, resource: Int?) {
imageView.apply { imageView.apply {

View File

@ -22,7 +22,7 @@ class ChatAdapter(
): RecyclerView.Adapter<RecyclerView.ViewHolder>() { ): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
companion object { companion object {
const val CONTAINER_MARGIN = 70 const val CONTAINER_MARGIN = 150
const val BUBBLE_HORIZONTAL_PADDING = 40 const val BUBBLE_HORIZONTAL_PADDING = 40
} }