Commit 6b630e0b authored by wanglei's avatar wanglei

...

parent 3fa3215f
......@@ -118,6 +118,8 @@ dependencies {
// define any required OkHttp artifacts without version
implementation("com.squareup.okhttp3:okhttp")
implementation("com.squareup.okhttp3:logging-interceptor")
//支持暂停恢复下载
implementation("com.github.amitshekhariitbhu:PRDownloader:1.0.1")
//facebook
......
......@@ -4,8 +4,11 @@ import android.app.Activity
import android.app.Application
import android.os.Bundle
import com.base.browserwhite.utils.ActivityManagerUtils
import com.downloader.PRDownloader
import com.downloader.PRDownloaderConfig
import com.facebook.FacebookSdk
class MyApplication : Application() {
companion object {
......@@ -17,6 +20,7 @@ class MyApplication : Application() {
context = this
FacebookSdk.sdkInitialize(applicationContext)
initLifeListener()
initPRDownloader()
}
private fun initLifeListener() {
......@@ -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
import com.downloader.Status
data class DownloadBean(
var downloadId: Long = -1L,
var downloadId: Int = -1,
var path: String = "",
val uri: String = "",
val time: String = "",
) {
var state: Int = -1
var state: Status = Status.UNKNOWN
var progress: Int = -1
var name: String = ""
var isTime: Boolean = false
......
......@@ -27,6 +27,7 @@ import com.base.browserwhite.utils.DownloadHelper.getOlderList
import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.VideoDownloader
import com.base.browserwhite.utils.VideoDownloader.queryDownloadProgress
import com.downloader.Status
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import kotlinx.coroutines.Dispatchers
......@@ -52,8 +53,10 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
var onPageFinished: ((uri: String?) -> Unit)? = null
private var downloadAdapter: DownloadAdapter? = null
override fun setView() {
initWebSettings()
loadWebView(url)
}
......@@ -79,32 +82,31 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
reloadWebView()
}
binding.flDownload.setOnClickListener {
val adapter = requireContext().showDownloadVideoDialog(
downloadList,
download = { bean: DownloadBean ->
val pair = VideoDownloader.downloadVideo(requireContext(), bean.uri, bean.name)
bean.downloadId = pair.first
bean.path = pair.second.absolutePath
},
dismissAction = {
isUpdating = false
saveDownloadRecordFile(downloadList)
},
)
isUpdating = true
upDataProgress(adapter)
if (downloadAdapter == null) {
downloadAdapter = DownloadAdapter()
}
downloadAdapter?.let { adapter ->
requireContext().showDownloadVideoDialog(
adapter, downloadList,
dismissAction = {
saveDownloadRecordFile(downloadList)
},
)
}
}
}
private fun saveDownloadRecordFile(downloadList: ArrayList<DownloadBean>) = lifecycleScope.launch(Dispatchers.IO) {
val recordFile = requireContext().getDownloadJson()
val gson = Gson()
val list = downloadList.filter {
it.state == DownloadManager.STATUS_RUNNING ||
it.state == DownloadManager.STATUS_PAUSED ||
it.state == DownloadManager.STATUS_SUCCESSFUL
it.state == Status.PAUSED ||
it.state == Status.RUNNING ||
it.state == Status.COMPLETED
}
val olderList = getOlderList(recordFile, gson).filter { !list.contains(it) }
......@@ -117,29 +119,6 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
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() {
binding.llError.visibility = View.GONE
binding.webView.visibility = View.VISIBLE
......
package com.base.browserwhite.ui.adapter
import android.app.DownloadManager
import android.annotation.SuppressLint
import android.content.Context
import android.view.View
import android.view.ViewGroup
......@@ -12,13 +12,20 @@ import com.base.browserwhite.databinding.ItemDownloadBinding
import com.base.browserwhite.databinding.ItemDownloadCardBinding
import com.base.browserwhite.databinding.ItemDownloadTimeBinding
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.bumptech.glide.Glide
import com.chad.library.adapter4.BaseQuickAdapter
import com.downloader.PRDownloader
import com.downloader.Status
import java.io.File
class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadViewHolder>() {
private val TAG = "DownloadAdapter"
inner class DownloadViewHolder(view: View) : ViewHolder(view)
var downloadAction: ((item: DownloadBean) -> Unit)? = null
......@@ -40,31 +47,43 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV
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.ivDownload.isVisible = item.downloadId == -1L
binding.flDownload.isVisible = item.downloadId != -1L
binding.ivDownload.isVisible = item.downloadId == -1
binding.flDownload.isVisible = item.state != Status.UNKNOWN
binding.ivFinish.isVisible = false
when (item.state) {
DownloadManager.STATUS_PAUSED -> {
Status.PAUSED -> {
binding.ivXiazaiZantin.setImageResource(R.mipmap.zanting_download)
binding.circularProgressBar.progress = item.progress.toFloat()
}
DownloadManager.STATUS_RUNNING -> {
Status.RUNNING -> {
binding.ivXiazaiZantin.setImageResource(R.mipmap.xiazhaiz_download)
binding.circularProgressBar.progress = item.progress.toFloat()
}
DownloadManager.STATUS_SUCCESSFUL -> {
Status.COMPLETED -> {
binding.flDownload.isVisible = false
binding.ivFinish.isVisible = true
}
else -> {
}
}
binding.ivDownload.setOnClickListener {
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
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 {
}
fun Context.showDownloadVideoDialog(
adapter: DownloadAdapter,
list: List<DownloadBean>,
download: (item: DownloadBean) -> Unit,
dismissAction: () -> Unit
): DownloadAdapter {
val TAG = "DownloadVideoDialog"
......@@ -250,14 +250,13 @@ object DialogViews {
//展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED
val adapter = DownloadAdapter()
adapter.downloadAction = { item: DownloadBean ->
dialog.dismiss()
showDownloadConfirmDialog(item) {
item.state = DownloadManager.STATUS_RUNNING
download.invoke(item)
adapter.downloadItem(item)
}
}
binding.rv.adapter = adapter
adapter.submitList(list)
......
......@@ -7,6 +7,10 @@ import android.database.Cursor
import android.net.Uri
import android.os.Environment
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
......@@ -50,6 +54,45 @@ object VideoDownloader {
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(
context: Context,
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