Commit 1aacfe19 authored by wanglei's avatar wanglei

...

parent 6b630e0b
......@@ -120,6 +120,7 @@ dependencies {
implementation("com.squareup.okhttp3:logging-interceptor")
//支持暂停恢复下载
implementation("com.github.amitshekhariitbhu:PRDownloader:1.0.1")
implementation("com.liulishuo.filedownloader:library:1.7.7")
//facebook
......
......@@ -6,7 +6,7 @@ data class DownloadBean(
var downloadId: Int = -1,
var path: String = "",
val uri: String = "",
val time: String = "",
var time: String = "",
) {
var state: Status = Status.UNKNOWN
var progress: Int = -1
......
......@@ -13,9 +13,12 @@ import com.base.browserwhite.ui.activity.BaseActivity
import com.base.browserwhite.ui.adapter.DownloadAdapter
import com.base.browserwhite.ui.views.DialogViews.showGerPermission
import com.base.browserwhite.utils.BarUtils
import com.base.browserwhite.utils.DownloadHelper.getDownloadJson
import com.base.browserwhite.utils.DownloadHelper.getNotFinishList
import com.base.browserwhite.utils.KotlinExt.toFormatTime
import com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import com.base.browserwhite.utils.PermissionHelp.requestStorePermission
import com.downloader.Status
import java.io.File
class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBinding>() {
......@@ -63,8 +66,7 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin
private fun initData() {
val appName: String = resources.getString(R.string.app_name)
val dir = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), appName)
// dir.listFiles().isNullOrEmpty()
if (true) {
if (dir.listFiles().isNullOrEmpty()) {
binding.llEmpty.isVisible = true
} else {
val fileList = arrayListOf<File>()
......@@ -72,6 +74,7 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin
val beanList = arrayListOf<DownloadBean>()
fileList.addAll(dir.listFiles() ?: arrayOf())
fileList.sortBy { it.lastModified() }
fileList.forEach {
val time = it.lastModified().toFormatTime()
if (!timeList.contains(time)) {
......@@ -81,6 +84,17 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin
beanList.add(DownloadBean(path = it.absolutePath))
}
}
getNotFinishList(getDownloadJson()).forEach { old ->
if (!timeList.contains(old.time)) {
timeList.add(old.time)
beanList.add(DownloadBean(time = old.time).apply { isTime = true })
}
val index = beanList.indexOfFirst { bean -> bean.time == old.time }
runCatching {
beanList.add(index + 1, old)
}
}
adapter.submitList(beanList)
}
......
package com.base.browserwhite.ui.activity.webbrowser
import android.annotation.SuppressLint
import android.app.DownloadManager
import android.net.Uri
import android.net.http.SslError
import android.view.View
......@@ -23,21 +22,16 @@ import com.base.browserwhite.ui.adapter.DownloadAdapter
import com.base.browserwhite.ui.fragment.BaseFragment
import com.base.browserwhite.ui.views.DialogViews.showDownloadVideoDialog
import com.base.browserwhite.utils.DownloadHelper.getDownloadJson
import com.base.browserwhite.utils.DownloadHelper.getOlderList
import com.base.browserwhite.utils.DownloadHelper.getNotFinishList
import com.base.browserwhite.utils.KotlinExt.toFormatTime
import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.VideoDownloader
import com.base.browserwhite.utils.VideoDownloader.queryDownloadProgress
import com.downloader.PRDownloader
import com.downloader.Status
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import org.json.JSONArray
import java.io.File
import java.lang.reflect.Type
import kotlin.random.Random
......@@ -104,12 +98,14 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
val gson = Gson()
val list = downloadList.filter {
it.state == Status.PAUSED ||
it.state == Status.RUNNING ||
it.state == Status.COMPLETED
it.state == Status.PAUSED || it.state == Status.RUNNING
}
list.forEach { it.time = System.currentTimeMillis().toFormatTime() }
val olderList = getOlderList(recordFile, gson).filter { !list.contains(it) }
val olderList = getNotFinishList(recordFile, gson).filter { old ->
val status = PRDownloader.getStatus(old.downloadId)
status == Status.PAUSED || status == Status.RUNNING
}.filter { !list.contains(it) }
val arrayList = arrayListOf<DownloadBean>()
arrayList.addAll(olderList)
......@@ -292,7 +288,7 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
binding.tvDownloadNumber.text = jsonArray.length().toString()
}
val recordFile = requireContext().getDownloadJson()
val olderList = getOlderList(recordFile, Gson())
val olderList = getNotFinishList(recordFile, Gson())
for (i in 0 until jsonArray.length()) {
val videoUrl = jsonArray.optString(i)
LogEx.logDebug(TAG, videoUrl)
......
......@@ -19,6 +19,7 @@ import com.bumptech.glide.Glide
import com.chad.library.adapter4.BaseQuickAdapter
import com.downloader.PRDownloader
import com.downloader.Status
import com.downloader.internal.DownloadRequestQueue
import java.io.File
......@@ -42,6 +43,8 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV
Glide.with(context).load(file.absoluteFile).centerCrop().into(binding.iv)
binding.tvName.text = file.name
binding.tvSize.text = file.length().toFormatSize()
} else if (item.uiType == 2) {
val binding = ItemDownloadCardBinding.bind(holder.itemView)
Glide.with(context).load(item.uri).centerCrop().into(binding.iv)
......@@ -126,5 +129,4 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV
bean.path = pair.second.absolutePath
}
}
\ No newline at end of file
......@@ -5,6 +5,7 @@ import android.app.AlertDialog
import android.app.Dialog
import android.app.DownloadManager
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.view.Gravity
......@@ -33,6 +34,7 @@ import com.base.browserwhite.databinding.DialogMediaMoreBinding
import com.base.browserwhite.databinding.DialogMyAccountBinding
import com.base.browserwhite.databinding.DialogPermissonOpenBinding
import com.base.browserwhite.databinding.DialogSearchEngineBinding
import com.base.browserwhite.ui.activity.download.WebDownloadManagerActivity
import com.base.browserwhite.ui.adapter.DownloadAdapter
import com.base.browserwhite.ui.views.DialogViews.showDeleteTipDialog
import com.base.browserwhite.utils.LogEx
......@@ -245,6 +247,14 @@ object DialogViews {
dialog.show()
val itemHeight = resources.getDimensionPixelOffset(R.dimen.dp_97)
LogEx.logDebug(TAG, "itemHeight=$itemHeight")
if (list.size > 3) {
val recyclerViewHeight: Int = 3 * itemHeight
binding.rv.layoutParams.height = recyclerViewHeight
binding.rv.requestLayout()
}
val parentView = binding.root.parent as View
val behavior = BottomSheetBehavior.from(parentView)
//展开
......@@ -260,16 +270,13 @@ object DialogViews {
binding.rv.adapter = adapter
adapter.submitList(list)
val itemHeight = resources.getDimensionPixelOffset(R.dimen.dp_97)
LogEx.logDebug(TAG, "itemHeight=$itemHeight")
if (list.size > 3) {
val recyclerViewHeight: Int = 3 * itemHeight
binding.rv.layoutParams.height = recyclerViewHeight
binding.rv.requestLayout()
}
dialog.setOnDismissListener {
dismissAction.invoke()
}
binding.tvDownloadDir.setOnClickListener {
dialog.dismiss()
startActivity(Intent(this, WebDownloadManagerActivity::class.java))
}
return adapter
}
......
package com.base.browserwhite.utils
import android.annotation.SuppressLint
import android.app.DownloadManager
import android.content.Context
import com.base.browserwhite.bean.DownloadBean
import com.base.browserwhite.ui.adapter.DownloadAdapter
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import java.io.File
......@@ -24,7 +21,7 @@ object DownloadHelper {
return recordFile
}
fun getOlderList(recordFile: File, gson: Gson): List<DownloadBean> {
fun getNotFinishList(recordFile: File, gson: Gson=Gson()): List<DownloadBean> {
val olderText = recordFile.readText()
val type: Type = object : TypeToken<List<DownloadBean>>() {}.type
return gson.fromJson(olderText, type) ?: listOf()
......
package com.base.browserwhite.utils
import android.annotation.SuppressLint
import android.app.DownloadManager
import android.app.DownloadManager.Request.NETWORK_WIFI
import android.content.Context
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 com.downloader.internal.DownloadTask
import java.io.File
......@@ -19,7 +18,6 @@ object VideoDownloader {
//https://assets.mixkit.co/videos/4702/4702-720.mp4
fun downloadVideo(context: Context, uri: String, name: String): Pair<Long, File> {
val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
var fileName = uri.split("/").last()
if (name.isNotEmpty()) {
fileName = name
......@@ -32,6 +30,7 @@ object VideoDownloader {
// 设置下载的标题和描述
request.setTitle(fileName)
request.setDescription("Downloading $fileName")
request.setAllowedNetworkTypes(NETWORK_WIFI)
// 设置通知栏的可见性
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)
......@@ -92,86 +91,4 @@ object VideoDownloader {
return Pair(downloadId, filePath)
}
fun queryDownloadProgress(
context: Context,
downloadId: Long,
uiAction: (progress: Int) -> Unit,
noRunningAction: (status: Int) -> Unit
) {
if (downloadId == -1L) {
return noRunningAction.invoke(-1)
}
val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
// 创建查询对象
val query = DownloadManager.Query().setFilterById(downloadId)
// 执行查询
val cursor = downloadManager.query(query)
// 检查游标是否有数据
if (cursor != null && cursor.moveToFirst()) {
// 获取下载的状态
val columnIndexStatus = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)
val status = cursor.getInt(columnIndexStatus)
// 检查下载是否还在进行中
if (status == DownloadManager.STATUS_RUNNING) {
// 获取下载的进度
val columnIndexBytesDownloadedSoFar = cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)
val bytesDownloadedSoFar = cursor.getLong(columnIndexBytesDownloadedSoFar)
val columnIndexTotalSizeBytes = cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)
val totalSizeBytes = cursor.getLong(columnIndexTotalSizeBytes)
// 计算下载的百分比
val progress = (100 * bytesDownloadedSoFar.toFloat() / totalSizeBytes.toFloat()).toInt()
// 在这里处理进度更新,例如更新UI
uiAction.invoke(progress)
} else {
// 处理下载完成或出错的情况
noRunningAction.invoke(status)
when (status) {
DownloadManager.STATUS_PAUSED -> {
println("Download paused")
}
DownloadManager.STATUS_FAILED -> {
println("Download failed")
}
DownloadManager.STATUS_SUCCESSFUL -> {
println("Download successful")
}
}
}
// 关闭游标
cursor.close()
}
}
@SuppressLint("Range")
fun queryDownloadFilePath(context: Context, downloadId: Long): String {
var filePath: String = ""
val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
runCatching {
val query = DownloadManager.Query().setFilterById(downloadId)
val cursor: Cursor = downloadManager.query(query)
if (cursor.moveToFirst()) {
val status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS))
if (status == DownloadManager.STATUS_SUCCESSFUL) {
//下载文件的本地路径
filePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME))
}
}
cursor.close()
}
return filePath
}
}
\ No newline at end of file
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