hardened view binding interaction

...in case of asynchronous UI interaction with already destroyed UI

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
This commit is contained in:
Andy Scherzinger 2021-06-01 13:37:58 +02:00
parent 7b7eaa455d
commit 40a08394bc
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B
2 changed files with 29 additions and 9 deletions

View File

@ -267,12 +267,18 @@ class ChatController(args: Bundle) :
loadAvatarForStatusBar() loadAvatarForStatusBar()
setTitle() setTitle()
setupMentionAutocomplete() try {
checkReadOnlyState() setupMentionAutocomplete()
checkLobbyState() checkReadOnlyState()
checkLobbyState()
if (!inConversation) { if (!inConversation) {
joinRoomWithPassword() joinRoomWithPassword()
}
} catch (npe: NullPointerException) {
// view binding can be null
// since this is called asynchrously and UI might have been destroyed in the meantime
Log.i(TAG, "UI destroyed - view binding already gone")
} }
} }
@ -559,7 +565,7 @@ class ChatController(args: Bundle) :
} }
private fun checkReadOnlyState() { private fun checkReadOnlyState() {
if (currentConversation != null) { if (currentConversation != null && isAlive()) {
if (currentConversation?.shouldShowLobby(conversationUser) ?: false || if (currentConversation?.shouldShowLobby(conversationUser) ?: false ||
currentConversation?.conversationReadOnlyState != null && currentConversation?.conversationReadOnlyState != null &&
currentConversation?.conversationReadOnlyState == currentConversation?.conversationReadOnlyState ==
@ -589,7 +595,10 @@ class ChatController(args: Bundle) :
} }
private fun checkLobbyState() { private fun checkLobbyState() {
if (currentConversation != null && currentConversation?.isLobbyViewApplicable(conversationUser) ?: false) { if (currentConversation != null &&
currentConversation?.isLobbyViewApplicable(conversationUser) ?: false &&
isAlive()
) {
if (!checkingLobbyStatus) { if (!checkingLobbyStatus) {
getRoomInfo() getRoomInfo()
@ -773,7 +782,7 @@ class ChatController(args: Bundle) :
} }
private fun setupMentionAutocomplete() { private fun setupMentionAutocomplete() {
if (!isDestroyed && !isBeingDestroyed) { if (isAlive()) {
val elevation = 6f val elevation = 6f
resources?.let { resources?.let {
val backgroundDrawable = ColorDrawable(it.getColor(R.color.bg_default)) val backgroundDrawable = ColorDrawable(it.getColor(R.color.bg_default))
@ -968,7 +977,14 @@ class ChatController(args: Bundle) :
currentConversation?.sessionId currentConversation?.sessionId
setupWebsocket() setupWebsocket()
checkLobbyState()
try {
checkLobbyState()
} catch (npe: NullPointerException) {
// view binding can be null
// since this is called asynchrously and UI might have been destroyed in the meantime
Log.i(TAG, "UI destroyed - view binding already gone")
}
if (isFirstMessagesProcessing) { if (isFirstMessagesProcessing) {
pullChatMessages(0) pullChatMessages(0)

View File

@ -101,6 +101,10 @@ abstract class NewBaseController(@LayoutRes var layoutRes: Int, args: Bundle? =
cleanTempCertPreference() cleanTempCertPreference()
} }
fun isAlive(): Boolean {
return !isDestroyed && !isBeingDestroyed
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup, container: ViewGroup,