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

View file

@ -1,21 +1,64 @@
package fr.free.nrw.commons.utils package fr.free.nrw.commons.utils
import androidx.core.graphics.Insets
import android.view.View import android.view.View
import android.view.ViewGroup.MarginLayoutParams import android.view.ViewGroup.MarginLayoutParams
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat 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 androidx.core.view.updateLayoutParams
import fr.free.nrw.commons.R
fun View.applyEdgeToEdgeInsets( fun View.applyEdgeToEdgeInsets(
typeMask: Int = WindowInsetsCompat.Type.systemBars(), 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) val insets = windowInsets.getInsets(typeMask)
v.updateLayoutParams<MarginLayoutParams> { val initialTop = if (view.getTag(R.id.initial_margin_top) != null) {
apply { block(insets) } 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 WindowInsetsCompat.CONSUMED
@ -40,3 +83,19 @@ fun applyEdgeToEdgeBottomInsets(view: View) = view.applyEdgeToEdgeInsets { inset
rightMargin = insets.right rightMargin = insets.right
bottomMargin = insets.bottom 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>