Commit 6b630e0b authored by wanglei's avatar wanglei

...

parent 3fa3215f
...@@ -118,6 +118,8 @@ dependencies { ...@@ -118,6 +118,8 @@ dependencies {
// define any required OkHttp artifacts without version // define any required OkHttp artifacts without version
implementation("com.squareup.okhttp3:okhttp") implementation("com.squareup.okhttp3:okhttp")
implementation("com.squareup.okhttp3:logging-interceptor") implementation("com.squareup.okhttp3:logging-interceptor")
//支持暂停恢复下载
implementation("com.github.amitshekhariitbhu:PRDownloader:1.0.1")
//facebook //facebook
......
...@@ -4,8 +4,11 @@ import android.app.Activity ...@@ -4,8 +4,11 @@ import android.app.Activity
import android.app.Application import android.app.Application
import android.os.Bundle import android.os.Bundle
import com.base.browserwhite.utils.ActivityManagerUtils import com.base.browserwhite.utils.ActivityManagerUtils
import com.downloader.PRDownloader
import com.downloader.PRDownloaderConfig
import com.facebook.FacebookSdk import com.facebook.FacebookSdk
class MyApplication : Application() { class MyApplication : Application() {
companion object { companion object {
...@@ -17,6 +20,7 @@ class MyApplication : Application() { ...@@ -17,6 +20,7 @@ class MyApplication : Application() {
context = this context = this
FacebookSdk.sdkInitialize(applicationContext) FacebookSdk.sdkInitialize(applicationContext)
initLifeListener() initLifeListener()
initPRDownloader()
} }
private fun initLifeListener() { private fun initLifeListener() {
...@@ -97,4 +101,13 @@ class MyApplication : Application() { ...@@ -97,4 +101,13 @@ class MyApplication : Application() {
} }
}) })
} }
private fun initPRDownloader() {
val config = PRDownloaderConfig.newBuilder()
.setReadTimeout(30000)
.setConnectTimeout(30000)
.setDatabaseEnabled(true)
.build()
PRDownloader.initialize(applicationContext, config)
}
} }
\ No newline at end of file
package com.base.browserwhite.bean package com.base.browserwhite.bean
import com.downloader.Status
data class DownloadBean( data class DownloadBean(
var downloadId: Long = -1L, var downloadId: Int = -1,
var path: String = "", var path: String = "",
val uri: String = "", val uri: String = "",
val time: String = "", val time: String = "",
) { ) {
var state: Int = -1 var state: Status = Status.UNKNOWN
var progress: Int = -1 var progress: Int = -1
var name: String = "" var name: String = ""
var isTime: Boolean = false var isTime: Boolean = false
......
...@@ -27,6 +27,7 @@ import com.base.browserwhite.utils.DownloadHelper.getOlderList ...@@ -27,6 +27,7 @@ import com.base.browserwhite.utils.DownloadHelper.getOlderList
import com.base.browserwhite.utils.LogEx import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.VideoDownloader import com.base.browserwhite.utils.VideoDownloader
import com.base.browserwhite.utils.VideoDownloader.queryDownloadProgress import com.base.browserwhite.utils.VideoDownloader.queryDownloadProgress
import com.downloader.Status
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
...@@ -52,8 +53,10 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() { ...@@ -52,8 +53,10 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
var onPageFinished: ((uri: String?) -> Unit)? = null var onPageFinished: ((uri: String?) -> Unit)? = null
private var downloadAdapter: DownloadAdapter? = null
override fun setView() { override fun setView() {
initWebSettings() initWebSettings()
loadWebView(url) loadWebView(url)
} }
...@@ -79,32 +82,31 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() { ...@@ -79,32 +82,31 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
reloadWebView() reloadWebView()
} }
binding.flDownload.setOnClickListener { binding.flDownload.setOnClickListener {
val adapter = requireContext().showDownloadVideoDialog( if (downloadAdapter == null) {
downloadList, downloadAdapter = DownloadAdapter()
download = { bean: DownloadBean -> }
val pair = VideoDownloader.downloadVideo(requireContext(), bean.uri, bean.name) downloadAdapter?.let { adapter ->
bean.downloadId = pair.first requireContext().showDownloadVideoDialog(
bean.path = pair.second.absolutePath adapter, downloadList,
}, dismissAction = {
dismissAction = { saveDownloadRecordFile(downloadList)
isUpdating = false },
saveDownloadRecordFile(downloadList) )
}, }
)
isUpdating = true
upDataProgress(adapter)
} }
} }
private fun saveDownloadRecordFile(downloadList: ArrayList<DownloadBean>) = lifecycleScope.launch(Dispatchers.IO) { private fun saveDownloadRecordFile(downloadList: ArrayList<DownloadBean>) = lifecycleScope.launch(Dispatchers.IO) {
val recordFile = requireContext().getDownloadJson() val recordFile = requireContext().getDownloadJson()
val gson = Gson() val gson = Gson()
val list = downloadList.filter { val list = downloadList.filter {
it.state == DownloadManager.STATUS_RUNNING || it.state == Status.PAUSED ||
it.state == DownloadManager.STATUS_PAUSED || it.state == Status.RUNNING ||
it.state == DownloadManager.STATUS_SUCCESSFUL it.state == Status.COMPLETED
} }
val olderList = getOlderList(recordFile, gson).filter { !list.contains(it) } val olderList = getOlderList(recordFile, gson).filter { !list.contains(it) }
...@@ -117,29 +119,6 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() { ...@@ -117,29 +119,6 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
recordFile.writeText(json) recordFile.writeText(json)
} }
private var isUpdating = false
@SuppressLint("NotifyDataSetChanged")
private fun upDataProgress(adapter: DownloadAdapter) = Thread {
while (isUpdating) {
downloadList.filter { it.state == DownloadManager.STATUS_RUNNING }.forEach { bean: DownloadBean ->
queryDownloadProgress(requireContext(), bean.downloadId,
uiAction = { progress ->
LogEx.logDebug(TAG, "item ${bean.downloadId} progress=$progress ")
bean.progress = progress
},
noRunningAction = { status ->
bean.state = status
})
}
binding.root.post {
adapter.notifyDataSetChanged()
}
Thread.sleep(250)
}
}.start()
private fun reloadWebView() { private fun reloadWebView() {
binding.llError.visibility = View.GONE binding.llError.visibility = View.GONE
binding.webView.visibility = View.VISIBLE binding.webView.visibility = View.VISIBLE
......
package com.base.browserwhite.ui.adapter package com.base.browserwhite.ui.adapter
import android.app.DownloadManager import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
...@@ -12,13 +12,20 @@ import com.base.browserwhite.databinding.ItemDownloadBinding ...@@ -12,13 +12,20 @@ import com.base.browserwhite.databinding.ItemDownloadBinding
import com.base.browserwhite.databinding.ItemDownloadCardBinding import com.base.browserwhite.databinding.ItemDownloadCardBinding
import com.base.browserwhite.databinding.ItemDownloadTimeBinding import com.base.browserwhite.databinding.ItemDownloadTimeBinding
import com.base.browserwhite.utils.KotlinExt.toFormatSize import com.base.browserwhite.utils.KotlinExt.toFormatSize
import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.VideoDownloader
import com.base.browserwhite.utils.XmlEx.inflate import com.base.browserwhite.utils.XmlEx.inflate
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.BaseQuickAdapter
import com.downloader.PRDownloader
import com.downloader.Status
import java.io.File import java.io.File
class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadViewHolder>() { class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadViewHolder>() {
private val TAG = "DownloadAdapter"
inner class DownloadViewHolder(view: View) : ViewHolder(view) inner class DownloadViewHolder(view: View) : ViewHolder(view)
var downloadAction: ((item: DownloadBean) -> Unit)? = null var downloadAction: ((item: DownloadBean) -> Unit)? = null
...@@ -40,31 +47,43 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV ...@@ -40,31 +47,43 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV
Glide.with(context).load(item.uri).centerCrop().into(binding.iv) Glide.with(context).load(item.uri).centerCrop().into(binding.iv)
binding.tvName.text = if (item.name.isNotEmpty()) item.name else item.uri.split("/").last() binding.tvName.text = if (item.name.isNotEmpty()) item.name else item.uri.split("/").last()
binding.ivDownload.isVisible = item.downloadId == -1L binding.ivDownload.isVisible = item.downloadId == -1
binding.flDownload.isVisible = item.downloadId != -1L binding.flDownload.isVisible = item.state != Status.UNKNOWN
binding.ivFinish.isVisible = false binding.ivFinish.isVisible = false
when (item.state) { when (item.state) {
DownloadManager.STATUS_PAUSED -> { Status.PAUSED -> {
binding.ivXiazaiZantin.setImageResource(R.mipmap.zanting_download) binding.ivXiazaiZantin.setImageResource(R.mipmap.zanting_download)
binding.circularProgressBar.progress = item.progress.toFloat() binding.circularProgressBar.progress = item.progress.toFloat()
} }
Status.RUNNING -> {
DownloadManager.STATUS_RUNNING -> {
binding.ivXiazaiZantin.setImageResource(R.mipmap.xiazhaiz_download) binding.ivXiazaiZantin.setImageResource(R.mipmap.xiazhaiz_download)
binding.circularProgressBar.progress = item.progress.toFloat() binding.circularProgressBar.progress = item.progress.toFloat()
} }
DownloadManager.STATUS_SUCCESSFUL -> { Status.COMPLETED -> {
binding.flDownload.isVisible = false binding.flDownload.isVisible = false
binding.ivFinish.isVisible = true binding.ivFinish.isVisible = true
} }
else -> {
}
} }
binding.ivDownload.setOnClickListener { binding.ivDownload.setOnClickListener {
downloadAction?.invoke(item) downloadAction?.invoke(item)
} }
binding.flDownload.setOnClickListener {
val status: Status = PRDownloader.getStatus(item.downloadId)
if (status == Status.PAUSED) {
PRDownloader.resume(item.downloadId)
}
if (status == Status.RUNNING) {
PRDownloader.pause(item.downloadId)
}
}
} }
} }
...@@ -85,4 +104,27 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV ...@@ -85,4 +104,27 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV
return DownloadViewHolder(layout.inflate(parent)) return DownloadViewHolder(layout.inflate(parent))
} }
@SuppressLint("NotifyDataSetChanged")
fun downloadItem(bean: DownloadBean) {
val pair = VideoDownloader.downloadVideo2(
context, bean.uri, bean.name,
progressAction = { progress ->
LogEx.logDebug(TAG, "progress=$progress")
bean.progress = progress
val status: Status = PRDownloader.getStatus(bean.downloadId)
bean.state = status
notifyDataSetChanged()
},
finishAction = {
val status: Status = PRDownloader.getStatus(bean.downloadId)
bean.state = status
LogEx.logDebug(TAG, "status=$status")
notifyDataSetChanged()
}
)
bean.downloadId = pair.first
bean.path = pair.second.absolutePath
}
} }
\ No newline at end of file
...@@ -233,8 +233,8 @@ object DialogViews { ...@@ -233,8 +233,8 @@ object DialogViews {
} }
fun Context.showDownloadVideoDialog( fun Context.showDownloadVideoDialog(
adapter: DownloadAdapter,
list: List<DownloadBean>, list: List<DownloadBean>,
download: (item: DownloadBean) -> Unit,
dismissAction: () -> Unit dismissAction: () -> Unit
): DownloadAdapter { ): DownloadAdapter {
val TAG = "DownloadVideoDialog" val TAG = "DownloadVideoDialog"
...@@ -250,14 +250,13 @@ object DialogViews { ...@@ -250,14 +250,13 @@ object DialogViews {
//展开 //展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED behavior.state = BottomSheetBehavior.STATE_EXPANDED
val adapter = DownloadAdapter()
adapter.downloadAction = { item: DownloadBean -> adapter.downloadAction = { item: DownloadBean ->
dialog.dismiss() dialog.dismiss()
showDownloadConfirmDialog(item) { showDownloadConfirmDialog(item) {
item.state = DownloadManager.STATUS_RUNNING adapter.downloadItem(item)
download.invoke(item)
} }
} }
binding.rv.adapter = adapter binding.rv.adapter = adapter
adapter.submitList(list) adapter.submitList(list)
......
...@@ -7,6 +7,10 @@ import android.database.Cursor ...@@ -7,6 +7,10 @@ import android.database.Cursor
import android.net.Uri import android.net.Uri
import android.os.Environment import android.os.Environment
import com.base.browserwhite.R import com.base.browserwhite.R
import com.downloader.Error
import com.downloader.OnCancelListener
import com.downloader.OnDownloadListener
import com.downloader.PRDownloader
import java.io.File import java.io.File
...@@ -50,6 +54,45 @@ object VideoDownloader { ...@@ -50,6 +54,45 @@ object VideoDownloader {
return Pair(downloadId, filePath) return Pair(downloadId, filePath)
} }
fun downloadVideo2(
context: Context,
url: String,
name: String,
progressAction: (progress: Int) -> Unit,
finishAction: () -> Unit
): Pair<Int, File> {
var fileName = url.split("/").last()
if (name.isNotEmpty()) {
fileName = name
}
// 设置下载文件的存储位置
val dirPath = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
context.resources.getString(R.string.app_name)
).absolutePath
val downloadId = PRDownloader.download(url, dirPath, fileName)
.build()
.setOnStartOrResumeListener { }
.setOnPauseListener { }
.setOnCancelListener { }
.setOnProgressListener {
val percent = it.currentBytes * 100 / it.totalBytes
progressAction.invoke(percent.toInt())
}.start(object : OnDownloadListener {
override fun onDownloadComplete() {
finishAction.invoke()
}
override fun onError(p0: Error?) {
finishAction.invoke()
}
})
val filePath = File(dirPath, fileName)
return Pair(downloadId, filePath)
}
fun queryDownloadProgress( fun queryDownloadProgress(
context: Context, context: Context,
downloadId: Long, downloadId: Long,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment