fix: preserve existing margins when adding new insets

This commit is contained in:
Rohit Verma 2025-08-09 09:30:40 +05:30
parent 238bd8c672
commit e43aa9c043
3 changed files with 73 additions and 5 deletions

View file

@ -48,6 +48,7 @@ import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.Compani
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.Companion.LAST_ZOOM
import fr.free.nrw.commons.utils.DialogUtil
import fr.free.nrw.commons.utils.MapUtils.ZOOM_LEVEL
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomInsets
import fr.free.nrw.commons.utils.handleGeoCoordinates
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
@ -474,6 +475,7 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
*/
private fun addPlaceSelectedButton() {
placeSelectedButton = findViewById(R.id.location_chosen_button)
applyEdgeToEdgeBottomInsets(placeSelectedButton)
placeSelectedButton.setOnClickListener { placeSelected() }
}

View file

@ -1,21 +1,64 @@
package fr.free.nrw.commons.utils
import androidx.core.graphics.Insets
import android.view.View
import android.view.ViewGroup.MarginLayoutParams
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.marginBottom
import androidx.core.view.marginLeft
import androidx.core.view.marginRight
import androidx.core.view.marginTop
import androidx.core.view.updateLayoutParams
import fr.free.nrw.commons.R
fun View.applyEdgeToEdgeInsets(
typeMask: Int = WindowInsetsCompat.Type.systemBars(),
block: MarginLayoutParams.(Insets) -> Unit
block: MarginLayoutParams.(InsetsAccumulator) -> Unit
) {
ViewCompat.setOnApplyWindowInsetsListener(this) { v, windowInsets ->
ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
val insets = windowInsets.getInsets(typeMask)
v.updateLayoutParams<MarginLayoutParams> {
apply { block(insets) }
val initialTop = if (view.getTag(R.id.initial_margin_top) != null) {
view.getTag(R.id.initial_margin_top) as Int
} else {
view.setTag(R.id.initial_margin_top, view.marginTop)
view.marginTop
}
val initialBottom = if (view.getTag(R.id.initial_margin_bottom) != null) {
view.getTag(R.id.initial_margin_bottom) as Int
} else {
view.setTag(R.id.initial_margin_bottom, view.marginBottom)
view.marginBottom
}
val initialLeft = if (view.getTag(R.id.initial_margin_left) != null) {
view.getTag(R.id.initial_margin_left) as Int
} else {
view.setTag(R.id.initial_margin_left, view.marginLeft)
view.marginLeft
}
val initialRight = if (view.getTag(R.id.initial_margin_right) != null) {
view.getTag(R.id.initial_margin_right) as Int
} else {
view.setTag(R.id.initial_margin_right, view.marginRight)
view.marginRight
}
val accumulator = InsetsAccumulator(
initialTop,
insets.top,
initialBottom,
insets.bottom,
initialLeft,
insets.left,
initialRight,
insets.right
)
view.updateLayoutParams<MarginLayoutParams> {
apply { block(accumulator) }
}
WindowInsetsCompat.CONSUMED
@ -39,4 +82,20 @@ fun applyEdgeToEdgeBottomInsets(view: View) = view.applyEdgeToEdgeInsets { inset
leftMargin = insets.left
rightMargin = insets.right
bottomMargin = insets.bottom
}
data class InsetsAccumulator(
private val initialTop: Int,
private val insetTop: Int,
private val initialBottom: Int,
private val insetBottom: Int,
private val initialLeft: Int,
private val insetLeft: Int,
private val initialRight: Int,
private val insetRight: Int
) {
val top = initialTop + insetTop
val bottom = initialBottom + insetBottom
val left = initialLeft + insetLeft
val right = initialRight + insetRight
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="initial_margin_top" type="id" />
<item name="initial_margin_bottom" type="id" />
<item name="initial_margin_left" type="id" />
<item name="initial_margin_right" type="id" />
</resources>