-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathFilesFragment.kt
More file actions
257 lines (205 loc) · 8.93 KB
/
FilesFragment.kt
File metadata and controls
257 lines (205 loc) · 8.93 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
package com.commit451.gitlab.fragment
import android.app.ProgressDialog
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.os.Bundle
import com.google.android.material.snackbar.Snackbar
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import butterknife.BindView
import com.commit451.gitlab.App
import com.commit451.gitlab.R
import com.commit451.gitlab.activity.BaseActivity
import com.commit451.gitlab.activity.ProjectActivity
import com.commit451.gitlab.adapter.BreadcrumbAdapter
import com.commit451.gitlab.adapter.DividerItemDecoration
import com.commit451.gitlab.adapter.FileAdapter
import com.commit451.gitlab.event.ProjectReloadEvent
import com.commit451.gitlab.extension.getUrl
import com.commit451.gitlab.extension.with
import com.commit451.gitlab.model.api.Project
import com.commit451.gitlab.model.api.RepositoryTreeObject
import com.commit451.gitlab.navigation.Navigator
import com.commit451.gitlab.rx.CustomSingleObserver
import com.commit451.gitlab.util.FileUtil
import com.commit451.gitlab.util.IntentUtil
import org.greenrobot.eventbus.Subscribe
import timber.log.Timber
import java.util.*
class FilesFragment : ButterKnifeFragment() {
companion object {
private const val CURRENT_PATH = "current_path"
fun newInstance(): FilesFragment {
return FilesFragment()
}
}
@BindView(R.id.root)
lateinit var root: View
@BindView(R.id.swipe_layout)
lateinit var swipeRefreshLayout: androidx.swiperefreshlayout.widget.SwipeRefreshLayout
@BindView(R.id.list)
lateinit var list: androidx.recyclerview.widget.RecyclerView
@BindView(R.id.breadcrumb)
lateinit var listBreadcrumbs: androidx.recyclerview.widget.RecyclerView
@BindView(R.id.message_text)
lateinit var textMessage: TextView
@BindView(R.id.progress)
lateinit var progress: View
lateinit var adapterFiles: FileAdapter
lateinit var adapterBreadcrumb: BreadcrumbAdapter
var project: Project? = null
var ref: String? = null
var currentPath = ""
val filesAdapterListener = object : FileAdapter.Listener {
override fun onOpenExternalClicked(treeItem: RepositoryTreeObject) {
progress.visibility = View.VISIBLE
val path = currentPath + treeItem.name
FileUtil.open(context!!, project!!.id, path, ref!!)
.observe(this@FilesFragment, androidx.lifecycle.Observer { success ->
progress.visibility = View.GONE
if(!success){
Snackbar.make(root, getString(R.string.error_opening_file), Snackbar.LENGTH_SHORT).show()
}
})
}
override fun onFolderClicked(treeItem: RepositoryTreeObject) {
loadData(currentPath + treeItem.name + "/")
}
override fun onFileClicked(treeItem: RepositoryTreeObject) {
val path = currentPath + treeItem.name
Navigator.navigateToFile(baseActivty, project!!.id, path, ref!!)
}
override fun onCopyClicked(treeItem: RepositoryTreeObject) {
val clipboard = baseActivty.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
// Creates a new text clip to put on the clipboard
val clip = ClipData.newPlainText(treeItem.name, treeItem.getUrl(project!!, ref!!, currentPath).toString())
clipboard.primaryClip = clip
Snackbar.make(root, R.string.copied_to_clipboard, Snackbar.LENGTH_SHORT)
.show()
}
override fun onShareClicked(treeItem: RepositoryTreeObject) {
IntentUtil.share(view!!, treeItem.getUrl(project!!, ref!!, currentPath))
}
override fun onOpenInBrowserClicked(treeItem: RepositoryTreeObject) {
IntentUtil.openPage(activity as BaseActivity, treeItem.getUrl(project!!, ref!!, currentPath).toString(), App.get().currentAccount)
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_files, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
adapterFiles = FileAdapter(filesAdapterListener)
list.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(activity)
list.addItemDecoration(DividerItemDecoration(baseActivty))
list.adapter = adapterFiles
adapterBreadcrumb = BreadcrumbAdapter()
listBreadcrumbs.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(activity, androidx.recyclerview.widget.LinearLayoutManager.HORIZONTAL, false)
listBreadcrumbs.adapter = adapterBreadcrumb
swipeRefreshLayout.setOnRefreshListener { loadData() }
var path = ""
if (savedInstanceState != null) {
path = savedInstanceState.getString(CURRENT_PATH)
}
if (activity is ProjectActivity) {
project = (activity as ProjectActivity).project
ref = (activity as ProjectActivity).getRefRef()
loadData(path)
} else {
throw IllegalStateException("Incorrect parent activity")
}
App.bus().register(this)
}
override fun onSaveInstanceState(outState: Bundle) {
outState.putString(CURRENT_PATH, currentPath)
super.onSaveInstanceState(outState)
}
override fun onBackPressed(): Boolean {
if (adapterBreadcrumb.itemCount > 1) {
val breadcrumb = adapterBreadcrumb.getValueAt(adapterBreadcrumb.itemCount - 2)
if (breadcrumb != null) {
breadcrumb.listener.onClick()
return true
}
}
return false
}
override fun onDestroyView() {
App.bus().unregister(this)
super.onDestroyView()
}
override fun loadData() {
loadData(currentPath)
}
fun loadData(newPath: String) {
if (project == null || ref.isNullOrEmpty()) {
swipeRefreshLayout.isRefreshing = false
return
}
swipeRefreshLayout.isRefreshing = true
App.get().gitLab.getTree(project!!.id, ref, newPath)
.with(this)
.subscribe(object : CustomSingleObserver<List<RepositoryTreeObject>>() {
override fun error(e: Throwable) {
Timber.e(e)
swipeRefreshLayout.isRefreshing = false
textMessage.visibility = View.VISIBLE
textMessage.setText(R.string.connection_error_files)
adapterFiles.setData(null)
currentPath = newPath
updateBreadcrumbs()
}
override fun success(repositoryTreeObjects: List<RepositoryTreeObject>) {
swipeRefreshLayout.isRefreshing = false
if (!repositoryTreeObjects.isEmpty()) {
textMessage.visibility = View.GONE
} else {
Timber.d("No files found")
textMessage.visibility = View.VISIBLE
textMessage.setText(R.string.no_files_found)
}
adapterFiles.setData(repositoryTreeObjects)
list.scrollToPosition(0)
currentPath = newPath
updateBreadcrumbs()
}
})
}
fun updateBreadcrumbs() {
val breadcrumbs = ArrayList<BreadcrumbAdapter.Breadcrumb>()
breadcrumbs.add(BreadcrumbAdapter.Breadcrumb(getString(R.string.root), object : BreadcrumbAdapter.Listener {
override fun onClick() {
loadData("")
}
}))
var newPath = ""
val segments = currentPath.split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
for (segment in segments) {
if (segment.isEmpty()) {
continue
}
newPath += segment + "/"
val finalPath = newPath
breadcrumbs.add(BreadcrumbAdapter.Breadcrumb(segment, object : BreadcrumbAdapter.Listener {
override fun onClick() {
loadData(finalPath)
}
}))
}
adapterBreadcrumb.setData(breadcrumbs)
listBreadcrumbs.scrollToPosition(adapterBreadcrumb.itemCount - 1)
}
@Suppress("unused")
@Subscribe
fun onProjectReload(event: ProjectReloadEvent) {
project = event.project
ref = event.branchName
loadData("")
}
}