-
Notifications
You must be signed in to change notification settings - Fork 15
/
RootPickerDialogFragment.kt
101 lines (92 loc) · 3.3 KB
/
RootPickerDialogFragment.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package dev.arkbuilders.navigator.presentation.dialog
import android.content.Context
import androidx.core.os.bundleOf
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.setFragmentResult
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import dev.arkbuilders.navigator.presentation.App
import kotlinx.coroutines.launch
import dev.arkbuilders.arkfilepicker.ArkFilePickerConfig
import dev.arkbuilders.arkfilepicker.folders.FoldersRepo
import dev.arkbuilders.arkfilepicker.presentation.filepicker.ArkFilePickerFragment
import java.nio.file.Path
import javax.inject.Inject
import kotlin.io.path.Path
class RootPickerDialogFragment : ArkFilePickerFragment() {
@Inject
lateinit var foldersRepo: FoldersRepo
private var rootNotFavorite = false
override fun onAttach(context: Context) {
App.instance.appComponent.inject(this)
super.onAttach(context)
}
override fun onFolderChanged(currentFolder: Path) {
lifecycleScope.launch {
val folders = foldersRepo.provideFolders()
val roots = folders.keys
val favorites = folders.values.flatten()
val root = roots.find { root -> currentFolder.startsWith(root) }
root?.let {
if (root == currentFolder) {
rootNotFavorite = true
binding.btnPick.text = "Root"
binding.btnPick.isEnabled = false
} else {
var foundAsFavorite = false
favorites.forEach {
if (currentFolder.endsWith(it)) {
foundAsFavorite = true
return@forEach
}
}
rootNotFavorite = false
binding.btnPick.text = "Favorite"
binding.btnPick.isEnabled = !foundAsFavorite
}
} ?: let {
rootNotFavorite = true
binding.btnPick.text = "Root"
binding.btnPick.isEnabled = true
}
}
}
override fun onPick(pickedPath: Path) {
setFragmentResult(
ROOT_PICKED_REQUEST_KEY,
bundleOf().apply {
putString(PICKED_PATH_BUNDLE_KEY, pickedPath.toString())
putBoolean(ROOT_NOT_FAV_BUNDLE_KEY, rootNotFavorite)
}
)
}
companion object {
fun newInstance(initialPath: Path?) = RootPickerDialogFragment().apply {
setConfig(
ArkFilePickerConfig(
initialPath = initialPath,
pathPickedRequestKey = "notUsed"
)
)
}
}
}
private const val ROOT_PICKED_REQUEST_KEY = "rootPicked"
private const val PICKED_PATH_BUNDLE_KEY = "pickedPath"
private const val ROOT_NOT_FAV_BUNDLE_KEY = "rootNotFav"
fun FragmentManager.onRootOrFavPicked(
lifecycleOwner: LifecycleOwner,
listener: (path: Path, rootNotFavorite: Boolean) -> Unit,
) {
setFragmentResultListener(
ROOT_PICKED_REQUEST_KEY,
lifecycleOwner
) { _, bundle ->
listener(
Path(
bundle.getString(PICKED_PATH_BUNDLE_KEY)!!
),
bundle.getBoolean(ROOT_NOT_FAV_BUNDLE_KEY)
)
}
}