Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
B
Browser White
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanglei
Browser White
Commits
6b630e0b
Commit
6b630e0b
authored
Aug 23, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...
parent
3fa3215f
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
134 additions
and
54 deletions
+134
-54
build.gradle.kts
app/build.gradle.kts
+2
-0
MyApplication.kt
app/src/main/java/com/base/browserwhite/MyApplication.kt
+13
-0
DownloadBean.kt
app/src/main/java/com/base/browserwhite/bean/DownloadBean.kt
+4
-2
WebViewFragment.kt
...se/browserwhite/ui/activity/webbrowser/WebViewFragment.kt
+19
-40
DownloadAdapter.kt
.../java/com/base/browserwhite/ui/adapter/DownloadAdapter.kt
+50
-8
DialogViews.kt
...c/main/java/com/base/browserwhite/ui/views/DialogViews.kt
+3
-4
VideoDownloader.kt
.../main/java/com/base/browserwhite/utils/VideoDownloader.kt
+43
-0
No files found.
app/build.gradle.kts
View file @
6b630e0b
...
...
@@ -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
...
...
app/src/main/java/com/base/browserwhite/MyApplication.kt
View file @
6b630e0b
...
...
@@ -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
app/src/main/java/com/base/browserwhite/bean/DownloadBean.kt
View file @
6b630e0b
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
...
...
app/src/main/java/com/base/browserwhite/ui/activity/webbrowser/WebViewFragment.kt
View file @
6b630e0b
...
...
@@ -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,22 +82,21 @@ 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
},
if
(
downloadAdapter
==
null
)
{
downloadAdapter
=
DownloadAdapter
()
}
downloadAdapter
?.
let
{
adapter
->
requireContext
().
showDownloadVideoDialog
(
adapter
,
downloadList
,
dismissAction
=
{
isUpdating
=
false
saveDownloadRecordFile
(
downloadList
)
},
)
isUpdating
=
true
upDataProgress
(
adapter
)
}
}
}
private
fun
saveDownloadRecordFile
(
downloadList
:
ArrayList
<
DownloadBean
>)
=
lifecycleScope
.
launch
(
Dispatchers
.
IO
)
{
...
...
@@ -102,9 +104,9 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
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
...
...
app/src/main/java/com/base/browserwhite/ui/adapter/DownloadAdapter.kt
View file @
6b630e0b
package
com.base.browserwhite.ui.adapter
import
android.a
pp.DownloadManager
import
android.a
nnotation.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
==
-
1
L
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
app/src/main/java/com/base/browserwhite/ui/views/DialogViews.kt
View file @
6b630e0b
...
...
@@ -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
)
...
...
app/src/main/java/com/base/browserwhite/utils/VideoDownloader.kt
View file @
6b630e0b
...
...
@@ -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
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment