Commit 03e87af4 authored by wanglei's avatar wanglei

...

parent 5e0851cd
package com.base.datarecovery.activity.junkclean package com.base.datarecovery.activity.junkclean
import android.animation.ValueAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Color import android.graphics.Color
import android.view.LayoutInflater import android.os.Environment
import android.view.ViewGroup import android.view.View
import android.view.animation.LinearInterpolator
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager import androidx.lifecycle.lifecycleScope
import com.base.datarecovery.BuildConfig
import com.base.datarecovery.R import com.base.datarecovery.R
import com.base.datarecovery.activity.ResultActivity import com.base.datarecovery.activity.ResultActivity
import com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity
import com.base.datarecovery.adapter.JunkExpandAdapter
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import com.base.datarecovery.bean.ChildBean import com.base.datarecovery.bean.ChildBean
import com.base.datarecovery.bean.ConstObject.JUNK_CLEANER import com.base.datarecovery.bean.ConstObject.JUNK_CLEANER
import com.base.datarecovery.bean.ParentBean
import com.base.datarecovery.databinding.ActivityLayoutCleanJunkBinding import com.base.datarecovery.databinding.ActivityLayoutCleanJunkBinding
import com.base.datarecovery.databinding.ItemChildBinding
import com.base.datarecovery.databinding.ItemParentBinding
import com.base.datarecovery.help.BaseActivity import com.base.datarecovery.help.BaseActivity
import com.base.datarecovery.help.FileHelp
import com.base.datarecovery.help.KotlinExt.toFormatSize import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.help.PermissionHelp.checkStorePermission
import com.base.datarecovery.help.PermissionHelp.requestStorePermission
import com.base.datarecovery.utils.BarUtils import com.base.datarecovery.utils.BarUtils
import com.base.datarecovery.utils.MediaStoreUtils import com.base.datarecovery.utils.MediaStoreUtils
import com.base.datarecovery.view.DialogViews.showExitFunctionDialog import com.base.datarecovery.view.DialogViews.showExitFunctionDialog
import pokercc.android.expandablerecyclerview.ExpandableAdapter import com.base.datarecovery.view.DialogViews.showGerPermission
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
import kotlin.random.Random import kotlin.random.Random
/** /**
...@@ -35,61 +37,63 @@ import kotlin.random.Random ...@@ -35,61 +37,63 @@ import kotlin.random.Random
*/ */
class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() { class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
private val parentList by lazy { private val TAG = "CleanJunkActivity"
mutableListOf(
ParentBean(
title = "Useless installation package",
childItem = child3,
parentSize = sizes[0],
isParentSelected = true,
expanded = false
),
ParentBean(
title = "Temp File",
childItem = child4,
parentSize = sizes[1],
isParentSelected = true,
expanded = false
),
ParentBean(
title = "Log File",
childItem = child5,
parentSize = sizes[2],
isParentSelected = true,
expanded = false
)
)
}
private val child1 = ArrayList<ChildBean>()
private val child2 = ArrayList<ChildBean>()
private val child3 = ArrayList<ChildBean>()
private val child4 = ArrayList<ChildBean>()
private val child5 = ArrayList<ChildBean>()
private val sizes = MutableList(3) { 0L }
private var scanCount = 0
private val selectList = mutableListOf<String>()
private var selectSize = 0L
override val binding: ActivityLayoutCleanJunkBinding by lazy { override val binding: ActivityLayoutCleanJunkBinding by lazy {
ActivityLayoutCleanJunkBinding.inflate(layoutInflater) ActivityLayoutCleanJunkBinding.inflate(layoutInflater)
} }
private lateinit var junkExpandAdapter: JunkExpandAdapter
@SuppressLint("SetTextI18n", "NotifyDataSetChanged")
override fun initView() { override fun initView() {
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
// binding.root.updatePadding(top = BarUtils.getStatusBarHeight()) // binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
setAdapter() junkExpandAdapter = JunkExpandAdapter { size ->
if (size == 0L) {
binding.tvBtn.text = "Got it"
binding.tvSize.text = "0"
binding.tvUnit.text = "B"
} else {
binding.tvBtn.text = "Clean up ${size.toFormatSize(1)}"
val split = size.toFormatSize().split(" ")
binding.tvSize.text = split[0]
binding.tvUnit.text = split[1]
}
if (scanFinish) {
if (junkExpandAdapter.getAllChildItemCount() == 0) {
binding.tvBtn.visibility = View.GONE
binding.llTwoBtn.visibility = View.VISIBLE
} else {
binding.tvBtn.isVisible = true
binding.tvBtn.isEnabled = true
}
}
}
binding.exRv.adapter = junkExpandAdapter
if (checkStorePermission()) {
scanJunk()
} else {
showGerPermission(desc = "", deny = { finishToMain() }, allow = {
requestStorePermission(launcher) {
scanJunk()
}
})
}
} }
override fun initListener() { override fun initListener() {
binding.idJunksBack.setOnClickListener { binding.flFanhui.setOnClickListener {
onBackPressedDispatcher.onBackPressed() onBackPressedDispatcher.onBackPressed()
} }
onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) { onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() { override fun handleOnBackPressed() {
showExitFunctionDialog { showExitFunctionDialog {
if (it) { if (it) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@CleanJunkActivity){ AdmobMaxHelper.admobMaxShowInterstitialAd(this@CleanJunkActivity) {
finishToMain() finishToMain()
} }
} else { } else {
...@@ -99,368 +103,139 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() { ...@@ -99,368 +103,139 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
} }
}) })
binding.idClBtn.setOnClickListener { binding.tvBtn.setOnClickListener {
if (binding.idClBtn.text == "Got it") {
startActivity(Intent(this@CleanJunkActivity, ResultActivity::class.java).apply { when (binding.tvBtn.text) {
putExtra("clean_size", JUNK_CLEANER) "Got it" -> {
putExtra("from", 0) startActivity(Intent(this@CleanJunkActivity, ResultActivity::class.java).apply {
}) putExtra("clean_size", JUNK_CLEANER)
} else { putExtra("from", 0)
startActivity( })
Intent(this, CleaningActivity::class.java) }
.putExtra("list", selectList.toTypedArray())
.putExtra("size", selectSize)
)
}
finish()
}
}
private fun setAdapter() {
binding.idExRl.adapter = mAdapter
binding.idExRl.layoutManager = LinearLayoutManager(this)
scanJunk()
}
private fun scanJunk() {
val apk = MediaStoreUtils.queryFiles(this, MediaStoreUtils.FileType.APK) ?: listOf()
apk.forEach { l ->
sizes[0] += l.size
val bean = ChildBean(R.mipmap.apk, l.name, l.path, l.size)
child3.add(bean)
}
// testApk()
scanCount += 1
updateSize(doneIndex = 0)
val temp = MediaStoreUtils.queryFiles(this, MediaStoreUtils.FileType.TMP) ?: listOf()
temp.forEach { l ->
sizes[1] += l.size
val bean = ChildBean(null, l.name, l.path, l.size)
child4.add(bean)
}
// testTemp()
scanCount += 1
updateSize(doneIndex = 1)
val log = MediaStoreUtils.queryFiles(this, MediaStoreUtils.FileType.LOG) ?: listOf() else -> {
log.forEach { l -> startActivity(
sizes[2] += l.size Intent(this, CleaningActivity::class.java).apply {
val bean = ChildBean(null, l.name, l.path, l.size) val list = junkExpandAdapter.getChoosePath()
child5.add(bean) putExtra("list", list.map { it.chilepath }.toTypedArray())
} putExtra("size", list.sumOf { it.childSize })
// testLog() }
scanCount += 2 )
updateSize(doneIndex = 2)
}
private fun testLog() { }
if (BuildConfig.DEBUG) {
repeat(5) {
sizes[2] += Random.nextLong()
val bean = ChildBean(null, "log", "", Random.nextLong())
child5.add(bean)
} }
finish()
} }
}
private fun testTemp() { binding.tvGotIt2.setOnClickListener {
if (BuildConfig.DEBUG) { startActivity(Intent(this@CleanJunkActivity, ResultActivity::class.java).apply {
repeat(5) { putExtra("clean_size", JUNK_CLEANER)
sizes[1] += Random.nextLong() putExtra("from", 0)
val bean = ChildBean(null, "temp", "", Random.nextLong()) })
child4.add(bean) finish()
}
} }
} binding.tvDeepScan.setOnClickListener {
startActivity(Intent(this, PhotoManagerAnimationActivity::class.java).apply {
private fun testApk() { putExtra("tittle", "Deep Scan")
if (BuildConfig.DEBUG) { })
repeat(5) { finish()
sizes[0] += Random.nextLong(1500)
val bean = ChildBean(R.mipmap.apk, "apk", "", Random.nextLong())
child3.add(bean)
}
} }
}
@SuppressLint("SetTextI18n")
private fun updateSize(doneIndex: Int = -1) {
addData(index = doneIndex)
val split = sizes.sum().toFormatSize(1).split(' ')
binding.idKeCl.text = split[0]
binding.idSizeUnit.text = split[1]
if (scanCount >= 3) {
selectList.clear()
selectSize = 0L
for (i in parentList.indices) {
if (parentList[i].childItem.isNotEmpty()) {
val childSize = parentList[i].childItem.filter {
it.isChildSelected
}.sumOf {
it.childSize
}
for (a in parentList[i].childItem) {
if (a.isChildSelected) {
if (a.pathList?.isNotEmpty() == true) {
for (o in a.pathList!!) {
selectList.add(o)
}
}
}
}
selectSize += childSize
} else {
if (parentList[i].isParentSelected) {
selectSize += parentList[i].parentSize
}
}
}
parentList.forEach { parent ->
selectList.addAll(parent.childItem.filter {
it.isChildSelected
}.map { it.chilepath })
}
}
binding.idClBtn.isVisible = scanCount >= 3
binding.idClBtn.isEnabled = sizes.sum() > 0
if (scanCount >= 3 && sizes.sum().toInt() == 0) {
binding.idClBtn.text = "Got it"
} else {
binding.idClBtn.text = "Clean up ${selectSize.toFormatSize(1)}"
}
binding.idClBtn.isEnabled = true
} }
@SuppressLint("NotifyDataSetChanged") var scanFinish: Boolean = false
private fun addData(index: Int) { private fun scanJunk() = lifecycleScope.launch(Dispatchers.Main) {
if (parentList.isNotEmpty()) {
parentList[index].isfinish = true var totalSize = 0L
parentList[index].parentSize = sizes[index]
mAdapter.notifyDataSetChanged() val list = arrayListOf<ChildBean>()
} async {
} val emptyFolder1 = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM))
val emptyFolder2 = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS))
val emptyFolder3 = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS))
val emptyFolder4 = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES))
val emptyFolder5 = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES))
val emptyFolder6 = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC))
val emptyFolder = arrayListOf<File>()
emptyFolder.addAll(emptyFolder1)
emptyFolder.addAll(emptyFolder2)
emptyFolder.addAll(emptyFolder3)
emptyFolder.addAll(emptyFolder4)
emptyFolder.addAll(emptyFolder5)
emptyFolder.addAll(emptyFolder6)
emptyFolder.forEach { l ->
list.add(ChildBean(R.mipmap.kongwenjian, l.name, l.path, 1))
}
delay(Random.nextLong(1500, 2000))
}.await()
junkExpandAdapter.addChildData(0, list)
list.clear()
async {
val apk = MediaStoreUtils.queryFiles(this@CleanJunkActivity, MediaStoreUtils.FileType.APK) ?: listOf()
apk.forEach { l ->
totalSize += l.size
list.add(ChildBean(R.mipmap.apk, l.name, l.path, l.size))
}
// if (BuildConfig.DEBUG) {
// repeat(5) {
// val size = Random.nextLong(500)
// totalSize += size
// list.add(ChildBean(R.mipmap.apk, "1", "apl$it", size))
// }
// }
delay(Random.nextLong(1500, 2000))
}.await()
junkExpandAdapter.addChildData(1, list)
list.clear()
async {
val temp = MediaStoreUtils.queryFiles(this@CleanJunkActivity, MediaStoreUtils.FileType.TMP) ?: listOf()
temp.forEach { l ->
totalSize += l.size
list.add(ChildBean(R.mipmap.temp_clean, l.name, l.path, l.size))
}
// if (BuildConfig.DEBUG) {
// repeat(5) {
// val size = Random.nextLong(500)
// totalSize += size
// list.add(ChildBean(R.mipmap.temp_clean, "1", "temp$it", size))
// }
// }
delay(Random.nextLong(1500, 2000))
}.await()
junkExpandAdapter.addChildData(2, list)
list.clear()
async {
val log = MediaStoreUtils.queryFiles(this@CleanJunkActivity, MediaStoreUtils.FileType.LOG) ?: listOf()
log.forEach { l ->
totalSize += l.size
list.add(ChildBean(R.mipmap.log_clean, l.name, l.path, l.size))
}
// if (BuildConfig.DEBUG) {
// repeat(5) {
// val size = Random.nextLong(500)
// totalSize += size
// list.add(ChildBean(R.mipmap.log_clean, "1", "log$it", size))
// }
// }
delay(Random.nextLong(1500, 2000))
}.await()
scanFinish = true
junkExpandAdapter.addChildData(3, list)
@SuppressLint("SetTextI18n")
private fun updateView() {
selectList.clear()
var allSize = 0L
for (i in parentList.indices) {
if (parentList[i].childItem.isNotEmpty()) {
val childSize = parentList[i].childItem.filter {
it.isChildSelected
}.sumOf {
it.childSize
}
for (a in parentList[i].childItem) {
if (a.isChildSelected) {
if (a.pathList?.isNotEmpty() == true) {
for (o in a.pathList!!) {
selectList.add(o)
}
}
}
}
allSize += childSize
} else {
if (parentList[i].isParentSelected) {
allSize += parentList[i].parentSize
}
}
}
selectSize = allSize
binding.idClBtn.text = "Clean up ${allSize.toFormatSize()}"
binding.idClBtn.isEnabled = allSize > 0
parentList.forEach { parent ->
selectList.addAll(parent.childItem.filter {
it.isChildSelected
}.map { it.chilepath })
}
} }
private val mAdapter by lazy {
class ParentViewHolder(val binding: ItemParentBinding) :
ExpandableAdapter.ViewHolder(binding.root)
class ChildViewHolder(val binding: ItemChildBinding) :
ExpandableAdapter.ViewHolder(binding.root)
object : ExpandableAdapter<ExpandableAdapter.ViewHolder>() {
var animators = mutableMapOf<Int, ValueAnimator>()
override fun getChildCount(groupPosition: Int): Int {
return parentList[groupPosition].childItem.size
}
override fun getGroupCount(): Int {
return parentList.size
}
override fun onViewDetachedFromWindow(holder: ViewHolder) {
super.onViewDetachedFromWindow(holder)
animators[holder.adapterPosition]?.pause()
}
override fun onViewAttachedToWindow(holder: ViewHolder) {
super.onViewAttachedToWindow(holder)
animators[holder.adapterPosition]?.resume()
}
override fun onCreateChildViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(viewGroup.context)
val binding = ItemChildBinding.inflate(inflater, viewGroup, false)
return ChildViewHolder(binding)
}
override fun onCreateGroupViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(viewGroup.context)
val binding = ItemParentBinding.inflate(inflater, viewGroup, false)
return ParentViewHolder(binding)
}
override fun onGroupViewHolderExpandChange(
holder: ViewHolder,
groupPosition: Int,
animDuration: Long,
expand: Boolean
) {
}
@SuppressLint("NotifyDataSetChanged")
override fun onBindGroupViewHolder(
holder: ViewHolder,
groupPosition: Int,
expand: Boolean,
payloads: List<Any>
) {
val viewHolder = holder as? ParentViewHolder ?: return
val parentType = parentList[groupPosition]
viewHolder.binding.idTypeName.text = parentType.title
parentType.expanded = expand
if (parentType.expanded) {
viewHolder.binding.idXiala.setImageResource(R.mipmap.zhankai)
} else {
viewHolder.binding.idXiala.setImageResource(R.mipmap.shouqi)
}
if (parentType.isfinish) {
viewHolder.binding.idImgLoad.isVisible = false
viewHolder.binding.idImgChoose.isVisible = true
} else {
val animator =
animators[groupPosition] ?: ValueAnimator.ofFloat(0f, 360f).apply {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
holder.binding.idImgLoad.rotation = it.animatedValue as Float
}
start()
animators[groupPosition] = this
}
viewHolder.binding.idImgLoad.isVisible = true
viewHolder.binding.idImgChoose.isVisible = false
}
viewHolder.binding.idTypeSize.text = parentType.parentSize.toFormatSize(1)
viewHolder.binding.idXiala.isVisible = parentType.childItem.isNotEmpty()
viewHolder.binding.idImgChoose.isSelected = parentType.isParentSelected
viewHolder.binding.idImgChoose.setOnClickListener {
viewHolder.binding.idImgChoose.isSelected =
!viewHolder.binding.idImgChoose.isSelected
parentType.isParentSelected = !parentType.isParentSelected
if (parentType.isParentSelected) {
for (app in parentType.childItem) {
app.isChildSelected = true
notifyDataSetChanged()
}
} else {
for (app in parentType.childItem) {
app.isChildSelected = false
notifyDataSetChanged()
}
}
updateView()
}
}
@SuppressLint("NotifyDataSetChanged")
override fun onBindChildViewHolder(
holder: ViewHolder,
groupPosition: Int,
childPosition: Int,
payloads: List<Any>
) {
val viewHolder = holder as? ChildViewHolder ?: return
val childType = parentList[groupPosition].childItem[childPosition]
when (groupPosition) {
0 -> {
val packageManager: PackageManager = this@CleanJunkActivity.packageManager
val apkFilePath = childType.chilepath // 替换成您的APK文件路径
val packageInfo =
packageManager.getPackageArchiveInfo(
apkFilePath,
PackageManager.GET_ACTIVITIES
)
if (packageInfo != null) {
val applicationInfo = packageInfo.applicationInfo
val appIcon = packageManager.getApplicationIcon(applicationInfo)
viewHolder.binding.idImgIcon.setImageDrawable(appIcon)
} else {
viewHolder.binding.idImgIcon.setImageResource(R.mipmap.apk)
}
}
1 -> {
viewHolder.binding.idImgIcon.setImageResource(R.mipmap.qingchuicon)
}
2 -> {
viewHolder.binding.idImgIcon.setImageResource(R.mipmap.del)
}
3 -> {
}
4 -> {
}
}
viewHolder.binding.idTvAppName.text = childType.childname
viewHolder.binding.idImgSelect.isSelected = childType.isChildSelected
viewHolder.binding.idTvSize.text = childType.childSize.toFormatSize()
viewHolder.itemView.setOnClickListener {
when (childPosition) {
childPosition -> {
viewHolder.binding.idImgSelect.isSelected =
!viewHolder.binding.idImgSelect.isSelected
childType.isChildSelected = !childType.isChildSelected
if (!childType.isChildSelected) {
parentList[groupPosition].isParentSelected = false
notifyDataSetChanged()
}
updateView()
}
}
}
}
}
}
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
for (animator in mAdapter.animators.values) { junkExpandAdapter.animators.values.forEach {
animator.cancel() it.cancel()
} }
} }
} }
\ No newline at end of file
...@@ -43,7 +43,9 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() { ...@@ -43,7 +43,9 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() {
MainScope().launch(Dispatchers.IO) { MainScope().launch(Dispatchers.IO) {
try { try {
listPath.forEach { NewFileUtils.delete(it) } listPath.forEach {
runCatching { NewFileUtils.delete(it) }
}
MediaStoreUtils.updateMediaStore(this@CleaningActivity, listPath) MediaStoreUtils.updateMediaStore(this@CleaningActivity, listPath)
} catch (_: Exception) { } catch (_: Exception) {
} finally { } finally {
...@@ -78,7 +80,7 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() { ...@@ -78,7 +80,7 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() {
binding.idTvJd.text = "${it.animatedValue as Int}" binding.idTvJd.text = "${it.animatedValue as Int}"
} }
doOnEnd { doOnEnd {
AdmobMaxHelper.admobMaxShowInterstitialAd(this@CleaningActivity){ AdmobMaxHelper.admobMaxShowInterstitialAd(this@CleaningActivity) {
startActivity( startActivity(
Intent(this@CleaningActivity, ResultActivity::class.java).putExtra("from", JUNK_CLEANER) Intent(this@CleaningActivity, ResultActivity::class.java).putExtra("from", JUNK_CLEANER)
.putExtra("clean_size", intentSize) .putExtra("clean_size", intentSize)
......
package com.base.datarecovery.adapter
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.content.pm.PackageManager
import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.ViewGroup
import android.view.animation.LinearInterpolator
import androidx.core.view.isVisible
import com.base.datarecovery.R
import com.base.datarecovery.bean.ChildBean
import com.base.datarecovery.databinding.ItemChildBinding
import com.base.datarecovery.databinding.ItemParentBinding
import com.base.datarecovery.bean.ParentBean
import com.base.datarecovery.help.KotlinExt.toFormatSize
import com.base.datarecovery.utils.LogEx
import pokercc.android.expandablerecyclerview.ExpandableAdapter
class JunkExpandAdapter(private val chooseAction: (size: Long) -> Unit) : ExpandableAdapter<ExpandableAdapter.ViewHolder>() {
private val TAG = "JunkExpandAdapter"
private val parentBeanList by lazy {
mutableListOf(
ParentBean(
title = "Residual file",
isParentSelected = true,
expanded = false
),
ParentBean(
title = "Useless installation package",
isParentSelected = true,
expanded = false
),
ParentBean(
title = "Temp File",
isParentSelected = true,
expanded = false
),
ParentBean(
title = "Log File",
isParentSelected = true,
expanded = false
)
)
}
var animators = mutableMapOf<Int, ValueAnimator>()
inner class ChildViewHolder(val binding: ItemChildBinding) : ViewHolder(binding.root)
inner class ParentViewHolder(val binding: ItemParentBinding) : ViewHolder(binding.root)
override fun getChildCount(groupPosition: Int): Int {
return parentBeanList[groupPosition].childItem.size
}
override fun getGroupCount(): Int {
return parentBeanList.size
}
override fun onCreateChildViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(viewGroup.context)
val binding = ItemChildBinding.inflate(inflater, viewGroup, false)
return ChildViewHolder(binding)
}
override fun onCreateGroupViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(viewGroup.context)
val binding = ItemParentBinding.inflate(inflater, viewGroup, false)
return ParentViewHolder(binding)
}
@SuppressLint("NotifyDataSetChanged", "SetTextI18n")
override fun onBindGroupViewHolder(holder: ViewHolder, groupPosition: Int, expand: Boolean, payloads: List<Any>) {
val viewHolder = holder as? ParentViewHolder ?: return
val parentBean = parentBeanList[groupPosition]
viewHolder.binding.idTypeName.text = parentBean.title
parentBean.expanded = expand
if (parentBean.expanded) {
viewHolder.binding.idXiala.setImageResource(R.mipmap.zhankai)
} else {
viewHolder.binding.idXiala.setImageResource(R.mipmap.shouqi)
}
if (parentBean.title == "Residual file") {
viewHolder.binding.idTypeSize.text = parentBean.childItem.size.toString() + " items"
} else {
viewHolder.binding.idTypeSize.text = parentBean.parentSize.toFormatSize(1)
}
viewHolder.binding.idXiala.isVisible = true
viewHolder.binding.idImgChoose.isSelected = parentBean.isParentSelected
bindParentAnimation(parentBean, groupPosition, viewHolder)
if (parentBean.childItem.isEmpty()) {
viewHolder.binding.idImgChoose.setOnClickListener { }
} else {
viewHolder.binding.idImgChoose.setOnClickListener {
viewHolder.binding.idImgChoose.isSelected = !viewHolder.binding.idImgChoose.isSelected
parentBean.isParentSelected = viewHolder.binding.idImgChoose.isSelected
parentBean.childItem.forEach {
it.isChildSelected = parentBean.isParentSelected
}
notifyDataSetChanged()
chooseSizeChange()
}
}
}
override fun onGroupViewHolderExpandChange(holder: ViewHolder, groupPosition: Int, animDuration: Long, expand: Boolean) {}
private fun chooseSizeChange() {
val selectSize = parentBeanList.sumOf { it.childItem.filter { it.isChildSelected }.sumOf { it.childSize } }
chooseAction.invoke(selectSize)
}
fun getChoosePath(): List<ChildBean> {
return parentBeanList.flatMap { it.childItem }.filter { it.isChildSelected }
}
fun getAllChildItemCount(): Int {
return parentBeanList.flatMap { it.childItem }.size
}
private fun bindParentAnimation(parentBean: ParentBean, groupPosition: Int, viewHolder: ParentViewHolder) {
if (parentBean.isfinish) {
viewHolder.binding.idImgLoad.isVisible = false
viewHolder.binding.idImgChoose.isVisible = true
animators[groupPosition]?.cancel()
} else {
LogEx.logDebug(TAG, "play parent ValueAnimator")
animators[groupPosition] ?: ValueAnimator.ofFloat(0f, 360f).apply {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
viewHolder.binding.idImgLoad.rotation = it.animatedValue as Float
}
start()
animators[groupPosition] = this
}
viewHolder.binding.idImgLoad.isVisible = true
viewHolder.binding.idImgChoose.isVisible = false
}
}
@SuppressLint("NotifyDataSetChanged")
override fun onBindChildViewHolder(holder: ViewHolder, groupPosition: Int, childPosition: Int, payloads: List<Any>) {
val viewHolder = holder as? ChildViewHolder ?: return
val childBean = parentBeanList[groupPosition].childItem[childPosition]
val parentBean = parentBeanList[groupPosition]
val context = holder.itemView.context
viewHolder.binding.idTvAppName.text = childBean.childname
viewHolder.binding.idImgSelect.isSelected = childBean.isChildSelected
viewHolder.binding.idTvSize.text = childBean.childSize.toFormatSize()
when (groupPosition) {
0 -> {
holder.binding.idImgIcon.setImageResource(R.mipmap.kongwenjian)
viewHolder.binding.idTvAppName.text = childBean.chilepath
}
1 -> {
try {
val apkFilePath = childBean.chilepath // 替换成您的APK文件路径
val packageInfo =
context.packageManager.getPackageArchiveInfo(apkFilePath, PackageManager.GET_ACTIVITIES)
if (packageInfo != null) {
val applicationInfo = packageInfo.applicationInfo
val appIcon: Drawable = context.packageManager.getApplicationIcon(applicationInfo)
viewHolder.binding.idImgIcon.setImageDrawable(appIcon)
} else {
holder.binding.idImgIcon.setImageResource(R.mipmap.apk)
}
} catch (e: Exception) {
holder.binding.idImgIcon.setImageResource(R.mipmap.apk)
}
}
2 -> {
holder.binding.idImgIcon.setImageResource(R.mipmap.temp_clean)
}
3 -> {
holder.binding.idImgIcon.setImageResource(R.mipmap.log_clean)
}
}
viewHolder.itemView.setOnClickListener {
viewHolder.binding.idImgSelect.isSelected = !viewHolder.binding.idImgSelect.isSelected
childBean.isChildSelected = viewHolder.binding.idImgSelect.isSelected
parentBean.isParentSelected = parentBean.childItem.all { it.isChildSelected }
notifyDataSetChanged()
chooseSizeChange()
}
}
@SuppressLint("NotifyDataSetChanged")
fun addChildData(position: Int, childBeanList: List<ChildBean>) {
val parentBean = parentBeanList[position]
parentBean.isfinish = true
parentBean.isParentSelected = true
parentBean.childItem.addAll(childBeanList)
parentBean.parentSize = childBeanList.sumOf { it.childSize }
LogEx.logDebug(TAG, "addChildData parentBean=$parentBean")
notifyDataSetChanged()
chooseSizeChange()
}
}
\ No newline at end of file
...@@ -2,8 +2,8 @@ package com.base.datarecovery.bean ...@@ -2,8 +2,8 @@ package com.base.datarecovery.bean
data class ParentBean( data class ParentBean(
val title: String, val title: String,
val childItem: List<ChildBean>, val childItem: ArrayList<ChildBean> = arrayListOf(),
var parentSize: Long, var parentSize: Long = 0,
var isParentSelected: Boolean, var isParentSelected: Boolean,
var expanded: Boolean = true, var expanded: Boolean = true,
var isfinish: Boolean = false var isfinish: Boolean = false
...@@ -12,9 +12,9 @@ data class ParentBean( ...@@ -12,9 +12,9 @@ data class ParentBean(
data class ChildBean( data class ChildBean(
val image: Int? = null, val image: Int? = null,
val childname: String, val childname: String,
val chilepath: String="", val chilepath: String = "",
val childSize: Long = 0L, val childSize: Long = 0L,
var isChildSelected: Boolean = true, var isChildSelected: Boolean = true,
var pathList: List<String>? = null, var pathList: List<String>? = null,
var packageName:String?="" var packageName: String? = ""
) )
\ No newline at end of file
...@@ -11,15 +11,8 @@ import com.base.datarecovery.activity.appprocess.AppProcessAnimationActivity ...@@ -11,15 +11,8 @@ import com.base.datarecovery.activity.appprocess.AppProcessAnimationActivity
import com.base.datarecovery.activity.junkclean.ScanJunkActivity import com.base.datarecovery.activity.junkclean.ScanJunkActivity
import com.base.datarecovery.activity.largefile.LargeFileAnimationActivity import com.base.datarecovery.activity.largefile.LargeFileAnimationActivity
import com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity import com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity
import com.base.datarecovery.activity.privacyspace.PrivacyPinOneActivity
import com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity
import com.base.datarecovery.activity.recovery.FileScanResultActivity
import com.base.datarecovery.activity.whatsapp.WhatsAppCleanerAnimationActivity import com.base.datarecovery.activity.whatsapp.WhatsAppCleanerAnimationActivity
import com.base.datarecovery.ads.AdmobMaxHelper import com.base.datarecovery.ads.AdmobMaxHelper
import com.base.datarecovery.bean.ConstObject.SCAN_DOCUMENTS
import com.base.datarecovery.bean.ConstObject.SCAN_PHOTOS
import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
import com.base.datarecovery.bean.ConstObject.privacyPinPassword
import com.base.datarecovery.databinding.FragmentHomeBinding import com.base.datarecovery.databinding.FragmentHomeBinding
import com.base.datarecovery.help.BaseFragment import com.base.datarecovery.help.BaseFragment
......
...@@ -115,4 +115,32 @@ object FileHelp { ...@@ -115,4 +115,32 @@ object FileHelp {
return result return result
} }
fun getFileFolder(file: File): List<File> {
val set = HashSet<File>()
//添加第一层文件到链表
val linkList = LinkedList<File>()
val fileList = file.listFiles()
fileList?.forEach {
if (it.isDirectory) {
linkList.add(it)
set.add(it)
}
}
//链表取文件
var tempFile: File
while (!linkList.isEmpty()) {
tempFile = linkList.removeFirst()
val tempFileList = tempFile.listFiles()
tempFileList?.forEach {
if (it.isDirectory) {
linkList.add(it)
set.add(it)
}
}
}
return set.toList()
}
} }
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="22dp"/>
<solid android:color="#EEEEEE"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF852C" />
<corners android:radius="22dp" />
</shape>
\ No newline at end of file
...@@ -17,27 +17,33 @@ ...@@ -17,27 +17,33 @@
<View <View
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" /> android:layout_height="50dp" />
<RelativeLayout <FrameLayout
android:id="@+id/id_top_rl"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="12dp"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatImageView <FrameLayout
android:id="@+id/id_junks_back" android:id="@+id/fl_fanhui"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingHorizontal="20dp" android:padding="15dp">
android:src="@mipmap/fanhui" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/fanhui"
tools:ignore="ContentDescription" />
</FrameLayout>
<TextView <TextView
android:id="@+id/id_tv_title_back" android:id="@+id/id_tv_title_back"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerInParent="true" android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:text="Clean Junk" android:text="Clean Junk"
android:textColor="@color/white" android:textColor="@color/white"
...@@ -45,48 +51,68 @@ ...@@ -45,48 +51,68 @@
android:textStyle="bold" android:textStyle="bold"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
</RelativeLayout> </FrameLayout>
<androidx.appcompat.widget.LinearLayoutCompat <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:layout_marginTop="60dp"
android:layout_marginBottom="10dp"
android:gravity="center_horizontal">
<TextView
android:id="@+id/id_ke_cl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginEnd="7dp"
android:includeFontPadding="false"
android:textColor="@color/white"
android:textSize="43sp"
android:textStyle="bold"
tools:text="0" />
<TextView <LinearLayout
android:id="@+id/id_size_unit" android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="top" android:orientation="vertical"
android:layout_marginTop="10dp" tools:ignore="UselessParent">
android:includeFontPadding="false"
android:textColor="@color/white" <LinearLayout
android:textSize="12sp" android:layout_width="wrap_content"
tools:text="KB" /> android:layout_height="wrap_content"
</androidx.appcompat.widget.LinearLayoutCompat> android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:layout_marginBottom="10dp"
android:gravity="center_horizontal">
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginEnd="7dp"
android:includeFontPadding="false"
android:text="0"
android:textColor="@color/white"
android:textSize="45sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginTop="8dp"
android:includeFontPadding="false"
android:text="KB"
android:textColor="@color/white"
android:textSize="12sp"
tools:ignore="HardcodedText" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="35dp"
android:text="Cleanable"
android:textColor="@color/white"
android:textSize="14sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</FrameLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="45dp"
android:text="Cleanable"
android:textColor="@color/white"
android:textSize="14sp"
tools:ignore="HardcodedText" />
</LinearLayout> </LinearLayout>
<FrameLayout <FrameLayout
...@@ -104,27 +130,72 @@ ...@@ -104,27 +130,72 @@
android:orientation="vertical"> android:orientation="vertical">
<pokercc.android.expandablerecyclerview.ExpandableRecyclerView <pokercc.android.expandablerecyclerview.ExpandableRecyclerView
android:id="@+id/id_ex_rl" android:id="@+id/ex_rv"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1" android:layout_weight="1"
android:visibility="visible" /> android:visibility="visible"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<TextView
android:id="@+id/id_cl_btn" <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="wrap_content">
android:layout_marginHorizontal="40dp"
android:layout_marginVertical="20dp" <TextView
android:background="@drawable/bg_button_enable_selector" android:id="@+id/tv_btn"
android:enabled="false" android:layout_width="match_parent"
android:gravity="center" android:layout_height="48dp"
android:text="Clean" android:layout_marginHorizontal="40dp"
android:textColor="@color/white" android:layout_marginVertical="20dp"
android:textSize="18sp" android:background="@drawable/bg_button_enable_selector"
android:textStyle="bold" android:enabled="false"
android:visibility="gone" android:gravity="center"
tools:ignore="HardcodedText" /> android:text="Clean"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
android:visibility="gone"
tools:ignore="HardcodedText" />
<LinearLayout
android:id="@+id/ll_two_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginVertical="20dp"
android:visibility="gone">
<TextView
android:id="@+id/tv_got_it_2"
android:layout_width="165dp"
android:layout_height="45dp"
android:background="@drawable/bg_eeeeee_22"
android:gravity="center"
android:text="Got it"
android:textColor="@color/black"
android:textSize="17sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_deep_scan"
android:layout_width="165dp"
android:layout_height="45dp"
android:layout_marginStart="20dp"
android:background="@drawable/bg_577dfd_22"
android:gravity="center"
android:text="Deep Scan"
android:textColor="@color/white"
android:textSize="17sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
</LinearLayout>
</FrameLayout>
</androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat>
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:paddingTop="10dp" android:paddingTop="10dp"
android:paddingBottom="15dp" android:paddingBottom="10dp"
tools:ignore="UseCompoundDrawables"> tools:ignore="UseCompoundDrawables">
<ImageView <ImageView
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
<TextView <TextView
android:id="@+id/tv_1" android:id="@+id/tv_1"
android:layout_width="100dp" android:layout_width="100dp"
android:layout_height="20dp" android:layout_height="16dp"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:gravity="center" android:gravity="center"
android:text="Clean" android:text="Clean"
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:paddingTop="10dp" android:paddingTop="10dp"
android:paddingBottom="15dp" android:paddingBottom="10dp"
tools:ignore="UseCompoundDrawables"> tools:ignore="UseCompoundDrawables">
<ImageView <ImageView
...@@ -76,7 +76,7 @@ ...@@ -76,7 +76,7 @@
<TextView <TextView
android:id="@+id/tv_2" android:id="@+id/tv_2"
android:layout_width="100dp" android:layout_width="100dp"
android:layout_height="20dp" android:layout_height="16dp"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:gravity="center" android:gravity="center"
android:text="Recovery" android:text="Recovery"
......
...@@ -66,10 +66,50 @@ ...@@ -66,10 +66,50 @@
</FrameLayout> </FrameLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="Used Space"
android:textColor="#666666"
android:textSize="16sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_storage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:textColor="#FF0C0C"
android:textSize="16sp"
android:textStyle="bold"
tools:text="52.0 GB / 128.0 GB" />
</LinearLayout>
<TextView
android:id="@+id/tv_clean"
android:layout_width="285dp"
android:layout_height="45dp"
android:layout_gravity="center_horizontal"
android:layout_marginVertical="20dp"
android:background="@drawable/bg_ff852c_22"
android:gravity="center"
android:text="Clean Junk"
android:textColor="@color/white"
android:textSize="19sp"
android:textStyle="bold"
tools:ignore="HardcodedText" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -79,7 +119,7 @@ ...@@ -79,7 +119,7 @@
android:orientation="horizontal"> android:orientation="horizontal">
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/card_large_file" android:id="@+id/card_clean_junk"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="70dp" android:layout_height="70dp"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
...@@ -102,7 +142,7 @@ ...@@ -102,7 +142,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:src="@mipmap/large" android:src="@mipmap/h_cleanjunk"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<TextView <TextView
...@@ -110,7 +150,7 @@ ...@@ -110,7 +150,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:text="Large File\nCleanerr" android:text="Clean Junk"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="15sp" android:textSize="15sp"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
...@@ -120,8 +160,9 @@ ...@@ -120,8 +160,9 @@
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/card_app_manager" android:id="@+id/card_whats_app"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="70dp" android:layout_height="70dp"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
...@@ -144,7 +185,7 @@ ...@@ -144,7 +185,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:src="@mipmap/app" android:src="@mipmap/whatsapp"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<TextView <TextView
...@@ -152,7 +193,7 @@ ...@@ -152,7 +193,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:text="App\nProcess" android:text="WhatsAPP\nCleaner"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="15sp" android:textSize="15sp"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
...@@ -162,7 +203,6 @@ ...@@ -162,7 +203,6 @@
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
...@@ -172,17 +212,18 @@ ...@@ -172,17 +212,18 @@
android:layout_marginTop="12dp" android:layout_marginTop="12dp"
android:orientation="horizontal"> android:orientation="horizontal">
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/card_whats_app" android:id="@+id/card_large_file"
app:cardBackgroundColor="#F8F8F8"
app:cardCornerRadius="10dp"
app:cardElevation="0dp"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="70dp" android:layout_height="70dp"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
android:layout_weight="1" android:layout_weight="1"
android:clickable="true" android:clickable="true"
android:focusable="true"> android:focusable="true"
app:cardBackgroundColor="#F8F8F8"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<LinearLayout <LinearLayout
...@@ -196,7 +237,7 @@ ...@@ -196,7 +237,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:src="@mipmap/whatsapp" android:src="@mipmap/large"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<TextView <TextView
...@@ -204,7 +245,7 @@ ...@@ -204,7 +245,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:text="WhatsAPP\nCleaner" android:text="Large File\nCleanerr"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="15sp" android:textSize="15sp"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
...@@ -214,7 +255,6 @@ ...@@ -214,7 +255,6 @@
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/card_photos_manager" android:id="@+id/card_photos_manager"
android:layout_width="0dp" android:layout_width="0dp"
...@@ -259,6 +299,100 @@ ...@@ -259,6 +299,100 @@
</LinearLayout> </LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="12dp"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
android:id="@+id/card_app_manager"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_marginHorizontal="8dp"
android:layout_weight="1"
android:clickable="true"
android:focusable="true"
app:cardBackgroundColor="#F8F8F8"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:src="@mipmap/app"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:text="App\nManager"
android:textColor="@color/black"
android:textSize="15sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/card_app_process"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_marginHorizontal="8dp"
android:layout_weight="1"
android:clickable="true"
android:focusable="true"
app:cardBackgroundColor="#F8F8F8"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:src="@mipmap/h_appprocess"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:text="App Process"
android:textColor="@color/black"
android:textSize="15sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
<FrameLayout <FrameLayout
android:id="@+id/fl_ad" android:id="@+id/fl_ad"
android:layout_width="match_parent" android:layout_width="match_parent"
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <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" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:orientation="vertical"
tools:context=".fragment.RecoveryFragment"> tools:context=".fragment.RecoveryFragment">
...@@ -88,13 +88,104 @@ ...@@ -88,13 +88,104 @@
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/card_ry_document" android:id="@+id/card_ry_document"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_marginHorizontal="8dp"
android:layout_weight="1"
app:cardBackgroundColor="#F8F8F8"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:src="@mipmap/recovery"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:text="Recovery\nDocuments"
android:textColor="@color/black"
android:textSize="15sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/card_privacy_space"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_marginHorizontal="8dp"
android:layout_weight="1"
android:clickable="true"
android:focusable="true"
app:cardBackgroundColor="#F8F8F8" app:cardBackgroundColor="#F8F8F8"
app:cardCornerRadius="10dp" app:cardCornerRadius="10dp"
app:cardElevation="0dp" app:cardElevation="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:src="@mipmap/space"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:text="Privacy\nSpace"
android:textColor="@color/black"
android:textSize="15sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="16dp"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="70dp" android:layout_height="70dp"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
android:layout_weight="1"> android:layout_weight="1"
app:cardBackgroundColor="#F8F8F8"
app:cardCornerRadius="10dp"
app:cardElevation="0dp">
<LinearLayout <LinearLayout
...@@ -127,7 +218,6 @@ ...@@ -127,7 +218,6 @@
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/card_privacy_space"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="70dp" android:layout_height="70dp"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
......
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