Commit fa4e93cf authored by yanglin's avatar yanglin

clean功能完善

parent 7756c502
...@@ -27,11 +27,9 @@ import com.xm.test.myfilemaster.MyApplication ...@@ -27,11 +27,9 @@ import com.xm.test.myfilemaster.MyApplication
import com.xm.test.myfilemaster.R import com.xm.test.myfilemaster.R
import com.xm.test.myfilemaster.adapter.CleanAdapter import com.xm.test.myfilemaster.adapter.CleanAdapter
import com.xm.test.myfilemaster.adapter.CleanAdapter2 import com.xm.test.myfilemaster.adapter.CleanAdapter2
import com.xm.test.myfilemaster.antivirus.AntivirusActivity
import com.xm.test.myfilemaster.model.CleanBean import com.xm.test.myfilemaster.model.CleanBean
import com.xm.test.myfilemaster.model.FileBean import com.xm.test.myfilemaster.model.FileBean
import com.xm.test.myfilemaster.util.FileUtil import com.xm.test.myfilemaster.util.FileUtil
import kotlinx.coroutines.runInterruptible
import java.io.File import java.io.File
class CleanActivity : AppCompatActivity(), CleanAdapter2.IClean { class CleanActivity : AppCompatActivity(), CleanAdapter2.IClean {
...@@ -145,9 +143,11 @@ class CleanActivity : AppCompatActivity(), CleanAdapter2.IClean { ...@@ -145,9 +143,11 @@ class CleanActivity : AppCompatActivity(), CleanAdapter2.IClean {
mAnimation.visibility = View.VISIBLE mAnimation.visibility = View.VISIBLE
Thread(Runnable { Thread(Runnable {
Thread.sleep(1000) Thread.sleep(1000)
mCleanAdapter2?.mFileCheckedItemList?.forEach { mCleanAdapter2?.mFileCheckedItemLists?.forEach {
it.forEach {
MyApplication.mCleanSdk?.delete(File(it.filePath)) MyApplication.mCleanSdk?.delete(File(it.filePath))
} }
}
runOnUiThread { runOnUiThread {
val intent = Intent(this, ResultPageActivity::class.java) val intent = Intent(this, ResultPageActivity::class.java)
intent.putExtra("pageTitle", "Clean") intent.putExtra("pageTitle", "Clean")
......
...@@ -68,9 +68,20 @@ class ScanResultActivity : AppCompatActivity() { ...@@ -68,9 +68,20 @@ class ScanResultActivity : AppCompatActivity() {
customDialog.setsCancel(View.OnClickListener { customDialog.setsCancel(View.OnClickListener {
customDialog.dismiss() customDialog.dismiss()
}).setsConfirm(View.OnClickListener { }).setsConfirm(View.OnClickListener {
Intent(Intent.ACTION_DELETE, Uri.parse("package:${mCurrentAppInfo!!.packageName}"))
val packageName = mCurrentAppInfo!!.packageName // 要卸载的应用包名
val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE)
intent.data = Uri.parse("package:$packageName")
startActivity(intent) startActivity(intent)
mResult?.remove(mCurrentAppInfo!!) mAppinfoPage.visibility = View.GONE
mDeleteGroupView.visibility = View.GONE
mGoItBtn.visibility = View.VISIBLE
mScanResultListLyout.visibility = View.VISIBLE
customDialog.dismiss()
// Intent(Intent.ACTION_DELETE, Uri.parse("package:${mCurrentAppInfo!!.packageName}"))
// startActivity(intent)
// mResult?.remove(mCurrentAppInfo!!)
}).show() }).show()
customDialog.isShowEditText(false) customDialog.isShowEditText(false)
customDialog.setsTitle("Delete") customDialog.setsTitle("Delete")
...@@ -108,8 +119,15 @@ class ScanResultActivity : AppCompatActivity() { ...@@ -108,8 +119,15 @@ class ScanResultActivity : AppCompatActivity() {
mAntivirusSuccessView.visibility = View.VISIBLE mAntivirusSuccessView.visibility = View.VISIBLE
} }
findViewById<View>(R.id.scan_result_quit_btn).setOnClickListener { findViewById<View>(R.id.scan_result_quit_btn).setOnClickListener {
if (mAppinfoPage.isVisible){
mAppinfoPage.visibility = View.GONE
mDeleteGroupView.visibility = View.GONE
mGoItBtn.visibility = View.VISIBLE
mScanResultListLyout.visibility = View.VISIBLE
}else{
finish() finish()
} }
}
findViewById<View>(R.id.scan_result_finish_text).setOnClickListener { findViewById<View>(R.id.scan_result_finish_text).setOnClickListener {
val intent = Intent(this, ResultPageActivity::class.java) val intent = Intent(this, ResultPageActivity::class.java)
...@@ -148,4 +166,18 @@ class ScanResultActivity : AppCompatActivity() { ...@@ -148,4 +166,18 @@ class ScanResultActivity : AppCompatActivity() {
super.onBackPressed() super.onBackPressed()
} }
} }
override fun onResume() {
super.onResume()
if (mCurrentAppInfo != null){
try {
packageManager.getPackageInfo(mCurrentAppInfo!!.packageName, PackageManager.GET_ACTIVITIES)
mResult?.remove(mCurrentAppInfo!!)
mScanResultAdapter?.setDatas(mResult!!)
}catch (e : PackageManager.NameNotFoundException){
println(e.message)
}
}
}
} }
\ No newline at end of file
package com.xm.test.myfilemaster.adapter package com.xm.test.myfilemaster.adapter
import android.util.Log
import android.util.SparseBooleanArray import android.util.SparseBooleanArray
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ListView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.xm.test.myfilemaster.R import com.xm.test.myfilemaster.R
import com.xm.test.myfilemaster.activity.CleanActivity
import com.xm.test.myfilemaster.databinding.CleanListItemLayoutBinding import com.xm.test.myfilemaster.databinding.CleanListItemLayoutBinding
import com.xm.test.myfilemaster.databinding.FilesItemLayoutBinding import com.xm.test.myfilemaster.databinding.FilesItemLayoutBinding
import com.xm.test.myfilemaster.model.CleanBean import com.xm.test.myfilemaster.model.CleanBean
...@@ -17,9 +16,8 @@ class CleanAdapter2(mIClean: IClean) : RecyclerView.Adapter<CleanAdapter2.AAA>() ...@@ -17,9 +16,8 @@ class CleanAdapter2(mIClean: IClean) : RecyclerView.Adapter<CleanAdapter2.AAA>()
private val list = ArrayList<CleanBean>() private val list = ArrayList<CleanBean>()
var mFileCheckedItemList = ArrayList<FileBean>() var mFileCheckedItemLists = ArrayList<ArrayList<FileBean>>()
private var mCheckedBooleanArrays = ArrayList<SparseBooleanArray>()
private var sparseBooleanArray = ArrayList<SparseBooleanArray>()
private var itemAdapters = ArrayList<SubAdapter>() private var itemAdapters = ArrayList<SubAdapter>()
var mAllSizes = ArrayList<Long>() var mAllSizes = ArrayList<Long>()
var mSwitchAll = ArrayList<Boolean>() var mSwitchAll = ArrayList<Boolean>()
...@@ -47,15 +45,11 @@ class CleanAdapter2(mIClean: IClean) : RecyclerView.Adapter<CleanAdapter2.AAA>() ...@@ -47,15 +45,11 @@ class CleanAdapter2(mIClean: IClean) : RecyclerView.Adapter<CleanAdapter2.AAA>()
override fun onBindViewHolder(holder: AAA, position: Int) { override fun onBindViewHolder(holder: AAA, position: Int) {
val data = list[position] val data = list[position]
sparseBooleanArray.add(SparseBooleanArray()) itemAdapters.add(SubAdapter(position, mCheckedBooleanArrays[position]))
itemAdapters.add(SubAdapter(position)) mSwitchAll.add(true)
mSwitchAll.add(false)
holder.binding.cleanItemName.text = data.typeName holder.binding.cleanItemName.text = data.typeName
holder.binding.cleanItemCheckBox.isChecked = mSwitchAll[position]
holder.binding.cleanItemList.visibility = if (!CleanAdapter.isCleanOver) View.GONE else View.VISIBLE holder.binding.cleanItemList.visibility = if (!CleanAdapter.isCleanOver) View.GONE else View.VISIBLE
holder.binding.cleanItemUnfold.visibility = if (!CleanAdapter.isCleanOver) View.GONE else View.VISIBLE holder.binding.cleanItemUnfold.visibility = if (!CleanAdapter.isCleanOver) View.GONE else View.VISIBLE
holder.binding.fileItemSize.visibility = if (!CleanAdapter.isCleanOver) View.GONE else View.VISIBLE holder.binding.fileItemSize.visibility = if (!CleanAdapter.isCleanOver) View.GONE else View.VISIBLE
...@@ -89,30 +83,35 @@ class CleanAdapter2(mIClean: IClean) : RecyclerView.Adapter<CleanAdapter2.AAA>() ...@@ -89,30 +83,35 @@ class CleanAdapter2(mIClean: IClean) : RecyclerView.Adapter<CleanAdapter2.AAA>()
data.isListViewShow = !data.isListViewShow data.isListViewShow = !data.isListViewShow
notifyItemChanged(position) notifyItemChanged(position)
} }
holder.binding.cleanItemCheckBox.isChecked = mSwitchAll[position]
selectAll(mSwitchAll[position],position)
holder.binding.cleanItemCheckBox.setOnClickListener { holder.binding.cleanItemCheckBox.setOnClickListener {
if (CleanAdapter.isCleanOver){ if (CleanAdapter.isCleanOver){
mSwitchAll[position] = !mSwitchAll[position] mSwitchAll[position] = !mSwitchAll[position]
list[position].fileBeans.forEach { selectAll(mSwitchAll[position], position)
it.isChecked = holder.binding.cleanItemCheckBox.isChecked
}
if (holder.binding.cleanItemCheckBox.isChecked){
mFileCheckedItemList.addAll(list[position].fileBeans)
}else{
mFileCheckedItemList.removeAll(list[position].fileBeans)
}
itemAdapters[position].setData(list[position].fileBeans)
notifyItemChanged(position) notifyItemChanged(position)
changeSwitchSize()
} }
} }
//选中的逻辑,先外层通过data的属性值是否选中,点击事假更新子类表选中状态下 //选中的逻辑,先外层通过data的属性值是否选中,点击事假更新子类表选中状态下
} }
fun selectAll(isChecked: Boolean, position: Int){
mFileCheckedItemLists[position].clear()
if (isChecked) mFileCheckedItemLists[position].addAll(list[position].fileBeans)
for (i in list[position].fileBeans.indices){
mCheckedBooleanArrays[position].put(i, isChecked)
}
itemAdapters[position].notifyDataSetChanged()
changeSwitchSize()
}
private fun changeSwitchSize() { private fun changeSwitchSize() {
var size: Long = 0 var size: Long = 0
mFileCheckedItemList.forEach { mFileCheckedItemLists.forEach {
it.forEach {
size += it.fileSize size += it.fileSize
} }
}
mIClean.OnChekedItemListener(size) mIClean.OnChekedItemListener(size)
} }
...@@ -120,16 +119,27 @@ class CleanAdapter2(mIClean: IClean) : RecyclerView.Adapter<CleanAdapter2.AAA>() ...@@ -120,16 +119,27 @@ class CleanAdapter2(mIClean: IClean) : RecyclerView.Adapter<CleanAdapter2.AAA>()
fun setData(datas: List<CleanBean>) { fun setData(datas: List<CleanBean>) {
list.clear() list.clear()
list.addAll(datas) list.addAll(datas)
notifyDataSetChanged() mCheckedBooleanArrays.clear()
mFileCheckedItemLists.clear()
for (i in datas.indices) {
mCheckedBooleanArrays.add(SparseBooleanArray())
mFileCheckedItemLists.add(ArrayList())
for (j in 0..<datas[i].fileBeans.size){
mCheckedBooleanArrays[i].put(j, false)
}
notifyItemChanged(i)
}
} }
inner class SubAdapter(itemPosition: Int) : RecyclerView.Adapter<SubAdapter.BBB>() { inner class SubAdapter(itemPosition: Int, sparseBooleanArray: SparseBooleanArray) : RecyclerView.Adapter<SubAdapter.BBB>() {
private val sibList = ArrayList<FileBean>() private val sibList = ArrayList<FileBean>()
private var itemPosition: Int private var itemPosition: Int
private var sparseBooleanArray: SparseBooleanArray
init { init {
this.itemPosition = itemPosition this.itemPosition = itemPosition
this.sparseBooleanArray = sparseBooleanArray
} }
inner class BBB(view: View) : RecyclerView.ViewHolder(view) { inner class BBB(view: View) : RecyclerView.ViewHolder(view) {
...@@ -153,19 +163,33 @@ class CleanAdapter2(mIClean: IClean) : RecyclerView.Adapter<CleanAdapter2.AAA>() ...@@ -153,19 +163,33 @@ class CleanAdapter2(mIClean: IClean) : RecyclerView.Adapter<CleanAdapter2.AAA>()
holder.binding.fileJoinToImg.visibility = View.GONE holder.binding.fileJoinToImg.visibility = View.GONE
holder.binding.fileSelectSwitch.visibility = if (!CleanAdapter.isCleanOver) View.GONE else View.VISIBLE holder.binding.fileSelectSwitch.visibility = if (!CleanAdapter.isCleanOver) View.GONE else View.VISIBLE
holder.binding.fileSelectSwitch.isChecked = sibList[position].isChecked holder.binding.fileSelectSwitch.isChecked = mCheckedBooleanArrays[itemPosition][position]
holder.binding.fileSelectSwitch.setOnClickListener { holder.binding.itemLayout.setOnClickListener {
sibList[position].isChecked = !sibList[position].isChecked Log.e("yanglin", "onBindViewHolder: $itemPosition $position", )
if (holder.binding.fileSelectSwitch.isChecked){ mCheckedBooleanArrays[itemPosition].put(position, !mCheckedBooleanArrays[itemPosition][position])
mFileCheckedItemList.add(sibList[position]) if (mCheckedBooleanArrays[itemPosition][position]){
mFileCheckedItemLists[itemPosition].add(sibList[position])
}else{ }else{
mFileCheckedItemList.remove(sibList[position]) mFileCheckedItemLists[itemPosition].remove(sibList[position])
mSwitchAll[itemPosition] = false
} }
mSwitchAll[itemPosition] = false
changeSwitchSize() changeSwitchSize()
notifyItemChanged(position) notifyItemChanged(position)
} // holder.binding.fileSelectSwitch.isChecked = !holder.binding.fileSelectSwitch.isChecked
}
// holder.binding.fileSelectSwitch.setOnClickListener {
// sibList[position].isChecked = !sibList[position].isChecked
// if (holder.binding.fileSelectSwitch.isChecked){
// mFileCheckedItemList.add(sibList[position])
// }else{
// mFileCheckedItemList.remove(sibList[position])
// mSwitchAll[itemPosition] = false
// }
// changeSwitchSize()
// notifyItemChanged(position)
// }
when(itemPosition){ when(itemPosition){
0 ->{ 0 ->{
......
...@@ -34,6 +34,12 @@ class ScanResultAdapter(dataList: ArrayList<AppInfo>, ...@@ -34,6 +34,12 @@ class ScanResultAdapter(dataList: ArrayList<AppInfo>,
return position.toLong() return position.toLong()
} }
fun setDatas(dataList: ArrayList<AppInfo>){
this.dataList.clear()
this.dataList.addAll(dataList)
notifyDataSetChanged()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var view: View var view: View
var viewHolder : ScanResultViewHolder var viewHolder : ScanResultViewHolder
......
package com.xm.test.myfilemaster.view
import android.animation.ValueAnimator
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Matrix
import android.util.AttributeSet
import android.view.View
import com.xm.test.myfilemaster.R
class RotatingImageView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private var bitmap: Bitmap? = null
private var matrix: Matrix = Matrix()
private var rotationAnimator: ValueAnimator? = null
private var rotationAngle: Float = 0f
init {
// 加载图片
bitmap = BitmapFactory.decodeResource(resources, R.mipmap.loading)
// 创建旋转动画
rotationAnimator = ValueAnimator.ofFloat(0f, 360f)
rotationAnimator?.apply {
repeatCount = ValueAnimator.INFINITE
duration = 2000 // 旋转一周的时间
addUpdateListener { animation ->
rotationAngle = animation.animatedValue as Float
invalidate()
}
start()
}
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
// 如果没有图片,直接返回
bitmap?.let {
// 保存画布状态
canvas.save()
// 旋转图片
matrix.setRotate(rotationAngle, it.width / 2f, it.height / 2f)
canvas.drawBitmap(it, matrix, null)
// 恢复画布状态
canvas.restore()
}
}
}
...@@ -93,11 +93,11 @@ ...@@ -93,11 +93,11 @@
<com.airbnb.lottie.LottieAnimationView <com.airbnb.lottie.LottieAnimationView
android:id="@+id/battery_animation_btn" android:id="@+id/battery_animation_btn"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="160dp" android:layout_height="248dp"
android:layout_marginTop="20dp" android:layout_marginTop="-46dp"
app:lottie_autoPlay="true" app:lottie_autoPlay="true"
app:lottie_loop="true" app:lottie_loop="true"
app:lottie_rawRes="@raw/qinglisaomiao" /> app:lottie_rawRes="@raw/xunhuan" />
<LinearLayout <LinearLayout
android:id="@+id/ad_layout" android:id="@+id/ad_layout"
......
...@@ -37,13 +37,13 @@ ...@@ -37,13 +37,13 @@
android:button="@null" android:button="@null"
android:drawableEnd="@drawable/bg_item_switch_selector" /> android:drawableEnd="@drawable/bg_item_switch_selector" />
<ImageView <com.xm.test.myfilemaster.view.RotatingImageView
android:id="@+id/clean_item_more" android:id="@+id/clean_item_more"
android:layout_width="wrap_content" android:layout_width="30dp"
android:layout_height="wrap_content" android:layout_height="30dp"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:src="@mipmap/more" /> android:src="@mipmap/loading" />
<TextView <TextView
android:id="@+id/file_item_size" android:id="@+id/file_item_size"
......
This diff is collapsed.
This diff is collapsed.
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