Skip to content

Commit e43aa9c

Browse files
committed
fix: preserve existing margins when adding new insets
1 parent 238bd8c commit e43aa9c

File tree

3 files changed

+73
-5
lines changed

3 files changed

+73
-5
lines changed

app/src/main/java/fr/free/nrw/commons/locationpicker/LocationPickerActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.Compani
4848
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.Companion.LAST_ZOOM
4949
import fr.free.nrw.commons.utils.DialogUtil
5050
import fr.free.nrw.commons.utils.MapUtils.ZOOM_LEVEL
51+
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomInsets
5152
import fr.free.nrw.commons.utils.handleGeoCoordinates
5253
import io.reactivex.android.schedulers.AndroidSchedulers
5354
import io.reactivex.schedulers.Schedulers
@@ -474,6 +475,7 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
474475
*/
475476
private fun addPlaceSelectedButton() {
476477
placeSelectedButton = findViewById(R.id.location_chosen_button)
478+
applyEdgeToEdgeBottomInsets(placeSelectedButton)
477479
placeSelectedButton.setOnClickListener { placeSelected() }
478480
}
479481

app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,64 @@
11
package fr.free.nrw.commons.utils
22

3-
import androidx.core.graphics.Insets
43
import android.view.View
54
import android.view.ViewGroup.MarginLayoutParams
65
import androidx.core.view.ViewCompat
76
import androidx.core.view.WindowInsetsCompat
7+
import androidx.core.view.marginBottom
8+
import androidx.core.view.marginLeft
9+
import androidx.core.view.marginRight
10+
import androidx.core.view.marginTop
811
import androidx.core.view.updateLayoutParams
12+
import fr.free.nrw.commons.R
913

1014
fun View.applyEdgeToEdgeInsets(
1115
typeMask: Int = WindowInsetsCompat.Type.systemBars(),
12-
block: MarginLayoutParams.(Insets) -> Unit
16+
block: MarginLayoutParams.(InsetsAccumulator) -> Unit
1317
) {
14-
ViewCompat.setOnApplyWindowInsetsListener(this) { v, windowInsets ->
18+
ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
1519
val insets = windowInsets.getInsets(typeMask)
1620

17-
v.updateLayoutParams<MarginLayoutParams> {
18-
apply { block(insets) }
21+
val initialTop = if (view.getTag(R.id.initial_margin_top) != null) {
22+
view.getTag(R.id.initial_margin_top) as Int
23+
} else {
24+
view.setTag(R.id.initial_margin_top, view.marginTop)
25+
view.marginTop
26+
}
27+
28+
val initialBottom = if (view.getTag(R.id.initial_margin_bottom) != null) {
29+
view.getTag(R.id.initial_margin_bottom) as Int
30+
} else {
31+
view.setTag(R.id.initial_margin_bottom, view.marginBottom)
32+
view.marginBottom
33+
}
34+
35+
val initialLeft = if (view.getTag(R.id.initial_margin_left) != null) {
36+
view.getTag(R.id.initial_margin_left) as Int
37+
} else {
38+
view.setTag(R.id.initial_margin_left, view.marginLeft)
39+
view.marginLeft
40+
}
41+
42+
val initialRight = if (view.getTag(R.id.initial_margin_right) != null) {
43+
view.getTag(R.id.initial_margin_right) as Int
44+
} else {
45+
view.setTag(R.id.initial_margin_right, view.marginRight)
46+
view.marginRight
47+
}
48+
49+
val accumulator = InsetsAccumulator(
50+
initialTop,
51+
insets.top,
52+
initialBottom,
53+
insets.bottom,
54+
initialLeft,
55+
insets.left,
56+
initialRight,
57+
insets.right
58+
)
59+
60+
view.updateLayoutParams<MarginLayoutParams> {
61+
apply { block(accumulator) }
1962
}
2063

2164
WindowInsetsCompat.CONSUMED
@@ -39,4 +82,20 @@ fun applyEdgeToEdgeBottomInsets(view: View) = view.applyEdgeToEdgeInsets { inset
3982
leftMargin = insets.left
4083
rightMargin = insets.right
4184
bottomMargin = insets.bottom
85+
}
86+
87+
data class InsetsAccumulator(
88+
private val initialTop: Int,
89+
private val insetTop: Int,
90+
private val initialBottom: Int,
91+
private val insetBottom: Int,
92+
private val initialLeft: Int,
93+
private val insetLeft: Int,
94+
private val initialRight: Int,
95+
private val insetRight: Int
96+
) {
97+
val top = initialTop + insetTop
98+
val bottom = initialBottom + insetBottom
99+
val left = initialLeft + insetLeft
100+
val right = initialRight + insetRight
42101
}

app/src/main/res/values/ids.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<item name="initial_margin_top" type="id" />
4+
<item name="initial_margin_bottom" type="id" />
5+
<item name="initial_margin_left" type="id" />
6+
<item name="initial_margin_right" type="id" />
7+
</resources>

0 commit comments

Comments
 (0)