Commit a8574d5b authored by wanglei's avatar wanglei

[新增]回收站功能

parent 7bce9429
......@@ -110,6 +110,12 @@
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.recyclebin.RecycleBinDetailActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<provider
android:name="androidx.core.content.FileProvider"
......
......@@ -38,6 +38,8 @@ import com.base.appzxhy.bean.FeatureBean.Companion.PHOTO_COMPRESSION
import com.base.appzxhy.bean.FeatureBean.Companion.SCREENSHOT_CLEAN
import com.base.appzxhy.bean.FeatureBean.Companion.SIMILAR_PHOTOS
import com.base.appzxhy.bean.FileBean
import com.base.appzxhy.bean.SimilarBean
import com.base.appzxhy.bean.config.AdConfigBean
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.business.ads.AdsShowCallBack
import com.base.appzxhy.business.ads.NativeParentView
......@@ -47,6 +49,7 @@ import com.base.appzxhy.ui.clean.JunkCleanActivity
import com.base.appzxhy.ui.largefile.LargeFileCleanActivity
import com.base.appzxhy.ui.main.MainActivity
import com.base.appzxhy.ui.photocompression.PhotoCompressionActivity
import com.base.appzxhy.ui.recyclebin.RecycleBinUtils
import com.base.appzxhy.ui.screenshot.ScreenshotCleanActivity
import com.base.appzxhy.ui.similar.SimilarPhotosActivity
import com.base.appzxhy.utils.ActivityLauncher
......@@ -61,6 +64,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import java.io.File
import java.util.Locale
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.apply
......@@ -364,7 +368,6 @@ abstract class BaseActivity<VB : ViewBinding>(
}
private var isShowAd = false
private fun setBackPressed() {
onBackPressedDispatcher.addCallback {
if (isBackDisable) {
......@@ -374,27 +377,35 @@ abstract class BaseActivity<VB : ViewBinding>(
Toast.LENGTH_SHORT
).show()
} else {
if (isShowAd) return@addCallback
handleBackPressed()
}
}
}
protected open fun handleBackPressed() {
when (this) {
// is MainActivity -> showLogoutDialog()
// is BatteryInfoActivity -> showExitDialog(ExitConfig.BATTERY_INFO)
// is JunkCleanActivity -> showExitDialog(ExitConfig.JUNK_CLEAN)
// is LargeFileCleanActivity -> showExitDialog(ExitConfig.LARGE_FILE_CLEAN)
// is PhotoCompressionActivity -> showExitDialog(ExitConfig.PHOTO_COMPRESSION)
// is ScreenshotCleanActivity -> showExitDialog(ExitConfig.SCREENSHOT_CLEAN)
// is SimilarPhotosActivity -> showExitDialog(ExitConfig.SIMILAR_PHOTOS)
// is WeatherActivity -> showExitDialog(ExitConfig.WEATHER)
// is ConstellationActivity -> showExitDialog(ExitConfig.CONSTELLATION)
else -> finishToMain()
fun backAdJump() {
if (AdConfigBean.adsConfigBean.functionBackShowAd) {
AdsMgr.showInsert(this, showCallBack = object : AdsShowCallBack() {
override fun next() {
finishToMainTop()
}
})
} else {
finishToMainTop()
}
}
fun functionInAd(next: (() -> Unit)? = null) {
if (AdConfigBean.adsConfigBean.functionInShowAd) {
AdsMgr.showInsert(this, showCallBack = object : AdsShowCallBack() {
override fun next() {
next?.invoke()
}
})
} else {
next?.invoke()
}
}
}
......@@ -444,10 +455,15 @@ enum class LottieEnum(val data: String, val images: String? = null, val isLoop:
}
fun AppCompatActivity.cleanFiles(list: List<FileBean>) {
fun AppCompatActivity.cleanFileBeans(list: List<FileBean>) {
lifecycleScope.launch(Dispatchers.IO) {
val paths = list.filter { it.isSelected }.map { it.path }.toTypedArray()
paths.forEach { FileUtils.deleteFile(it) }
paths.forEach {
RecycleBinUtils.addRecycleBinFile(File(it))
FileUtils.deleteFile(it)
}
launch(Dispatchers.Main) { MediaUtils.updateMedia(applicationContext, paths) }
}
}
......@@ -25,6 +25,7 @@ class NativeParentView(context: Context, attrs: AttributeSet? = null) :
private val TAG = "NativeParentView"
private var removeAll = true
var isAdShowed = false
var adGravity = android.view.Gravity.CENTER
init {
// 获取XML属性
......@@ -84,7 +85,7 @@ class NativeParentView(context: Context, attrs: AttributeSet? = null) :
LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT
)
params.gravity = android.view.Gravity.CENTER
params.gravity = adGravity
addView(adView, params)
}
......@@ -115,7 +116,7 @@ class NativeParentView(context: Context, attrs: AttributeSet? = null) :
LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT
)
params.gravity = android.view.Gravity.CENTER
params.gravity = adGravity
addView(adView, params)
}
......
......@@ -62,7 +62,7 @@ class AdInterMgr {
val needLoad = adState.currentAd == null || !adAvailable()
if (needLoad) {
if (!adState.loadingAd) {
loadAd(activity, adEvent, isUnLimit)
loadAd(activity, adEvent, isUnLimit, true)
}
} else {
showReadyAd(adEvent)
......@@ -122,6 +122,7 @@ class AdInterMgr {
context: Context,
adEvent: AdEvent,
isUnLimit: Boolean = false,
isShow: Boolean = false,
) {
if (!isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.INSERT, adEvent)) {
......@@ -139,7 +140,7 @@ class AdInterMgr {
object : InterstitialAdLoadCallback() {
override fun onAdLoaded(ad: InterstitialAd) {
adState.onAdLoaded(ad)
if (this@AdInterMgr.showCallBack != null) {
if (this@AdInterMgr.showCallBack != null || isShow) {
showReadyAd(adEvent)
}
(adEvent as AdmobEvent).pullAd(ad.responseInfo)
......
......@@ -53,7 +53,7 @@ class AdOpenMgr {
val needLoad = adState.currentAd == null || !adAvailable()
if (needLoad) {
if (!adState.loadingAd) {
loadAd(activity, adEvent, isUnLimit)
loadAd(activity, adEvent, isUnLimit, true)
}
} else {
showReadyAd(adEvent)
......@@ -111,7 +111,12 @@ class AdOpenMgr {
}
}
fun loadAd(context: Context, adEvent: AdEvent, isUnLimit: Boolean = false) {
fun loadAd(
context: Context,
adEvent: AdEvent,
isUnLimit: Boolean = false,
isShow: Boolean = false,
) {
if (!isUnLimit) {
if (!LimitUtils.isAdShow(AdsType.OPEN, adEvent)) {
......@@ -132,7 +137,7 @@ class AdOpenMgr {
object : AppOpenAd.AppOpenAdLoadCallback() {
override fun onAdLoaded(appOpenAd: AppOpenAd) {
adState.onAdLoaded(appOpenAd)
if (this@AdOpenMgr.showCallBack != null) {
if (this@AdOpenMgr.showCallBack != null || isShow) {
showReadyAd(adEvent)
}
(adEvent as AdmobEvent).pullAd(appOpenAd.responseInfo)
......
package com.base.appzxhy.ui.guide
import android.annotation.SuppressLint
import android.content.Intent
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.databinding.FragmentGuide2Binding
import com.base.appzxhy.ui.main.MainActivity
class Guide2Fragment : BaseFragment<FragmentGuide2Binding>(FragmentGuide2Binding::inflate) {
var page: Int = 1
@SuppressLint("SetTextI18n")
override fun initView() {
super.initView()
when (page) {
0 -> {
binding.iv.setImageResource(R.drawable.image_guide_1)
binding.ivDian.setImageResource(R.drawable.dian_1)
binding.tvContent.text = getString(R.string.guide_tip_1)
}
1 -> {
binding.iv.setImageResource(R.drawable.image_guide_2)
binding.ivDian.setImageResource(R.drawable.dian_2)
binding.tvContent.text = getString(R.string.guide_tip_2)
}
3 -> {
binding.iv.setImageResource(R.drawable.image_guide_3)
binding.ivDian.setImageResource(R.drawable.dian_3)
binding.tvContent.text = getString(R.string.guide_tip_3)
binding.tvBtn.text = "Start"
}
}
}
override fun initListener() {
super.initListener()
binding.tvSkip.setOnClickListener {
val activity = requireActivity() as GuideActivity?
activity?.startActivity(Intent(activity, MainActivity::class.java))
activity?.finish()
}
binding.tvBtn.setOnClickListener {
val activity = requireActivity() as GuideActivity?
activity ?: requireActivity()
activity?.next(page)
}
}
override fun onResume() {
super.onResume()
if (!binding.flAd.isAdShowed) {
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
}
}
}
\ No newline at end of file
......@@ -12,18 +12,18 @@ import com.base.appzxhy.ui.main.MainActivity
class GuideActivity : BaseActivity<ActivityGuideBinding>(ActivityGuideBinding::inflate) {
private val page1: GuideFragment by lazy {
GuideFragment().apply { page = 0 }
private val page1: Guide2Fragment by lazy {
Guide2Fragment().apply { page = 0 }
}
private val page2: GuideFragment by lazy {
GuideFragment().apply { page = 1 }
private val page2: Guide2Fragment by lazy {
Guide2Fragment().apply { page = 1 }
}
private val pageNative: NativeFullFragment by lazy {
NativeFullFragment()
}
private val page3: GuideFragment by lazy {
GuideFragment().apply { page = 3 }
private val page3: Guide2Fragment by lazy {
Guide2Fragment().apply { page = 3 }
}
private val fragments: MutableList<Fragment> by lazy {
mutableListOf(page1, page2, page3)
......
package com.base.appzxhy.ui.guide
import android.content.Intent
import androidx.activity.addCallback
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
......@@ -41,7 +40,7 @@ class GuideCleanActivity : BaseActivity<ActivityGuideCleanBinding>(ActivityGuide
}
binding.llContinue.setOnClickListener {
startActivity(Intent(this, GuideActivity::class.java))
goToAc(GuideActivity::class.java)
finish()
}
}
......
package com.base.appzxhy.ui.guide
import android.annotation.SuppressLint
import android.content.Intent
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.databinding.FragmentGuideBinding
import com.base.appzxhy.ui.main.MainActivity
class GuideFragment : BaseFragment<FragmentGuideBinding>(FragmentGuideBinding::inflate) {
var page: Int = 1
@SuppressLint("SetTextI18n")
override fun initView() {
super.initView()
when (page) {
0 -> {
binding.iv.setImageResource(R.drawable.chahua04)
binding.ivDian.setImageResource(R.drawable.icon1)
binding.tvContent.text = "Clean up clutter to unlock more space and\n" +
"keep your phone running smoothly."
}
1 -> {
binding.iv.setImageResource(R.drawable.chahua03)
binding.ivDian.setImageResource(R.drawable.icon2)
binding.tvContent.text = "Quickly clear junk files and free up valuable\n" +
"storage with just a few taps."
}
3 -> {
binding.iv.setImageResource(R.drawable.chahua01)
binding.ivDian.setImageResource(R.drawable.icon4)
binding.tvContent.text = "Clean photos,videos,and audio files to\n" +
"save space and keep your phone tidy."
binding.tvBtn.text = "Start"
}
}
}
override fun initListener() {
super.initListener()
binding.tvSkip.setOnClickListener {
val activity = requireActivity() as GuideActivity?
activity?.startActivity(Intent(activity, MainActivity::class.java))
activity?.finish()
}
binding.tvBtn.setOnClickListener {
val activity = requireActivity() as GuideActivity?
activity ?: requireActivity()
activity?.next(page)
}
}
override fun onResume() {
super.onResume()
if (!binding.flAd.isAdShowed) {
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
}
}
}
//package com.base.appzxhy.ui.guide
//
//import android.annotation.SuppressLint
//import android.content.Intent
//import com.base.appzxhy.R
//import com.base.appzxhy.base.BaseFragment
//import com.base.appzxhy.business.ads.AdsMgr
//import com.base.appzxhy.databinding.FragmentGuideBinding
//import com.base.appzxhy.ui.main.MainActivity
//
//
//class GuideFragment : BaseFragment<FragmentGuideBinding>(FragmentGuideBinding::inflate) {
// var page: Int = 1
//
//
// @SuppressLint("SetTextI18n")
// override fun initView() {
// super.initView()
// when (page) {
// 0 -> {
// binding.iv.setImageResource(R.drawable.chahua04)
// binding.ivDian.setImageResource(R.drawable.icon1)
// binding.tvContent.text = "Clean up clutter to unlock more space and\n" +
// "keep your phone running smoothly."
// }
//
// 1 -> {
// binding.iv.setImageResource(R.drawable.chahua03)
// binding.ivDian.setImageResource(R.drawable.icon2)
// binding.tvContent.text = "Quickly clear junk files and free up valuable\n" +
// "storage with just a few taps."
// }
//
// 3 -> {
// binding.iv.setImageResource(R.drawable.chahua01)
// binding.ivDian.setImageResource(R.drawable.icon4)
// binding.tvContent.text = "Clean photos,videos,and audio files to\n" +
// "save space and keep your phone tidy."
// binding.tvBtn.text = "Start"
// }
// }
//
// }
//
// override fun initListener() {
// super.initListener()
// binding.tvSkip.setOnClickListener {
// val activity = requireActivity() as GuideActivity?
// activity?.startActivity(Intent(activity, MainActivity::class.java))
// activity?.finish()
// }
// binding.tvBtn.setOnClickListener {
// val activity = requireActivity() as GuideActivity?
// activity ?: requireActivity()
// activity?.next(page)
// }
// }
//
// override fun onResume() {
// super.onResume()
//
// if (!binding.flAd.isAdShowed) {
// AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
// }
// }
//
//}
......@@ -11,6 +11,7 @@ class NativeFullFragment : BaseFragment<FragmentNativeFullBinding>(FragmentNativ
super.onResume()
if (!binding.flAd.isAdShowed) {
// binding.flAd.adGravity = android.view.Gravity.BOTTOM or android.view.Gravity.CENTER_HORIZONTAL
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_full)
}
}
......
......@@ -16,7 +16,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.base.LottieEnum
import com.base.appzxhy.base.cleanFiles
import com.base.appzxhy.base.cleanFileBeans
import com.base.appzxhy.bean.FeatureBean.Companion.LARGE_FILE_CLEAN
import com.base.appzxhy.bean.FileBean
import com.base.appzxhy.business.ads.AdsMgr
......@@ -368,7 +368,7 @@ class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(Activ
if (total <= 0) return@setOnClickListener
val dialog = ConfirmDialog(this)
dialog.action = {
cleanFiles(list)
cleanFileBeans(list)
AdsMgr.showInsert(this, showCallBack = object : AdsShowCallBack() {
override fun next() {
CleanResultActivity.functionKey = LARGE_FILE_CLEAN
......
......@@ -17,6 +17,7 @@ import com.base.appzxhy.bean.HomeTabUIBean
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.databinding.ActivityMainBinding
import com.base.appzxhy.databinding.ItemHomeTabBinding
import com.base.appzxhy.ui.dialog.StoragePermissionDialog
import com.base.appzxhy.ui.recyclebin.RecycleBinFragment
import com.base.appzxhy.utils.PermissionUtils.requestStoragePermission
import com.google.android.material.tabs.TabLayout
......@@ -57,9 +58,14 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
when (dialogType) {
"StoreDialog" -> {
requestStoragePermission(launcher) {}
val dialog = StoragePermissionDialog(this@MainActivity)
dialog.action = {
requestStoragePermission(launcher) { }
}
"NotificationDialog"->{
dialog.showDialog()
}
"NotificationDialog" -> {
}
}
......@@ -134,6 +140,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
mainPageCount = mainPageCount + 1
viewModel.checkDialog(this)
viewModel.refreshRecycleBin()
}
}
\ No newline at end of file
......@@ -2,9 +2,14 @@ package com.base.appzxhy.ui.main
import android.content.Context
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.getRecycleBinData
import com.base.appzxhy.utils.PermissionUtils.checkStorePermission
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import java.io.File
class MainViewModel : ViewModel() {
......@@ -22,4 +27,10 @@ class MainViewModel : ViewModel() {
// return
// }
}
var recycleBinFileFlow: MutableStateFlow<List<File>> = MutableStateFlow(listOf())
fun refreshRecycleBin() = viewModelScope.launch(Dispatchers.IO) {
recycleBinFileFlow.update { getRecycleBinData() }
}
}
\ No newline at end of file
......@@ -27,8 +27,6 @@ class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>(Activit
@SuppressLint("SetTextI18n")
override fun initView() {
useDefaultImmersive()
val number = intent.extras?.getInt("Number") ?: 0
val scanType = intent.extras?.getInt("ScanType")
val path: String? = intent.extras?.getString("Path")
......
......@@ -359,4 +359,6 @@ class FileRecoveryActivity : BaseActivity<ActivityFileRecoveryBinding>(ActivityF
// 检查时间戳是否在24个月的范围内
return timestamp in twentyFourMonthsAgo..currentTime
}
}
package com.base.appzxhy.ui.recyclebin
import android.content.Context
import android.view.ViewGroup
import com.base.appzxhy.R
import com.base.appzxhy.databinding.ItemRecoveryBinBinding
import com.base.appzxhy.ui.adapter.CommonViewHolder
import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.getImgRes
import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.mImageStr
import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.mVideoStr
import com.base.appzxhy.utils.KotlinExt.toFormatSize
import com.base.appzxhy.utils.XmlEx.inflate
import com.bumptech.glide.Glide
import com.chad.library.adapter4.BaseQuickAdapter
import java.io.File
class RecycleBinAdapter : BaseQuickAdapter<File, CommonViewHolder>() {
var clickAction: ((file: File) -> Unit)? = null
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: File?) {
item ?: return
val binding = ItemRecoveryBinBinding.bind(holder.itemView)
val context = holder.itemView.context
if (mImageStr.contains("." + item.extension) || mVideoStr.contains("." + item.extension)) {
Glide.with(context).load(item.absoluteFile).into(binding.icon)
} else {
binding.icon.setImageResource(item.getImgRes())
}
binding.tvName.text = item.name
binding.tvSize.text = item.length().toFormatSize()
binding.root.setOnClickListener {
clickAction?.invoke(item)
}
}
override fun onCreateViewHolder(
context: Context,
parent: ViewGroup,
viewType: Int
): CommonViewHolder {
return CommonViewHolder(R.layout.item_recovery_bin.inflate(parent))
}
}
\ No newline at end of file
package com.base.appzxhy.ui.recyclebin
import android.os.Environment
import android.view.View
import androidx.lifecycle.lifecycleScope
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.business.ads.AdsShowCallBack
import com.base.appzxhy.databinding.ActivityRecycleBinDetailBinding
import com.base.appzxhy.ui.recovery.FileRecoveredActivity
import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.getImgRes
import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.getType
import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.mImageStr
import com.base.appzxhy.ui.recyclebin.RecycleBinUtils.mVideoStr
import com.base.appzxhy.utils.FileUtils.deleteIfExists
import com.base.appzxhy.utils.KotlinExt.toFormatSize
import com.base.appzxhy.utils.KotlinExt.toFormatTime
import com.bumptech.glide.Glide
import kotlinx.coroutines.launch
import java.io.File
class RecycleBinDetailActivity : BaseActivity<ActivityRecycleBinDetailBinding>(ActivityRecycleBinDetailBinding::inflate) {
companion object {
lateinit var recycleBinFile: File
}
override fun initView() {
super.initView()
if (mImageStr.contains("." + recycleBinFile.extension) || mVideoStr.contains("." + recycleBinFile.extension)) {
Glide.with(this).load(recycleBinFile.absoluteFile).into(binding.iv)
} else {
binding.iv.setImageResource(recycleBinFile.getImgRes())
}
binding.tvPath.text = recycleBinFile.absolutePath
binding.tvSize.text = recycleBinFile.length().toFormatSize()
binding.tvTime.text = recycleBinFile.lastModified().toFormatTime()
functionInAd {
binding.v.visibility = View.GONE
}
}
override fun initListener() {
super.initListener()
binding.ivBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
binding.ivDelete.setOnClickListener {
lifecycleScope.launch {
recycleBinFile.deleteIfExists()
}
}
binding.tvRestore.setOnClickListener {
lifecycleScope.launch {
restore()
}
AdsMgr.showInsert(this, showCallBack = object : AdsShowCallBack() {
override fun show() {
super.show()
binding.v.visibility = View.VISIBLE
}
override fun next() {
goToAc(FileRecoveredActivity::class.java, exb = {
putExtra("Number", 1)
putExtra("ScanType", recycleBinFile.getType())
})
}
})
}
}
fun restore() {
val appName = getString(R.string.app_name).replace("/", " ")
val appDir = File(Environment.getExternalStorageDirectory(), appName)
val dir = File(appDir, "Restore")
if (!dir.exists()) {
dir.mkdirs()
}
val recoveryFile = File(dir, recycleBinFile.name)
recycleBinFile.copyTo(recoveryFile, true)
recycleBinFile.deleteIfExists()
}
}
\ No newline at end of file
package com.base.appzxhy.ui.recyclebin
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.base.goToAc
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.databinding.FragmentRecycleBinBinding
import com.base.appzxhy.ui.main.MainActivity
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
class RecycleBinFragment : BaseFragment<FragmentRecycleBinBinding>(FragmentRecycleBinBinding::inflate) {
private val adapter = RecycleBinAdapter()
override fun initView() {
super.initView()
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
binding.rv.adapter = adapter
lifecycleScope.launch {
(requireActivity() as MainActivity).viewModel.recycleBinFileFlow.collectLatest {
binding.llEmpty.isVisible = it.isEmpty()
adapter.submitList(it)
}
}
}
override fun initListener() {
super.initListener()
adapter.clickAction = {
RecycleBinDetailActivity.recycleBinFile = it
goToAc(RecycleBinDetailActivity::class.java)
}
}
}
\ No newline at end of file
package com.base.appzxhy.ui.recyclebin
import com.base.appzxhy.MyApplication
import com.base.appzxhy.R
import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_AUDIOS
import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_DOCUMENTS
import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_PHOTOS
import com.base.appzxhy.ui.recovery.FileScanResultActivity.Companion.SCAN_VIDEOS
import java.io.File
object RecycleBinUtils {
......@@ -14,14 +19,41 @@ object RecycleBinUtils {
val mAudioStr: Set<String> = HashSet(
mutableListOf(".mp3", ".flac", ".wav")
)
val mDocumentStr: Set<String> = HashSet(mutableListOf(".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf"))
fun File.getType(): Int {
if (mImageStr.contains("." + extension)) {
return SCAN_PHOTOS
}
if (mVideoStr.contains("." + extension)) {
return SCAN_VIDEOS
}
if (mAudioStr.contains("." + extension)) {
return SCAN_AUDIOS
}
if (mDocumentStr.contains("." + extension)) {
return SCAN_DOCUMENTS
}
return -1
}
fun File.getImgRes(): Int {
return when (extension) {
"mp3" -> R.drawable.mp3
"flac" -> R.drawable.flac
"doc", "docx" -> R.drawable.doc
"xls", "xlsx" -> R.drawable.xls
"ppt", "pptx" -> R.drawable.ppt
else -> R.drawable.icon_file
}
}
fun getRecycleBinData(): List<File> {
val file = File(MyApplication.Companion.appContext.filesDir, "recycleBin")
if (file.exists()) {
val arrayList = arrayListOf<File>()
arrayList.addAll(arrayList)
return arrayList
val recycleBinDir = File(MyApplication.Companion.appContext.filesDir, "recycleBin")
if (recycleBinDir.exists()) {
return recycleBinDir.listFiles()?.toList() ?: listOf()
} else {
return listOf()
}
......@@ -33,7 +65,7 @@ object RecycleBinUtils {
recycleBinDir.mkdirs()
}
val recycleBinFile = File(recycleBinDir, "." + file.name)
val recycleBinFile = File(recycleBinDir, file.name)
file.copyTo(recycleBinFile, true)
}
......
......@@ -12,7 +12,7 @@ import androidx.recyclerview.widget.GridLayoutManager
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.base.LottieEnum
import com.base.appzxhy.base.cleanFiles
import com.base.appzxhy.base.cleanFileBeans
import com.base.appzxhy.bean.FeatureBean.Companion.SCREENSHOT_CLEAN
import com.base.appzxhy.bean.FileBean
import com.base.appzxhy.business.ads.AdsMgr
......@@ -196,7 +196,7 @@ class ScreenshotCleanActivity : BaseActivity<ActivityScreenshotCleanBinding>(Act
dialog.action = {
AdsMgr.showInsert(this, showCallBack = object : AdsShowCallBack() {
override fun next() {
cleanFiles(selectedFiles)
cleanFileBeans(selectedFiles)
CleanResultActivity.total = total
CleanResultActivity.functionKey = SCREENSHOT_CLEAN
CleanResultActivity.titleName = getString(R.string.screenshot_clean)
......
......@@ -5,6 +5,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.lifecycleScope
......@@ -24,6 +25,8 @@ import com.base.appzxhy.databinding.ItemSimilarPhotosBinding
import com.base.appzxhy.databinding.ItemSimilarPhotosChildBinding
import com.base.appzxhy.ui.cleanresult.CleanResultActivity
import com.base.appzxhy.ui.dialog.ConfirmDialog
import com.base.appzxhy.ui.recyclebin.RecycleBinUtils
import com.base.appzxhy.utils.FileUtils
import com.base.appzxhy.utils.MediaUtils
import com.base.appzxhy.utils.Utils
import com.bumptech.glide.Glide
......@@ -33,6 +36,7 @@ import com.bumptech.glide.request.RequestOptions
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import java.io.File
import java.util.concurrent.Semaphore
class SimilarPhotosActivity : BaseActivity<ActivitySimilarPhotosBinding>(ActivitySimilarPhotosBinding::inflate) {
......@@ -249,6 +253,7 @@ class SimilarPhotosActivity : BaseActivity<ActivitySimilarPhotosBinding>(Activit
dialog.action = {
AdsMgr.showInsert(this, showCallBack = object : AdsShowCallBack() {
override fun next() {
cleanSimilarBeans(selectedFiles)
CleanResultActivity.total = total
CleanResultActivity.functionKey = SIMILAR_PHOTOS
CleanResultActivity.titleName = getString(R.string.similar_photos)
......@@ -276,4 +281,15 @@ class SimilarPhotosActivity : BaseActivity<ActivitySimilarPhotosBinding>(Activit
updateSelection()
}
fun AppCompatActivity.cleanSimilarBeans(list: List<SimilarBean>) {
lifecycleScope.launch(Dispatchers.IO) {
val paths = list.map { it.url }.toTypedArray()
paths.forEach {
RecycleBinUtils.addRecycleBinFile(File(it))
FileUtils.deleteFile(it)
}
launch(Dispatchers.Main) { MediaUtils.updateMedia(applicationContext, paths) }
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#328EF6" />
<corners android:radius="@dimen/dp_38" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="#328EF6" />
<corners android:radius="@dimen/dp_50" />
</shape>
\ No newline at end of file
......@@ -14,6 +14,7 @@
android:layout_marginTop="56dp"
android:gravity="center"
android:text="Which type do you want to clean?"
android:textColor="#1A1A1A"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintTop_toTopOf="parent"
......@@ -43,7 +44,7 @@
android:layout_gravity="center_vertical"
android:layout_marginVertical="12dp"
android:layout_marginStart="20dp"
android:src="@drawable/icon04"
android:src="@drawable/icon_photo_guide"
tools:ignore="ContentDescription" />
<TextView
......@@ -84,7 +85,7 @@
android:layout_gravity="center_vertical"
android:layout_marginVertical="12dp"
android:layout_marginStart="20dp"
android:src="@drawable/icon03" />
android:src="@drawable/icon_video_guide" />
<TextView
android:layout_width="0dp"
......@@ -123,7 +124,7 @@
android:layout_gravity="center_vertical"
android:layout_marginVertical="12dp"
android:layout_marginStart="20dp"
android:src="@drawable/icon02" />
android:src="@drawable/icon_audio_guide" />
<TextView
android:layout_width="0dp"
......@@ -162,7 +163,7 @@
android:layout_gravity="center_vertical"
android:layout_marginVertical="12dp"
android:layout_marginStart="20dp"
android:src="@drawable/icon01" />
android:src="@drawable/icon_document_guide" />
<TextView
android:layout_width="0dp"
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
<FrameLayout
android:id="@+id/flTop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ivBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="@dimen/dp_8"
android:padding="@dimen/dp_8"
android:src="@drawable/fanhui_b"
tools:ignore="ContentDescription,UseAppTint" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ivDelete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="@dimen/dp_8"
android:padding="@dimen/dp_8"
android:src="@drawable/delete_b"
tools:ignore="ContentDescription,UseAppTint" />
</FrameLayout>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/flTop"
app:layout_constraintVertical_bias="0.0"
tools:ignore="ContentDescription"
tools:layout_editor_absoluteX="0dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.4"
tools:ignore="ContentDescription">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
android:visibility="gone" />
<ImageView
android:id="@+id/iv_bofang"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:clickable="true"
android:focusable="true"
android:src="@drawable/bofang"
android:visibility="invisible"
tools:ignore="SpeakableTextPresentCheck" />
</LinearLayout>
<androidx.cardview.widget.CardView
android:layout_width="@dimen/dp_345"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="15dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/ll"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginVertical="18dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/tv_restore"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_path"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="14sp"
tools:text="1721110745805_Trash_Screenshot_2024-07-16-14-07-233_00m.miui.ho" />
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:textColor="#999999"
android:textSize="14sp"
tools:text="1MB" />
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="9dp"
android:textColor="#999999"
android:textSize="14sp"
tools:text="2024/07/16" />
</LinearLayout>
<TextView
android:id="@+id/tv_restore"
android:layout_width="98dp"
android:layout_height="45dp"
android:layout_marginEnd="15dp"
android:background="@drawable/bg_328ef6_38"
android:gravity="center"
android:text="Restore"
android:textColor="@color/white"
android:textSize="15sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
<View
android:id="@+id/v"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.guide.Guide2Fragment">
<TextView
android:id="@+id/tvSkip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:layout_marginEnd="20dp"
android:text="Skip"
android:textColor="#B6B6B6"
android:textSize="16sp"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="HardcodedText" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ivDian"
android:layout_width="@dimen/dp_118"
android:layout_height="@dimen/dp_4"
android:layout_marginTop="@dimen/dp_60"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/dian_1" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_118"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivDian"
app:srcCompat="@drawable/image_guide_1" />
<TextView
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/dp_45"
android:layout_marginTop="@dimen/dp_60"
android:gravity="center"
android:text="@string/guide_tip_1"
android:textColor="#1A1A1A"
android:textSize="@dimen/sp_16"
app:layout_constraintTop_toBottomOf="@id/iv" />
<TextView
android:id="@+id/tvBtn"
android:layout_width="@dimen/dp_300"
android:layout_height="@dimen/dp_55"
android:layout_marginBottom="@dimen/dp_40"
android:background="@drawable/bg_stroke_328ef6_50"
android:gravity="center"
android:text="@string/next"
android:textColor="#328EF6"
android:textSize="@dimen/sp_20"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@id/flAd"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<com.base.appzxhy.business.ads.NativeParentView
android:id="@+id/flAd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#D9D9D9"
android:minHeight="75dp"
app:layout_constraintBottom_toBottomOf="parent">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/zhanwei1"
tools:ignore="ImageContrastCheck,ImageContrastCheck" />
</com.base.appzxhy.business.ads.NativeParentView>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -38,6 +38,13 @@
android:src="@drawable/zhanwei1" />
</com.base.appzxhy.business.ads.NativeParentView>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/flAd" />
<LinearLayout
android:id="@+id/llEmpty"
......@@ -45,6 +52,7 @@
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
......@@ -57,16 +65,15 @@
app:srcCompat="@drawable/image" />
<TextView
android:textSize="@dimen/sp_14"
android:textColor="#666666"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/dp_38"
android:layout_marginTop="@dimen/dp_30"
android:gravity="center"
android:text="@string/recyclebin_tip" />
android:text="@string/recyclebin_tip"
android:textColor="#666666"
android:textSize="@dimen/sp_14" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_50"
android:layout_marginVertical="@dimen/dp_6">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
android:layout_marginStart="@dimen/dp_16"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/icon_file" />
<LinearLayout
android:id="@+id/ll"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/dp_12"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/icon"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="middle"
android:includeFontPadding="false"
android:singleLine="true"
android:text="VID_20240210_200748.mp3"
android:textColor="#1A1A1A" />
<TextView
android:id="@+id/tvSize"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:text="8.7 MB"
android:textColor="#999999" />
</LinearLayout>
<View
android:layout_width="0dp"
android:layout_height="1px"
android:background="#DEDEDF"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/ll" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -2,5 +2,5 @@
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/rv"
android:layout_height="match_parent"/>
android:layout_height="wrap_content"/>
......@@ -34,4 +34,7 @@
<dimen name="dp_38">38dp</dimen>
<dimen name="dp_320">320dp</dimen>
<dimen name="dp_330">330dp</dimen>
<dimen name="dp_55">55dp</dimen>
<dimen name="dp_6">6dp</dimen>
<dimen name="dp_345">345dp</dimen>
</resources>
\ No newline at end of file
......@@ -124,6 +124,10 @@ Please rest assured that we will handle your information in strict accordance wi
<string name="thank_you_very_much_for_taking_the_time_to_rate_us">Thank you very much for taking the time to rate us.</string>
<string name="submit">SUBMIT</string>
<string name="screenshot_cleaner">Screenshot Cleaner</string>
<string name="guide_tip_1">Deleted precious photos or important files by accident? That’s when regret kicks in.</string>
<string name="guide_tip_2">Don’t let regret set in! Our app can accurately recover the files you’ve accidentally deleted.</string>
<string name="guide_tip_3">Release phone memory clean up junk files</string>
<string name="next">Next</string>
</resources>
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