mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-02-14 23:18:43 +00:00
Fix back button intermittently not working in conversation view.
Co-authored-by: Greyson Parrelli <greyson@signal.org>
This commit is contained in:
committed by
Greyson Parrelli
parent
00b72c9263
commit
c565db812e
@@ -576,6 +576,7 @@ class ConversationFragment :
|
||||
private var keyboardEvents: KeyboardEvents? = null
|
||||
private var progressDialog: ProgressCardDialogFragment? = null
|
||||
private var firstPinRender: Boolean = true
|
||||
private var skipNextBackPressHandling: Boolean = false
|
||||
|
||||
private val jumpAndPulseScrollStrategy = object : ScrollToPositionDelegate.ScrollStrategy {
|
||||
override fun performScroll(recyclerView: RecyclerView, layoutManager: LinearLayoutManager, position: Int, smooth: Boolean) {
|
||||
@@ -973,7 +974,7 @@ class ConversationFragment :
|
||||
return viewModel.backPressedState.map {
|
||||
if (it.shouldHandleBackPressed()) {
|
||||
FragmentBackPressedInfo.Enabled({
|
||||
BackPressedCallback().handleOnBackPressed()
|
||||
handleBackPressed()
|
||||
})
|
||||
} else {
|
||||
FragmentBackPressedInfo.Disabled
|
||||
@@ -981,6 +982,31 @@ class ConversationFragment :
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleBackPressed() {
|
||||
if (skipNextBackPressHandling) {
|
||||
skipNextBackPressHandling = false
|
||||
return
|
||||
}
|
||||
|
||||
Log.d(TAG, "handleBackPressed()")
|
||||
val state = viewModel.backPressedState.value
|
||||
|
||||
when {
|
||||
state.isReactionDelegateShowing -> reactionDelegate.hide()
|
||||
state.isSearchRequested -> searchMenuItem?.collapseActionView()
|
||||
state.isInActionMode -> finishActionMode()
|
||||
state.isMediaKeyboardShowing -> container.hideInput()
|
||||
else -> {
|
||||
// State has changed since the back handler was enabled. Let the back press proceed
|
||||
// to the next handler by triggering onBackPressed again after setting a skip flag
|
||||
// to avoid infinite recursion.
|
||||
Log.d(TAG, "handleBackPressed() - state changed, forwarding back press")
|
||||
skipNextBackPressHandling = true
|
||||
requireActivity().onBackPressedDispatcher.onBackPressed()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//endregion
|
||||
|
||||
private fun startActionMode() {
|
||||
@@ -2672,18 +2698,7 @@ class ConversationFragment :
|
||||
|
||||
private inner class BackPressedCallback : OnBackPressedCallback(false) {
|
||||
override fun handleOnBackPressed() {
|
||||
Log.d(TAG, "onBackPressed()")
|
||||
val state = viewModel.backPressedState.value
|
||||
|
||||
if (state.isReactionDelegateShowing) {
|
||||
reactionDelegate.hide()
|
||||
} else if (state.isSearchRequested) {
|
||||
searchMenuItem?.collapseActionView()
|
||||
} else if (state.isInActionMode) {
|
||||
finishActionMode()
|
||||
} else if (state.isMediaKeyboardShowing) {
|
||||
container.hideInput()
|
||||
}
|
||||
handleBackPressed()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user