Commit c2477599 authored by maxiaoliang's avatar maxiaoliang

新增需求,修改首页ui

parent c75073f9
...@@ -187,7 +187,16 @@ ...@@ -187,7 +187,16 @@
<activity <activity
android:name=".activity.BackRelsutAt" android:name=".activity.BackRelsutAt"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity android:name=".activity.appprocess.AProcessAnimalActivity"
android:screenOrientation="portrait"/>
<activity android:name=".activity.appprocess.AprocessActivity"
android:screenOrientation="portrait"/>
<activity android:name=".activity.recover.FileScanResultActivity"
android:screenOrientation="portrait"/>
<activity android:name=".activity.recover.FileRecoveryActivity"
android:screenOrientation="portrait"/>
<activity android:name=".activity.recover.FileRecoveredActivity"
android:screenOrientation="portrait"/>
<service <service
android:name=".fcm.FcmService" android:name=".fcm.FcmService"
android:exported="true"> android:exported="true">
......
package com.test.easy.easycleanerjunk.activity.appprocess
import android.content.Intent
import android.view.View
import androidx.lifecycle.lifecycleScope
import com.test.easy.easycleanerjunk.databinding.ActivityLayoutAprocessAnimalBinding
import com.test.easy.easycleanerjunk.helps.BaseActivity
import com.test.easy.easycleanerjunk.helps.ConfigHelper
import com.test.easy.easycleanerjunk.helps.ads.AdmobUtils
import com.test.easy.easycleanerjunk.helps.ads.MaxAdUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlin.random.Random
class AProcessAnimalActivity:BaseActivity<ActivityLayoutAprocessAnimalBinding>() {
override val isLightMode =true
override val binding: ActivityLayoutAprocessAnimalBinding by lazy {
ActivityLayoutAprocessAnimalBinding.inflate(layoutInflater)
}
private var job: Job? = null
override fun initView() {
}
override fun onPause() {
super.onPause()
binding.lottie.pauseAnimation()
job?.cancel()
}
override fun onResume() {
super.onResume()
resumeLottie()
job = waitJob()
}
fun resumeLottie(){
binding.lottie.imageAssetsFolder = "easy_app_manager/images/"
binding.lottie.setAnimation("easy_app_manager/data.json")
binding.lottie.playAnimation()
}
private fun waitJob() = lifecycleScope.launch(Dispatchers.Main) {
delay(Random.nextLong(2500, 4000))
binding.lottie.cancelAnimation()
binding.lottie.visibility = View.GONE
binding.idLottieFinish.visibility = View.VISIBLE
binding.idLottieFinish.playAnimation()
binding.tv.text = "Completed!"
delay(1000)
if(ConfigHelper.admobTrueMaxFlase==0){
MaxAdUtils.showInterstitialAd(this@AProcessAnimalActivity) {
startActivity(Intent(this@AProcessAnimalActivity, AprocessActivity::class.java))
finish()
}
}else{
AdmobUtils.showInterstitialAd(this@AProcessAnimalActivity) {
startActivity(Intent(this@AProcessAnimalActivity, AprocessActivity::class.java))
finish()
}
}
}
}
\ No newline at end of file
package com.test.easy.easycleanerjunk.activity.appprocess
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo
import android.net.Uri
import android.provider.Settings
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.addCallback
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.test.easy.easycleanerjunk.R
import com.test.easy.easycleanerjunk.activity.BackRelsutAt
import com.test.easy.easycleanerjunk.bean.AppUninstallBean
import com.test.easy.easycleanerjunk.databinding.ActivityLayoutProBinding
import com.test.easy.easycleanerjunk.helps.BaseActivity
import com.test.easy.easycleanerjunk.helps.FileHelps
import com.test.easy.easycleanerjunk.helps.KotlinExt.toFormatSize
import com.test.easy.easycleanerjunk.utils.SPUtils
import com.test.easy.easycleanerjunk.view.AFunOb
import com.test.easy.easycleanerjunk.view.DialogViews.showDialogFunctionExit
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class AprocessActivity : BaseActivity<ActivityLayoutProBinding>() {
override val isLightMode = true
override val binding: ActivityLayoutProBinding by lazy {
ActivityLayoutProBinding.inflate(layoutInflater)
}
override fun initView() {
setData()
val a = FileHelps.ramInfo.availMem
val t = FileHelps.ramInfo.totalMem
binding.idTvBfb.text="%.1f %%".format(a*100f/t)
binding.idProgbar.progress=(a*100f/t).toInt()
binding.idTvPrgcess.text =
"${FileHelps.ramInfo.availMem.toFormatSize()}/${FileHelps.ramInfo.totalMem.toFormatSize()}"
}
override fun initListener() {
binding.idImgBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
binding.idTvSkip.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
showDialogFunctionExit(AFunOb.APP_PROCESS, apps = mData.size) {
val s = SPUtils.getInstance().getInt("outcomeReturnCount", 0)
if (s == 1) {
val localCount = SPUtils.getInstance().getInt("localCount", 0)
SPUtils.getInstance().put("localCount", localCount + 1)
val n = SPUtils.getInstance().getInt("outcomeReturnHomeCount", 0)
if (localCount < n) {
BackRelsutAt.launch(this@AprocessActivity,AFunOb.APP_PROCESS)
finish()
}else{
finishToMain()
}
}else{
finishToMain()
}
}
}
}
private val mData = mutableListOf<AppUninstallBean>()
private fun setData() = lifecycleScope.launch(Dispatchers.IO) {
val pm = packageManager
val packages = pm.getInstalledPackages(0)
packages.forEach { app ->
if (isLaunchApp(this@AprocessActivity, app)) {
val appBean = AppUninstallBean(
app.applicationInfo.loadIcon(pm),
app.applicationInfo.loadLabel(pm).toString(),
app.applicationInfo.packageName
)
mData.add(appBean)
}
}
launch(Dispatchers.Main) {
binding.idProg.visibility = View.GONE
binding.idRlApp.layoutManager = LinearLayoutManager(this@AprocessActivity)
binding.idRlApp.adapter = mAdapter
}
}
private fun isLaunchApp(
context: Context,
app: PackageInfo,
filterSystem: Boolean = true
): Boolean {
val flagSystem = (app.applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) < 1
val flag = if (filterSystem) flagSystem else true
return flag && app.applicationInfo.packageName != context.packageName
}
private val mAdapter by lazy {
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val ivImage: ImageView
val tvName: TextView
init {
ivImage = view.findViewById(R.id.id_img_icon)
tvName = view.findViewById(R.id.tv_name)
}
}
object : RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): ViewHolder {
val view = LayoutInflater.from(this@AprocessActivity)
.inflate(R.layout.item_layout_apps, parent, false)
return ViewHolder(view)
}
override fun getItemCount() = mData.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.ivImage.setImageDrawable(mData[position].icon)
holder.tvName.text = mData[position].name
holder.itemView.setOnClickListener {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
intent.data = Uri.parse("package:${mData[position].packageName}")
startActivity(intent)
}
}
}
}
}
\ No newline at end of file
package com.test.easy.easycleanerjunk.activity.recover
import android.annotation.SuppressLint
import android.graphics.Color
import android.os.Environment
import androidx.activity.addCallback
import com.test.easy.easycleanerjunk.R
import com.test.easy.easycleanerjunk.databinding.ActivityFileRecoveredBinding
import com.test.easy.easycleanerjunk.helps.BaseActivity
import com.test.easy.easycleanerjunk.helps.ConfigHelper
import com.test.easy.easycleanerjunk.helps.ConfigHelper.SCAN_PHOTOS
import com.test.easy.easycleanerjunk.helps.ConfigHelper.SCAN_VIDEOS
import com.test.easy.easycleanerjunk.helps.ads.AdmobUtils
import com.test.easy.easycleanerjunk.helps.ads.MaxAdUtils
import com.test.easy.easycleanerjunk.utils.BarUtils
import java.io.File
class FileRecoveredActivity : BaseActivity<ActivityFileRecoveredBinding>() {
override val isLightMode = true
override val binding: ActivityFileRecoveredBinding by lazy {
ActivityFileRecoveredBinding.inflate(layoutInflater)
}
@SuppressLint("SetTextI18n")
override fun initView() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
val number = intent.extras?.getInt("Number") ?: 0
val scanType = intent.extras?.getInt("ScanType")
binding.tvNumber.text = number.toString()
val type = when (scanType) {
SCAN_PHOTOS -> if (number == 1) "Photo" else "Photos"
SCAN_VIDEOS -> if (number == 1) "Video" else "Videos"
else -> ""
}
binding.tvType.text = type
val appName = this.resources.getString(R.string.app_name)
val appDir = File(Environment.getExternalStorageDirectory(), appName)
binding.tvDir.text = "Recovered in $appDir"
}
override fun initListener() {
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
if(ConfigHelper.admobTrueMaxFlase==0){
MaxAdUtils.showInterstitialAd(this@FileRecoveredActivity) {
finishToMain()
}
}else{
AdmobUtils.showInterstitialAd(this@FileRecoveredActivity) {
finishToMain()
}
}
}
binding.tvContinue.setOnClickListener {
if(ConfigHelper.admobTrueMaxFlase==0){
MaxAdUtils.showInterstitialAd(this@FileRecoveredActivity) {
finish()
}
}else{
AdmobUtils.showInterstitialAd(this@FileRecoveredActivity) {
finish()
}
}
}
binding.tvFinish.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
}
}
\ No newline at end of file
package com.test.easy.easycleanerjunk.activity.recover
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.os.Environment
import android.view.View
import androidx.activity.addCallback
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.test.easy.easycleanerjunk.adapter.FileFolderAdapter
import com.test.easy.easycleanerjunk.bean.FolderBean
import com.test.easy.easycleanerjunk.bean.RecoveryBean
import com.test.easy.easycleanerjunk.databinding.ActivityFileScanResultBinding
import com.test.easy.easycleanerjunk.helps.BaseActivity
import com.test.easy.easycleanerjunk.helps.ConfigHelper
import com.test.easy.easycleanerjunk.helps.ConfigHelper.SCAN_PHOTOS
import com.test.easy.easycleanerjunk.helps.ConfigHelper.SCAN_VIDEOS
import com.test.easy.easycleanerjunk.helps.FileHelps.loadFileByFilter
import com.test.easy.easycleanerjunk.helps.PermissionHelp.checkStorePermission
import com.test.easy.easycleanerjunk.helps.PermissionHelp.requestStorePermission
import com.test.easy.easycleanerjunk.helps.ads.AdmobUtils
import com.test.easy.easycleanerjunk.helps.ads.MaxAdUtils
import com.test.easy.easycleanerjunk.utils.BarUtils
import com.test.easy.easycleanerjunk.utils.FileHexEx
import com.test.easy.easycleanerjunk.view.DialogViews.showExitFunctionDialog
import com.test.easy.easycleanerjunk.view.DialogViews.showGerPermission
import com.test.easy.easycleanerjunk.view.FileScanDialog
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import java.io.File
class FileScanResultActivity : BaseActivity<ActivityFileScanResultBinding>() {
override val isLightMode= true
private val TAG = "FileScanResultActivity"
private var scanOnce: Boolean = false
private var scanType = 0
override val binding: ActivityFileScanResultBinding by lazy {
ActivityFileScanResultBinding.inflate(layoutInflater)
}
private lateinit var fileFolderAdapter: FileFolderAdapter
@SuppressLint("SetTextI18n")
override fun initView() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
scanType = intent.extras?.getInt("ScanType") ?: 0
when (scanType) {
SCAN_PHOTOS -> {
binding.tvTittle.text = "Photo Recovery"
binding.tvFileType.text = "Photos"
}
SCAN_VIDEOS -> {
binding.tvTittle.text = "Video Recovery"
binding.tvFileType.text = "videos"
}
}
fileFolderAdapter = FileFolderAdapter(scanType) { folderBean ->
FileRecoveryActivity.folderBean = null
FileRecoveryActivity.folderBean = folderBean
startActivity(Intent(this, FileRecoveryActivity::class.java).apply {
putExtra("ScanType", scanType)
})
}
binding.rv.adapter = fileFolderAdapter
if (checkStorePermission()) {
beginScan()
} else {
showGerPermission(
deny = { finishToMain() }) {
requestStorePermission(launcher, result = {
if (it) beginScan() else finishToMain()
})
}
}
}
override fun initListener() {
binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
onBackPressedDispatcher.addCallback {
showExitFunctionDialog {
if (it) {
if(ConfigHelper.admobTrueMaxFlase==0) {
MaxAdUtils.showInterstitialAd(this@FileScanResultActivity) {
finishToMain()
}
}else{
AdmobUtils.showInterstitialAd(this@FileScanResultActivity) {
finishToMain()
}
}
} else {
finishToMain()
}
}
}
}
@SuppressLint("SetTextI18n")
private fun beginScan() {
if (scanOnce)
return
scanOnce = true
//变量路径
val mPathFlow = MutableSharedFlow<String>(
replay = 5,//当新的订阅者Collect时,发送几个已经发送过的数据给它
extraBufferCapacity = 5,//减去replay,MutableSharedFlow还缓存多少数据,缓冲池容量 = replay + extraBufferCapacity
onBufferOverflow = BufferOverflow.DROP_OLDEST//缓存策略,三种 丢掉最新值、丢掉最旧值和挂起
)
val pathFlow: SharedFlow<String> = mPathFlow
//符合条件Flow
val mFoundFlow = MutableSharedFlow<Pair<Int, String>>(
replay = 5,
extraBufferCapacity = 5,
onBufferOverflow = BufferOverflow.SUSPEND
)
val foundFlow: SharedFlow<Pair<Int, String>> = mFoundFlow
val dialogClass = FileScanDialog(this)
val scanDialog = dialogClass.showFileScanDialog(pathFlow, foundFlow) {
pathList.add(it)
binding.tvFileNumber.text = pathList.size.toString()
setAdapterData(it)
}
val filter = when (scanType) {
SCAN_PHOTOS -> FileHexEx::isImage
SCAN_VIDEOS -> FileHexEx::isVideo
else -> FileHexEx::isImage
}
val root = Environment.getExternalStorageDirectory()
lifecycleScope.loadFileByFilter(
mPathFlow,
mFoundFlow,
root, filter = filter,
onDo = { file ->
// LogEx.logDebug(TAG, "file =${file.absolutePath}")
},
onFinish = {
lifecycleScope.launch(Dispatchers.Main) {
binding.ivWancheng.visibility = View.VISIBLE
binding.tvScanning.text = "Completed"
if (isActive) {
if(ConfigHelper.admobTrueMaxFlase==0){
MaxAdUtils.showInterstitialAd(this@FileScanResultActivity)
}else{
AdmobUtils.showInterstitialAd(this@FileScanResultActivity)
}
}
binding.flEmpty.isVisible = pathList.isEmpty()
setAdapterData(null)
dialogClass.finishScan {
scanDialog.dismiss()
}
}
}
)
}
private val pathList = ArrayList<String>()
private val hashMap = HashMap<String, ArrayList<RecoveryBean>>()
private fun setAdapterData(path: String? = null) {
val flag = path?.let { addMapFolder(it) } ?: true
if (flag) {
binding.tvFolderNumber.text = hashMap.keys.size.toString()
val mapList = hashMap.map {
FolderBean(it.key, recoveryList = it.value)
}
fileFolderAdapter.setData(mapList)
}
}
private fun addMapFolder(path: String): Boolean {
var isNewFolder = false
val folder = File(path).parent?.split("/")?.last() ?: ""
if (hashMap[folder] == null) {
hashMap[folder] = arrayListOf()
isNewFolder = true
}
val recoveryBean = RecoveryBean(path)
hashMap[folder]?.add(recoveryBean)
return isNewFolder
}
}
\ No newline at end of file
...@@ -56,7 +56,6 @@ class ScreenShotAnimationActivity : BaseActivity<ActivityScreenShotAnimationBind ...@@ -56,7 +56,6 @@ class ScreenShotAnimationActivity : BaseActivity<ActivityScreenShotAnimationBind
} }
private fun waitJob() = lifecycleScope.launch(Dispatchers.Main) { private fun waitJob() = lifecycleScope.launch(Dispatchers.Main) {
delay(Random.nextLong(3000, 4500))
delay(Random.nextLong(2500, 4000)) delay(Random.nextLong(2500, 4000))
binding.lottie.cancelAnimation() binding.lottie.cancelAnimation()
binding.lottie.visibility = View.GONE binding.lottie.visibility = View.GONE
......
...@@ -91,7 +91,7 @@ class NewSplashActivity : BaseActivity<ActivityLayoutSplashBinding>(), ...@@ -91,7 +91,7 @@ class NewSplashActivity : BaseActivity<ActivityLayoutSplashBinding>(),
private fun loadAd() { private fun loadAd() {
if(ConfigHelper.admobTrueMaxFlase==0){ if(ConfigHelper.admobTrueMaxFlase==0){
MaxAdUtils.loadAppOpenAd { MaxAdUtils.loadAppOpenAd(activity = this) {
if (isFinishing || isDestroyed) { if (isFinishing || isDestroyed) {
return@loadAppOpenAd return@loadAppOpenAd
} else { } else {
......
package com.test.easy.easycleanerjunk.adapter
import android.annotation.SuppressLint
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
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.test.easy.easycleanerjunk.R
import com.test.easy.easycleanerjunk.bean.FolderBean
import com.test.easy.easycleanerjunk.databinding.ItemFolderRecoveryBinding
import com.test.easy.easycleanerjunk.helps.ConfigHelper.SCAN_PHOTOS
import com.test.easy.easycleanerjunk.helps.ConfigHelper.SCAN_VIDEOS
import com.test.easy.easycleanerjunk.utils.ScreenUtil.dpToPx
import com.test.easy.easycleanerjunk.view.XmlEx.inflate
class FileFolderAdapter(
private val scanType: Int, private val click: (bean: FolderBean) -> Unit
) : RecyclerView.Adapter<FileFolderAdapter.FF>() {
private val TAG = "FileFolderAdapter"
private val beanList = arrayListOf<FolderBean>()
class FF(view: View) : ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FF {
val layout = when (scanType) {
SCAN_PHOTOS, SCAN_VIDEOS -> R.layout.item_folder_recovery
else -> R.layout.item_folder_recovery
}
return FF(layout.inflate(parent))
}
override fun getItemCount(): Int {
return beanList.size
}
@SuppressLint("SetTextI18n", "CheckResult")
override fun onBindViewHolder(holder: FF, position: Int) {
val bean = beanList[position]
val context = holder.itemView.context
when (scanType) {
SCAN_PHOTOS, SCAN_VIDEOS -> {
val binding = ItemFolderRecoveryBinding.bind(holder.itemView)
runCatching {
val options = RequestOptions().transform(CenterCrop(), RoundedCorners(context.dpToPx(10)))
val image1 = bean.recoveryList[0].path
val request1 = Glide.with(context).load(image1).apply(options)
if (scanType == SCAN_VIDEOS) {
request1.error(R.mipmap.videotu)
}
request1.into(binding.iv1)
val image2 = bean.recoveryList[1].path
val request2 = Glide.with(context).load(image2).apply(options)
if (scanType == SCAN_VIDEOS) {
request2.error(R.mipmap.videotu)
}
request2.into(binding.iv2)
val image3 = bean.recoveryList[2].path
val request3 = Glide.with(context).load(image3).apply(options)
if (scanType == SCAN_VIDEOS) {
request3.error(R.mipmap.videotu)
}
request3.into(binding.iv3)
}
binding.tvFolder.text = bean.folder
binding.tvFolderNumber.text = "(${bean.recoveryList.size})"
binding.root.setOnClickListener {
click.invoke(bean)
}
}
else -> {
}
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(list: List<FolderBean>) {
beanList.clear()
beanList.addAll(list)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun addData(list: List<FolderBean>) {
beanList.addAll(list)
notifyDataSetChanged()
}
}
\ No newline at end of file
package com.test.easy.easycleanerjunk.adapter
import android.annotation.SuppressLint
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import com.test.easy.easycleanerjunk.R
import com.test.easy.easycleanerjunk.bean.FolderBean
import com.test.easy.easycleanerjunk.bean.RecoveryBean
import com.test.easy.easycleanerjunk.databinding.ItemTimeMediaBinding
import com.test.easy.easycleanerjunk.helps.KotlinExt.toFormatSize
import com.test.easy.easycleanerjunk.view.XmlEx.inflate
import java.io.File
import java.text.SimpleDateFormat
import java.util.Locale
class FileTimeColumnsAdapter(
val scanType: Int,
val select: (all: Boolean, size: Int) -> Unit,
) : RecyclerView.Adapter<FileTimeColumnsAdapter.MCV>() {
private val beanList = arrayListOf<FolderBean>()
private var hideThumbnails: Boolean = false
private var columns: Int = 2
class MCV(view: View) : ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MCV {
return MCV(R.layout.item_time_media.inflate(parent))
}
override fun getItemCount(): Int {
return beanList.size
}
override fun onBindViewHolder(holder: MCV, position: Int) {
val binding = ItemTimeMediaBinding.bind(holder.itemView)
val context = holder.itemView.context
val bean = beanList[position]
val file = File(bean.recoveryList.first().path)
val time = SimpleDateFormat("yyyy-MMM-dd", Locale.getDefault()).format(file.lastModified())
binding.tvTime.text = time
binding.ivSelector.isSelected = bean.isSelect
val subAdapter = MediaColumnsAdapter()
binding.rvMediaColumns.layoutManager = GridLayoutManager(context, columns)
binding.rvMediaColumns.layoutParams =
LinearLayout.LayoutParams(RecyclerView.LayoutParams.WRAP_CONTENT, RecyclerView.LayoutParams.WRAP_CONTENT).apply {
topMargin = context.resources.getDimensionPixelOffset(R.dimen.dp_8)
gravity = Gravity.CENTER_HORIZONTAL
}
binding.rvMediaColumns.adapter = subAdapter
val list = if (hideThumbnails) bean.recoveryList.filter { !it.isThumbnails } else bean.recoveryList
if (list.isEmpty()) {
binding.flTittle.visibility = View.GONE
} else {
binding.flTittle.visibility = View.VISIBLE
subAdapter.setData(list)
}
binding.ivSelector.setOnClickListener {
bean.isSelect = !bean.isSelect
binding.ivSelector.isSelected = bean.isSelect
notifyItemChanged(position)
itemClick(bean.isSelect, subAdapter)
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(data: List<FolderBean>) {
beanList.clear()
beanList.addAll(data)
notifyDataSetChanged()
}
inner class MediaColumnsAdapter : RecyclerView.Adapter<MediaColumnsAdapter.CS>() {
private val list = arrayListOf<RecoveryBean>()
inner class CS(view: View) : ViewHolder(view) {
val iv = view.findViewById<ImageView>(R.id.iv)
val ivSelector = view.findViewById<ImageView>(R.id.iv_selector)
val tvSize = view.findViewById<TextView>(R.id.tv_size)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CS {
var layout = when (columns) {
2 -> R.layout.item_media_columns2
3 -> R.layout.item_media_columns3
4 -> R.layout.item_media_columns4
else -> R.layout.item_media_columns2
}
return CS(layout.inflate(parent))
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: CS, position: Int) {
}
override fun onBindViewHolder(holder: CS, position: Int, payloads: MutableList<Any>) {
val context = holder.itemView.context
val data = list[position]
if (payloads.isEmpty()) {
Glide.with(context).asBitmap().load(data.path).centerCrop().into(holder.iv)
holder.ivSelector.isSelected = data.isSelect
holder.itemView.setOnClickListener {
data.isSelect = !data.isSelect
holder.ivSelector.isSelected = data.isSelect
notifyItemChanged(position, "changeIv")
subItemClick(data)
}
val file = File(data.path)
holder.tvSize.text = file.length().toFormatSize()
} else {
holder.ivSelector.isSelected = data.isSelect
super.onBindViewHolder(holder, position, payloads)
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(bean: List<RecoveryBean>) {
list.clear()
list.addAll(bean)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun toggleSelect(select: Boolean) {
list.forEach {
it.isSelect = select
}
notifyDataSetChanged()
}
}
@SuppressLint("NotifyDataSetChanged")
fun subItemClick(data: RecoveryBean) {
val folderBean = beanList.find { it.recoveryList.contains(data) }
folderBean?.let { folder ->
val select = folder.recoveryList.all { it.isSelect }
if (folder.isSelect != select) {
folder.isSelect = select
notifyDataSetChanged()
}
}
val all = beanList.all { it.isSelect }
val size = beanList.sumOf { it.recoveryList.filter { bean -> bean.isSelect }.size }
select.invoke(all, size)
}
private fun itemClick(isSelect: Boolean, subAdapter: MediaColumnsAdapter) {
subAdapter.toggleSelect(isSelect)
val all = beanList.all { it.isSelect }
val size = beanList.sumOf { it.recoveryList.filter { bean -> bean.isSelect }.size }
select.invoke(all, size)
}
@SuppressLint("NotifyDataSetChanged")
fun toggleThumbnails(hideThumbnails: Boolean) {
this.hideThumbnails = hideThumbnails
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
fun toggleAllSelect(selected: Boolean) {
beanList.forEach {
it.isSelect = selected
it.recoveryList.forEach { bean -> bean.isSelect = selected }
}
notifyDataSetChanged()
val all = beanList.all { it.isSelect }
val size = beanList.sumOf { it.recoveryList.filter { bean -> bean.isSelect }.size }
select.invoke(all, size)
}
@SuppressLint("NotifyDataSetChanged")
fun changeColumns(columns: Int) {
this.columns = columns
notifyDataSetChanged()
}
fun getSelectData(): List<RecoveryBean> {
return beanList.flatMap { it.recoveryList }.filter { it.isSelect }
}
}
\ No newline at end of file
package com.test.easy.easycleanerjunk.adapter
import android.annotation.SuppressLint
import android.view.View
import android.view.ViewGroup
import androidx.annotation.Dimension
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.test.easy.easycleanerjunk.R
import com.test.easy.easycleanerjunk.bean.RecoveryFilterBean
import com.test.easy.easycleanerjunk.databinding.ItemRecoveryFilterBinding
import com.test.easy.easycleanerjunk.view.XmlEx.inflate
class RecoveryFilterAdapter(
val click: (bean: RecoveryFilterBean) -> Unit
) : RecyclerView.Adapter<RecoveryFilterAdapter.YYDS>() {
private val beanList = arrayListOf<RecoveryFilterBean>()
inner class YYDS(view: View) : ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): YYDS {
return YYDS(R.layout.item_recovery_filter.inflate(parent))
}
override fun getItemCount(): Int {
return beanList.size
}
override fun onBindViewHolder(holder: YYDS, position: Int) {
val binding = ItemRecoveryFilterBinding.bind(holder.itemView)
val bean = beanList[position]
val context = holder.itemView.context
binding.tv.text = bean.tittle
binding.iv.isVisible = bean.isSelect
if (bean.isSelect) {
binding.tv.setTextColor(ContextCompat.getColor(context, R.color.black))
binding.tv.setTextSize(Dimension.SP, 18f)
} else {
binding.tv.setTextColor(ContextCompat.getColor(context, R.color.color_747474))
binding.tv.setTextSize(Dimension.SP, 16f)
}
binding.root.setOnClickListener {
click.invoke(bean)
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(list: List<RecoveryFilterBean>) {
beanList.clear()
beanList.addAll(list)
notifyDataSetChanged()
}
}
\ No newline at end of file
...@@ -13,12 +13,15 @@ import com.test.easy.easycleanerjunk.helps.ConfigHelper ...@@ -13,12 +13,15 @@ import com.test.easy.easycleanerjunk.helps.ConfigHelper
import com.test.easy.easycleanerjunk.helps.ads.AdmobUtils import com.test.easy.easycleanerjunk.helps.ads.AdmobUtils
import com.test.easy.easycleanerjunk.helps.ads.MaxAdUtils import com.test.easy.easycleanerjunk.helps.ads.MaxAdUtils
import com.test.easy.easycleanerjunk.view.AFunOb.APP_MANAGER import com.test.easy.easycleanerjunk.view.AFunOb.APP_MANAGER
import com.test.easy.easycleanerjunk.view.AFunOb.APP_PROCESS
import com.test.easy.easycleanerjunk.view.AFunOb.BATTERY_INFO import com.test.easy.easycleanerjunk.view.AFunOb.BATTERY_INFO
import com.test.easy.easycleanerjunk.view.AFunOb.JUNK_CLEANER import com.test.easy.easycleanerjunk.view.AFunOb.JUNK_CLEANER
import com.test.easy.easycleanerjunk.view.AFunOb.LARGE_FILE_CLEANER import com.test.easy.easycleanerjunk.view.AFunOb.LARGE_FILE_CLEANER
import com.test.easy.easycleanerjunk.view.AFunOb.PHOTO_COMPRESS import com.test.easy.easycleanerjunk.view.AFunOb.PHOTO_COMPRESS
import com.test.easy.easycleanerjunk.view.AFunOb.PHOTO_RECOVERY
import com.test.easy.easycleanerjunk.view.AFunOb.SCREENSHOT_CLEANER import com.test.easy.easycleanerjunk.view.AFunOb.SCREENSHOT_CLEANER
import com.test.easy.easycleanerjunk.view.AFunOb.SIMILAR_PHOTOS import com.test.easy.easycleanerjunk.view.AFunOb.SIMILAR_PHOTOS
import com.test.easy.easycleanerjunk.view.AFunOb.VIDEO_RECOVERY
import com.test.easy.easycleanerjunk.view.AFunOb.WHATSAPP_CLEANER import com.test.easy.easycleanerjunk.view.AFunOb.WHATSAPP_CLEANER
import com.test.easy.easycleanerjunk.view.XmlEx.inflate import com.test.easy.easycleanerjunk.view.XmlEx.inflate
...@@ -31,20 +34,25 @@ class ToolsAdapter( ...@@ -31,20 +34,25 @@ class ToolsAdapter(
ToolsUI( ToolsUI(
tittle = "Popular", tools = listOf( tittle = "Popular", tools = listOf(
ToolUI(JUNK_CLEANER, context.getString(R.string.clean_junk), R.mipmap.t_cleanjunk), ToolUI(JUNK_CLEANER, context.getString(R.string.clean_junk), R.mipmap.t_cleanjunk),
ToolUI(WHATSAPP_CLEANER, context.getString(R.string.whatsapp_cleaner), R.mipmap.t_whatsapp),
ToolUI(BATTERY_INFO, context.getString(R.string.battery_info), R.mipmap.t_battery),
ToolUI(LARGE_FILE_CLEANER, context.getString(R.string.large_file_cleaner), R.mipmap.t_large), ToolUI(LARGE_FILE_CLEANER, context.getString(R.string.large_file_cleaner), R.mipmap.t_large),
ToolUI(PHOTO_COMPRESS, context.getString(R.string.photo_compress), R.mipmap.t_photo),
)
),
ToolsUI(isAd = true),
ToolsUI(
tittle = "More", tools = listOf(
ToolUI(APP_MANAGER, context.getString(R.string.app_manager), R.mipmap.t_appmanager), ToolUI(APP_MANAGER, context.getString(R.string.app_manager), R.mipmap.t_appmanager),
ToolUI(SIMILAR_PHOTOS, context.getString(R.string.similar_photos), R.mipmap.t_similar), ToolUI(APP_PROCESS, "App Process", R.mipmap.t_appprocess),
ToolUI(WHATSAPP_CLEANER, context.getString(R.string.whatsapp_cleaner), R.mipmap.t_whatsapp),
ToolUI(PHOTO_RECOVERY, "Photo Recovery", R.mipmap.t_photo_recover),
ToolUI(VIDEO_RECOVERY, "Video Recovery", R.mipmap.t_video),
ToolUI(BATTERY_INFO, context.getString(R.string.battery_info), R.mipmap.t_battery),
ToolUI(PHOTO_COMPRESS, context.getString(R.string.photo_compress), R.mipmap.t_photo_recover),
ToolUI(SIMILAR_PHOTOS, "Duplicate Photos", R.mipmap.t_duplicate),
ToolUI(SCREENSHOT_CLEANER, context.getString(R.string.screenshot_cleaner), R.mipmap.screenshot), ToolUI(SCREENSHOT_CLEANER, context.getString(R.string.screenshot_cleaner), R.mipmap.screenshot),
) )
), ),
ToolsUI(isAd = true),
// ToolsUI(
// tittle = "More", tools = listOf(
//
//
// )
// ),
) )
......
...@@ -29,4 +29,5 @@ class ConfigBean() { ...@@ -29,4 +29,5 @@ class ConfigBean() {
var facebookAdShowEventCount: Int = 3 var facebookAdShowEventCount: Int = 3
var ifGuestFirstClean: Int = 1 var ifGuestFirstClean: Int = 1
var isShowDeviceAd: Int = 0 var isShowDeviceAd: Int = 0
var openAdloadfail:Int=0
} }
package com.test.easy.easycleanerjunk.bean
data class FolderBean(
val folder: String = "",
val time: String = "",
val recoveryList: ArrayList<RecoveryBean> = arrayListOf()
) {
var isSelect: Boolean = false
}
\ No newline at end of file
package com.test.easy.easycleanerjunk.bean
import com.test.easy.easycleanerjunk.utils.FileHexEx.isPdf
import java.io.File
data class RecoveryBean(
val path: String = "",
) {
var isSelect: Boolean = false
var isThumbnails: Boolean = false
var type: String = ""
companion object {
fun RecoveryBean.setType() {
val file = File(path)
if (isPdf(file)) {
type = "PDF"
}
}
}
}
\ No newline at end of file
package com.test.easy.easycleanerjunk.bean
class RecoveryFilterBean(
val tittle: String = "ALL",
var type: String ,
var isSelect: Boolean = false,
)
\ No newline at end of file
...@@ -8,16 +8,22 @@ import android.widget.ScrollView ...@@ -8,16 +8,22 @@ import android.widget.ScrollView
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.test.easy.easycleanerjunk.activity.SettingActivity import com.test.easy.easycleanerjunk.activity.SettingActivity
import com.test.easy.easycleanerjunk.activity.appmanager.AppManagerAnimationActivity import com.test.easy.easycleanerjunk.activity.appmanager.AppManagerAnimationActivity
import com.test.easy.easycleanerjunk.activity.appprocess.AProcessAnimalActivity
import com.test.easy.easycleanerjunk.activity.batteryinfo.BatteryInfoAnimationActivity import com.test.easy.easycleanerjunk.activity.batteryinfo.BatteryInfoAnimationActivity
import com.test.easy.easycleanerjunk.activity.largefile.LargeFileAnimationActivity import com.test.easy.easycleanerjunk.activity.largefile.LargeFileAnimationActivity
import com.test.easy.easycleanerjunk.activity.photocompress.photo.StartCompressionPhotoActivity import com.test.easy.easycleanerjunk.activity.photocompress.photo.StartCompressionPhotoActivity
import com.test.easy.easycleanerjunk.activity.recover.FileScanResultActivity
import com.test.easy.easycleanerjunk.activity.scanjunk.PrepareScanActivity import com.test.easy.easycleanerjunk.activity.scanjunk.PrepareScanActivity
import com.test.easy.easycleanerjunk.activity.screenshot.ScreenShotAnimationActivity import com.test.easy.easycleanerjunk.activity.screenshot.ScreenShotAnimationActivity
import com.test.easy.easycleanerjunk.activity.similarphotos.RepeatPhotoAnimationActivity import com.test.easy.easycleanerjunk.activity.similarphotos.RepeatPhotoAnimationActivity
import com.test.easy.easycleanerjunk.activity.whatsapp.WhatsAppCleanerAnimationActivity import com.test.easy.easycleanerjunk.activity.whatsapp.WhatsAppCleanerAnimationActivity
import com.test.easy.easycleanerjunk.databinding.FragmentLayoutHomeBinding import com.test.easy.easycleanerjunk.databinding.FragmentLayoutHomeBinding
import com.test.easy.easycleanerjunk.helps.BaseFragment import com.test.easy.easycleanerjunk.helps.BaseFragment
import com.test.easy.easycleanerjunk.helps.ConfigHelper.SCAN_PHOTOS
import com.test.easy.easycleanerjunk.helps.ConfigHelper.SCAN_VIDEOS
import com.test.easy.easycleanerjunk.helps.FileHelps
import com.test.easy.easycleanerjunk.helps.KotlinExt.setOnClickListener import com.test.easy.easycleanerjunk.helps.KotlinExt.setOnClickListener
import com.test.easy.easycleanerjunk.helps.KotlinExt.toFormatSize
import com.test.easy.easycleanerjunk.utils.BarUtils import com.test.easy.easycleanerjunk.utils.BarUtils
class HomeFragment : BaseFragment<FragmentLayoutHomeBinding>() { class HomeFragment : BaseFragment<FragmentLayoutHomeBinding>() {
...@@ -30,6 +36,7 @@ class HomeFragment : BaseFragment<FragmentLayoutHomeBinding>() { ...@@ -30,6 +36,7 @@ class HomeFragment : BaseFragment<FragmentLayoutHomeBinding>() {
override fun setView() { override fun setView() {
binding.root.updatePadding(top = BarUtils.getStatusBarHeight()) binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
startAnimation() startAnimation()
binding.idTvUsedSpace.text="${FileHelps.usedSize.toFormatSize()}/${FileHelps.totalsize.toFormatSize()}"
} }
private var animator: ValueAnimator? = null private var animator: ValueAnimator? = null
...@@ -70,7 +77,7 @@ class HomeFragment : BaseFragment<FragmentLayoutHomeBinding>() { ...@@ -70,7 +77,7 @@ class HomeFragment : BaseFragment<FragmentLayoutHomeBinding>() {
binding.idImgSl.setOnClickListener { binding.idImgSl.setOnClickListener {
binding.idScrollView.fullScroll(ScrollView.FOCUS_DOWN) binding.idScrollView.fullScroll(ScrollView.FOCUS_DOWN)
} }
listOf(binding.idCleanJunk, binding.idFlClean, binding.idCleanUp).setOnClickListener { listOf( binding.idFlClean, binding.idCleanUp).setOnClickListener {
startActivity(Intent(requireContext(), PrepareScanActivity::class.java)) startActivity(Intent(requireContext(), PrepareScanActivity::class.java))
} }
...@@ -100,6 +107,19 @@ class HomeFragment : BaseFragment<FragmentLayoutHomeBinding>() { ...@@ -100,6 +107,19 @@ class HomeFragment : BaseFragment<FragmentLayoutHomeBinding>() {
binding.idWhatapp.setOnClickListener { binding.idWhatapp.setOnClickListener {
startActivity(Intent(requireContext(), WhatsAppCleanerAnimationActivity::class.java)) startActivity(Intent(requireContext(), WhatsAppCleanerAnimationActivity::class.java))
} }
binding.idAppProcess.setOnClickListener {
startActivity(Intent(requireContext(), AProcessAnimalActivity::class.java))
}
binding.idPhotoRecovery.setOnClickListener {
startActivity(Intent(requireContext(), FileScanResultActivity::class.java).apply {
putExtra("ScanType", SCAN_PHOTOS)
})
}
binding.idVideoRecovery.setOnClickListener {
startActivity(Intent(requireContext(), FileScanResultActivity::class.java).apply {
putExtra("ScanType", SCAN_VIDEOS)
})
}
} }
......
...@@ -2,9 +2,11 @@ package com.test.easy.easycleanerjunk.fragment ...@@ -2,9 +2,11 @@ package com.test.easy.easycleanerjunk.fragment
import android.content.Intent import android.content.Intent
import com.test.easy.easycleanerjunk.activity.appmanager.AppManagerAnimationActivity import com.test.easy.easycleanerjunk.activity.appmanager.AppManagerAnimationActivity
import com.test.easy.easycleanerjunk.activity.appprocess.AProcessAnimalActivity
import com.test.easy.easycleanerjunk.activity.batteryinfo.BatteryInfoAnimationActivity import com.test.easy.easycleanerjunk.activity.batteryinfo.BatteryInfoAnimationActivity
import com.test.easy.easycleanerjunk.activity.largefile.LargeFileAnimationActivity import com.test.easy.easycleanerjunk.activity.largefile.LargeFileAnimationActivity
import com.test.easy.easycleanerjunk.activity.photocompress.photo.StartCompressionPhotoActivity import com.test.easy.easycleanerjunk.activity.photocompress.photo.StartCompressionPhotoActivity
import com.test.easy.easycleanerjunk.activity.recover.FileScanResultActivity
import com.test.easy.easycleanerjunk.activity.scanjunk.PrepareScanActivity import com.test.easy.easycleanerjunk.activity.scanjunk.PrepareScanActivity
import com.test.easy.easycleanerjunk.activity.screenshot.ScreenShotAnimationActivity import com.test.easy.easycleanerjunk.activity.screenshot.ScreenShotAnimationActivity
import com.test.easy.easycleanerjunk.activity.similarphotos.RepeatPhotoAnimationActivity import com.test.easy.easycleanerjunk.activity.similarphotos.RepeatPhotoAnimationActivity
...@@ -12,13 +14,17 @@ import com.test.easy.easycleanerjunk.activity.whatsapp.WhatsAppCleanerAnimationA ...@@ -12,13 +14,17 @@ import com.test.easy.easycleanerjunk.activity.whatsapp.WhatsAppCleanerAnimationA
import com.test.easy.easycleanerjunk.adapter.ToolsAdapter import com.test.easy.easycleanerjunk.adapter.ToolsAdapter
import com.test.easy.easycleanerjunk.databinding.FragmentLayoutTools1Binding import com.test.easy.easycleanerjunk.databinding.FragmentLayoutTools1Binding
import com.test.easy.easycleanerjunk.helps.BaseFragment import com.test.easy.easycleanerjunk.helps.BaseFragment
import com.test.easy.easycleanerjunk.helps.ConfigHelper
import com.test.easy.easycleanerjunk.view.AFunOb import com.test.easy.easycleanerjunk.view.AFunOb
import com.test.easy.easycleanerjunk.view.AFunOb.APP_MANAGER import com.test.easy.easycleanerjunk.view.AFunOb.APP_MANAGER
import com.test.easy.easycleanerjunk.view.AFunOb.APP_PROCESS
import com.test.easy.easycleanerjunk.view.AFunOb.BATTERY_INFO import com.test.easy.easycleanerjunk.view.AFunOb.BATTERY_INFO
import com.test.easy.easycleanerjunk.view.AFunOb.LARGE_FILE_CLEANER import com.test.easy.easycleanerjunk.view.AFunOb.LARGE_FILE_CLEANER
import com.test.easy.easycleanerjunk.view.AFunOb.PHOTO_COMPRESS import com.test.easy.easycleanerjunk.view.AFunOb.PHOTO_COMPRESS
import com.test.easy.easycleanerjunk.view.AFunOb.PHOTO_RECOVERY
import com.test.easy.easycleanerjunk.view.AFunOb.SCREENSHOT_CLEANER import com.test.easy.easycleanerjunk.view.AFunOb.SCREENSHOT_CLEANER
import com.test.easy.easycleanerjunk.view.AFunOb.SIMILAR_PHOTOS import com.test.easy.easycleanerjunk.view.AFunOb.SIMILAR_PHOTOS
import com.test.easy.easycleanerjunk.view.AFunOb.VIDEO_RECOVERY
import com.test.easy.easycleanerjunk.view.AFunOb.WHATSAPP_CLEANER import com.test.easy.easycleanerjunk.view.AFunOb.WHATSAPP_CLEANER
class ToolsFragment : BaseFragment<FragmentLayoutTools1Binding>() { class ToolsFragment : BaseFragment<FragmentLayoutTools1Binding>() {
...@@ -34,10 +40,31 @@ class ToolsFragment : BaseFragment<FragmentLayoutTools1Binding>() { ...@@ -34,10 +40,31 @@ class ToolsFragment : BaseFragment<FragmentLayoutTools1Binding>() {
AFunOb.JUNK_CLEANER -> { AFunOb.JUNK_CLEANER -> {
startActivity(Intent(requireContext(), PrepareScanActivity::class.java)) startActivity(Intent(requireContext(), PrepareScanActivity::class.java))
} }
LARGE_FILE_CLEANER -> { LARGE_FILE_CLEANER -> {
startActivity(Intent(requireContext(), LargeFileAnimationActivity::class.java)) startActivity(Intent(requireContext(), LargeFileAnimationActivity::class.java))
} }
APP_MANAGER -> {
startActivity(Intent(requireActivity(), AppManagerAnimationActivity::class.java))
}
APP_PROCESS->{
startActivity(Intent(requireActivity(), AProcessAnimalActivity::class.java))
}
WHATSAPP_CLEANER -> {
startActivity(Intent(requireActivity(), WhatsAppCleanerAnimationActivity::class.java))
}
PHOTO_RECOVERY->{
startActivity(Intent(requireContext(), FileScanResultActivity::class.java).apply {
putExtra("ScanType", ConfigHelper.SCAN_PHOTOS)
})
}
VIDEO_RECOVERY->{
startActivity(Intent(requireContext(), FileScanResultActivity::class.java).apply {
putExtra("ScanType", ConfigHelper.SCAN_VIDEOS)
})
}
BATTERY_INFO -> {
startActivity(Intent(requireActivity(), BatteryInfoAnimationActivity::class.java))
}
SIMILAR_PHOTOS -> { SIMILAR_PHOTOS -> {
startActivity(Intent(requireContext(), RepeatPhotoAnimationActivity::class.java)) startActivity(Intent(requireContext(), RepeatPhotoAnimationActivity::class.java))
...@@ -47,21 +74,12 @@ class ToolsFragment : BaseFragment<FragmentLayoutTools1Binding>() { ...@@ -47,21 +74,12 @@ class ToolsFragment : BaseFragment<FragmentLayoutTools1Binding>() {
startActivity(Intent(requireActivity(), StartCompressionPhotoActivity::class.java)) startActivity(Intent(requireActivity(), StartCompressionPhotoActivity::class.java))
} }
BATTERY_INFO -> {
startActivity(Intent(requireActivity(), BatteryInfoAnimationActivity::class.java))
}
SCREENSHOT_CLEANER -> { SCREENSHOT_CLEANER -> {
startActivity(Intent(requireActivity(), ScreenShotAnimationActivity::class.java)) startActivity(Intent(requireActivity(), ScreenShotAnimationActivity::class.java))
} }
WHATSAPP_CLEANER -> {
startActivity(Intent(requireActivity(), WhatsAppCleanerAnimationActivity::class.java))
}
APP_MANAGER -> {
startActivity(Intent(requireActivity(), AppManagerAnimationActivity::class.java))
}
} }
} }
binding.rvTools.adapter = adapter binding.rvTools.adapter = adapter
......
...@@ -77,6 +77,7 @@ object ComUtils { ...@@ -77,6 +77,7 @@ object ComUtils {
SPUtils.getInstance().put("ifGuestFirstClean", true) SPUtils.getInstance().put("ifGuestFirstClean", true)
} }
ConfigHelper.admobTrueMaxFlase=bean.admobTrueMaxFlase ConfigHelper.admobTrueMaxFlase=bean.admobTrueMaxFlase
ConfigHelper.openAdLoadFail=bean.openAdloadfail
adDisplayInterval = bean.adInterval adDisplayInterval = bean.adInterval
maxMultiClick = bean.maxMultiClick maxMultiClick = bean.maxMultiClick
AdDisplayUtils.getInstance().setMaxAdDisplayCount(bean.adShowCount) AdDisplayUtils.getInstance().setMaxAdDisplayCount(bean.adShowCount)
......
...@@ -6,6 +6,8 @@ import com.test.easy.easycleanerjunk.utils.SPUtils ...@@ -6,6 +6,8 @@ import com.test.easy.easycleanerjunk.utils.SPUtils
object ConfigHelper { object ConfigHelper {
const val SCAN_PHOTOS = 1
const val SCAN_VIDEOS = 3
var isInterAdShow=false var isInterAdShow=false
const val privacyPolicy = "https://sites.google.com/view/easy-cleannow/easy-clean" const val privacyPolicy = "https://sites.google.com/view/easy-cleannow/easy-clean"
...@@ -143,6 +145,7 @@ object ConfigHelper { ...@@ -143,6 +145,7 @@ object ConfigHelper {
field = value field = value
SPUtils.getInstance().put("admobTrueMaxFlase", value, true) SPUtils.getInstance().put("admobTrueMaxFlase", value, true)
} }
var ifcacheinstall = "" var ifcacheinstall = ""
get() { get() {
return SPUtils.getInstance().getString("ifcacheinstall", field) return SPUtils.getInstance().getString("ifcacheinstall", field)
...@@ -159,4 +162,12 @@ object ConfigHelper { ...@@ -159,4 +162,12 @@ object ConfigHelper {
field = value field = value
SPUtils.getInstance().put("ifConfig", value, true) SPUtils.getInstance().put("ifConfig", value, true)
} }
var openAdLoadFail = 0
get() {
return SPUtils.getInstance().getInt("openAdLoadFail", field)
}
set(value) {
field = value
SPUtils.getInstance().put("openAdLoadFail", value, true)
}
} }
\ No newline at end of file
package com.test.easy.easycleanerjunk.helps package com.test.easy.easycleanerjunk.helps
import android.app.ActivityManager
import android.content.Context
import android.os.Environment
import android.os.StatFs
import android.provider.MediaStore import android.provider.MediaStore
import com.test.easy.easycleanerjunk.bean.ImageDataBean import com.test.easy.easycleanerjunk.bean.ImageDataBean
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.io.File import java.io.File
...@@ -12,7 +19,69 @@ import java.io.RandomAccessFile ...@@ -12,7 +19,69 @@ import java.io.RandomAccessFile
import java.util.LinkedList import java.util.LinkedList
object FileHelps { object FileHelps {
var usedSize = 0L //已经用的
var availableSize = 0L //剩余大小
var totalsize = 0L//总共大小
init {
totalsize = getallSize()
availableSize = getBeSize()
usedSize = totalsize - availableSize
}
val ramInfo by lazy {
ActivityManager.MemoryInfo().apply {
(BaseApplication.context.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager)?.getMemoryInfo(this)
}
}
private fun getallSize(): Long {
return if (totalsize > 0) {
totalsize
} else try {
val statFs = StatFs(Environment.getExternalStorageDirectory().path)
val statFs2 = StatFs(Environment.getRootDirectory().path)
var blockSizeLong =
statFs2.blockSizeLong * statFs2.blockCountLong + statFs.blockSizeLong * statFs.blockCountLong
blockSizeLong = getClosestPowerOfTwo(blockSizeLong)
totalsize = blockSizeLong
blockSizeLong
} catch (e10: java.lang.Exception) {
0L
}
}
private fun getBeSize(): Long {
try {
val statFs = StatFs(Environment.getExternalStorageDirectory().path)
val statFs2 = StatFs(Environment.getRootDirectory().path)
val blackSize =
statFs2.blockSizeLong * statFs2.availableBlocksLong + statFs.blockSizeLong * statFs.availableBlocksLong
return getaSzie(blackSize)
} catch (e10: Exception) {
return 0L
}
}
private fun getaSzie(j10: Long): Long {
var j10 = j10
var i7 = 0
while (true) {
val j11: Long = 1000
if (j10 < j11) {
break
}
j10 /= j11
i7++
}
for (i10 in 0 until i7) {
j10 *= 1024
}
return j10
}
private fun getClosestPowerOfTwo(size: Long): Long {
var powerOfTwo: Long = 1
while (powerOfTwo < size) {
powerOfTwo *= 2
}
return powerOfTwo
}
val similarImageList = mutableListOf<ImageDataBean>() val similarImageList = mutableListOf<ImageDataBean>()
fun getImageFiles(callback: () -> Unit) { fun getImageFiles(callback: () -> Unit) {
MainScope().launch(Dispatchers.Main) { MainScope().launch(Dispatchers.Main) {
...@@ -108,5 +177,56 @@ object FileHelps { ...@@ -108,5 +177,56 @@ object FileHelps {
} }
return data return data
} }
fun CoroutineScope.loadFileByFilter(
flow1: MutableSharedFlow<String>? = null,
flow2: MutableSharedFlow<Pair<Int, String>>? = null,
folder: File,
filter: (file: File) -> Boolean,
onDo: ((file: File) -> Unit)? = null,
onFinish: (() -> Unit)? = null
) = launch(Dispatchers.IO) {
delay(1000)
var size = 0
//添加第一层文件到链表
val linkList = LinkedList<File>()
val fileList = folder.listFiles()
fileList?.forEach {
if (it.isDirectory) {
linkList.add(it)
} else {
val flag = filter(it)
// LogEx.logDebug(TAG, "$it flag=$flag")
if (flag) {
onDo?.invoke(it)
size++
flow2?.emit(Pair(size, it.absolutePath))
}
flow1?.emit(it.absolutePath)
}
}
//链表取文件
var tempFile: File
while (!linkList.isEmpty()) {
tempFile = linkList.removeFirst()
val tempFileList = tempFile.listFiles()
tempFileList?.forEach {
if (it.isDirectory) {
linkList.add(it)
} else {
val flag = filter(it)
// LogEx.logDebug(TAG, "$it flag=$flag")
if (flag) {
onDo?.invoke(it)
size++
flow2?.emit(Pair(size, it.absolutePath))
}
flow1?.emit(it.absolutePath)
}
}
}
onFinish?.invoke()
}
} }
\ No newline at end of file
...@@ -43,7 +43,7 @@ object MaxAdUtils { ...@@ -43,7 +43,7 @@ object MaxAdUtils {
field = value field = value
SPUtils.getInstance().put("isBlack", value, true) SPUtils.getInstance().put("isBlack", value, true)
} }
fun loadAppOpenAd(skip: Boolean = false, onLoad: (() -> Unit)? = null) { fun loadAppOpenAd(skip: Boolean = false, activity: Activity,onLoad: (() -> Unit)? = null) {
if (isBlack) { if (isBlack) {
EventUtils.event("blacklist_filter") EventUtils.event("blacklist_filter")
onLoad?.invoke() onLoad?.invoke()
...@@ -86,10 +86,16 @@ object MaxAdUtils { ...@@ -86,10 +86,16 @@ object MaxAdUtils {
override fun onAdLoadFailed(p0: String, p1: MaxError) { override fun onAdLoadFailed(p0: String, p1: MaxError) {
mOpenAd=null mOpenAd=null
onLoad?.invoke()
maxAdPullReport(null, "AppOpenAd", p1.message) maxAdPullReport(null, "AppOpenAd", p1.message)
// Log.e("MXL", "onAdLoadFailed: " + p1) // Log.e("MXL", "onAdLoadFailed: " + p1)
AdDisplayUtils.getInstance().incrementAdRequestFailCount() AdDisplayUtils.getInstance().incrementAdRequestFailCount()
if(ConfigHelper.openAdLoadFail==1){
showInterstitialAd(activity){
onLoad?.invoke()
}
}else{
onLoad?.invoke()
}
} }
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {} override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {}
...@@ -117,7 +123,7 @@ object MaxAdUtils { ...@@ -117,7 +123,7 @@ object MaxAdUtils {
EventUtils.event("ad_prepare_show", ext = obj) EventUtils.event("ad_prepare_show", ext = obj)
if (System.currentTimeMillis() - openLoadTime > 1000 * 60 * 60) { if (System.currentTimeMillis() - openLoadTime > 1000 * 60 * 60) {
mOpenAd = null mOpenAd = null
loadAppOpenAd() loadAppOpenAd(activity = activity)
onHidden?.invoke() onHidden?.invoke()
val obj = JSONObject() val obj = JSONObject()
obj.put("ad_unit", "openAd") obj.put("ad_unit", "openAd")
...@@ -151,7 +157,7 @@ object MaxAdUtils { ...@@ -151,7 +157,7 @@ object MaxAdUtils {
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) { override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
onHidden?.invoke() onHidden?.invoke()
loadAppOpenAd() loadAppOpenAd(activity = activity)
val obj = JSONObject() val obj = JSONObject()
obj.put("reason", p1.message) obj.put("reason", p1.message)
obj.put("ad_unit", "openAd") obj.put("ad_unit", "openAd")
...@@ -415,7 +421,7 @@ object MaxAdUtils { ...@@ -415,7 +421,7 @@ object MaxAdUtils {
}) })
if (thisInterAd?.isReady == true) { if (thisInterAd?.isReady == true) {
thisInterAd?.showAd() thisInterAd.showAd()
} else { } else {
onHidden?.invoke() onHidden?.invoke()
interAd?.loadAd() interAd?.loadAd()
......
...@@ -62,5 +62,9 @@ object FileHexEx { ...@@ -62,5 +62,9 @@ object FileHexEx {
} }
fun isPdf(file: File): Boolean {
val pdfHex = "25504446"
val hex = FileHelps.readFileRange(file.absolutePath, 0, 4).byteArrayToHexString()
return pdfHex == hex
}
} }
\ No newline at end of file
...@@ -9,4 +9,7 @@ object AFunOb { ...@@ -9,4 +9,7 @@ object AFunOb {
const val BATTERY_INFO = "Battery Info" const val BATTERY_INFO = "Battery Info"
const val WHATSAPP_CLEANER = "WhatsApp Cleaner" const val WHATSAPP_CLEANER = "WhatsApp Cleaner"
const val APP_MANAGER = "App Manager" const val APP_MANAGER = "App Manager"
const val APP_PROCESS = "App Process"
const val PHOTO_RECOVERY = "Photo Recovery"
const val VIDEO_RECOVERY = "Video Recovery"
} }
\ No newline at end of file
...@@ -2,6 +2,7 @@ package com.test.easy.easycleanerjunk.view ...@@ -2,6 +2,7 @@ package com.test.easy.easycleanerjunk.view
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.app.AlertDialog
import android.app.Dialog import android.app.Dialog
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
...@@ -12,17 +13,23 @@ import android.view.View ...@@ -12,17 +13,23 @@ import android.view.View
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.lifecycle.LifecycleCoroutineScope
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.test.easy.easycleanerjunk.R import com.test.easy.easycleanerjunk.R
import com.test.easy.easycleanerjunk.activity.home.NewMainActivity import com.test.easy.easycleanerjunk.activity.home.NewMainActivity
import com.test.easy.easycleanerjunk.activity.photocompress.photo.CustomDialog import com.test.easy.easycleanerjunk.activity.photocompress.photo.CustomDialog
import com.test.easy.easycleanerjunk.databinding.DialogExitFunctionBinding
import com.test.easy.easycleanerjunk.databinding.DialogLayoutFlowTypeBinding import com.test.easy.easycleanerjunk.databinding.DialogLayoutFlowTypeBinding
import com.test.easy.easycleanerjunk.databinding.DialogPermissonOpenBinding import com.test.easy.easycleanerjunk.databinding.DialogPermissonOpenBinding
import com.test.easy.easycleanerjunk.databinding.DialogRecoveringBinding
import com.test.easy.easycleanerjunk.helps.ConfigHelper import com.test.easy.easycleanerjunk.helps.ConfigHelper
import com.test.easy.easycleanerjunk.helps.ads.AdmobUtils import com.test.easy.easycleanerjunk.helps.ads.AdmobUtils
import com.test.easy.easycleanerjunk.helps.ads.MaxAdUtils import com.test.easy.easycleanerjunk.helps.ads.MaxAdUtils
import com.test.easy.easycleanerjunk.utils.ActivityManagerUtils import com.test.easy.easycleanerjunk.utils.ActivityManagerUtils
import com.test.easy.easycleanerjunk.utils.SPUtils import com.test.easy.easycleanerjunk.utils.SPUtils
import com.test.easy.easycleanerjunk.view.AFunOb.APP_MANAGER import com.test.easy.easycleanerjunk.view.AFunOb.APP_MANAGER
import com.test.easy.easycleanerjunk.view.AFunOb.APP_PROCESS
import com.test.easy.easycleanerjunk.view.AFunOb.BATTERY_INFO import com.test.easy.easycleanerjunk.view.AFunOb.BATTERY_INFO
import com.test.easy.easycleanerjunk.view.AFunOb.JUNK_CLEANER import com.test.easy.easycleanerjunk.view.AFunOb.JUNK_CLEANER
import com.test.easy.easycleanerjunk.view.AFunOb.LARGE_FILE_CLEANER import com.test.easy.easycleanerjunk.view.AFunOb.LARGE_FILE_CLEANER
...@@ -30,6 +37,16 @@ import com.test.easy.easycleanerjunk.view.AFunOb.PHOTO_COMPRESS ...@@ -30,6 +37,16 @@ import com.test.easy.easycleanerjunk.view.AFunOb.PHOTO_COMPRESS
import com.test.easy.easycleanerjunk.view.AFunOb.SCREENSHOT_CLEANER import com.test.easy.easycleanerjunk.view.AFunOb.SCREENSHOT_CLEANER
import com.test.easy.easycleanerjunk.view.AFunOb.SIMILAR_PHOTOS import com.test.easy.easycleanerjunk.view.AFunOb.SIMILAR_PHOTOS
import com.test.easy.easycleanerjunk.view.AFunOb.WHATSAPP_CLEANER import com.test.easy.easycleanerjunk.view.AFunOb.WHATSAPP_CLEANER
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import java.io.File
import kotlin.random.Random
object DialogViews { object DialogViews {
...@@ -104,7 +121,7 @@ object DialogViews { ...@@ -104,7 +121,7 @@ object DialogViews {
} }
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
fun Context.showDialogFunctionExit(function: String, okAction: () -> Unit) { fun Context.showDialogFunctionExit(function: String,apps:Int=0, okAction: () -> Unit) {
val s = SPUtils.getInstance().getInt("isShowBackIntAd", 0) val s = SPUtils.getInstance().getInt("isShowBackIntAd", 0)
if (s == 0) { if (s == 0) {
if (this !is NewMainActivity && !ActivityManagerUtils.getInstance().isActivityInStack( if (this !is NewMainActivity && !ActivityManagerUtils.getInstance().isActivityInStack(
...@@ -125,6 +142,7 @@ object DialogViews { ...@@ -125,6 +142,7 @@ object DialogViews {
BATTERY_INFO -> "Exit Battery Information? You may miss important battery status information." BATTERY_INFO -> "Exit Battery Information? You may miss important battery status information."
WHATSAPP_CLEANER -> "Exit WhatsApp Cleaner? Remaining WhatsApp junk files may be taking up space." WHATSAPP_CLEANER -> "Exit WhatsApp Cleaner? Remaining WhatsApp junk files may be taking up space."
APP_MANAGER -> "Exit App Manager? Miss opportunity to manage unused apps and free up space." APP_MANAGER -> "Exit App Manager? Miss opportunity to manage unused apps and free up space."
APP_PROCESS->"${apps} background processes are still running. Are you sure you want to leave?"
else -> "" else -> ""
} }
...@@ -160,4 +178,100 @@ object DialogViews { ...@@ -160,4 +178,100 @@ object DialogViews {
} }
} }
@SuppressLint("SetTextI18n")
fun Context.showRecoveringDialog(
lifecycleScope: LifecycleCoroutineScope,
list: List<String>,
dir: File,
copyProgressAction: () -> Unit,
finish: () -> Unit
) {
val dialog = BottomSheetDialog(this)
val binding = DialogRecoveringBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
val mutableSharedFlow = MutableSharedFlow<Int>(
replay = 5,//当新的订阅者Collect时,发送几个已经发送过的数据给它
extraBufferCapacity = 5,//减去replay,MutableSharedFlow还缓存多少数据,缓冲池容量 = replay + extraBufferCapacity
onBufferOverflow = BufferOverflow.SUSPEND//缓存策略,三种 丢掉最新值、丢掉最旧值和挂起
)
val sharedFlow: SharedFlow<Int> = mutableSharedFlow
val parentView = binding.root.parent as View
val behavior = BottomSheetBehavior.from(parentView)
//展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED
// 设置禁止通过拖动来隐藏
behavior.isHideable = false
// 禁止点击外部区域关闭
dialog.setOnCancelListener { dialogInterface ->
dialogInterface.cancel() // 这里可以处理点击外部区域的逻辑
}
lifecycleScope.launch(Dispatchers.IO) {
val arrayList = arrayListOf<String>().apply {
addAll(list)
}
var index = 0
while (arrayList.isNotEmpty()) {
val path = arrayList[0]
arrayList.removeAt(0)
val file = File(path)
runCatching {
val recoveryFile = File(dir, file.name)
file.copyTo(recoveryFile, true)
}
mutableSharedFlow.emit(index)
delay(Random.nextLong(500, 1500))
index++
}
mutableSharedFlow.emit(-1)
}
lifecycleScope.launch(Dispatchers.Main) {
sharedFlow.collectLatest {
if (it == -1) {
finish.invoke()
dialog.dismiss()
cancel()
} else {
val process = it.toFloat() / list.size.toFloat()
if (process > 0.3) {
copyProgressAction.invoke()
}
binding.tvNumber.text = "${it + 1}/${list.size}"
}
}
}
dialog.show()
}
fun Context.showExitFunctionDialog(
mustShow: Boolean = false,
exitAction: (showAd: Boolean) -> Unit
) {
val binding = DialogExitFunctionBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this).create()
dialog.setView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
val params = dialog.window?.attributes
params?.width = resources.getDimensionPixelOffset(R.dimen.dp_345)
dialog.window?.attributes = params
binding.tvN.setOnClickListener {
dialog.dismiss()
exitAction.invoke(true)
}
binding.tvY.setOnClickListener {
dialog.dismiss()
}
}
} }
\ No newline at end of file
package com.test.easy.easycleanerjunk.view
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.app.AlertDialog
import android.view.LayoutInflater
import android.view.View
import android.view.animation.LinearInterpolator
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.test.easy.easycleanerjunk.R
import com.test.easy.easycleanerjunk.databinding.DialogFileScanBinding
import com.test.easy.easycleanerjunk.helps.ConfigHelper
import com.test.easy.easycleanerjunk.helps.ads.AdmobUtils
import com.test.easy.easycleanerjunk.helps.ads.MaxAdUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
class FileScanDialog(
val activity: AppCompatActivity,
) {
private val a1 = ValueAnimator.ofFloat(0f, -360f)
private val dialog = AlertDialog.Builder(activity).create()
private val binding = DialogFileScanBinding.inflate(LayoutInflater.from(activity))
@SuppressLint("SetTextI18n")
fun showFileScanDialog(
pathFlow: SharedFlow<String>,
foundFlow: SharedFlow<Pair<Int, String>>,
foundAction: ((path: String) -> Unit)? = null
): AlertDialog {
dialog?.setView(binding.root)
dialog?.setCanceledOnTouchOutside(false)
dialog?.setCancelable(false)
dialog?.show()
dialog?.window?.setBackgroundDrawableResource(android.R.color.transparent)
val params = dialog?.window?.attributes
params?.width = activity.resources.getDimensionPixelOffset(R.dimen.dp_300)
dialog?.window?.attributes = params
a1.run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
binding.iv.rotation = it.animatedValue as Float
}
start()
}
dialog?.setOnDismissListener {
a1.cancel()
}
if(ConfigHelper.admobTrueMaxFlase==0){
MaxAdUtils.showNativeAd(activity, binding.flAd)
}else{
AdmobUtils.showNativeAd(activity, binding.flAd)
}
var pathShowed = false
activity.lifecycleScope.launch(Dispatchers.Main) {
pathFlow.collectLatest { path ->
if (!pathShowed) {
pathShowed = true
binding.tvPath.visibility = View.VISIBLE
}
binding.tvPath.text = path
}
}
activity.lifecycleScope.launch {
foundFlow.collectLatest {
binding.tvFoundNumber.text = "Found ${it.first} files"
foundAction?.invoke(it.second)
}
}
return dialog
}
@SuppressLint("SetTextI18n")
fun finishScan(clickAction: () -> Unit) {
a1.cancel()
binding.tvBtn.visibility = View.VISIBLE
binding.iv.visibility = View.GONE
binding.tvPath.visibility = View.GONE
binding.tvTitle.text = "Scan Completed"
binding.tvBtn.setOnClickListener {
clickAction.invoke()
}
}
}
\ No newline at end of file
package com.test.easy.easycleanerjunk.view
import java.util.Calendar
object TimeUtils {
fun isWithinOneMonth(pastTimestamp: Long): Boolean {
val calendar = Calendar.getInstance()
val currentTime = System.currentTimeMillis()
// 将当前时间减去一个月
calendar.timeInMillis = currentTime
calendar.add(Calendar.MONTH, -1)
val oneMonthAgo = calendar.timeInMillis
// 检查过去的时间戳是否在当前时间与一个月前之间
return pastTimestamp in oneMonthAgo..currentTime
}
fun isWithinSixMonths(pastTimestamp: Long): Boolean {
val calendar = Calendar.getInstance() // 获取当前时间的Calendar实例
val currentTime = System.currentTimeMillis() // 获取当前时间的时间戳
// 设置calendar到当前时间
calendar.timeInMillis = currentTime
// 减去6个月
calendar.add(Calendar.MONTH, -6)
val sixMonthsAgo = calendar.timeInMillis // 计算6个月前的日期
// 检查过去的时间戳是否在6个月的范围内
return pastTimestamp in sixMonthsAgo..currentTime
}
fun isWithinTwentyFourMonths(timestamp: Long): Boolean {
val calendar = Calendar.getInstance() // 获取当前时间的Calendar实例
val currentTime = System.currentTimeMillis() // 获取当前时间的时间戳
// 设置calendar到当前时间
calendar.timeInMillis = currentTime
// 减去24个月
calendar.add(Calendar.MONTH, -24)
val twentyFourMonthsAgo = calendar.timeInMillis // 计算24个月前的日期
// 检查时间戳是否在24个月的范围内
return timestamp in twentyFourMonthsAgo..currentTime
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#2372FC" android:state_checked="true" /> <item android:color="@color/theme_color" android:state_checked="true" />
<item android:color="#D1D1D1" android:state_checked="false" /> <item android:color="#D1D1D1" android:state_checked="false" />
</selector> </selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:endColor="#EDF5FF"
android:startColor="#E7ECFF" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:endColor="#EDF5FF"
android:startColor="#E7ECFF" />
<corners
android:bottomLeftRadius="15dp"
android:bottomRightRadius="15dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bg_stroke_bfbec4_15" android:state_enabled="false" />
<item android:drawable="@drawable/bg_stroke_black_15" android:state_enabled="true" />
</selector>
\ 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="#BFBEC4" />
<corners android:radius="15dp" />
</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="@color/black" />
<corners android:radius="15dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="12dp" />
<solid android:color="#260164C8" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="12dp" />
<solid android:color="@color/theme_color"/>
</shape>
</clip>
</item>
</layer-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="#577DFD"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout_editor_absoluteX="0dp">
<View
android:id="@+id/v_top"
android:layout_width="match_parent"
android:layout_height="40dp"
app:layout_constraintTop_toTopOf="parent" />
<FrameLayout
android:id="@+id/fl_fanhui"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="15dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/v_top"
tools:ignore="UselessParent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
tools:ignore="ContentDescription" />
</FrameLayout>
<ImageView
android:id="@+id/iv_yanhua"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="18dp"
android:layout_marginTop="25dp"
android:src="@mipmap/tu_yanhua"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/fl_fanhui"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="15sp"
android:includeFontPadding="false"
android:textColor="@color/white"
android:textSize="59sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/iv_yanhua"
app:layout_constraintStart_toEndOf="@id/iv_yanhua"
app:layout_constraintTop_toTopOf="@id/iv_yanhua"
tools:text="2" />
<TextView
android:id="@+id/tv_type"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="14dp"
android:layout_marginBottom="10dp"
android:includeFontPadding="false"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@id/tv_number"
app:layout_constraintStart_toEndOf="@id/tv_number"
tools:text="Photos" />
<TextView
android:id="@+id/tv_success"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="35dp"
android:text="Recovered successfully!"
android:textColor="@color/white"
android:textSize="25sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="@id/iv_yanhua"
app:layout_constraintTop_toBottomOf="@id/iv_yanhua"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_dir"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="18dp"
android:textColor="@color/white"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/iv_yanhua"
app:layout_constraintTop_toBottomOf="@id/tv_success"
tools:text="Recovered in " />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="25dp"
android:src="@mipmap/tubg_yanhua"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/v_top"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="60dp">
<com.noober.background.view.BLTextView
android:id="@+id/tv_continue"
android:layout_width="160dp"
android:layout_height="46dp"
android:layout_gravity="start"
android:gravity="center"
android:text="Continue"
android:textColor="@color/white"
android:textSize="18sp"
app:bl_corners_radius="22dp"
app:bl_stroke_color="@color/white"
app:bl_stroke_width="2dp"
tools:ignore="HardcodedText" />
<com.noober.background.view.BLTextView
android:id="@+id/tv_finish"
android:layout_width="160dp"
android:layout_height="46dp"
android:layout_marginStart="25dp"
android:gravity="center"
android:text="Finish"
android:textColor="#577DFD"
android:textSize="18sp"
app:bl_corners_radius="22dp"
app:bl_solid_color="#F5F5F5"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="40dp" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<FrameLayout
android:id="@+id/fl_fanhui"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="15dp"
tools:ignore="UselessParent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
tools:ignore="ContentDescription"
app:tint="@color/black" />
</FrameLayout>
<TextView
android:id="@+id/tv_tittle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="16sp"
android:textStyle="bold"
tools:text="Photo Recovery" />
</FrameLayout>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="123dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
app:cardBackgroundColor="#F0F3FA"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/ll_finish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/iv_wancheng"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="8dp"
android:src="@mipmap/wancheng"
android:visibility="gone"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_scanning"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="Scanning"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
<View
android:id="@+id/line"
android:layout_width="1px"
android:layout_height="28dp"
android:background="#C8CBD2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll_finish" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="@+id/line"
app:layout_constraintEnd_toStartOf="@+id/line"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/line">
<TextView
android:id="@+id/tv_file_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="0"
android:textColor="@color/black"
android:textSize="23sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_file_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:textColor="#768294"
android:textSize="14sp"
android:textStyle="bold"
tools:text="Photos" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="@+id/line"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/line"
app:layout_constraintTop_toTopOf="@id/line">
<TextView
android:id="@+id/tv_folder_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="0"
android:textColor="@color/black"
android:textSize="23sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:text="Folders"
android:textColor="#768294"
android:textSize="14sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_folder_recovery" />
<LinearLayout
android:id="@+id/fl_empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
android:visibility="gone"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@mipmap/queshengye"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="16dp"
android:text="File no found"
android:textColor="@color/black"
android:textSize="16sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat 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"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_marginTop="120dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.test.easy.easycleanerjunk.view.XmlLottieAnimationView
android:id="@+id/lottie"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:adjustViewBounds="true"
app:lottie_autoPlay="true"
app:lottie_loop="true" />
<com.test.easy.easycleanerjunk.view.XmlLottieAnimationView
android:id="@+id/id_lottie_finish"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:visibility="gone"
app:lottie_rawRes="@raw/loading_completed" />
</FrameLayout>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginTop="20dp"
android:text="Wait a moment..."
android:textColor="#333333"
android:textSize="15sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</androidx.appcompat.widget.LinearLayoutCompat>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="22dp"
android:layout_marginBottom="30dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/id_img_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="16dp"
android:src="@mipmap/fanhui" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="App Process"
android:textColor="#000000"
android:textSize="18sp"
android:textStyle="bold" />
</RelativeLayout>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">
<TextView
android:id="@+id/id_tv_bfb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textSize="52sp"
android:textStyle="bold"
tools:text="68" />
</androidx.appcompat.widget.LinearLayoutCompat>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="22dp"
android:text="RAM Used"
android:textColor="#000000"
android:textSize="14sp"
android:textStyle="bold" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="18dp">
<ProgressBar
android:id="@+id/id_progbar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="24dp"
android:layout_marginHorizontal="14dp"
android:progressDrawable="@drawable/pro_process" />
<TextView
android:id="@+id/id_tv_prgcess"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:layout_marginEnd="36dp"
android:textColor="#000000"
android:textSize="12sp"
tools:text="5.6GB/7.9GB" />
</FrameLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="17dp"
android:layout_marginTop="34dp"
android:text="Running background apps"
android:textColor="#999999"
android:textSize="14sp" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<ProgressBar
android:id="@+id/id_prog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminateTint="@color/theme_color"
android:layout_gravity="center" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/id_rl_app"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</FrameLayout>
<com.noober.background.view.BLTextView
android:id="@+id/id_tv_skip"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginHorizontal="41dp"
android:layout_marginVertical="20dp"
android:gravity="center"
android:text="Skip"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
app:bl_corners_radius="24dp"
app:bl_solid_color="@color/theme_color" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView 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="345dp"
android:layout_height="wrap_content"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="20dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:text="Exit scanning"
android:textColor="@color/black"
android:textSize="19sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="35dp"
android:layout_marginTop="20dp"
android:gravity="center"
android:text="lf you exit, the scanning results will be discarded."
android:textColor="@color/black"
android:textSize="15sp"
tools:ignore="HardcodedText" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:layout_marginBottom="25dp">
<com.noober.background.view.BLTextView
android:id="@+id/tv_n"
android:layout_width="145dp"
android:layout_height="45dp"
android:layout_marginHorizontal="8dp"
app:bl_stroke_color="#577DFD"
app:bl_stroke_width="1dp"
app:bl_corners_radius="22dp"
android:gravity="center"
android:text="Exit"
android:textColor="#577DFD"
android:textSize="16sp"
tools:ignore="HardcodedText" />
<com.noober.background.view.BLTextView
android:id="@+id/tv_y"
android:layout_width="145dp"
android:layout_height="45dp"
android:layout_marginHorizontal="8dp"
app:bl_solid_color="#577DFD"
app:bl_corners_radius="22dp"
android:gravity="center"
android:text="Continue"
android:textColor="@color/white"
android:textSize="16sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView 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="300dp"
android:layout_height="wrap_content"
android:orientation="vertical"
app:cardCornerRadius="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="13dp"
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@mipmap/jiazai_scan"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="5dp"
android:text="Scanning"
android:textColor="@color/black"
android:textSize="18sp"
tools:ignore="HardcodedText" />
</LinearLayout>
<TextView
android:id="@+id/tv_found_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginVertical="5dp"
android:text="Found 0 files"
android:textColor="#333333"
android:textSize="15sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="15dp"
android:layout_marginBottom="10dp"
android:ellipsize="middle"
android:singleLine="true"
android:textColor="#666666"
android:textSize="12sp"
android:visibility="gone" />
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp" />
<com.noober.background.view.BLTextView
android:id="@+id/tv_btn"
android:layout_width="251dp"
android:layout_height="45dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="25dp"
android:gravity="center"
android:text="Finish"
android:textColor="@color/white"
android:textSize="17sp"
android:textStyle="bold"
android:visibility="gone"
app:bl_corners_radius="22dp"
app:bl_solid_color="@color/theme_color"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.noober.background.view.BLLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:bl_solid_color="#577DFD"
app:bl_corners_topRadius="20dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="18dp"
android:layout_marginTop="40dp"
android:textColor="@color/white"
android:textSize="45sp"
android:textStyle="bold"
tools:text="0/1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="18dp"
android:layout_marginTop="25dp"
android:text="Recovering..."
android:textColor="@color/white"
android:textSize="25sp"
tools:ignore="HardcodedText" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="18dp"
android:layout_marginTop="15dp"
android:text="It may take a few seconds to recover the file(s), please wait.."
android:textColor="@color/white"
android:textSize="15sp"
tools:ignore="HardcodedText" />
<FrameLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="26dp" />
</com.noober.background.view.BLLinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_folder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold"
tools:text="Hidden Files" />
<TextView
android:id="@+id/tv_folder_number"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="9dp"
android:layout_weight="1"
android:ellipsize="middle"
android:singleLine="true"
android:textColor="#7D849E"
android:textSize="16sp"
android:textStyle="bold"
tools:text="(1786)" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/jianotu"
tools:ignore="ContentDescription" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp">
<ImageView
android:id="@+id/iv_1"
android:layout_width="106dp"
android:layout_height="106dp"
android:layout_gravity="start"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_2"
android:layout_width="106dp"
android:layout_height="106dp"
android:layout_gravity="center"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_3"
android:layout_width="106dp"
android:layout_height="106dp"
android:layout_gravity="end"
tools:ignore="ContentDescription" />
</FrameLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="wrap_content"
android:layout_margin="8dp"
android:orientation="horizontal"
android:paddingVertical="5dp">
<androidx.cardview.widget.CardView
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="center_vertical"
app:cardCornerRadius="10dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/id_img_icon"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.cardview.widget.CardView>
<LinearLayout
android:id="@+id/ll"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textColor="@color/black"
android:textSize="14sp"
tools:text="Feel Clean" />
</LinearLayout>
<com.noober.background.view.BLTextView
android:id="@+id/tv_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="8dp"
android:gravity="center"
android:paddingHorizontal="24dp"
android:paddingVertical="8dp"
android:text="Stop"
android:textColor="#3739BA"
android:textSize="13sp"
app:bl_corners_radius="14dp"
app:bl_solid_color="#333739BA"
tools:ignore="HardcodedText" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView 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="164dp"
android:layout_height="164dp"
android:layout_margin="8dp"
app:cardCornerRadius="15dp">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
<FrameLayout
android:id="@+id/fl_selector"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_selector"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_margin="10dp"
android:src="@drawable/bg_select_all"
tools:ignore="ContentDescription" />
</FrameLayout>
<com.noober.background.view.BLFrameLayout
android:layout_width="match_parent"
android:layout_height="36dp"
android:layout_gravity="bottom"
app:bl_solid_color="#801B1B1B"
app:bl_corners_topRadius="15dp">
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:textColor="@color/white"
android:textSize="15sp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="8dp"
android:src="@mipmap/tuicon"
tools:ignore="ContentDescription" />
</com.noober.background.view.BLFrameLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView 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="105dp"
android:layout_height="105dp"
android:layout_margin="8dp"
app:cardCornerRadius="12.5dp">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
<FrameLayout
android:id="@+id/fl_selector"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_selector"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_margin="10dp"
android:src="@drawable/bg_select_all"
tools:ignore="ContentDescription" />
</FrameLayout>
<com.noober.background.view.BLFrameLayout
android:layout_width="match_parent"
android:layout_height="36dp"
android:layout_gravity="bottom"
app:bl_corners_topRadius="15dp"
app:bl_corners_bottomRadius="0dp"
app:bl_solid_color="#801B1B1B">
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:textColor="@color/white"
android:textSize="12.5sp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="8dp"
android:src="@mipmap/tuicon"
tools:ignore="ContentDescription" />
</com.noober.background.view.BLFrameLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView 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="85dp"
android:layout_height="85dp"
android:layout_margin="8dp"
app:cardCornerRadius="12.5dp">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
<FrameLayout
android:id="@+id/fl_selector"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_selector"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_margin="5dp"
android:src="@drawable/bg_select_all"
tools:ignore="ContentDescription" />
</FrameLayout>
<com.noober.background.view.BLFrameLayout
android:layout_width="match_parent"
android:layout_height="36dp"
android:layout_gravity="bottom"
app:bl_solid_color="#801B1B1B"
app:bl_corners_topRadius="15dp">
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:textColor="@color/white"
android:textSize="10sp"
tools:ignore="SmallSp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="8dp"
android:src="@mipmap/tuicon"
tools:ignore="ContentDescription" />
</com.noober.background.view.BLFrameLayout>
</androidx.cardview.widget.CardView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="6dp"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<TextView
android:id="@+id/tv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:gravity="center_vertical"
android:textSize="16sp"
android:textStyle="bold"
tools:text="All" />
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@mipmap/gxuan"
tools:ignore="ContentDescription" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="8dp"
android:orientation="vertical">
<FrameLayout
android:id="@+id/fl_tittle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText"
tools:text="Today" />
<LinearLayout
android:id="@+id/ll_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="16dp"
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/iv_selector"
android:layout_width="28dp"
android:layout_height="28dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="5dp"
android:src="@drawable/bg_select_all"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Select"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
</FrameLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_media_columns"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp" />
</LinearLayout>
\ No newline at end of file
...@@ -23,5 +23,5 @@ ...@@ -23,5 +23,5 @@
<color name="color_ecfcff">#ECFCFF</color> <color name="color_ecfcff">#ECFCFF</color>
<color name="color_ecfcf7">#ECFCF7</color> <color name="color_ecfcf7">#ECFCF7</color>
<color name="color_f5f4ff">#F5F4FF</color> <color name="color_f5f4ff">#F5F4FF</color>
<color name="color_747474">#747474</color>
</resources> </resources>
\ No newline at end of file
...@@ -12,5 +12,5 @@ ...@@ -12,5 +12,5 @@
<dimen name="dp_109">109dp</dimen> <dimen name="dp_109">109dp</dimen>
<dimen name="dp_5">5dp</dimen> <dimen name="dp_5">5dp</dimen>
<dimen name="dp_8">8dp</dimen> <dimen name="dp_8">8dp</dimen>
<dimen name="dp_345">345dp</dimen>
</resources> </resources>
\ 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