react-native-safe-area-context icon indicating copy to clipboard operation
react-native-safe-area-context copied to clipboard

returning inset bottom on samsung S8 even with edge-to-edge hidden nav bar

Open wcastand opened this issue 11 months ago • 1 comments

i'm using expo 52 and edge-to-edge support and when i tested on my samsung galaxy s8, the navigation bar is hidden but the inset is wrong.

388208896-83a72475-5420-48ea-8e63-be5b6ef2a3c1 (1)

the value should be zero since the nav is hidden but it's 144.



fun getSafeAreaInsets(view: View): EdgeInsets? {
  // The view has not been layout yet.
  if (view.height == 0) {
    return null
  }
  val rootView = view.rootView
  val windowInsets = getRootWindowInsetsCompat(rootView) ?: return null

  // Calculate the part of the view that overlaps with window insets.
  val windowWidth = rootView.width.toFloat()
  val windowHeight = rootView.height.toFloat()
  val visibleRect = android.graphics.Rect()
  view.getGlobalVisibleRect(visibleRect)
    Log.d(
        "DebugTag", // Replace with your desired tag
        "Computed values: top=${visibleRect.top}, height=${view.height}, " +
                "windowHeight=$windowHeight, insetsBottom=${windowInsets.bottom}, " +
                "result=${max(min(visibleRect.top + view.height - windowHeight, 0f) + windowInsets.bottom, 0f)}"
    )
  return EdgeInsets(
      top = max(windowInsets.top - visibleRect.top, 0f),
      right = max(min(visibleRect.left + view.width - windowWidth, 0f) + windowInsets.right, 0f),
      bottom = max(min(visibleRect.top + view.height - windowHeight, 0f) + windowInsets.bottom, 0f),
      left = max(windowInsets.left - visibleRect.left, 0f))
}
Computed values: top=0, height=2220, windowHeight=2220.0, insetsBottom=144.0, result=144.0

trying to understand a bit, getRootWindowInsetsCompatM seems to be the function used to get the insets on my samsung.

insets in getRootWindowInsetsCompatM uses rootView.rootWindowInsets which returns:

// without navigation bar showing
API Level: WindowInsets{systemWindowInsets=Rect(0, 72 - 0, 144) windowDecorInsets=Rect(0, 0 - 0, 0) stableInsets=Rect(0, 72 - 0, 144)}

i try to reactivate the navigationBar to see what was logged and it looks like it gets the same values :/

// with navigation bar showing
API Level: WindowInsets{systemWindowInsets=Rect(0, 72 - 0, 144) windowDecorInsets=Rect(0, 0 - 0, 0) stableInsets=Rect(0, 72 - 0, 144)}

issue also seems to be that the code below return true even when the navigation bar is hidden :/

rootWindowInsets?.isVisible(WindowInsetsCompat.Type.navigationBars())

what i maybe found so far but need activity is something like this https://stackoverflow.com/questions/51317263/how-to-know-when-samsung-s8-s8-s9-ect-bottom-navigation-bar-is-visible

if you want me to test a specific code to replace the rootView.rootWindowInsets and see if it returns the right value, happy to help

wcastand avatar Nov 20 '24 22:11 wcastand