Periodically refresh download progress while in DownloadsActivity.
This commit is contained in:
parent
03fcf1a382
commit
ff2a915ba4
|
@ -13,6 +13,7 @@ import kotlinx.android.synthetic.main.activity_downloads.*
|
||||||
import kotlinx.coroutines.Dispatchers.IO
|
import kotlinx.coroutines.Dispatchers.IO
|
||||||
import kotlinx.coroutines.Dispatchers.Main
|
import kotlinx.coroutines.Dispatchers.Main
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
|
@ -24,10 +25,21 @@ class DownloadsActivity : AppCompatActivity() {
|
||||||
|
|
||||||
setContentView(R.layout.activity_downloads)
|
setContentView(R.layout.activity_downloads)
|
||||||
|
|
||||||
|
downloads.itemAnimator = null
|
||||||
|
|
||||||
adapter = DownloadsAdapter(this, DownloadChangedListener()).also {
|
adapter = DownloadsAdapter(this, DownloadChangedListener()).also {
|
||||||
|
it.setHasStableIds(true)
|
||||||
|
|
||||||
downloads.layoutManager = LinearLayoutManager(this)
|
downloads.layoutManager = LinearLayoutManager(this)
|
||||||
downloads.adapter = it
|
downloads.adapter = it
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GlobalScope.launch(IO) {
|
||||||
|
while (true) {
|
||||||
|
delay(500)
|
||||||
|
refreshProgress()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
|
@ -80,6 +92,28 @@ class DownloadsActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private suspend fun refreshProgress() {
|
||||||
|
val cursor = Otter.get().exoDownloadManager.downloadIndex.getDownloads()
|
||||||
|
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
val download = cursor.download
|
||||||
|
|
||||||
|
download.getMetadata()?.let { info ->
|
||||||
|
adapter.downloads.withIndex().associate { it.value to it.index }.filter { it.key.id == info.id }.toList().getOrNull(0)?.let { match ->
|
||||||
|
if (download.state == Download.STATE_DOWNLOADING && download.percentDownloaded != info.download?.percentDownloaded ?: 0) {
|
||||||
|
withContext(Main) {
|
||||||
|
adapter.downloads[match.second] = info.apply {
|
||||||
|
this.download = download
|
||||||
|
}
|
||||||
|
|
||||||
|
adapter.notifyItemChanged(match.second)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inner class DownloadChangedListener : DownloadsAdapter.OnDownloadChangedListener {
|
inner class DownloadChangedListener : DownloadsAdapter.OnDownloadChangedListener {
|
||||||
override fun onItemRemoved(index: Int) {
|
override fun onItemRemoved(index: Int) {
|
||||||
adapter.downloads.removeAt(index)
|
adapter.downloads.removeAt(index)
|
||||||
|
|
|
@ -22,6 +22,8 @@ class DownloadsAdapter(private val context: Context, private val listener: OnDow
|
||||||
|
|
||||||
override fun getItemCount() = downloads.size
|
override fun getItemCount() = downloads.size
|
||||||
|
|
||||||
|
override fun getItemId(position: Int) = downloads[position].id.toLong()
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
val view = LayoutInflater.from(context).inflate(R.layout.row_download, parent, false)
|
val view = LayoutInflater.from(context).inflate(R.layout.row_download, parent, false)
|
||||||
|
|
||||||
|
@ -37,12 +39,12 @@ class DownloadsAdapter(private val context: Context, private val listener: OnDow
|
||||||
download.download?.let { state ->
|
download.download?.let { state ->
|
||||||
when (state.isTerminalState) {
|
when (state.isTerminalState) {
|
||||||
true -> {
|
true -> {
|
||||||
holder.progress.visibility = View.GONE
|
holder.progress.visibility = View.INVISIBLE
|
||||||
|
|
||||||
when (state.state) {
|
when (state.state) {
|
||||||
Download.STATE_FAILED -> {
|
Download.STATE_FAILED -> {
|
||||||
holder.toggle.setImageDrawable(context.getDrawable(R.drawable.retry))
|
holder.toggle.setImageDrawable(context.getDrawable(R.drawable.retry))
|
||||||
holder.progress.visibility = View.GONE
|
holder.progress.visibility = View.INVISIBLE
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> holder.toggle.visibility = View.GONE
|
else -> holder.toggle.visibility = View.GONE
|
||||||
|
|
|
@ -5,7 +5,10 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="?android:attr/selectableItemBackground"
|
android:background="?android:attr/selectableItemBackground"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:padding="16dp"
|
android:paddingStart="16dp"
|
||||||
|
android:paddingTop="6dp"
|
||||||
|
android:paddingEnd="16dp"
|
||||||
|
android:paddingBottom="6dp"
|
||||||
tools:showIn="@layout/activity_downloads">
|
tools:showIn="@layout/activity_downloads">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
|
Loading…
Reference in New Issue