[fenix] Bug 1812580 - Wait for the layout cycle to complete before changing anchors

This comes to solve the issue seen in the error logs by adding the anchor
change done for the snackbar to the operation queue on thread Main thread.
Should allow to avoid chaning the snackbar's anchor in between onMeasure and
onLayout.
pull/600/head
Mugurell 1 year ago committed by mergify[bot]
parent 18e026ba28
commit 5ca40120f0

@ -60,18 +60,20 @@ class FenixSnackbarBehavior<V : View>(
currentAnchorId = dependency?.id ?: View.NO_ID
val params = snackbar.layoutParams as CoordinatorLayout.LayoutParams
if (dependency == null || (dependency.id == R.id.toolbar && toolbarPosition == ToolbarPosition.TOP)) {
// Position the snackbar at the bottom of the screen.
params.anchorId = View.NO_ID
params.anchorGravity = Gravity.NO_GRAVITY
params.gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL
} else {
// Position the snackbar just above the anchor.
params.anchorId = dependency.id
params.anchorGravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
params.gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
snackbar.post {
if (dependency == null || (dependency.id == R.id.toolbar && toolbarPosition == ToolbarPosition.TOP)) {
// Position the snackbar at the bottom of the screen.
params.anchorId = View.NO_ID
params.anchorGravity = Gravity.NO_GRAVITY
params.gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL
snackbar.layoutParams = params
} else {
// Position the snackbar just above the anchor.
params.anchorId = dependency.id
params.anchorGravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
params.gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
snackbar.layoutParams = params
}
}
snackbar.layoutParams = params
}
}

@ -9,6 +9,8 @@ import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.coordinatorlayout.widget.CoordinatorLayout
import io.mockk.every
import io.mockk.mockk
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Before
@ -20,14 +22,20 @@ import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
@RunWith(FenixRobolectricTestRunner::class)
class FenixSnackbarBehaviorTest {
private val snackbarParams = CoordinatorLayout.LayoutParams(0, 0)
private val snackbarContainer = FrameLayout(testContext)
private val snackbarContainer = mockk<FrameLayout>(relaxed = true)
private var snackbarLayoutParams = CoordinatorLayout.LayoutParams(0, 0)
private val dependency = View(testContext)
private val parent = CoordinatorLayout(testContext)
@Before
fun setup() {
snackbarContainer.layoutParams = snackbarParams
every { snackbarContainer.layoutParams } returns snackbarLayoutParams
every { snackbarContainer.post(any()) } answers {
// Immediately run the given Runnable argument
val action: Runnable = firstArg()
action.run()
true
}
parent.addView(dependency)
}
@ -235,17 +243,14 @@ class FenixSnackbarBehaviorTest {
}
private fun assertSnackbarPlacementAboveAnchor(anchor: View = dependency) {
assertEquals(anchor.id, snackbarContainer.params.anchorId)
assertEquals(Gravity.TOP or Gravity.CENTER_HORIZONTAL, snackbarContainer.params.anchorGravity)
assertEquals(Gravity.TOP or Gravity.CENTER_HORIZONTAL, snackbarContainer.params.gravity)
assertEquals(anchor.id, snackbarLayoutParams.anchorId)
assertEquals(Gravity.TOP or Gravity.CENTER_HORIZONTAL, snackbarLayoutParams.anchorGravity)
assertEquals(Gravity.TOP or Gravity.CENTER_HORIZONTAL, snackbarLayoutParams.gravity)
}
private fun assertSnackbarIsPlacedAtTheBottomOfTheScreen() {
assertEquals(View.NO_ID, snackbarContainer.params.anchorId)
assertEquals(Gravity.NO_GRAVITY, snackbarContainer.params.anchorGravity)
assertEquals(Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL, snackbarContainer.params.gravity)
assertEquals(View.NO_ID, snackbarLayoutParams.anchorId)
assertEquals(Gravity.NO_GRAVITY, snackbarLayoutParams.anchorGravity)
assertEquals(Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL, snackbarLayoutParams.gravity)
}
private val FrameLayout.params
get() = layoutParams as CoordinatorLayout.LayoutParams
}

Loading…
Cancel
Save