@@ -10,17 +10,19 @@ import android.view.View
1010import android.view.ViewGroup
1111import androidx.activity.result.contract.ActivityResultContracts
1212import androidx.annotation.ColorInt
13+ import androidx.annotation.FloatRange
1314import androidx.appcompat.app.AppCompatActivity
1415import androidx.core.view.isVisible
1516import androidx.fragment.app.FragmentManager
17+ import androidx.paging.LoadState
1618import androidx.recyclerview.widget.GridLayoutManager
1719import androidx.recyclerview.widget.RecyclerView
1820import com.github.file_picker.adapter.ItemAdapter
19- import com.github.file_picker.extension.getStorageFiles
21+ import com.github.file_picker.data.model.Media
22+ import com.github.file_picker.data.repository.FilesRepository
2023import com.github.file_picker.extension.hasPermission
2124import com.github.file_picker.listener.OnItemClickListener
2225import com.github.file_picker.listener.OnSubmitClickListener
23- import com.github.file_picker.model.Media
2426import com.google.android.material.bottomsheet.BottomSheetBehavior
2527import com.google.android.material.bottomsheet.BottomSheetDialog
2628import com.google.android.material.bottomsheet.BottomSheetDialogFragment
@@ -49,6 +51,7 @@ class FilePicker private constructor(
4951 private var _binding : FilePickerBinding ? = null
5052
5153 private var itemsAdapter: ItemAdapter ? = null
54+ private lateinit var repository: FilesRepository
5255
5356 private var title: String
5457 private var titleTextColor by Delegates .notNull<Int >()
@@ -61,6 +64,7 @@ class FilePicker private constructor(
6164 private var accentColor by Delegates .notNull<Int >()
6265 private var gridSpanCount by Delegates .notNull<Int >()
6366 private var cancellable by Delegates .notNull<Boolean >()
67+ private var overlayAlpha by Delegates .notNull<Float >()
6468
6569 private var onItemClickListener: OnItemClickListener ?
6670 private var onSubmitClickListener: OnSubmitClickListener ?
@@ -77,6 +81,7 @@ class FilePicker private constructor(
7781 this .gridSpanCount = builder.gridSpanCount
7882 this .limitCount = builder.limitCount
7983 this .accentColor = builder.accentColor
84+ this .overlayAlpha = builder.overlayAlpha
8085 this .onItemClickListener = builder.onItemClickListener
8186 this .onSubmitClickListener = builder.onSubmitClickListener
8287 }
@@ -116,6 +121,8 @@ class FilePicker private constructor(
116121 private set
117122 var onSubmitClickListener: OnSubmitClickListener ? = null
118123 private set
124+ var overlayAlpha: Float = DEFAULT_OVERLAY_ALPHA
125+ private set
119126
120127 /* *
121128 * Set title
@@ -228,14 +235,21 @@ class FilePicker private constructor(
228235 ) = apply { this .onItemClickListener = onItemClickListener }
229236
230237 /* *
231- * Build file picker instance
238+ * Set overlay alpha
232239 *
240+ * @param alpha
241+ */
242+ fun setOverlayAlpha (
243+ alpha : Float
244+ ) = apply { this .overlayAlpha = alpha }
245+
246+ /* *
247+ * Build file picker instance
233248 */
234249 fun build () = FilePicker (this )
235250
236251 /* *
237252 * Build file picker and show it
238- *
239253 */
240254 fun buildAndShow () = build().show(
241255 appCompatActivity.supportFragmentManager,
@@ -257,6 +271,7 @@ class FilePicker private constructor(
257271 }
258272
259273 override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
274+ repository = FilesRepository (requireActivity().application)
260275 setCancellableDialog(cancellable)
261276 setupViews()
262277 }
@@ -365,6 +380,7 @@ class FilePicker private constructor(
365380 private fun setupRecyclerView (recyclerView : RecyclerView ) {
366381 itemsAdapter = ItemAdapter (
367382 accentColor = accentColor,
383+ overlayAlpha = overlayAlpha,
368384 limitSelectionCount = limitCount,
369385 listener = { itemPosition ->
370386 setupOnItemClickListener(itemPosition)
@@ -390,7 +406,7 @@ class FilePicker private constructor(
390406 private fun setupOnItemClickListener (position : Int ) {
391407 if (onItemClickListener == null ) return
392408 if (itemsAdapter == null ) return
393- val media = itemsAdapter?.currentList ?.get(position) ? : return
409+ val media = itemsAdapter?.snapshot()?.items ?.get(position) ? : return
394410 onItemClickListener?.onClick(media, position, itemsAdapter!! )
395411 }
396412
@@ -411,34 +427,29 @@ class FilePicker private constructor(
411427
412428 /* *
413429 * Load files
414- *
415430 */
416431 private fun loadFiles () = CoroutineScope (Dispatchers .IO ).launch {
417- val files = getStorageFiles(fileType = fileType)
418- .map { Media (file = it, type = fileType) }
419-
420- if (selectedFiles.isNotEmpty()) {
421- selectedFiles.forEach { media ->
422- val selectedMedia = files.find { it.id == media.id }
423- if (selectedMedia != null ) {
424- selectedMedia.isSelected = media.isSelected
425- selectedMedia.order = media.order
432+ itemsAdapter?.addLoadStateListener { state ->
433+ binding.progress.isVisible = state.source.refresh is LoadState .Loading
434+ if (state.source.refresh is LoadState .NotLoading ) {
435+ selectedFiles.forEach { media ->
436+ itemsAdapter?.snapshot()?.items?.find { it.id == media.id }?.let {
437+ it.isSelected = media.isSelected
438+ it.order = media.order
439+ }
426440 }
441+ updateSelectedCount()
442+ setFixedSubmitButton()
443+ changeSubmitButtonState()
427444 }
428445 }
429-
430- requireActivity().runOnUiThread {
431- itemsAdapter?.submitList(files)
432- updateSelectedCount()
433- setFixedSubmitButton()
434- changeSubmitButtonState()
435- binding.progress.isVisible = false
446+ repository.getFiles(fileType = fileType).collect { pagingData ->
447+ itemsAdapter?.submitData(pagingData)
436448 }
437449 }
438450
439451 /* *
440452 * Submit list
441- *
442453 */
443454 private fun submitList () = getSelectedItems()?.let {
444455 onSubmitClickListener?.onClick(it)
@@ -450,7 +461,7 @@ class FilePicker private constructor(
450461 * @return
451462 */
452463 private fun getSelectedItems (): List <Media >? =
453- itemsAdapter?.currentList ?.filter { it.isSelected }?.sortedBy { it.order }
464+ itemsAdapter?.snapshot()?.items ?.filter { it.isSelected }?.sortedBy { it.order }
454465
455466 /* *
456467 * Has selected item
@@ -471,6 +482,9 @@ class FilePicker private constructor(
471482 const val DEFAULT_TITLE = " Choose File"
472483 const val DEFAULT_TITLE_TEXT_COLOR = DEFAULT_ACCENT_COLOR
473484
485+ @FloatRange(from = 0.0 , to = 1.0 )
486+ const val DEFAULT_OVERLAY_ALPHA = 0.5F
487+
474488 const val DEFAULT_SUBMIT_TEXT = " Submit"
475489 const val DEFAULT_SUBMIT_TEXT_COLOR = Color .WHITE
476490
0 commit comments