Commit dc98af32 authored by wanglei's avatar wanglei

...

parent 1a083b74
package com.base.browserwhite.bean
data class DownloadBean(
val downloadId: Long=0,
val path: String="",
val time: String = ""
val downloadId: Long = 0,
val path: String = "",
val uri: String = "",
val time: String = "",
) {
var isTime: Boolean = false
var uiType: Int = 1
}
\ No newline at end of file
......@@ -6,23 +6,36 @@ import android.os.Build
import android.os.Environment
import android.os.StatFs
import android.os.storage.StorageManager
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isEmpty
import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.base.browserwhite.BuildConfig
import com.base.browserwhite.R
import com.base.browserwhite.bean.MediaBean
import com.base.browserwhite.databinding.ActivityMainBinding
import com.base.browserwhite.ui.fragment.FileFragment
import com.base.browserwhite.ui.fragment.HomeFragment
import com.base.browserwhite.ui.views.DialogViews.showMyAccountDialog
import com.base.browserwhite.utils.BarUtils
import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.MediaStoreUtils.getMediaFile
import com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import com.base.browserwhite.utils.VideoDownloader
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.launch
import java.io.File
class MainActivity : BaseActivity<ActivityMainBinding>() {
private val TAG = "MainActivity"
private val homeFragment: HomeFragment by lazy {
HomeFragment()
}
......
......@@ -173,7 +173,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
val delayTime = 300L
delay(delayTime)
processTime += delayTime
if (processTime >= Random.nextLong(5000, 8000)) {
if (processTime >= 600L) {
if (!outTimeAdStart) {
outTimeAdStart = true
outTimeAd()
......
......@@ -16,8 +16,10 @@ import android.webkit.WebStorage
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.lifecycle.lifecycleScope
import com.base.browserwhite.bean.DownloadBean
import com.base.browserwhite.databinding.FragmentWebViewBinding
import com.base.browserwhite.ui.fragment.BaseFragment
import com.base.browserwhite.ui.views.DialogViews.showDownloadVideoDialog
import com.base.browserwhite.utils.LogEx
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
......@@ -31,6 +33,7 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
private val TAG = "WebViewFragment"
private var job: Job? = null
var url: String = ""
private val downloadList = arrayListOf<DownloadBean>()
override val binding: FragmentWebViewBinding by lazy {
FragmentWebViewBinding.inflate(layoutInflater)
......@@ -64,6 +67,9 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
}
reloadWebView()
}
binding.flDownload.setOnClickListener {
requireContext().showDownloadVideoDialog(downloadList)
}
}
private fun reloadWebView() {
......@@ -219,11 +225,11 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
}
var isParsing: Boolean = false
private var isParsing: Boolean = false
fun parseVideoLink(view: WebView) {
if (isParsing) return
isParsing = true
downloadList.clear()
view.evaluateJavascript("(function() {" +
"var videos = document.querySelectorAll('video');" +
"var videoSources = [];" +
......@@ -241,9 +247,11 @@ class WebViewFragment : BaseFragment<FragmentWebViewBinding>() {
binding.flDownload.visibility = View.VISIBLE
binding.tvDownloadNumber.text = jsonArray.length().toString()
}
for (i in 0 until jsonArray.length()) {
val videoUrl = jsonArray.optString(i)
LogEx.logDebug(TAG, videoUrl)
downloadList.add(DownloadBean(uri = videoUrl).apply { uiType = 2 })
}
isParsing = false
})
......
package com.base.browserwhite.ui.adapter
import android.content.ClipData.Item
import android.content.Context
import android.view.View
import android.view.ViewGroup
......@@ -8,9 +7,9 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.browserwhite.R
import com.base.browserwhite.bean.DownloadBean
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.KotlinExt.toFormatTime
import com.base.browserwhite.utils.XmlEx.inflate
import com.bumptech.glide.Glide
import com.chad.library.adapter4.BaseQuickAdapter
......@@ -26,23 +25,32 @@ class DownloadAdapter : BaseQuickAdapter<DownloadBean, DownloadAdapter.DownloadV
if (item.isTime) {
val binding = ItemDownloadTimeBinding.bind(holder.itemView)
binding.tvTime.text = item.time
} else {
} else if (item.uiType == 1) {
val binding = ItemDownloadBinding.bind(holder.itemView)
val file = File(item.path)
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)
binding.tvName.text = item.uri.split("/").last()
}
}
override fun getItemViewType(position: Int, list: List<DownloadBean>): Int {
val bean = list[position]
return if (bean.isTime) 0 else 1
return if (bean.isTime) 0 else bean.uiType
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): DownloadViewHolder {
val layout = if (viewType == 0) R.layout.item_download_time else R.layout.item_download
val layout = when (viewType) {
0 -> R.layout.item_download_time
1 -> R.layout.item_download
2 -> R.layout.item_download_card
else -> 0
}
return DownloadViewHolder(layout.inflate(parent))
}
......
......@@ -28,8 +28,7 @@ class MediaAdapter(
val uiType: Int,
val clickAction: ((bean: MediaBean) -> Unit)? = null,
val moreAction: ((view: View, bean: MediaBean) -> Unit)? = null
) :
RecyclerView.Adapter<MediaAdapter.MediaViewHolder>() {
) : RecyclerView.Adapter<MediaAdapter.MediaViewHolder>() {
private val beanList = arrayListOf<MediaBean>()
......
......@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.view.View
import android.widget.Toast
import androidx.lifecycle.lifecycleScope
import com.base.browserwhite.BuildConfig
import com.base.browserwhite.bean.MediaBean
......@@ -21,17 +22,19 @@ import com.base.browserwhite.ui.views.DialogViews.showMediaMoreDialog
import com.base.browserwhite.ui.views.ProgressBean
import com.base.browserwhite.utils.IntentEx.shareAction
import com.base.browserwhite.utils.KotlinExt.toFormatSize
import com.base.browserwhite.utils.LogEx
import com.base.browserwhite.utils.MediaStoreUtils.getMediaApkCountSize
import com.base.browserwhite.utils.MediaStoreUtils.getMediaAudioCountSize
import com.base.browserwhite.utils.MediaStoreUtils.getMediaDocumentCountSize
import com.base.browserwhite.utils.MediaStoreUtils.getMediaFile
import com.base.browserwhite.utils.MediaStoreUtils.getMediaPhotoCountSize
import com.base.browserwhite.utils.MediaStoreUtils.getMediaVideoCountSize
import com.base.browserwhite.utils.MediaStoreUtils.getMediaZipCountSize
import com.base.browserwhite.utils.MediaStoreUtils.getMediaFile
import com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import com.base.browserwhite.utils.PermissionHelp.requestStorePermission
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import java.io.File
......@@ -62,10 +65,6 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
moreAction(requireContext(), view, bean, adapter)
})
binding.rvRecent.adapter = adapter
if (requireContext().checkStorePermission()) {
initRvData()
}
}
companion object {
......@@ -91,7 +90,6 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
val launcher = (requireActivity() as MainActivity).launcher
requireContext().requestStorePermission(launcher) {
if (it) {
initRvData()
}
}
}
......@@ -190,7 +188,6 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
// )
progressList
)
binding.tvPhotoSize.text = picturePair.first.toString()
binding.tvVideoSize.text = videoPair.first.toString()
binding.tvAudioSize.text = audioPair.first.toString()
......@@ -199,25 +196,21 @@ class FileFragment : BaseFragment<FragmentFileBinding>() {
binding.tvZipSize.text = zipSize.toString()
}
}
private fun initRvData() = lifecycleScope.launch(Dispatchers.IO) {
val mediaList = requireContext().getMediaFile().filter {
val file = File(it.path)
if (BuildConfig.DEBUG) {
true
} else {
System.currentTimeMillis() - file.lastModified() <= 15L * 24 * 60 * 60 * 1000
binding.colorProgress.finishAnimation = {
val list = requireContext().getMediaFile().filter {
val file = File(it.path)
if (BuildConfig.DEBUG) {
true
} else {
System.currentTimeMillis() - file.lastModified() <= 15L * 24 * 60 * 60 * 1000
}
}
}
LogEx.logDebug(TAG, "size=${mediaList.size}")
launch(Dispatchers.Main) {
if (mediaList.isEmpty()) {
if (list.isEmpty()) {
binding.tvTitleRecent.visibility = View.GONE
}
adapter.setData(mediaList)
adapter.setData(list)
}
}
......
package com.base.browserwhite.ui.views
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.AnimatorSet
import android.animation.ValueAnimator
import android.content.Context
......@@ -41,6 +43,8 @@ class ColorProgress : View {
initPaint(context)
}
var finishAnimation: (() -> Unit)? = null
private fun initPaint(context: Context) {
strokeWidth = context.resources.getDimension(R.dimen.dp_9)
......@@ -111,7 +115,7 @@ class ColorProgress : View {
invalidate()
}
fun animateProgress( list: List<ProgressBean>) {
fun animateProgress(list: List<ProgressBean>) {
listProgressBean = list
val totalAngle = list.maxOf { it.sweepAngle }
val progressAnimator = ValueAnimator.ofFloat(0f, totalAngle)
......@@ -121,6 +125,20 @@ class ColorProgress : View {
val animatedValue = animation.getAnimatedValue() as Float
setProgress(animatedValue)
}
progressAnimator.addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {
}
override fun onAnimationEnd(animation: Animator) {
finishAnimation?.invoke()
}
override fun onAnimationCancel(animation: Animator) {
}
override fun onAnimationRepeat(animation: Animator) {
}
})
progressAnimator.start()
}
......
......@@ -17,11 +17,14 @@ import com.base.browserwhite.bean.ConstObject.DUCKDUCKGO
import com.base.browserwhite.bean.ConstObject.GOOGLE
import com.base.browserwhite.bean.ConstObject.YAHOO
import com.base.browserwhite.bean.ConstObject.YANDEX
import com.base.browserwhite.bean.DownloadBean
import com.base.browserwhite.databinding.DialogDeleteTipBinding
import com.base.browserwhite.databinding.DialogDownloadVideoBinding
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.adapter.DownloadAdapter
import com.base.browserwhite.ui.views.DialogViews.showMyAccountDialog
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
......@@ -205,7 +208,7 @@ object DialogViews {
dialog.show()
val params = dialog.window?.attributes
params?.width=resources.getDimensionPixelOffset(R.dimen.dp_335)
params?.width = resources.getDimensionPixelOffset(R.dimen.dp_335)
dialog.window?.attributes = params
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
binding.tvCancel.setOnClickListener {
......@@ -217,9 +220,9 @@ object DialogViews {
}
}
fun Context.showDownloadVideoDialog(){
fun Context.showDownloadVideoDialog(list: List<DownloadBean>) {
val dialog = BottomSheetDialog(this)
val binding = DialogMyAccountBinding.inflate(LayoutInflater.from(this))
val binding = DialogDownloadVideoBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
......@@ -229,6 +232,10 @@ object DialogViews {
val behavior = BottomSheetBehavior.from(parentView)
//展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED
val adapter = DownloadAdapter()
binding.rv.adapter = adapter
adapter.submitList(list)
}
}
\ No newline at end of file
......@@ -44,13 +44,13 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="300dp"
android:layout_marginTop="16dp"
tools:listitem="@layout/item_download_card"
android:maxHeight="300dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_download_dir" />
app:layout_constraintTop_toBottomOf="@id/tv_download_dir"
tools:listitem="@layout/item_download_card" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -42,7 +42,7 @@
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/xiazhai"
android:src="@mipmap/xiazhai_web"
tools:ignore="ContentDescription" />
<TextView
......
......@@ -46,6 +46,7 @@
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/black"
......@@ -53,6 +54,7 @@
tools:text="1796-21.mp4" />
<TextView
android:id="@+id/tv_size"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
......
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