1
1
package fr.free.nrw.commons.utils
2
2
3
- import androidx.core.graphics.Insets
4
3
import android.view.View
5
4
import android.view.ViewGroup.MarginLayoutParams
6
5
import androidx.core.view.ViewCompat
7
6
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
8
11
import androidx.core.view.updateLayoutParams
12
+ import fr.free.nrw.commons.R
9
13
10
14
fun View.applyEdgeToEdgeInsets (
11
15
typeMask : Int = WindowInsetsCompat .Type .systemBars(),
12
- block : MarginLayoutParams .(Insets ) -> Unit
16
+ block : MarginLayoutParams .(InsetsAccumulator ) -> Unit
13
17
) {
14
- ViewCompat .setOnApplyWindowInsetsListener(this ) { v , windowInsets ->
18
+ ViewCompat .setOnApplyWindowInsetsListener(this ) { view , windowInsets ->
15
19
val insets = windowInsets.getInsets(typeMask)
16
20
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) }
19
62
}
20
63
21
64
WindowInsetsCompat .CONSUMED
@@ -39,4 +82,20 @@ fun applyEdgeToEdgeBottomInsets(view: View) = view.applyEdgeToEdgeInsets { inset
39
82
leftMargin = insets.left
40
83
rightMargin = insets.right
41
84
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
42
101
}
0 commit comments