Skip to content

Commit

Permalink
Merge pull request #775 from arkivanov/disable-input-during-predictiv…
Browse files Browse the repository at this point in the history
…e-back-animation

Disable input during predictive back animation
  • Loading branch information
arkivanov authored Sep 7, 2024
2 parents 43ef0e1 + e7c597f commit 365b434
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInput
import com.arkivanov.decompose.Child
import com.arkivanov.decompose.ExperimentalDecomposeApi
import com.arkivanov.decompose.extensions.compose.utils.InputConsumingOverlay
import com.arkivanov.decompose.router.stack.ChildStack

@OptIn(ExperimentalDecomposeApi::class)
Expand Down Expand Up @@ -56,25 +56,11 @@ internal abstract class AbstractStackAnimation<C : Any, T : Any>(
// A workaround until https://issuetracker.google.com/issues/214231672.
// Normally only the exiting child should be disabled.
if (disableInputDuringAnimation && (items.size > 1)) {
Overlay(modifier = Modifier.matchParentSize())
InputConsumingOverlay(modifier = Modifier.matchParentSize())
}
}
}

@Composable
private fun Overlay(modifier: Modifier) {
Box(
modifier = modifier.pointerInput(Unit) {
awaitPointerEventScope {
while (true) {
val event = awaitPointerEvent()
event.changes.forEach { it.consume() }
}
}
}
)
}

private fun getAnimationItems(newStack: ChildStack<C, T>, oldStack: ChildStack<C, T>?): Map<Any, AnimationItem<C, T>> =
when {
oldStack == null ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import com.arkivanov.decompose.Ref
import com.arkivanov.decompose.extensions.compose.stack.animation.LocalStackAnimationProvider
import com.arkivanov.decompose.extensions.compose.stack.animation.StackAnimation
import com.arkivanov.decompose.extensions.compose.stack.animation.emptyStackAnimation
import com.arkivanov.decompose.extensions.compose.utils.InputConsumingOverlay
import com.arkivanov.decompose.router.stack.ChildStack
import com.arkivanov.essenty.backhandler.BackCallback
import com.arkivanov.essenty.backhandler.BackEvent
Expand Down Expand Up @@ -95,6 +96,10 @@ private class PredictiveBackAnimation<C : Any, T : Any>(
)
}
}

if (handler.items.size > 1) {
InputConsumingOverlay(modifier = Modifier.matchParentSize())
}
}

if (stack.backStack.isNotEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.arkivanov.decompose.extensions.compose.utils

import androidx.compose.foundation.layout.Box
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInput

@Composable
internal fun InputConsumingOverlay(modifier: Modifier) {
Box(
modifier = modifier.pointerInput(Unit) {
awaitPointerEventScope {
while (true) {
val event = awaitPointerEvent()
event.changes.forEach { it.consume() }
}
}
}
)
}

0 comments on commit 365b434

Please sign in to comment.