diff options
Diffstat (limited to 'modules/bottom-sheet/android/src/main/java')
-rw-r--r-- | modules/bottom-sheet/android/src/main/java/expo/modules/bottomsheet/BottomSheetView.kt | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/modules/bottom-sheet/android/src/main/java/expo/modules/bottomsheet/BottomSheetView.kt b/modules/bottom-sheet/android/src/main/java/expo/modules/bottomsheet/BottomSheetView.kt index 56b5b3f05..5df163b64 100644 --- a/modules/bottom-sheet/android/src/main/java/expo/modules/bottomsheet/BottomSheetView.kt +++ b/modules/bottom-sheet/android/src/main/java/expo/modules/bottomsheet/BottomSheetView.kt @@ -31,9 +31,13 @@ class BottomSheetView( private lateinit var dialogRootViewGroup: DialogRootViewGroup private var eventDispatcher: EventDispatcher? = null - private val screenHeight = - context.resources.displayMetrics.heightPixels - .toFloat() + private val rawScreenHeight = context.resources.displayMetrics.heightPixels.toFloat() + private val safeScreenHeight = (rawScreenHeight - getNavigationBarHeight()).toFloat() + + private fun getNavigationBarHeight(): Int { + val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android") + return if (resourceId > 0) resources.getDimensionPixelSize(resourceId) else 0 + } private val onAttemptDismiss by EventDispatcher() private val onSnapPointChange by EventDispatcher() @@ -63,12 +67,12 @@ class BottomSheetView( } } - var maxHeight = this.screenHeight + var maxHeight = this.safeScreenHeight set(value) { val px = dpToPx(value) field = - if (px > this.screenHeight) { - this.screenHeight + if (px > this.safeScreenHeight) { + this.safeScreenHeight } else { px } @@ -153,6 +157,19 @@ class BottomSheetView( // Presentation + private fun getHalfExpandedRatio(contentHeight: Float): Float { + return when { + // Full height sheets + contentHeight >= safeScreenHeight -> 0.99f + // Medium height sheets (>50% but <100%) + contentHeight >= safeScreenHeight / 2 -> + this.clampRatio(this.getTargetHeight() / safeScreenHeight) + // Small height sheets (<50%) + else -> + this.clampRatio(this.getTargetHeight() / rawScreenHeight) + } + } + private fun present() { if (this.isOpen || this.isOpening || this.isClosing) return @@ -172,12 +189,12 @@ class BottomSheetView( val behavior = BottomSheetBehavior.from(it) behavior.state = BottomSheetBehavior.STATE_HIDDEN behavior.isFitToContents = true - behavior.halfExpandedRatio = this.clampRatio(this.getTargetHeight() / this.screenHeight) + behavior.halfExpandedRatio = getHalfExpandedRatio(contentHeight) behavior.skipCollapsed = true behavior.isDraggable = true behavior.isHideable = true - if (contentHeight >= this.screenHeight || this.minHeight >= this.screenHeight) { + if (contentHeight >= this.safeScreenHeight || this.minHeight >= this.safeScreenHeight) { behavior.state = BottomSheetBehavior.STATE_EXPANDED this.selectedSnapPoint = 2 } else { @@ -227,11 +244,11 @@ class BottomSheetView( bottomSheet?.let { val behavior = BottomSheetBehavior.from(it) - behavior.halfExpandedRatio = this.clampRatio(this.getTargetHeight() / this.screenHeight) + behavior.halfExpandedRatio = getHalfExpandedRatio(contentHeight) - if (contentHeight > this.screenHeight && behavior.state != BottomSheetBehavior.STATE_EXPANDED) { + if (contentHeight > this.safeScreenHeight && behavior.state != BottomSheetBehavior.STATE_EXPANDED) { behavior.state = BottomSheetBehavior.STATE_EXPANDED - } else if (contentHeight < this.screenHeight && behavior.state != BottomSheetBehavior.STATE_HALF_EXPANDED) { + } else if (contentHeight < this.safeScreenHeight && behavior.state != BottomSheetBehavior.STATE_HALF_EXPANDED) { behavior.state = BottomSheetBehavior.STATE_HALF_EXPANDED } } |