mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-02-15 07:28:30 +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 keyboardEvents: KeyboardEvents? = null
|
||||||
private var progressDialog: ProgressCardDialogFragment? = null
|
private var progressDialog: ProgressCardDialogFragment? = null
|
||||||
private var firstPinRender: Boolean = true
|
private var firstPinRender: Boolean = true
|
||||||
|
private var skipNextBackPressHandling: Boolean = false
|
||||||
|
|
||||||
private val jumpAndPulseScrollStrategy = object : ScrollToPositionDelegate.ScrollStrategy {
|
private val jumpAndPulseScrollStrategy = object : ScrollToPositionDelegate.ScrollStrategy {
|
||||||
override fun performScroll(recyclerView: RecyclerView, layoutManager: LinearLayoutManager, position: Int, smooth: Boolean) {
|
override fun performScroll(recyclerView: RecyclerView, layoutManager: LinearLayoutManager, position: Int, smooth: Boolean) {
|
||||||
@@ -973,7 +974,7 @@ class ConversationFragment :
|
|||||||
return viewModel.backPressedState.map {
|
return viewModel.backPressedState.map {
|
||||||
if (it.shouldHandleBackPressed()) {
|
if (it.shouldHandleBackPressed()) {
|
||||||
FragmentBackPressedInfo.Enabled({
|
FragmentBackPressedInfo.Enabled({
|
||||||
BackPressedCallback().handleOnBackPressed()
|
handleBackPressed()
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
FragmentBackPressedInfo.Disabled
|
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
|
//endregion
|
||||||
|
|
||||||
private fun startActionMode() {
|
private fun startActionMode() {
|
||||||
@@ -2672,18 +2698,7 @@ class ConversationFragment :
|
|||||||
|
|
||||||
private inner class BackPressedCallback : OnBackPressedCallback(false) {
|
private inner class BackPressedCallback : OnBackPressedCallback(false) {
|
||||||
override fun handleOnBackPressed() {
|
override fun handleOnBackPressed() {
|
||||||
Log.d(TAG, "onBackPressed()")
|
handleBackPressed()
|
||||||
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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user