Commit 2bea702d authored by wanglei's avatar wanglei

[新增]大文件功能

parent 33617e4b
...@@ -68,6 +68,11 @@ ...@@ -68,6 +68,11 @@
android:exported="false" android:exported="false"
android:screenOrientation="portrait" android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" /> tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.largefile.LargeFileCleanActivity"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
......
{"v":"5.6.3","fr":25,"ip":0,"op":36,"w":870,"h":870,"nm":"1-扫描动画","ddd":0,"assets":[{"id":"image_0","w":120,"h":120,"u":"images/","p":"img_0.png","e":0},{"id":"image_1","w":198,"h":198,"u":"images/","p":"img_1.png","e":0},{"id":"image_2","w":678,"h":678,"u":"images/","p":"img_2.png","e":0},{"id":"image_3","w":678,"h":678,"u":"images/","p":"img_3.png","e":0}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"小飞圆","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[60],"e":[0]},{"t":40}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[141,893,0],"e":[437,429,0],"to":[0,0,0],"ti":[0,0,0]},{"t":35}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"小飞圆","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"小飞圆","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.8],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":5,"s":[60],"e":[0]},{"t":25}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":1},"o":{"x":0.2,"y":0},"t":5,"s":[892,226,0],"e":[462,460,0],"to":[0,0,0],"ti":[0,0,0]},{"t":20}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"小飞圆","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"小飞圆","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.8],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":5,"s":[60],"e":[0]},{"t":25}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":1},"o":{"x":0.2,"y":0},"t":5,"s":[-81,761,0],"e":[431,435,0],"to":[0,0,0],"ti":[0,0,0]},{"t":30}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"小飞圆","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"小飞圆","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.8],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":10,"s":[60],"e":[0]},{"t":30}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":1},"o":{"x":0.2,"y":0},"t":10,"s":[574,-48,0],"e":[434,408,0],"to":[0,0,0],"ti":[0,0,0]},{"t":30}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"小飞圆","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"小飞圆","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.8],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":0,"s":[60],"e":[0]},{"t":20}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":1},"o":{"x":0.2,"y":0},"t":0,"s":[-48,-40,0],"e":[444,444,0],"to":[0,0,0],"ti":[0,0,0]},{"t":18}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[36,36],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"小飞圆","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"小飞圆","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.2],"y":[0]},"t":16,"s":[60],"e":[0]},{"t":36}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":1},"o":{"x":0.2,"y":0},"t":16,"s":[1018,824,0],"e":[446,462,0],"to":[0,0,0],"ti":[0,0,0]},{"t":31}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[26,26],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"小飞圆","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":2,"nm":"icon_clean_home","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[435,435,0],"ix":2},"a":{"a":0,"k":[60,60,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":2,"nm":"小圆","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[435,435,0],"ix":2},"a":{"a":0,"k":[99,99,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":2,"nm":"转圈园","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[360]},{"t":35}],"ix":10},"p":{"a":0,"k":[435,435,0],"ix":2},"a":{"a":0,"k":[339,339,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":2,"nm":"背景圆","refId":"image_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[435,435,0],"ix":2},"a":{"a":0,"k":[339,339,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":75,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
...@@ -31,6 +31,7 @@ import com.base.appzxhy.SpConstObject.appLanguageSp ...@@ -31,6 +31,7 @@ import com.base.appzxhy.SpConstObject.appLanguageSp
import com.base.appzxhy.R import com.base.appzxhy.R
import com.base.appzxhy.bean.FeatureBean.Companion.BATTERY_INFO import com.base.appzxhy.bean.FeatureBean.Companion.BATTERY_INFO
import com.base.appzxhy.bean.FeatureBean.Companion.JUNK_CLEAN import com.base.appzxhy.bean.FeatureBean.Companion.JUNK_CLEAN
import com.base.appzxhy.bean.FeatureBean.Companion.LARGE_FILE_CLEAN
import com.base.appzxhy.bean.FileBean import com.base.appzxhy.bean.FileBean
import com.base.appzxhy.business.ads.AdsMgr import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.business.ads.AdsShowCallBack import com.base.appzxhy.business.ads.AdsShowCallBack
...@@ -38,6 +39,7 @@ import com.base.appzxhy.business.ads.NativeParentView ...@@ -38,6 +39,7 @@ import com.base.appzxhy.business.ads.NativeParentView
import com.base.appzxhy.business.helper.EventUtils import com.base.appzxhy.business.helper.EventUtils
import com.base.appzxhy.ui.batteryinfo.BatteryInfoActivity import com.base.appzxhy.ui.batteryinfo.BatteryInfoActivity
import com.base.appzxhy.ui.clean.JunkCleanActivity import com.base.appzxhy.ui.clean.JunkCleanActivity
import com.base.appzxhy.ui.largefile.LargeFileCleanActivity
import com.base.appzxhy.ui.main.MainActivity import com.base.appzxhy.ui.main.MainActivity
import com.base.appzxhy.utils.ActivityLauncher import com.base.appzxhy.utils.ActivityLauncher
import com.base.appzxhy.utils.ActivityManagerUtils import com.base.appzxhy.utils.ActivityManagerUtils
...@@ -364,20 +366,24 @@ fun Activity.jumpAction(key: String) { ...@@ -364,20 +366,24 @@ fun Activity.jumpAction(key: String) {
JUNK_CLEAN -> { JUNK_CLEAN -> {
goToAc(JunkCleanActivity::class.java) goToAc(JunkCleanActivity::class.java)
} }
LARGE_FILE_CLEAN -> {
goToAc(LargeFileCleanActivity::class.java)
}
} }
} }
enum class LottieConfig(val data: String, val images: String? = null, val isLoop: Boolean = true) { enum class LottieConfig(val data: String, val images: String? = null, val isLoop: Boolean = true) {
BATTERY_INFO_LOTTIE("battery_info/scan/data.json", "battery_info/scan/images", true), BATTERY_INFO_LOTTIE("battery_info/scan/data.json", "battery_info/scan/images", true),
CLEAN_LOTTIE("clean.json"),
LARGE_FILE_LOTTIE("large_files/scan/data.json", "large_files/scan/images"),
// LARGE_FILE("large_files/scan/data.json", "large_files/scan/images"),
// PHOTO_COMPRESSION("photo_compression/scan/data.json", "photo_compression/scan/images"), // PHOTO_COMPRESSION("photo_compression/scan/data.json", "photo_compression/scan/images"),
// PHOTO_COMPRESSION_COMPRESS("photo_compression/compress/data.json", "photo_compression/compress/images"), // PHOTO_COMPRESSION_COMPRESS("photo_compression/compress/data.json", "photo_compression/compress/images"),
// SCREENSHOT("screenshot/scan/data.json", "screenshot/scan/images"), // SCREENSHOT("screenshot/scan/data.json", "screenshot/scan/images"),
// SIMILAR_PHOTOS("similar_photos/scan/data.json", "similar_photos/scan/images"), // SIMILAR_PHOTOS("similar_photos/scan/data.json", "similar_photos/scan/images"),
// WHATSAPP("whatsapp/scan/data.json", "whatsapp/scan/images"), // WHATSAPP("whatsapp/scan/data.json", "whatsapp/scan/images"),
CLEAN_LOTTIE("clean.json"),
// WEATHER(""), // WEATHER(""),
// CONSTELLATION("") // CONSTELLATION("")
} }
......
package com.base.appzxhy.ui.dialog
import android.view.Gravity
import android.view.LayoutInflater
import android.widget.LinearLayout
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import com.base.appzxhy.R
import com.base.appzxhy.databinding.DialogConfirmBinding
class ConfirmDialog(
val activity: AppCompatActivity
) {
val dialog = AlertDialog.Builder(activity).create()
val binding = DialogConfirmBinding.inflate(LayoutInflater.from(activity))
var action: (() -> Unit)? = null
fun showDialog(type: String) {
dialog.setView(binding.root)
dialog.setCanceledOnTouchOutside(true)
dialog.show()
val params = dialog.window?.attributes
params?.width = LinearLayout.LayoutParams.MATCH_PARENT
params?.height = LinearLayout.LayoutParams.WRAP_CONTENT
params?.gravity = Gravity.BOTTOM
dialog.window?.attributes = params
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
when (type) {
"delete" -> {
binding.tvTitle.text = activity.getString(R.string.delete_title)
binding.tvContent.text = activity.getString(R.string.delete_content)
binding.tvConfirm.text = activity.getString(R.string.delete)
}
}
binding.tvCancel.setOnClickListener {
dialog.dismiss()
}
binding.tvConfirm.setOnClickListener {
dialog.dismiss()
action?.invoke()
}
}
}
\ No newline at end of file
package com.base.appzxhy.ui.largefile
import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.base.LottieConfig
import com.base.appzxhy.base.cleanFiles
import com.base.appzxhy.bean.FeatureBean.Companion.LARGE_FILE_CLEAN
import com.base.appzxhy.bean.FileBean
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.business.ads.AdsShowCallBack
import com.base.appzxhy.databinding.ActivityLargeFileCleanBinding
import com.base.appzxhy.databinding.ItemLargeFileCleanBinding
import com.base.appzxhy.databinding.ItemLargeFileCleanTabBinding
import com.base.appzxhy.ui.cleanresult.CleanResultActivity
import com.base.appzxhy.ui.dialog.ConfirmDialog
import com.base.appzxhy.utils.MediaUtils
import com.base.appzxhy.utils.MineTypeUtils
import com.base.appzxhy.utils.Utils
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 kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import java.util.Calendar
class LargeFileCleanActivity : BaseActivity<ActivityLargeFileCleanBinding>(ActivityLargeFileCleanBinding::inflate) {
private val LARGE_FILE_SIZE: Long = 1024 * 1024 * 10
private val typeList by lazy {
listOf(
FileBean(getString(R.string.all_types), isSelected = true),
FileBean(getString(R.string.image)),
FileBean(getString(R.string.video)),
FileBean(getString(R.string.audio)),
FileBean(getString(R.string.document)),
FileBean(getString(R.string.apk)),
FileBean(getString(R.string.other_types)),
)
}
private val sizeList by lazy {
listOf(
FileBean(getString(R.string.mb_10), isSelected = true),
FileBean(getString(R.string.mb_20)),
FileBean(getString(R.string.mb_50)),
FileBean(getString(R.string.mb_100)),
FileBean(getString(R.string.mb_500)),
)
}
private val timeList by lazy {
listOf(
FileBean(getString(R.string.all_time), isSelected = true),
FileBean(getString(R.string.week_1)),
FileBean(getString(R.string.month_1)),
FileBean(getString(R.string.month_3)),
FileBean(getString(R.string.month_6)),
FileBean(getString(R.string.year_1)),
)
}
private var typePosition = 0
private var sizePosition = 0
private var timePosition = 0
private var total: Long = 0
private var allData = mutableListOf<FileBean>()
private var list = mutableListOf<FileBean>()
private val adapter by lazy {
class ViewHolder(val binding: ItemLargeFileCleanBinding) : RecyclerView.ViewHolder(binding.root)
object : RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemLargeFileCleanBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun getItemCount(): Int = list.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = list[position]
holder.binding.ivVideo.isVisible = MineTypeUtils.isVideo(item.mineType)
if (MineTypeUtils.isImage(item.mineType) || MineTypeUtils.isVideo(item.mineType)) {
val round = resources.getDimensionPixelSize(R.dimen.dp_4)
val options = RequestOptions().transform(CenterCrop(), RoundedCorners(round))
Glide.with(holder.itemView.context)
.load(item.path)
.apply(options)
.into(holder.binding.ivIcon)
} else if (MineTypeUtils.isAudio(item.mineType)) {
holder.binding.ivIcon.setImageResource(R.drawable.icon_yinping)
} else if (MineTypeUtils.isApk(item.mineType)) {
holder.binding.ivIcon.setImageResource(R.drawable.icon_app_file_cleaner)
} else if (MineTypeUtils.isDoc(item.mineType)) {
holder.binding.ivIcon.setImageResource(R.drawable.icon_wenjianx)
} else {
holder.binding.ivIcon.setImageResource(R.drawable.icon_qita_file_cleaner)
}
holder.binding.tvName.text = item.name
holder.binding.tvLength.text = Utils.getSizeFormat(item.length)
holder.binding.ivSelect.isSelected = item.isSelected
holder.binding.viewLine.visibility = if (position == itemCount - 1) View.GONE else View.VISIBLE
holder.itemView.setOnClickListener {
item.isSelected = !item.isSelected
notifyItemChanged(position)
updateView()
}
}
}
}
private var tabType = 0
private val tabList = mutableListOf<FileBean>()
private val tabAdapter by lazy {
class ViewHolder(val binding: ItemLargeFileCleanTabBinding) : RecyclerView.ViewHolder(binding.root)
object : RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemLargeFileCleanTabBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun getItemCount(): Int = tabList.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = tabList[position]
holder.binding.tvName.text = item.name
holder.binding.tvName.setTextColor(getColor(if (item.isSelected) R.color.colorPrimary else R.color.color_666666))
holder.binding.viewLine.visibility = if (position == itemCount - 1) View.GONE else View.VISIBLE
holder.binding.ivSelect.isSelected = item.isSelected
holder.itemView.setOnClickListener {
tabList.forEach { it.isSelected = false }
item.isSelected = !item.isSelected
handleTab(item, position)
}
}
}
}
private fun updateView() {
total = list.filter { it.isSelected }.sumOf { it.length }
setTextSize(binding.tvDelete, getString(R.string.delete), total)
binding.tvDelete.isEnabled = total > 0
}
private fun handleTab(item: FileBean, position: Int) {
binding.clTab.visibility = View.GONE
var textView: AppCompatTextView = binding.tvTime
when (tabType) {
1 -> {
textView = binding.tvType
typePosition = position
}
2 -> {
textView = binding.tvSize
sizePosition = position
}
3 -> {
textView = binding.tvTime
timePosition = position
}
}
textView.text = item.name
binding.tvDelete.text = getString(R.string.delete)
filterData()
clearTab()
}
fun setTextSize(view: TextView, content: String, total: Long) {
view.text = if (total > 0) "$content (${Utils.getSizeFormat(total)})" else content
}
@SuppressLint("NotifyDataSetChanged")
private fun filterData() {
allData.forEach { it.isSelected = false }
var data = filterType(allData, typePosition)
data = filterSize(data, sizePosition)
data = filterTime(data, timePosition)
list = data.toMutableList()
adapter.notifyDataSetChanged()
binding.rvLargeFile.visibility = if (list.isEmpty()) View.GONE else View.VISIBLE
binding.ivEmpty.visibility = if (list.isEmpty()) View.VISIBLE else View.GONE
binding.tvDelete.visibility = if (list.isEmpty()) View.GONE else View.VISIBLE
}
private fun filterType(list: List<FileBean>, position: Int): List<FileBean> {
return when (position) {
1 -> list.filter { MineTypeUtils.isImage(it.mineType) }
2 -> list.filter { MineTypeUtils.isVideo(it.mineType) }
3 -> list.filter { MineTypeUtils.isAudio(it.mineType) }
4 -> list.filter { MineTypeUtils.isDoc(it.mineType) }
5 -> list.filter { MineTypeUtils.isApk(it.mineType) }
6 -> list.filterNot { file ->
MineTypeUtils.mineTypes.any { mimeType -> file.mineType.startsWith(mimeType) }
}
else -> {
list
}
}
}
private fun filterSize(list: List<FileBean>, position: Int): List<FileBean> {
return when (position) {
1 -> list.filter { it.length >= LARGE_FILE_SIZE * 2 }
2 -> list.filter { it.length >= LARGE_FILE_SIZE * 5 }
3 -> list.filter { it.length >= LARGE_FILE_SIZE * 10 }
4 -> list.filter { it.length >= LARGE_FILE_SIZE * 50 }
else -> {
list.filter { it.length >= LARGE_FILE_SIZE }
}
}
}
private fun filterTime(list: List<FileBean>, position: Int): List<FileBean> {
return when (position) {
1 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.WEEK_OF_YEAR, -1) }.timeInMillis }
2 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.MONTH, -1) }.timeInMillis }
3 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.MONTH, -3) }.timeInMillis }
4 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.MONTH, -6) }.timeInMillis }
5 -> list.filter { it.lastModified > Calendar.getInstance().apply { add(Calendar.YEAR, -1) }.timeInMillis }
else -> {
list
}
}
}
private fun clearTab() {
binding.llTab.setBackgroundResource(R.color.color_f7fafa)
binding.tvDelete.isEnabled = false
binding.llType.setBackgroundResource(R.drawable.tab_large_file)
binding.llSize.setBackgroundResource(R.drawable.tab_large_file)
binding.llTime.setBackgroundResource(R.drawable.tab_large_file)
binding.ivType.isSelected = false
binding.ivSize.isSelected = false
binding.ivTime.isSelected = false
binding.tvType.setTextColor(getColor(R.color.color_181b1f))
binding.tvSize.setTextColor(getColor(R.color.color_181b1f))
binding.tvTime.setTextColor(getColor(R.color.color_181b1f))
binding.ivTypeArrow.setImageResource(R.drawable.icon_jiantou_down_small)
binding.ivSizeArrow.setImageResource(R.drawable.icon_jiantou_down_small)
binding.ivTimeArrow.setImageResource(R.drawable.icon_jiantou_down_small)
binding.llType.isSelected = false
binding.llSize.isSelected = false
binding.llTime.isSelected = false
}
private fun setTab(
view: View,
textView: AppCompatTextView,
imageView: AppCompatImageView
) {
if (view.isSelected) {
hiddenTab()
return
}
clearTab()
view.isSelected = true
view.setBackgroundResource(R.drawable.bg_btn_50)
imageView.setImageResource(R.drawable.icon_jiantou_up_small)
textView.setTextColor(getColor(R.color.white))
binding.llTab.setBackgroundResource(R.color.white)
when (view) {
binding.llType -> {
binding.ivType.isSelected = true
binding.tvOtherThan.visibility = View.GONE
showTab(1, typeList)
}
binding.llSize -> {
binding.ivSize.isSelected = true
binding.tvOtherThan.text = getString(R.string.larger_than)
binding.tvOtherThan.visibility = View.VISIBLE
showTab(2, sizeList)
}
binding.llTime -> {
binding.ivTime.isSelected = true
binding.tvOtherThan.text = getString(R.string.other_types)
binding.tvOtherThan.visibility = View.VISIBLE
showTab(3, timeList)
}
}
}
@SuppressLint("NotifyDataSetChanged")
private fun showTab(type: Int, list: List<FileBean>) {
binding.clTab.visibility = View.VISIBLE
tabType = type
tabList.clear()
tabList.addAll(list)
tabAdapter.notifyDataSetChanged()
}
private fun hiddenTab() {
binding.clTab.visibility = View.GONE
binding.llType.isSelected = false
binding.llSize.isSelected = false
binding.llTime.isSelected = false
clearTab()
}
override fun useDefaultImmersive() {
setStatusBarColor()
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, 0, systemBars.right, systemBars.bottom)
binding.clTop.setPadding(0, systemBars.top, 0, 0)
insets
}
}
override fun initView() {
super.initView()
binding.rvTab.adapter = tabAdapter
binding.rvTab.layoutManager = LinearLayoutManager(this)
binding.rvLargeFile.adapter = adapter
binding.rvLargeFile.layoutManager = LinearLayoutManager(this)
initData()
showAdAnimation(LottieConfig.LARGE_FILE_LOTTIE) {
AdsMgr.showNative(binding.flAd, R.layout.layout_admob_native_custom)
}
}
private fun initData() {
lifecycleScope.launch(Dispatchers.IO) {
allData = async { MediaUtils.findFiles(this@LargeFileCleanActivity, LARGE_FILE_SIZE) }.await()
launch(Dispatchers.Main) { filterData() }
}
}
override fun initListener() {
super.initListener()
binding.ivBack.setOnClickListener { onBackPressedDispatcher.onBackPressed() }
binding.llType.setOnClickListener {
setTab(it, binding.tvType, binding.ivTypeArrow)
}
binding.llSize.setOnClickListener {
setTab(it, binding.tvSize, binding.ivSizeArrow)
}
binding.llTime.setOnClickListener {
setTab(it, binding.tvTime, binding.ivTimeArrow)
}
binding.clTab.setOnClickListener {
hiddenTab()
}
binding.tvDelete.setOnClickListener {
if (total <= 0) return@setOnClickListener
val dialog = ConfirmDialog(this)
dialog.action = {
cleanFiles(list)
AdsMgr.showInsert(this, showCallBack = object : AdsShowCallBack() {
override fun next() {
CleanResultActivity.functionKey = LARGE_FILE_CLEAN
CleanResultActivity.total = total
CleanResultActivity.titleName = getString(R.string.large_file_clean)
goToAc(CleanResultActivity::class.java)
}
})
}
dialog.showDialog("delete")
}
}
}
\ No newline at end of file
...@@ -26,8 +26,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl ...@@ -26,8 +26,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
private val featureList = listOf( private val featureList = listOf(
FeatureBean(JUNK_CLEAN, R.string.junk_clean, R.drawable.h_junkclean).apply { span = 1 }, FeatureBean(JUNK_CLEAN, R.string.junk_clean, R.drawable.h_junkclean).apply { span = 1 },
FeatureBean(BATTERY_INFO, R.string.battery_info, R.drawable.h_battery).apply { span = 1 }, FeatureBean(BATTERY_INFO, R.string.battery_info, R.drawable.h_battery).apply { span = 1 },
FeatureBean(SCREENSHOT_CLEAN, R.string.large_file_clean, R.drawable.h_lagre).apply { span = 1 }, FeatureBean(LARGE_FILE_CLEAN, R.string.large_file_clean, R.drawable.h_lagre).apply { span = 1 },
FeatureBean(LARGE_FILE_CLEAN, R.string.screenshot_clean, R.drawable.h_screenshot).apply { span = 3 }, FeatureBean(SCREENSHOT_CLEAN, R.string.screenshot_clean, R.drawable.h_screenshot).apply { span = 3 },
FeatureBean(PHOTO_COMPRESSION, R.string.photo_compression, R.drawable.h_compression).apply { span = 3 }, FeatureBean(PHOTO_COMPRESSION, R.string.photo_compression, R.drawable.h_compression).apply { span = 3 },
FeatureBean(SIMILAR_PHOTOS, R.string.similar_photos, R.drawable.h_similar).apply { span = 3 }, FeatureBean(SIMILAR_PHOTOS, R.string.similar_photos, R.drawable.h_similar).apply { span = 3 },
) )
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/colorPrimary" />
<corners android:radius="4dp" />
</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/icon_mb_file_s" android:state_selected="true" />
<item android:drawable="@drawable/icon_mb_file_n" android:state_selected="false" />
</selector>
\ 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/icon_time_file_s" android:state_selected="true" />
<item android:drawable="@drawable/icon_time_file_n" android:state_selected="false" />
</selector>
\ 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/icon_type_file_s" android:state_selected="true" />
<item android:drawable="@drawable/icon_type_file_n" android:state_selected="false" />
</selector>
\ 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="4dp" />
<solid android:color="@color/white" />
<stroke android:width="1dp" android:color="@color/color_aeb4bd" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="37dp" />
<solid android:color="@android:color/transparent" />
<stroke android:width="1dp" android:color="@color/color_ebebeb" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_f7fafa">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
app:layout_constraintTop_toTopOf="parent">
<FrameLayout
android:id="@+id/ll_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingVertical="6dp"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ivBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_8"
android:padding="@dimen/dp_8"
android:src="@drawable/icon_return_w" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/large_file_clean"
android:textColor="@color/white"
android:textSize="20sp"
android:textStyle="bold" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/ll_tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="12dp"
android:paddingTop="24dp"
app:layout_constraintTop_toBottomOf="@id/cl_top">
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/ll_type"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/tab_large_file"
android:gravity="center"
android:orientation="horizontal"
android:paddingVertical="8dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_filter_large_type"
android:src="@drawable/bg_filter_large_type" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="2dp"
android:text="@string/all_types"
android:textColor="@color/color_181b1f"
android:textSize="14sp"
android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_type_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_jiantou_down_small" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/ll_size"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="6dp"
android:layout_weight="1"
android:background="@drawable/tab_large_file"
android:gravity="center"
android:orientation="horizontal"
android:paddingHorizontal="10dp"
android:paddingVertical="8dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bg_filter_large_size" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="2dp"
android:text="@string/mb_10"
android:textColor="@color/color_181b1f"
android:textSize="14sp"
android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_size_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_jiantou_down_small" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/ll_time"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/tab_large_file"
android:gravity="center"
android:orientation="horizontal"
android:paddingHorizontal="10dp"
android:paddingVertical="8dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bg_filter_large_time" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="2dp"
android:text="@string/all_time"
android:textColor="@color/color_181b1f"
android:textSize="14sp"
android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_time_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_jiantou_down_small" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
<com.base.appzxhy.business.ads.NativeParentView
android:id="@+id/flAd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="10dp"
android:layout_marginTop="10dp"
app:layout_constraintTop_toBottomOf="@id/ll_tab">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/zhanwei1" />
</com.base.appzxhy.business.ads.NativeParentView>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_empty"
android:layout_width="@dimen/dp_150"
android:layout_height="@dimen/dp_150"
android:src="@drawable/queshengtu"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_large_file"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginBottom="12dp"
android:paddingVertical="6dp"
android:scrollbars="none"
app:layout_constraintBottom_toTopOf="@id/tv_delete"
app:layout_constraintTop_toBottomOf="@id/flAd" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="30dp"
android:layout_marginBottom="40dp"
android:background="@drawable/bg_btn_enable_50"
android:enabled="false"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:text="@string/delete"
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_tab"
android:layout_width="match_parent"
android:layout_height="0dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll_tab">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0.2"
android:src="@color/black" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/white_background_bottom"
android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_other_than"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:paddingTop="8dp"
android:text="@string/other_than"
android:textColor="@color/color_aeb4bd"
android:textSize="12sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvTab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="12dp"
android:scrollbars="none"
app:layout_constraintTop_toBottomOf="@id/tv_other_than" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>
<include
android:id="@+id/layout_animation"
layout="@layout/layout_animation"
android:visibility="gone" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/white_background">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="24dp"
android:includeFontPadding="false"
android:lineSpacingExtra="4dp"
android:text="@string/confirm"
android:textAlignment="center"
android:textColor="@color/color_1a1a1a"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp"
android:includeFontPadding="false"
android:lineSpacingExtra="4dp"
android:text="@string/confirm_content"
android:textAlignment="center"
android:textColor="@color/color_666666"
android:textSize="14sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_title" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="24dp"
android:background="@drawable/button_border_background"
android:gravity="center"
android:paddingVertical="8dp"
android:text="@string/cancel"
android:textColor="@color/color_aeb4bd"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/tv_confirm"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_content" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_confirm"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="32dp"
android:layout_marginBottom="24dp"
android:background="@drawable/bg_btn_4"
android:gravity="center"
android:paddingVertical="8dp"
android:text="@string/confirm"
android:textColor="@color/white"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_cancel"
app:layout_constraintTop_toBottomOf="@id/tv_content" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="15dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="12dp"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@mipmap/logo"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_video"
android:layout_width="@dimen/dp_20"
android:layout_height="@dimen/dp_20"
android:src="@drawable/img_play_file_small"
app:layout_constraintBottom_toBottomOf="@id/iv_icon"
app:layout_constraintEnd_toEndOf="@id/iv_icon"
app:layout_constraintStart_toStartOf="@id/iv_icon"
app:layout_constraintTop_toTopOf="@id/iv_icon" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:layout_weight="1"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/iv_select"
app:layout_constraintStart_toEndOf="@id/iv_icon"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/app_name"
android:textColor="@color/color_181b1f"
android:textSize="16sp" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_length"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:text="0B"
android:textColor="@color/color_aeb4bd"
android:textSize="12sp"
tools:ignore="HardcodedText" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bg_select_yuan"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:id="@+id/view_line"
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_marginTop="12dp"
android:background="@color/color_ebebeb"
app:layout_constraintTop_toBottomOf="@id/ll_content" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="15dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="12dp"
android:gravity="center"
android:orientation="horizontal"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/app_name"
android:textColor="@color/color_666666"
android:textSize="14sp" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_select"
android:layout_width="@dimen/dp_20"
android:layout_height="@dimen/dp_20"
android:src="@drawable/bg_select_yuan"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.appcompat.widget.LinearLayoutCompat>
<View
android:id="@+id/view_line"
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_marginTop="12dp"
android:background="@color/color_ebebeb"
app:layout_constraintTop_toBottomOf="@id/ll_content" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -69,7 +69,29 @@ Please rest assured that we will handle your information in strict accordance wi ...@@ -69,7 +69,29 @@ Please rest assured that we will handle your information in strict accordance wi
<string name="result_photo_compression">Reduce photo size to release more space</string> <string name="result_photo_compression">Reduce photo size to release more space</string>
<string name="result_screenshot_clean">Check screenshot cleaner to release more space</string> <string name="result_screenshot_clean">Check screenshot cleaner to release more space</string>
<string name="result_similar_photos">Delete similar photos to save space.</string> <string name="result_similar_photos">Delete similar photos to save space.</string>
<string name="all_types">All Types</string>
<string name="mb_10">10 MB</string>
<string name="delete">Delete</string>
<string name="other_than">Other than</string>
<string name="image">Image</string>
<string name="apk">Apk</string>
<string name="other_types">Other Types</string>
<string name="mb_20">20 MB</string>
<string name="mb_50">50 MB</string>
<string name="mb_100">100 MB</string>
<string name="mb_500">500 MB</string>
<string name="all_time">All time</string>
<string name="week_1">1 week</string>
<string name="month_1">1 month</string>
<string name="month_3">3 month</string>
<string name="month_6">6 month</string>
<string name="year_1">1 year</string>
<string name="larger_than">Larger than</string>
<string name="confirm">Confirm</string>
<string name="confirm_content">The original photos will be replaced by the compressed ones</string>
<string name="cancel">Cancel</string>
<string name="delete_title">Sure to delete?</string>
<string name="delete_content">Selected files cannot be recovered after deletion. Continue anyway?</string>
</resources> </resources>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment