1
0
Fork 0

For #13405 - Use toolbar location relative to the whole screen instead of window.

master
Kainalu Hagiwara 2020-08-10 10:43:30 -07:00 committed by Jeff Boek
parent 7f9ddfe051
commit d9ffac0c89
3 changed files with 34 additions and 1 deletions

View File

@ -23,6 +23,7 @@ import mozilla.components.browser.session.Session
import mozilla.components.browser.session.SessionManager
import mozilla.components.support.ktx.android.util.dpToPx
import mozilla.components.support.ktx.android.view.getRectWithViewLocation
import org.mozilla.fenix.ext.getRectWithScreenLocation
import org.mozilla.fenix.ext.getWindowInsets
import org.mozilla.fenix.ext.isKeyboardVisible
import org.mozilla.fenix.ext.sessionsOfType
@ -304,7 +305,7 @@ class ToolbarGestureHandler(
}
private fun PointF.isInToolbar(): Boolean {
val toolbarLocation = toolbarLayout.getRectWithViewLocation()
val toolbarLocation = toolbarLayout.getRectWithScreenLocation()
// In Android 10, the system gesture touch area overlaps the bottom of the toolbar, so
// lets make our swipe area taller by that amount
activity.window.decorView.getWindowInsets()?.let { insets ->

View File

@ -31,6 +31,20 @@ fun View.removeTouchDelegate() {
}
}
/**
* Fills a [Rect] with data about a view's location in the screen.
*
* @see View.getLocationOnScreen
* @see View.getRectWithViewLocation for a version of this that is relative to a window
*/
fun View.getRectWithScreenLocation(): Rect {
val locationOnScreen = IntArray(2).apply { getLocationOnScreen(this) }
return Rect(locationOnScreen[0],
locationOnScreen[1],
locationOnScreen[0] + width,
locationOnScreen[1] + height)
}
/**
* A safer version of [ViewCompat.getRootWindowInsets] that does not throw a NullPointerException
* if the view is not attached.

View File

@ -148,4 +148,22 @@ class ViewTest {
every { view.getKeyboardHeight() } returns 100
assertEquals(true, view.isKeyboardVisible())
}
@Test
fun `getRectWithScreenLocation should transform getLocationInScreen method values`() {
val locationOnScreen = slot<IntArray>()
every { view.getLocationOnScreen(capture(locationOnScreen)) } answers {
locationOnScreen.captured[0] = 100
locationOnScreen.captured[1] = 200
}
every { view.width } returns 150
every { view.height } returns 250
val outRect = view.getRectWithScreenLocation()
assertEquals(100, outRect.left)
assertEquals(200, outRect.top)
assertEquals(250, outRect.right)
assertEquals(450, outRect.bottom)
}
}