Commit 5a4796e0 authored by wanglei's avatar wanglei

..

parent f2427763
package com.base.scanqrclear.luma
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.base.scanqrclear.R
import com.base.scanqrclear.bean.SimilarBean
import com.base.scanqrclear.databinding.ActivitySimilarPhotosBinding
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.util.concurrent.Semaphore
class SimilarPhotosActivity : BaseActivity2() {
companion object {
fun start(context: Context) {
val intent = Intent(context, SimilarPhotosActivity::class.java)
context.startActivity(intent)
}
}
private lateinit var adapter: SimilarPhotosAdapter
private val semaphore = Semaphore(20)
private var isScanning = true
private val binding by lazy {
ActivitySimilarPhotosBinding.inflate(layoutInflater)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
initView()
initData()
showAnimationAd(LottieType.SIMILAR_PHOTOS) {
if (isScanning)
loadingDialog = DialogHelps.showLoadingDialog(this)
}
AdmobHelps.showNativeAd(this, completed = {
binding.adNative.setNativeAd(it)
}, maxCompleted = { nativeAdLoader, nativeMaxAd ->
binding.adNative.setNativeAd(nativeAdLoader, nativeMaxAd)
})
}
private fun initView() {
adapter = SimilarPhotosAdapter()
adapter.callback = object : BaseAdapter.OnClickCallback<SimilarBean> {
override fun onClicked(view: View, position: Int, item: SimilarBean) {
val list = getAllList(adapter.list)
val total = list.filter { it.isSelect }.sumOf { it.size }
showSelection(total > 0, total)
}
}
binding.rvPhoto.adapter = adapter
binding.rvPhoto.layoutManager = LinearLayoutManager(this)
binding.flBack.setOnClickListener { backPressed() }
binding.ivSelect.setOnClickListener {
it.isSelected = !it.isSelected
setSelectAll(it.isSelected, adapter.list)
}
binding.tvDelete.setOnClickListener {
val list = getAllList(adapter.list).filter { it.isSelect }
if (list.isEmpty()) return@setOnClickListener
val total = list.sumOf { it.size }
DialogHelps.showDeleteDialog(this, binding.tvDelete) {
showAnimationAd {
toCleanResult(total, getString(R.string.similar_photos))
}
deleteFiles(list)
}
}
}
private fun initData() {
lifecycleScope.launch(Dispatchers.IO) {
val images = MediaHelps.findImageFiles(this@SimilarPhotosActivity)
val similarBeans = images.mapNotNull { value ->
lifecycleScope.async(Dispatchers.IO) {
semaphore.acquire() // 请求许可
try {
ImageHelpers.createImage(value.path)
} finally {
semaphore.release() // 释放许可
}
}.await()
}
// val similarBeans = deferredSimilarBeans.mapNotNull { it.await() }
val hasSame = mutableSetOf<String>()
similarBeans.forEach { similar ->
if (hasSame.contains(similar.url)) return@forEach
hasSame.add(similar.url)
similar.items.add(similar)
similarBeans.forEach {
if (!hasSame.contains(it.url) && ImageHelpers.similarCondition(similar, it)) {
hasSame.add(it.url)
similar.items.add(it)
}
}
}
val list = similarBeans.filter { it.items.size > 1 }
withContext(Dispatchers.Main) {
isScanning = false
loadingDialog?.dismiss()
setSelectAll(true, list)
}
}
}
private fun setSelectAll(isSelected: Boolean, list: List<SimilarBean>) {
binding.ivSelect.isSelected = isSelected
list.forEach { similar ->
similar.items.forEachIndexed { index, similarBean ->
similarBean.isSelect = if (index > 0) isSelected else false
}
}
adapter.submitList(list)
binding.ivSelect.setImageResource(if (isSelected) R.mipmap.icon_s else R.mipmap.icon_n)
val total = getAllList(adapter.list).filter { it.isSelect }.sumOf { it.size }
showSelection(isSelected && list.isNotEmpty(), total)
}
private fun deleteFiles(list: List<SimilarBean>) {
lifecycleScope.launch(Dispatchers.IO) {
val paths = list.map { it.url }.toTypedArray()
paths.forEach { FileHelps.deleteFile(it) }
withContext(Dispatchers.Main) {
MediaHelps.updateMedia(applicationContext, paths)
}
}
}
private fun showSelection(isSelection: Boolean, total: Long) {
binding.tvDelete.setBackgroundResource(if (isSelection) R.drawable.gradient else R.drawable.gradient_not_clickable)
val delete = getString(R.string.delete)
binding.tvDelete.text = if (total > 0) "${delete} (${Utils.getFormatSize(total)})" else delete
}
private fun getAllList(beans: List<SimilarBean>): MutableList<SimilarBean> {
val list = mutableListOf<SimilarBean>()
beans.forEach { it.items.forEach { list.add(it) } }
return list
}
}
\ No newline at end of file
package com.base.scanqrclear.luma
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.GridLayoutManager
import com.base.scanqrclear.R
import com.base.scanqrclear.bean.SimilarBean
import com.base.scanqrclear.databinding.ItemSimilarPhotosBinding
import com.base.scanqrclear.luma.AppHelps.dpToPx
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
class SimilarPhotosAdapter(
val data: List<SimilarBean> = emptyList()
) : BaseAdapter<SimilarBean, ItemSimilarPhotosBinding>(data) {
override fun getViewBinding(
layoutInflater: LayoutInflater,
parent: ViewGroup
): ItemSimilarPhotosBinding {
return ItemSimilarPhotosBinding.inflate(layoutInflater, parent, false)
}
override fun bind(
holder: BaseViewHolder<ItemSimilarPhotosBinding>,
position: Int,
item: SimilarBean
) {
val total = item.items.filter { it.isSelect }.sumOf { it.size }
holder.binding.tvSize.text = Utils.getFormatSize(total)
val width = holder.itemView.context.resources.displayMetrics.widthPixels
val margin = holder.itemView.context.dpToPx(45).toInt()
val imageWidth = (width - margin) / 4
val largePhotoWidth = imageWidth * 2
val largePhotoHeight = (largePhotoWidth * 0.92).toInt()
holder.binding.ivFirstPhoto.layoutParams.width = largePhotoWidth
holder.binding.ivFirstPhoto.layoutParams.height = largePhotoHeight
val round = holder.itemView.context.dpToPx(8).toInt()
val options = RequestOptions().transform(CenterCrop(), RoundedCorners(round))
Glide.with(holder.itemView.context)
.load(item.items[0].url)
.override(largePhotoWidth, largePhotoHeight)
.apply(options)
.into(holder.binding.ivFirstPhoto)
holder.binding.ivSelect.setImageResource(if (item.items[0].isSelect) R.mipmap.icon_xuanzhong_photo_on else R.mipmap.icon_weixuanzhong_photo_off)
holder.binding.ivFirstPhoto.setOnClickListener {
item.items[0].isSelect = !item.items[0].isSelect
holder.binding.ivSelect.setImageResource(if (item.items[0].isSelect) R.mipmap.icon_xuanzhong_photo_on else R.mipmap.icon_weixuanzhong_photo_off)
setItemClick(item, item.items[0], 0, holder)
}
val largePhotos = item.items.take(5)
val largeAdapter = SimilarPhotosChildAdapter(largePhotos.subList(1, largePhotos.size))
setItemClick(item, largeAdapter, holder)
holder.binding.rvLargePhoto.layoutManager = GridLayoutManager(holder.itemView.context, 2, GridLayoutManager.VERTICAL, false)
holder.binding.rvLargePhoto.adapter = largeAdapter
val photos = if (item.items.size > 4) item.items.subList(5, item.items.size) else mutableListOf()
val adapter = SimilarPhotosChildAdapter(photos)
setItemClick(item, adapter, holder)
holder.binding.rvPhoto.layoutManager = GridLayoutManager(holder.itemView.context, 4, GridLayoutManager.VERTICAL, false)
holder.binding.rvPhoto.adapter = adapter
}
private fun setItemClick(
item: SimilarBean,
adapter: SimilarPhotosChildAdapter,
holder: BaseViewHolder<ItemSimilarPhotosBinding>
) {
adapter.callback = object : OnClickCallback<SimilarBean> {
override fun onClicked(view: View, position: Int, data: SimilarBean) {
setItemClick(item, data, position, holder)
}
}
}
private fun setItemClick(
item: SimilarBean,
data: SimilarBean,
position: Int,
holder: BaseViewHolder<ItemSimilarPhotosBinding>
) {
val total = item.items.filter { it.isSelect }.sumOf { it.size }
holder.binding.tvSize.text = Utils.getFormatSize(total)
callback?.onClicked(holder.itemView, position, data)
}
}
package com.base.scanqrclear.luma
import android.view.LayoutInflater
import android.view.ViewGroup
import com.base.scanqrclear.R
import com.base.scanqrclear.bean.SimilarBean
import com.base.scanqrclear.databinding.ItemSimilarPhotosChildBinding
import com.base.scanqrclear.luma.AppHelps.dpToPx
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
class SimilarPhotosChildAdapter(
val data: List<SimilarBean>
) : BaseAdapter<SimilarBean, ItemSimilarPhotosChildBinding>(data) {
override fun getViewBinding(
layoutInflater: LayoutInflater,
parent: ViewGroup
): ItemSimilarPhotosChildBinding {
return ItemSimilarPhotosChildBinding.inflate(layoutInflater, parent, false)
}
override fun bind(
holder: BaseViewHolder<ItemSimilarPhotosChildBinding>,
position: Int,
item: SimilarBean
) {
val width = holder.itemView.context.resources.displayMetrics.widthPixels
val margin = holder.itemView.context.dpToPx(45).toInt()
val imageWidth = (width - margin) / 4
holder.binding.ivPhoto.layoutParams.width = imageWidth
holder.binding.ivPhoto.layoutParams.height = (imageWidth * 0.91).toInt()
holder.binding.ivSelect.setImageResource(if (item.isSelect) R.mipmap.icon_xuanzhong_photo_on else R.mipmap.icon_yuan_n)
holder.itemView.setOnClickListener {
item.isSelect = !item.isSelect
holder.binding.ivSelect.setImageResource(if (item.isSelect) R.mipmap.icon_xuanzhong_photo_on else R.mipmap.icon_yuan_n)
callback?.onClicked(it, position, item)
}
val round = holder.itemView.context.dpToPx(8).toInt()
val options = RequestOptions().transform(CenterCrop(), RoundedCorners(round))
Glide.with(holder.itemView.context)
.load(item.url)
.apply(options)
.into(holder.binding.ivPhoto)
}
}
\ 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