Commit 2111510d authored by wanglei's avatar wanglei

[AI重构]AI重构LargeFileCleanActivity

parent 8a6e6deb
...@@ -38,10 +38,14 @@ import kotlinx.coroutines.Dispatchers ...@@ -38,10 +38,14 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.Calendar import java.util.Calendar
import androidx.activity.viewModels
import com.simplecleaner.app.ui.largefile.LargeFileCleanViewModel
import com.simplecleaner.app.ui.largefile.LargeFileCleanAdapter
class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(ActivityLargeFileCleanBinding::inflate) { class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(ActivityLargeFileCleanBinding::inflate) {
private val viewModel: LargeFileCleanViewModel by viewModels()
private val LARGE_FILE_SIZE: Long = 1024 * 1024 * 10 private val LARGE_FILE_SIZE: Long = 1024 * 1024 * 10
private val typeList by lazy { private val typeList by lazy {
listOf( listOf(
...@@ -74,53 +78,11 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ ...@@ -74,53 +78,11 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ
) )
} }
private var typePosition = 0 private val adapter: LargeFileCleanAdapter by lazy {
private var sizePosition = 0 LargeFileCleanAdapter(emptyList()) { position ->
private var timePosition = 0 viewModel.toggleSelect(position)
private var total: Long = 0 adapter.notifyItemChanged(position)
private var allData = mutableListOf<FileBean>() updateView()
private var list = mutableListOf<FileBean>()
private val adapter by lazy {
class ViewHolder(val binding: ItemLargeFileCleanBinding) : RecyclerView.ViewHolder(binding.root)
object : RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemLargeFileCleanBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun getItemCount(): Int = list.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = list[position]
holder.binding.ivVideo.isVisible = MineTypeUtils.isVideo(item.mineType)
if (MineTypeUtils.isImage(item.mineType) || MineTypeUtils.isVideo(item.mineType)) {
val round = resources.getDimensionPixelSize(R.dimen.dp_4)
val options = RequestOptions().transform(CenterCrop(), RoundedCorners(round))
Glide.with(holder.itemView.context)
.load(item.path)
.apply(options)
.into(holder.binding.ivIcon)
} else if (MineTypeUtils.isAudio(item.mineType)) {
holder.binding.ivIcon.setImageResource(R.drawable.icon_yinping_large)
} else if (MineTypeUtils.isApk(item.mineType)) {
holder.binding.ivIcon.setImageResource(R.drawable.icon_app_large)
} else if (MineTypeUtils.isDoc(item.mineType)) {
holder.binding.ivIcon.setImageResource(R.drawable.icon_wenjianx_large)
} else {
holder.binding.ivIcon.setImageResource(R.drawable.icon_yingyong_large)
}
holder.binding.tvName.text = item.name
holder.binding.tvLength.text = Utils.getSizeFormat(item.length)
holder.binding.ivSelect.isSelected = item.isSelected
holder.binding.viewLine.visibility = if (position == itemCount - 1) View.GONE else View.VISIBLE
holder.itemView.setOnClickListener {
item.isSelected = !item.isSelected
notifyItemChanged(position)
updateView()
}
}
} }
} }
...@@ -153,7 +115,7 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ ...@@ -153,7 +115,7 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ
} }
private fun updateView() { private fun updateView() {
total = list.filter { it.isSelected }.sumOf { it.length } val total = viewModel.getFilteredList().filter { it.isSelected }.sumOf { it.length }
setTextSize(binding.tvDelete, getString(R.string.delete), total) setTextSize(binding.tvDelete, getString(R.string.delete), total)
binding.tvDelete.isEnabled = total > 0 binding.tvDelete.isEnabled = total > 0
if (binding.tvDelete.isEnabled == true) { if (binding.tvDelete.isEnabled == true) {
...@@ -169,17 +131,17 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ ...@@ -169,17 +131,17 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ
when (tabType) { when (tabType) {
1 -> { 1 -> {
textView = binding.tvType textView = binding.tvType
typePosition = position viewModel.typePosition = position
} }
2 -> { 2 -> {
textView = binding.tvSize textView = binding.tvSize
sizePosition = position viewModel.sizePosition = position
} }
3 -> { 3 -> {
textView = binding.tvTime textView = binding.tvTime
timePosition = position viewModel.timePosition = position
} }
} }
textView.text = item.name textView.text = item.name
...@@ -194,58 +156,12 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ ...@@ -194,58 +156,12 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
private fun filterData() { private fun filterData() {
allData.forEach { it.isSelected = false } viewModel.filterData()
var data = filterType(allData, typePosition) adapter.setData(viewModel.getFilteredList())
data = filterSize(data, sizePosition) binding.rvLargeFile.visibility = if (viewModel.getFilteredList().isEmpty()) View.GONE else View.VISIBLE
data = filterTime(data, timePosition) binding.ivEmpty.visibility = if (viewModel.getFilteredList().isEmpty()) View.VISIBLE else View.GONE
list = data.toMutableList() binding.tvDelete.visibility = if (viewModel.getFilteredList().isEmpty()) View.GONE else View.VISIBLE
adapter.notifyDataSetChanged() updateView()
binding.rvLargeFile.visibility = if (list.isEmpty()) View.GONE else View.VISIBLE
binding.ivEmpty.visibility = if (list.isEmpty()) View.VISIBLE else View.GONE
binding.tvDelete.visibility = if (list.isEmpty()) View.GONE else View.VISIBLE
}
private fun filterType(list: List<FileBean>, position: Int): List<FileBean> {
return when (position) {
1 -> list.filter { MineTypeUtils.isImage(it.mineType) }
2 -> list.filter { MineTypeUtils.isVideo(it.mineType) }
3 -> list.filter { MineTypeUtils.isAudio(it.mineType) }
4 -> list.filter { MineTypeUtils.isDoc(it.mineType) }
5 -> list.filter { MineTypeUtils.isApk(it.mineType) }
6 -> list.filterNot { file ->
MineTypeUtils.mineTypes.any { mimeType -> file.mineType.startsWith(mimeType) }
}
else -> {
list
}
}
}
private fun filterSize(list: List<FileBean>, position: Int): List<FileBean> {
return when (position) {
1 -> list.filter { it.length >= LARGE_FILE_SIZE * 2 }
2 -> list.filter { it.length >= LARGE_FILE_SIZE * 5 }
3 -> list.filter { it.length >= LARGE_FILE_SIZE * 10 }
4 -> list.filter { it.length >= LARGE_FILE_SIZE * 50 }
else -> {
list.filter { it.length >= LARGE_FILE_SIZE }
}
}
}
private fun filterTime(list: List<FileBean>, position: Int): List<FileBean> {
return when (position) {
1 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.WEEK_OF_YEAR, -1) }.timeInMillis }
2 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.MONTH, -1) }.timeInMillis }
3 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.MONTH, -3) }.timeInMillis }
4 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.MONTH, -6) }.timeInMillis }
5 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.YEAR, -1) }.timeInMillis }
else -> {
list
}
}
} }
private fun clearTab() { private fun clearTab() {
...@@ -289,6 +205,7 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ ...@@ -289,6 +205,7 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ
binding.ivType.isSelected = true binding.ivType.isSelected = true
binding.tvOtherThan.visibility = View.GONE binding.tvOtherThan.visibility = View.GONE
showTab(1, typeList) showTab(1, typeList)
viewModel.typePosition = 1
} }
binding.llSize -> { binding.llSize -> {
...@@ -296,6 +213,7 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ ...@@ -296,6 +213,7 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ
binding.tvOtherThan.text = getString(R.string.larger_than) binding.tvOtherThan.text = getString(R.string.larger_than)
binding.tvOtherThan.visibility = View.VISIBLE binding.tvOtherThan.visibility = View.VISIBLE
showTab(2, sizeList) showTab(2, sizeList)
viewModel.sizePosition = 2
} }
binding.llTime -> { binding.llTime -> {
...@@ -303,8 +221,10 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ ...@@ -303,8 +221,10 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ
binding.tvOtherThan.text = getString(R.string.other_types) binding.tvOtherThan.text = getString(R.string.other_types)
binding.tvOtherThan.visibility = View.VISIBLE binding.tvOtherThan.visibility = View.VISIBLE
showTab(3, timeList) showTab(3, timeList)
viewModel.timePosition = 3
} }
} }
filterData()
} }
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
...@@ -340,19 +260,19 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ ...@@ -340,19 +260,19 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ
binding.rvTab.layoutManager = LinearLayoutManager(this) binding.rvTab.layoutManager = LinearLayoutManager(this)
binding.rvLargeFile.adapter = adapter binding.rvLargeFile.adapter = adapter
binding.rvLargeFile.layoutManager = LinearLayoutManager(this) binding.rvLargeFile.layoutManager = LinearLayoutManager(this)
initData() viewModel.largeFileSize = 1024 * 1024 * 10
viewModel.loadFiles(this) {
adapter.setData(viewModel.getFilteredList())
updateView()
binding.rvLargeFile.visibility = if (viewModel.getFilteredList().isEmpty()) View.GONE else View.VISIBLE
binding.ivEmpty.visibility = if (viewModel.getFilteredList().isEmpty()) View.VISIBLE else View.GONE
binding.tvDelete.visibility = if (viewModel.getFilteredList().isEmpty()) View.GONE else View.VISIBLE
}
showAdAnimation(LottieEnum.LARGE_FILE_LOTTIE) { showAdAnimation(LottieEnum.LARGE_FILE_LOTTIE) {
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom) AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
} }
} }
private fun initData() {
lifecycleScope.launch(Dispatchers.IO) {
allData = async { MediaUtils.findFiles(this@LargeFileCleanActivity, LARGE_FILE_SIZE) }.await()
launch(Dispatchers.Main) { filterData() }
}
}
override fun initListener() { override fun initListener() {
super.initListener() super.initListener()
binding.ivBack.setOnClickListener { onBackPressedDispatcher.onBackPressed() } binding.ivBack.setOnClickListener { onBackPressedDispatcher.onBackPressed() }
...@@ -369,14 +289,15 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ ...@@ -369,14 +289,15 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ
hiddenTab() hiddenTab()
} }
binding.tvDelete.setOnClickListener { binding.tvDelete.setOnClickListener {
if (total <= 0) return@setOnClickListener if (viewModel.getFilteredList().isEmpty() || viewModel.getFilteredList().filter { it.isSelected }
.sumOf { it.length } <= 0) return@setOnClickListener
val dialog = ConfirmDialog(this) val dialog = ConfirmDialog(this)
dialog.action = { dialog.action = {
cleanFileBeans(list) cleanFileBeans(viewModel.getFilteredList())
AdsMgr.showInsert(this, showCallBack = object : AdsShowCallBack() { AdsMgr.showInsert(this, showCallBack = object : AdsShowCallBack() {
override fun next() { override fun next() {
CleanResultActivity.functionKey = LARGE_FILE_CLEAN CleanResultActivity.functionKey = LARGE_FILE_CLEAN
CleanResultActivity.total = total CleanResultActivity.total = viewModel.getFilteredList().filter { it.isSelected }.sumOf { it.length }
CleanResultActivity.titleName = getString(R.string.large_file_clean) CleanResultActivity.titleName = getString(R.string.large_file_clean)
goToAc(CleanResultActivity::class.java) goToAc(CleanResultActivity::class.java)
} }
......
package com.simplecleaner.app.ui.largefile
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.simplecleaner.app.R
import com.simplecleaner.app.bean.FileBean
import com.simplecleaner.app.databinding.ItemLargeFileCleanBinding
import com.simplecleaner.app.utils.MineTypeUtils
import com.simplecleaner.app.utils.Utils
class LargeFileCleanAdapter(
private var data: List<FileBean>,
private val onItemClick: (Int) -> Unit
) : RecyclerView.Adapter<LargeFileCleanAdapter.ViewHolder>() {
inner class ViewHolder(val binding: ItemLargeFileCleanBinding) : RecyclerView.ViewHolder(binding.root) {
init {
binding.root.setOnClickListener {
val position = bindingAdapterPosition
if (position != RecyclerView.NO_POSITION) {
onItemClick(position)
}
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemLargeFileCleanBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun getItemCount(): Int = data.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = data[position]
holder.binding.ivVideo.isVisible = MineTypeUtils.isVideo(item.mineType)
if (MineTypeUtils.isImage(item.mineType) || MineTypeUtils.isVideo(item.mineType)) {
val round = holder.itemView.resources.getDimensionPixelSize(R.dimen.dp_4)
val options = RequestOptions().transform(CenterCrop(), RoundedCorners(round))
Glide.with(holder.itemView.context)
.load(item.path)
.apply(options)
.into(holder.binding.ivIcon)
} else if (MineTypeUtils.isAudio(item.mineType)) {
holder.binding.ivIcon.setImageResource(R.drawable.icon_yinping_large)
} else if (MineTypeUtils.isApk(item.mineType)) {
holder.binding.ivIcon.setImageResource(R.drawable.icon_app_large)
} else if (MineTypeUtils.isDoc(item.mineType)) {
holder.binding.ivIcon.setImageResource(R.drawable.icon_wenjianx_large)
} else {
holder.binding.ivIcon.setImageResource(R.drawable.icon_yingyong_large)
}
holder.binding.tvName.text = item.name
holder.binding.tvLength.text = Utils.getSizeFormat(item.length)
holder.binding.ivSelect.isSelected = item.isSelected
holder.binding.viewLine.visibility = if (position == itemCount - 1) View.GONE else View.VISIBLE
}
fun setData(newData: List<FileBean>) {
data = newData
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.simplecleaner.app.ui.largefile
import android.content.Context
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import com.simplecleaner.app.bean.FileBean
import com.simplecleaner.app.utils.MediaUtils
import com.simplecleaner.app.utils.MineTypeUtils
import java.util.Calendar
class LargeFileCleanViewModel : ViewModel() {
private var allData: List<FileBean> = emptyList()
private var filteredList: List<FileBean> = emptyList()
var typePosition = 0
var sizePosition = 0
var timePosition = 0
var largeFileSize: Long = 1024 * 1024 * 10
fun loadFiles(context: Context, onLoaded: (() -> Unit)? = null) {
viewModelScope.launch(Dispatchers.IO) {
allData = MediaUtils.findFiles(context, largeFileSize)
filterData()
withContext(Dispatchers.Main) {
onLoaded?.invoke()
}
}
}
fun filterData() {
filteredList = filterType(allData, typePosition)
.let { filterSize(it, sizePosition) }
.let { filterTime(it, timePosition) }
}
fun getFilteredList(): List<FileBean> = filteredList
fun toggleSelect(position: Int) {
if (position in filteredList.indices) {
filteredList[position].isSelected = !filteredList[position].isSelected
}
}
private fun filterType(list: List<FileBean>, position: Int): List<FileBean> {
return when (position) {
1 -> list.filter { MineTypeUtils.isImage(it.mineType) }
2 -> list.filter { MineTypeUtils.isVideo(it.mineType) }
3 -> list.filter { MineTypeUtils.isAudio(it.mineType) }
4 -> list.filter { MineTypeUtils.isDoc(it.mineType) }
5 -> list.filter { MineTypeUtils.isApk(it.mineType) }
6 -> list.filterNot { file ->
MineTypeUtils.mineTypes.any { mimeType -> file.mineType.startsWith(mimeType) }
}
else -> list
}
}
private fun filterSize(list: List<FileBean>, position: Int): List<FileBean> {
return when (position) {
1 -> list.filter { it.length >= largeFileSize * 2 }
2 -> list.filter { it.length >= largeFileSize * 5 }
3 -> list.filter { it.length >= largeFileSize * 10 }
4 -> list.filter { it.length >= largeFileSize * 50 }
else -> list.filter { it.length >= largeFileSize }
}
}
private fun filterTime(list: List<FileBean>, position: Int): List<FileBean> {
return when (position) {
1 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.WEEK_OF_YEAR, -1) }.timeInMillis }
2 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.MONTH, -1) }.timeInMillis }
3 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.MONTH, -3) }.timeInMillis }
4 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.MONTH, -6) }.timeInMillis }
5 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.YEAR, -1) }.timeInMillis }
else -> list
}
}
}
\ 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