mirror of https://github.com/nextcloud/android
176 lines
6.3 KiB
Kotlin
176 lines
6.3 KiB
Kotlin
/*
|
|
* Nextcloud - Android Client
|
|
*
|
|
* SPDX-FileCopyrightText: 2020 Chris Narkiewicz <hello@ezaquarii.com>
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
package com.nextcloud.client.etm.pages
|
|
|
|
import android.os.Bundle
|
|
import android.view.LayoutInflater
|
|
import android.view.Menu
|
|
import android.view.MenuInflater
|
|
import android.view.MenuItem
|
|
import android.view.View
|
|
import android.view.ViewGroup
|
|
import android.widget.ImageView
|
|
import android.widget.TextView
|
|
import androidx.recyclerview.widget.DividerItemDecoration
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
import com.nextcloud.client.etm.EtmBaseFragment
|
|
import com.nextcloud.client.files.DownloadRequest
|
|
import com.nextcloud.client.files.UploadRequest
|
|
import com.nextcloud.client.jobs.transfer.Transfer
|
|
import com.nextcloud.client.jobs.transfer.TransferManager
|
|
import com.owncloud.android.R
|
|
import com.owncloud.android.datamodel.OCFile
|
|
import com.owncloud.android.db.OCUpload
|
|
|
|
class EtmFileTransferFragment : EtmBaseFragment() {
|
|
|
|
companion object {
|
|
private const val TEST_DOWNLOAD_DUMMY_PATH = "/test/dummy_file.txt"
|
|
}
|
|
|
|
class Adapter(private val inflater: LayoutInflater) : RecyclerView.Adapter<Adapter.ViewHolder>() {
|
|
|
|
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
|
|
val type = view.findViewById<TextView>(R.id.etm_transfer_type)
|
|
val typeIcon = view.findViewById<ImageView>(R.id.etm_transfer_type_icon)
|
|
val uuid = view.findViewById<TextView>(R.id.etm_transfer_uuid)
|
|
val path = view.findViewById<TextView>(R.id.etm_transfer_remote_path)
|
|
val user = view.findViewById<TextView>(R.id.etm_transfer_user)
|
|
val state = view.findViewById<TextView>(R.id.etm_transfer_state)
|
|
val progress = view.findViewById<TextView>(R.id.etm_transfer_progress)
|
|
private val progressRow = view.findViewById<View>(R.id.etm_transfer_progress_row)
|
|
|
|
var progressEnabled: Boolean = progressRow.visibility == View.VISIBLE
|
|
get() {
|
|
return progressRow.visibility == View.VISIBLE
|
|
}
|
|
set(value) {
|
|
field = value
|
|
progressRow.visibility = if (value) {
|
|
View.VISIBLE
|
|
} else {
|
|
View.GONE
|
|
}
|
|
}
|
|
}
|
|
|
|
private var transfers = listOf<Transfer>()
|
|
|
|
fun setStatus(status: TransferManager.Status) {
|
|
transfers = listOf(status.pending, status.running, status.completed).flatten().reversed()
|
|
notifyDataSetChanged()
|
|
}
|
|
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
|
val view = inflater.inflate(R.layout.etm_transfer_list_item, parent, false)
|
|
return ViewHolder(view)
|
|
}
|
|
|
|
override fun getItemCount(): Int {
|
|
return transfers.size
|
|
}
|
|
|
|
override fun onBindViewHolder(vh: ViewHolder, position: Int) {
|
|
val transfer = transfers[position]
|
|
|
|
val transferTypeStrId = when (transfer.request) {
|
|
is DownloadRequest -> R.string.etm_transfer_type_download
|
|
is UploadRequest -> R.string.etm_transfer_type_upload
|
|
}
|
|
|
|
val transferTypeIconId = when (transfer.request) {
|
|
is DownloadRequest -> R.drawable.ic_cloud_download
|
|
is UploadRequest -> R.drawable.ic_cloud_upload
|
|
}
|
|
|
|
vh.type.setText(transferTypeStrId)
|
|
vh.typeIcon.setImageResource(transferTypeIconId)
|
|
vh.uuid.text = transfer.uuid.toString()
|
|
vh.path.text = transfer.request.file.remotePath
|
|
vh.user.text = transfer.request.user.accountName
|
|
vh.state.text = transfer.state.toString()
|
|
if (transfer.progress >= 0) {
|
|
vh.progressEnabled = true
|
|
vh.progress.text = transfer.progress.toString()
|
|
} else {
|
|
vh.progressEnabled = false
|
|
}
|
|
}
|
|
}
|
|
|
|
private lateinit var adapter: Adapter
|
|
private lateinit var list: RecyclerView
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
setHasOptionsMenu(true)
|
|
}
|
|
|
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
|
val view = inflater.inflate(R.layout.fragment_etm_downloader, container, false)
|
|
adapter = Adapter(inflater)
|
|
list = view.findViewById(R.id.etm_download_list)
|
|
list.layoutManager = LinearLayoutManager(context)
|
|
list.addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
|
|
list.adapter = adapter
|
|
return view
|
|
}
|
|
|
|
override fun onResume() {
|
|
super.onResume()
|
|
vm.transferManagerConnection.bind()
|
|
vm.transferManagerConnection.registerStatusListener(this::onDownloaderStatusChanged)
|
|
}
|
|
|
|
override fun onPause() {
|
|
super.onPause()
|
|
vm.transferManagerConnection.unbind()
|
|
}
|
|
|
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
|
super.onCreateOptionsMenu(menu, inflater)
|
|
inflater.inflate(R.menu.fragment_etm_file_transfer, menu)
|
|
}
|
|
|
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
|
return when (item.itemId) {
|
|
R.id.etm_test_download -> {
|
|
scheduleTestDownload()
|
|
true
|
|
}
|
|
R.id.etm_test_upload -> {
|
|
scheduleTestUpload()
|
|
true
|
|
}
|
|
else -> super.onOptionsItemSelected(item)
|
|
}
|
|
}
|
|
|
|
private fun scheduleTestDownload() {
|
|
val request = DownloadRequest(
|
|
vm.currentUser,
|
|
OCFile(TEST_DOWNLOAD_DUMMY_PATH),
|
|
true
|
|
)
|
|
vm.transferManagerConnection.enqueue(request)
|
|
}
|
|
|
|
private fun scheduleTestUpload() {
|
|
val request = UploadRequest(
|
|
vm.currentUser,
|
|
OCUpload(TEST_DOWNLOAD_DUMMY_PATH, TEST_DOWNLOAD_DUMMY_PATH, vm.currentUser.accountName),
|
|
true
|
|
)
|
|
vm.transferManagerConnection.enqueue(request)
|
|
}
|
|
|
|
private fun onDownloaderStatusChanged(status: TransferManager.Status) {
|
|
adapter.setStatus(status)
|
|
}
|
|
}
|