2020-06-13 16:09:48 +02:00
|
|
|
package com.github.apognu.otter.activities
|
|
|
|
|
|
|
|
import android.os.Bundle
|
2020-06-14 14:59:50 +02:00
|
|
|
import kotlinx.coroutines.flow.collect
|
2020-06-13 16:09:48 +02:00
|
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
|
|
import com.github.apognu.otter.R
|
|
|
|
import com.github.apognu.otter.adapters.DownloadsAdapter
|
|
|
|
import com.github.apognu.otter.utils.*
|
2020-06-14 14:59:50 +02:00
|
|
|
import com.google.android.exoplayer2.offline.Download
|
2020-06-13 16:09:48 +02:00
|
|
|
import kotlinx.android.synthetic.main.activity_downloads.*
|
2020-06-14 14:59:50 +02:00
|
|
|
import kotlinx.coroutines.Dispatchers.IO
|
2020-06-13 16:09:48 +02:00
|
|
|
import kotlinx.coroutines.Dispatchers.Main
|
|
|
|
import kotlinx.coroutines.GlobalScope
|
|
|
|
import kotlinx.coroutines.launch
|
2020-06-14 14:59:50 +02:00
|
|
|
import kotlinx.coroutines.withContext
|
2020-06-13 16:09:48 +02:00
|
|
|
|
|
|
|
class DownloadsActivity : AppCompatActivity() {
|
|
|
|
lateinit var adapter: DownloadsAdapter
|
|
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
|
|
|
|
setContentView(R.layout.activity_downloads)
|
|
|
|
|
2020-06-14 14:59:50 +02:00
|
|
|
adapter = DownloadsAdapter(this, DownloadChangedListener()).also {
|
2020-06-13 16:09:48 +02:00
|
|
|
downloads.layoutManager = LinearLayoutManager(this)
|
|
|
|
downloads.adapter = it
|
|
|
|
}
|
2020-06-14 14:59:50 +02:00
|
|
|
}
|
2020-06-13 16:09:48 +02:00
|
|
|
|
2020-06-14 14:59:50 +02:00
|
|
|
override fun onResume() {
|
|
|
|
super.onResume()
|
|
|
|
|
|
|
|
GlobalScope.launch(IO) {
|
|
|
|
EventBus.get().collect { event ->
|
|
|
|
if (event is Event.DownloadChanged) {
|
|
|
|
refreshTrack(event.download)
|
|
|
|
}
|
2020-06-13 16:09:48 +02:00
|
|
|
}
|
|
|
|
}
|
2020-06-14 14:59:50 +02:00
|
|
|
|
|
|
|
refresh()
|
2020-06-13 16:09:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private fun refresh() {
|
|
|
|
GlobalScope.launch(Main) {
|
|
|
|
RequestBus.send(Request.GetDownloads).wait<Response.Downloads>()?.let { response ->
|
|
|
|
adapter.downloads.clear()
|
|
|
|
|
|
|
|
while (response.cursor.moveToNext()) {
|
|
|
|
val download = response.cursor.download
|
|
|
|
|
2020-06-14 14:59:50 +02:00
|
|
|
download.getMetadata()?.let { info ->
|
2020-06-13 16:09:48 +02:00
|
|
|
adapter.downloads.add(info.apply {
|
|
|
|
this.download = download
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
adapter.notifyDataSetChanged()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-14 14:59:50 +02:00
|
|
|
private suspend fun refreshTrack(download: Download) {
|
|
|
|
if (download.state == Download.STATE_COMPLETED) {
|
|
|
|
download.getMetadata()?.let { info ->
|
|
|
|
adapter.downloads.withIndex().associate { it.value to it.index }.filter { it.key.id == info.id }.toList().getOrNull(0)?.let { match ->
|
|
|
|
withContext(Main) {
|
|
|
|
adapter.downloads[match.second] = info.apply {
|
|
|
|
this.download = download
|
|
|
|
}
|
|
|
|
|
|
|
|
adapter.notifyItemChanged(match.second)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
inner class DownloadChangedListener : DownloadsAdapter.OnDownloadChangedListener {
|
|
|
|
override fun onItemRemoved(index: Int) {
|
|
|
|
adapter.downloads.removeAt(index)
|
|
|
|
adapter.notifyDataSetChanged()
|
2020-06-13 16:09:48 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|