Commit 1aacfe19 authored by wanglei's avatar wanglei

...

parent 6b630e0b
...@@ -120,6 +120,7 @@ dependencies { ...@@ -120,6 +120,7 @@ dependencies {
implementation("com.squareup.okhttp3:logging-interceptor") implementation("com.squareup.okhttp3:logging-interceptor")
//支持暂停恢复下载 //支持暂停恢复下载
implementation("com.github.amitshekhariitbhu:PRDownloader:1.0.1") implementation("com.github.amitshekhariitbhu:PRDownloader:1.0.1")
implementation("com.liulishuo.filedownloader:library:1.7.7")
//facebook //facebook
......
...@@ -6,7 +6,7 @@ data class DownloadBean( ...@@ -6,7 +6,7 @@ data class DownloadBean(
var downloadId: Int = -1, var downloadId: Int = -1,
var path: String = "", var path: String = "",
val uri: String = "", val uri: String = "",
val time: String = "", var time: String = "",
) { ) {
var state: Status = Status.UNKNOWN var state: Status = Status.UNKNOWN
var progress: Int = -1 var progress: Int = -1
......
...@@ -13,9 +13,12 @@ import com.base.browserwhite.ui.activity.BaseActivity ...@@ -13,9 +13,12 @@ import com.base.browserwhite.ui.activity.BaseActivity
import com.base.browserwhite.ui.adapter.DownloadAdapter import com.base.browserwhite.ui.adapter.DownloadAdapter
import com.base.browserwhite.ui.views.DialogViews.showGerPermission import com.base.browserwhite.ui.views.DialogViews.showGerPermission
import com.base.browserwhite.utils.BarUtils 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.KotlinExt.toFormatTime
import com.base.browserwhite.utils.PermissionHelp.checkStorePermission import com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import com.base.browserwhite.utils.PermissionHelp.requestStorePermission import com.base.browserwhite.utils.PermissionHelp.requestStorePermission
import com.downloader.Status
import java.io.File import java.io.File
class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBinding>() { class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBinding>() {
...@@ -63,8 +66,7 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin ...@@ -63,8 +66,7 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin
private fun initData() { private fun initData() {
val appName: String = resources.getString(R.string.app_name) val appName: String = resources.getString(R.string.app_name)
val dir = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), appName) val dir = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), appName)
// dir.listFiles().isNullOrEmpty() if (dir.listFiles().isNullOrEmpty()) {
if (true) {
binding.llEmpty.isVisible = true binding.llEmpty.isVisible = true
} else { } else {
val fileList = arrayListOf<File>() val fileList = arrayListOf<File>()
...@@ -72,6 +74,7 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin ...@@ -72,6 +74,7 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin
val beanList = arrayListOf<DownloadBean>() val beanList = arrayListOf<DownloadBean>()
fileList.addAll(dir.listFiles() ?: arrayOf()) fileList.addAll(dir.listFiles() ?: arrayOf())
fileList.sortBy { it.lastModified() } fileList.sortBy { it.lastModified() }
fileList.forEach { fileList.forEach {
val time = it.lastModified().toFormatTime() val time = it.lastModified().toFormatTime()
if (!timeList.contains(time)) { if (!timeList.contains(time)) {
...@@ -81,6 +84,17 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin ...@@ -81,6 +84,17 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin
beanList.add(DownloadBean(path = it.absolutePath)) 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) adapter.submitList(beanList)
} }
......
package com.base.browserwhite.ui.activity.webbrowser package com.base.browserwhite.ui.activity.webbrowser
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.DownloadManager
import android.net.Uri import android.net.Uri
import android.net.http.SslError import android.net.http.SslError
import android.view.View import android.view.View
...@@ -23,21 +22,16 @@ import com.base.browserwhite.ui.adapter.DownloadAdapter ...@@ -23,21 +22,16 @@ import com.base.browserwhite.ui.adapter.DownloadAdapter
import com.base.browserwhite.ui.fragment.BaseFragment import com.base.browserwhite.ui.fragment.BaseFragment
import com.base.browserwhite.ui.views.DialogViews.showDownloadVideoDialog import com.base.browserwhite.ui.views.DialogViews.showDownloadVideoDialog
import com.base.browserwhite.utils.DownloadHelper.getDownloadJson 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.LogEx
import com.base.browserwhite.utils.VideoDownloader import com.downloader.PRDownloader
import com.base.browserwhite.utils.VideoDownloader.queryDownloadProgress
import com.downloader.Status import com.downloader.Status
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.json.JSONArray import org.json.JSONArray
import java.io.File
import java.lang.reflect.Type
import kotlin.random.Random import kotlin.random.Random
...@@ -104,12 +98,14 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() { ...@@ -104,12 +98,14 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
val gson = Gson() val gson = Gson()
val list = downloadList.filter { val list = downloadList.filter {
it.state == Status.PAUSED || it.state == Status.PAUSED || it.state == Status.RUNNING
it.state == Status.RUNNING ||
it.state == Status.COMPLETED
} }
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>() val arrayList = arrayListOf<DownloadBean>()
arrayList.addAll(olderList) arrayList.addAll(olderList)
...@@ -292,7 +288,7 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() { ...@@ -292,7 +288,7 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
binding.tvDownloadNumber.text = jsonArray.length().toString() binding.tvDownloadNumber.text = jsonArray.length().toString()
} }
val recordFile = requireContext().getDownloadJson() val recordFile = requireContext().getDownloadJson()
val olderList = getOlderList(recordFile, Gson()) val olderList = getNotFinishList(recordFile, Gson())
for (i in 0 until jsonArray.length()) { for (i in 0 until jsonArray.length()) {
val videoUrl = jsonArray.optString(i) val videoUrl = jsonArray.optString(i)
LogEx.logDebug(TAG, videoUrl) LogEx.logDebug(TAG, videoUrl)
......
...@@ -19,6 +19,7 @@ import com.bumptech.glide.Glide ...@@ -19,6 +19,7 @@ import com.bumptech.glide.Glide
import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.BaseQuickAdapter
import com.downloader.PRDownloader import com.downloader.PRDownloader
import com.downloader.Status import com.downloader.Status
import com.downloader.internal.DownloadRequestQueue
import java.io.File import java.io.File
...@@ -42,6 +43,8 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV ...@@ -42,6 +43,8 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV
Glide.with(context).load(file.absoluteFile).centerCrop().into(binding.iv) Glide.with(context).load(file.absoluteFile).centerCrop().into(binding.iv)
binding.tvName.text = file.name binding.tvName.text = file.name
binding.tvSize.text = file.length().toFormatSize() binding.tvSize.text = file.length().toFormatSize()
} else if (item.uiType == 2) { } else if (item.uiType == 2) {
val binding = ItemDownloadCardBinding.bind(holder.itemView) val binding = ItemDownloadCardBinding.bind(holder.itemView)
Glide.with(context).load(item.uri).centerCrop().into(binding.iv) Glide.with(context).load(item.uri).centerCrop().into(binding.iv)
...@@ -126,5 +129,4 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV ...@@ -126,5 +129,4 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV
bean.path = pair.second.absolutePath bean.path = pair.second.absolutePath
} }
} }
\ No newline at end of file
...@@ -5,6 +5,7 @@ import android.app.AlertDialog ...@@ -5,6 +5,7 @@ import android.app.AlertDialog
import android.app.Dialog import android.app.Dialog
import android.app.DownloadManager import android.app.DownloadManager
import android.content.Context import android.content.Context
import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.view.Gravity import android.view.Gravity
...@@ -33,6 +34,7 @@ import com.base.browserwhite.databinding.DialogMediaMoreBinding ...@@ -33,6 +34,7 @@ import com.base.browserwhite.databinding.DialogMediaMoreBinding
import com.base.browserwhite.databinding.DialogMyAccountBinding import com.base.browserwhite.databinding.DialogMyAccountBinding
import com.base.browserwhite.databinding.DialogPermissonOpenBinding import com.base.browserwhite.databinding.DialogPermissonOpenBinding
import com.base.browserwhite.databinding.DialogSearchEngineBinding 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.adapter.DownloadAdapter
import com.base.browserwhite.ui.views.DialogViews.showDeleteTipDialog import com.base.browserwhite.ui.views.DialogViews.showDeleteTipDialog
import com.base.browserwhite.utils.LogEx import com.base.browserwhite.utils.LogEx
...@@ -245,6 +247,14 @@ object DialogViews { ...@@ -245,6 +247,14 @@ object DialogViews {
dialog.show() 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 parentView = binding.root.parent as View
val behavior = BottomSheetBehavior.from(parentView) val behavior = BottomSheetBehavior.from(parentView)
//展开 //展开
...@@ -260,16 +270,13 @@ object DialogViews { ...@@ -260,16 +270,13 @@ object DialogViews {
binding.rv.adapter = adapter binding.rv.adapter = adapter
adapter.submitList(list) 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 { dialog.setOnDismissListener {
dismissAction.invoke() dismissAction.invoke()
} }
binding.tvDownloadDir.setOnClickListener {
dialog.dismiss()
startActivity(Intent(this, WebDownloadManagerActivity::class.java))
}
return adapter return adapter
} }
......
package com.base.browserwhite.utils package com.base.browserwhite.utils
import android.annotation.SuppressLint
import android.app.DownloadManager
import android.content.Context import android.content.Context
import com.base.browserwhite.bean.DownloadBean import com.base.browserwhite.bean.DownloadBean
import com.base.browserwhite.ui.adapter.DownloadAdapter
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import java.io.File import java.io.File
...@@ -24,7 +21,7 @@ object DownloadHelper { ...@@ -24,7 +21,7 @@ object DownloadHelper {
return recordFile return recordFile
} }
fun getOlderList(recordFile: File, gson: Gson): List<DownloadBean> { fun getNotFinishList(recordFile: File, gson: Gson=Gson()): List<DownloadBean> {
val olderText = recordFile.readText() val olderText = recordFile.readText()
val type: Type = object : TypeToken<List<DownloadBean>>() {}.type val type: Type = object : TypeToken<List<DownloadBean>>() {}.type
return gson.fromJson(olderText, type) ?: listOf() return gson.fromJson(olderText, type) ?: listOf()
......
package com.base.browserwhite.utils package com.base.browserwhite.utils
import android.annotation.SuppressLint
import android.app.DownloadManager import android.app.DownloadManager
import android.app.DownloadManager.Request.NETWORK_WIFI
import android.content.Context import android.content.Context
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.Error
import com.downloader.OnCancelListener
import com.downloader.OnDownloadListener import com.downloader.OnDownloadListener
import com.downloader.PRDownloader import com.downloader.PRDownloader
import com.downloader.internal.DownloadTask
import java.io.File import java.io.File
...@@ -19,7 +18,6 @@ object VideoDownloader { ...@@ -19,7 +18,6 @@ object VideoDownloader {
//https://assets.mixkit.co/videos/4702/4702-720.mp4 //https://assets.mixkit.co/videos/4702/4702-720.mp4
fun downloadVideo(context: Context, uri: String, name: String): Pair<Long, File> { fun downloadVideo(context: Context, uri: String, name: String): Pair<Long, File> {
val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
var fileName = uri.split("/").last() var fileName = uri.split("/").last()
if (name.isNotEmpty()) { if (name.isNotEmpty()) {
fileName = name fileName = name
...@@ -32,6 +30,7 @@ object VideoDownloader { ...@@ -32,6 +30,7 @@ object VideoDownloader {
// 设置下载的标题和描述 // 设置下载的标题和描述
request.setTitle(fileName) request.setTitle(fileName)
request.setDescription("Downloading $fileName") request.setDescription("Downloading $fileName")
request.setAllowedNetworkTypes(NETWORK_WIFI)
// 设置通知栏的可见性 // 设置通知栏的可见性
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE) request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)
...@@ -92,86 +91,4 @@ object VideoDownloader { ...@@ -92,86 +91,4 @@ object VideoDownloader {
return Pair(downloadId, filePath) 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