Skip to content

Commit a370028

Browse files
committed
feat(customselector): improve RecyclerView edge-to-edge inset handling
It allows the last item to sits above the navigation bar while preserving edge-to-edge appearance.
1 parent e43aa9c commit a370028

File tree

5 files changed

+42
-2
lines changed

5 files changed

+42
-2
lines changed

app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,10 @@ import fr.free.nrw.commons.databinding.CustomSelectorBottomLayoutBinding
5454
import fr.free.nrw.commons.databinding.CustomSelectorToolbarBinding
5555
import fr.free.nrw.commons.media.ZoomableActivity
5656
import fr.free.nrw.commons.theme.BaseActivity
57-
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
5857
import fr.free.nrw.commons.upload.FileUtilsWrapper
5958
import fr.free.nrw.commons.utils.CustomSelectorUtils
59+
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
60+
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopInsets
6061
import kotlinx.coroutines.CoroutineDispatcher
6162
import kotlinx.coroutines.CoroutineScope
6263
import kotlinx.coroutines.Dispatchers
@@ -199,7 +200,8 @@ class CustomSelectorActivity :
199200
.fillMaxWidth(),
200201
)
201202
}
202-
applyEdgeToEdgeAllInsets(binding.root)
203+
applyEdgeToEdgeTopInsets(toolbarBinding.toolbarLayout)
204+
bottomSheetBinding.bottomLayout.applyEdgeToEdgeBottomPaddingInsets()
203205
val view = binding.root
204206
setContentView(view)
205207

app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/FolderFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import fr.free.nrw.commons.databinding.FragmentCustomSelectorBinding
1818
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment
1919
import fr.free.nrw.commons.media.MediaClient
2020
import fr.free.nrw.commons.upload.FileProcessor
21+
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
2122
import javax.inject.Inject
2223

2324
/**
@@ -99,6 +100,7 @@ class FolderFragment : CommonsDaggerSupportFragment() {
99100
selectorRV = binding?.selectorRv
100101
loader = binding?.loader
101102
with(binding?.selectorRv) {
103+
this?.applyEdgeToEdgeBottomPaddingInsets()
102104
this?.layoutManager = gridLayoutManager
103105
this?.setHasFixedSize(true)
104106
this?.adapter = folderAdapter

app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import fr.free.nrw.commons.media.MediaClient
4141
import fr.free.nrw.commons.theme.BaseActivity
4242
import fr.free.nrw.commons.upload.FileProcessor
4343
import fr.free.nrw.commons.upload.FileUtilsWrapper
44+
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
4445
import io.reactivex.schedulers.Schedulers
4546
import kotlinx.coroutines.flow.MutableStateFlow
4647
import kotlinx.coroutines.flow.asStateFlow
@@ -217,6 +218,7 @@ class ImageFragment :
217218
imageAdapter.setSingleSelection(singleSelection)
218219
gridLayoutManager = GridLayoutManager(context, getSpanCount())
219220
with(binding?.selectorRv) {
221+
this?.applyEdgeToEdgeBottomPaddingInsets()
220222
this?.layoutManager = gridLayoutManager
221223
this?.setHasFixedSize(true)
222224
this?.adapter = imageAdapter

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import androidx.core.view.marginLeft
99
import androidx.core.view.marginRight
1010
import androidx.core.view.marginTop
1111
import androidx.core.view.updateLayoutParams
12+
import androidx.core.view.updatePadding
1213
import fr.free.nrw.commons.R
1314

1415
fun View.applyEdgeToEdgeInsets(
@@ -65,6 +66,38 @@ fun View.applyEdgeToEdgeInsets(
6566
}
6667
}
6768

69+
fun View.applyEdgeToEdgeTopPaddingInsets(
70+
typeMask: Int = WindowInsetsCompat.Type.systemBars(),
71+
) {
72+
ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
73+
val insets = windowInsets.getInsets(typeMask)
74+
75+
view.updatePadding(
76+
left = insets.left,
77+
right = insets.right,
78+
top = insets.top
79+
)
80+
81+
WindowInsetsCompat.CONSUMED
82+
}
83+
}
84+
85+
fun View.applyEdgeToEdgeBottomPaddingInsets(
86+
typeMask: Int = WindowInsetsCompat.Type.systemBars(),
87+
) {
88+
ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
89+
val insets = windowInsets.getInsets(typeMask)
90+
91+
view.updatePadding(
92+
left = insets.left,
93+
right = insets.right,
94+
bottom = insets.bottom
95+
)
96+
97+
WindowInsetsCompat.CONSUMED
98+
}
99+
}
100+
68101
fun applyEdgeToEdgeAllInsets(view: View) = view.applyEdgeToEdgeInsets { insets ->
69102
leftMargin = insets.left
70103
rightMargin = insets.right

app/src/main/res/layout/fragment_custom_selector.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
app:layout_constraintEnd_toEndOf="parent"
3535
app:layout_constraintStart_toStartOf="parent"
3636
app:layout_constraintTop_toBottomOf="@id/switchWidget"
37+
android:clipToPadding="false"
3738
/>
3839

3940
<TextView

0 commit comments

Comments
 (0)