Commit 7cd6ad09 authored by wanglei's avatar wanglei

...

parent d2596d6f
...@@ -4,19 +4,14 @@ import android.annotation.SuppressLint ...@@ -4,19 +4,14 @@ import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.os.Build import android.os.Build
import android.util.Log
import android.view.View import android.view.View
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.base.filerecoveryrecyclebin.R import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.activity.ResultActivity
import com.base.filerecoveryrecyclebin.activity.recovery.FileRecoveredActivity import com.base.filerecoveryrecyclebin.activity.recovery.FileRecoveredActivity
import com.base.filerecoveryrecyclebin.activity.recyclebin.RecycleBinFileEx.findRecycleBinFile
import com.base.filerecoveryrecyclebin.activity.recyclebin.RecycleBinFileEx.findRecycleBinJsonFile
import com.base.filerecoveryrecyclebin.bean.ConstObject import com.base.filerecoveryrecyclebin.bean.ConstObject
import com.base.filerecoveryrecyclebin.bean.ConstObject.RECYCLE_BIN
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean import com.base.filerecoveryrecyclebin.bean.RecycleBinBean
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean.Companion.mAudioStr import com.base.filerecoveryrecyclebin.bean.RecycleBinBean.Companion.mAudioStr
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean.Companion.mDocumentStr import com.base.filerecoveryrecyclebin.bean.RecycleBinBean.Companion.mDocumentStr
...@@ -27,6 +22,7 @@ import com.base.filerecoveryrecyclebin.help.BaseActivity ...@@ -27,6 +22,7 @@ import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatSize import com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatSize
import com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatTime import com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatTime
import com.base.filerecoveryrecyclebin.help.VideoPlayerUtil import com.base.filerecoveryrecyclebin.help.VideoPlayerUtil
import com.base.filerecoveryrecyclebin.service.BackUpUtils
import com.base.filerecoveryrecyclebin.service.BackUpUtils.recoveryFile import com.base.filerecoveryrecyclebin.service.BackUpUtils.recoveryFile
import com.base.filerecoveryrecyclebin.utils.BarUtils import com.base.filerecoveryrecyclebin.utils.BarUtils
import com.base.filerecoveryrecyclebin.utils.LogEx import com.base.filerecoveryrecyclebin.utils.LogEx
...@@ -85,7 +81,7 @@ class RecycleBinDetailActivity : BaseActivity<ActivityRecycleBinDetailBinding>() ...@@ -85,7 +81,7 @@ class RecycleBinDetailActivity : BaseActivity<ActivityRecycleBinDetailBinding>()
} }
Glide.with(this).load(bean.backupPath).centerCrop().into(binding.iv) Glide.with(this).load(bean.backupPath).centerCrop().into(binding.iv)
binding.tvName.text = bean.path binding.tvPath.text = bean.path
binding.tvSize.text = bean.size.toFormatSize() binding.tvSize.text = bean.size.toFormatSize()
binding.tvTime.text = "Delete time:${bean.deleteTime.toFormatTime()}" binding.tvTime.text = "Delete time:${bean.deleteTime.toFormatTime()}"
} }
...@@ -106,7 +102,7 @@ class RecycleBinDetailActivity : BaseActivity<ActivityRecycleBinDetailBinding>() ...@@ -106,7 +102,7 @@ class RecycleBinDetailActivity : BaseActivity<ActivityRecycleBinDetailBinding>()
runCatching { runCatching {
binFile.copyTo(file, true) binFile.copyTo(file, true)
binFile.delete() binFile.delete()
recoveryFile(bean.name) recoveryFile(bean.namePath)
} }
} }
startActivity(Intent(this, FileRecoveredActivity::class.java).apply { startActivity(Intent(this, FileRecoveredActivity::class.java).apply {
...@@ -132,20 +128,17 @@ class RecycleBinDetailActivity : BaseActivity<ActivityRecycleBinDetailBinding>() ...@@ -132,20 +128,17 @@ class RecycleBinDetailActivity : BaseActivity<ActivityRecycleBinDetailBinding>()
binding.ivBofang.setOnClickListener { binding.ivBofang.setOnClickListener {
recycleBinBean?.let { bean -> recycleBinBean?.let { bean ->
val file = File(bean.path) VideoPlayerUtil.playVideo(this, bean.backupPath)
val binFile = findRecycleBinFile(file.name)
VideoPlayerUtil.playVideo(this, binFile?.absolutePath)
} }
} }
binding.flDelete.setOnClickListener { binding.flDelete.setOnClickListener {
recycleBinBean?.let { bean -> recycleBinBean?.let { bean ->
val file = File(bean.path) BackUpUtils.deleteFileSp(bean.namePath)
val binFile = findRecycleBinFile(file.name) val file = File(bean.backupPath)
val binJsonFile = findRecycleBinJsonFile(file.name) if (file.exists()) {
file.delete()
binFile?.delete() }
binJsonFile?.delete()
} }
finish() finish()
} }
......
...@@ -2,15 +2,11 @@ package com.base.filerecoveryrecyclebin.adapter ...@@ -2,15 +2,11 @@ package com.base.filerecoveryrecyclebin.adapter
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Build
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.filerecoveryrecyclebin.R import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.activity.recyclebin.RecycleBinFileEx.findRecycleBinFile
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean import com.base.filerecoveryrecyclebin.bean.RecycleBinBean
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean.Companion.mAudioStr import com.base.filerecoveryrecyclebin.bean.RecycleBinBean.Companion.mAudioStr
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean.Companion.mDocumentStr import com.base.filerecoveryrecyclebin.bean.RecycleBinBean.Companion.mDocumentStr
...@@ -26,7 +22,6 @@ import com.bumptech.glide.load.DataSource ...@@ -26,7 +22,6 @@ import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.target.Target
import java.io.File
class RecycleBinAdapter(val click: (bean: RecycleBinBean) -> Unit) : RecyclerView.Adapter<RecycleBinAdapter.RBAV>() { class RecycleBinAdapter(val click: (bean: RecycleBinBean) -> Unit) : RecyclerView.Adapter<RecycleBinAdapter.RBAV>() {
...@@ -86,7 +81,7 @@ class RecycleBinAdapter(val click: (bean: RecycleBinBean) -> Unit) : RecyclerVie ...@@ -86,7 +81,7 @@ class RecycleBinAdapter(val click: (bean: RecycleBinBean) -> Unit) : RecyclerVie
binding.iv.setImageResource(R.mipmap.h_documents) binding.iv.setImageResource(R.mipmap.h_documents)
} }
binding.tvName.text = bean.name binding.tvName.text = bean.namePath
binding.tvTime.text = "delete time:" + bean.deleteTime.toFormatTime() binding.tvTime.text = "delete time:" + bean.deleteTime.toFormatTime()
binding.tvSize.text = bean.size.toFormatSize() binding.tvSize.text = bean.size.toFormatSize()
binding.root.setOnClickListener { binding.root.setOnClickListener {
......
...@@ -2,14 +2,16 @@ package com.base.filerecoveryrecyclebin.bean ...@@ -2,14 +2,16 @@ package com.base.filerecoveryrecyclebin.bean
data class RecycleBinBean( data class RecycleBinBean(
val name: String = "", val namePath: String = "",//文件名称,sp的key,容易重复,所已会覆盖之前的文件
val path: String = "", val path: String = "",//原文件路径
val backupPath: String = "", val backupPath: String = "",//备份文件路径
var deleteTime: Long = 0, var deleteTime: Long = 0,
val size: Long = 0, val size: Long = 0,
val mimeType: String = "", val mimeType: String = "",
var deleted: Boolean = false var deleted: Boolean = false
) { ) {
companion object { companion object {
val mImageStr: Set<String> = HashSet( val mImageStr: Set<String> = HashSet(
mutableListOf( mutableListOf(
......
...@@ -25,12 +25,13 @@ object BackUpUtils { ...@@ -25,12 +25,13 @@ object BackUpUtils {
private const val KEY = "backup_key" private const val KEY = "backup_key"
fun backupFile(src: File, path: String) { fun backupFile(src: File, namePath: String) {
if (namePath.isEmpty()) return
if (!hasStorageReadWritePermission()) { if (!hasStorageReadWritePermission()) {
return return
} }
try { try {
val recycleBinFile = File(getRecycleBinDir(), ".$path") val recycleBinFile = File(getRecycleBinDir(), ".$namePath")
LogEx.logDebug(TAG, "oo=$src ${src.length()}") LogEx.logDebug(TAG, "oo=$src ${src.length()}")
if (src.length() == 0L) { if (src.length() == 0L) {
return return
...@@ -41,19 +42,35 @@ object BackUpUtils { ...@@ -41,19 +42,35 @@ object BackUpUtils {
return return
} }
val binBean = RecycleBinBean( val binBean = RecycleBinBean(
path, namePath,
src.path, src.absolutePath,
recycleBinFile.absolutePath, recycleBinFile.absolutePath,
0, 0,
src.length(), src.length(),
getFileExtension(src), getFileExtension(src),
false false
) )
saveData(binBean, path) saveData(binBean, namePath)
} catch (e: Exception) { } catch (e: Exception) {
} }
}
fun deleteFile(path: String) {
if (path.isEmpty()) return
val isExists = queryFileExists(path)
if (isExists) {
val hashMap = queryBackUpSp()
val data = hashMap[path]
if (data != null) {
data.deleted = true
data.deleteTime = System.currentTimeMillis()
hashMap[path] = data
saveBackUpSp(hashMap)
}
}
} }
private fun getFileExtension(file: File): String { private fun getFileExtension(file: File): String {
...@@ -65,10 +82,10 @@ object BackUpUtils { ...@@ -65,10 +82,10 @@ object BackUpUtils {
} }
} }
fun saveData(binBean: RecycleBinBean, path: String) { fun saveData(binBean: RecycleBinBean, namePath: String) {
if (namePath.isEmpty()) return
val hashMap = queryBackUpSp() val hashMap = queryBackUpSp()
hashMap.put(path, binBean) hashMap.put(namePath, binBean)
saveBackUpSp(hashMap) saveBackUpSp(hashMap)
} }
...@@ -103,25 +120,16 @@ object BackUpUtils { ...@@ -103,25 +120,16 @@ object BackUpUtils {
} }
} }
fun queryFileExists(path: String): Boolean {
val hashMap = queryBackUpSp()
return hashMap.contains(path) fun queryFileExists(namePath: String): Boolean {
val hashMap = queryBackUpSp()
return hashMap.contains(namePath)
} }
fun deleteFile(path: String) { fun deleteFileSp(namePath: String) {
val isExists = queryFileExists(path) val map = queryBackUpSp()
if (isExists) { map.remove(namePath)
val hashMap = queryBackUpSp() saveBackUpSp(map)
val data = hashMap[path]
if (data != null) {
data?.deleted = true
data?.deleteTime = System.currentTimeMillis()
hashMap[path] = data
saveBackUpSp(hashMap)
}
}
} }
......
package com.base.filerecoveryrecyclebin.service; package com.base.filerecoveryrecyclebin.service;
import static android.os.FileObserver.ALL_EVENTS;
import static android.os.FileObserver.ATTRIB;
import static android.os.FileObserver.MOVED_FROM;
import android.os.Build;
import android.os.Environment; import android.os.Environment;
import android.os.FileObserver; import android.os.FileObserver;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.base.filerecoveryrecyclebin.MyApplication;
import com.base.filerecoveryrecyclebin.activity.recyclebin.RecycleBinFileEx;
import com.base.filerecoveryrecyclebin.help.FileHelp; import com.base.filerecoveryrecyclebin.help.FileHelp;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
...@@ -108,13 +99,13 @@ public class FileObserverExample { ...@@ -108,13 +99,13 @@ public class FileObserverExample {
} }
} }
private void handleFileCreation(String path) { private void handleFileCreation(String namePath) {
// 确保线程安全,这里我们只是打印出来,实际使用中可能需要同步机制 // 确保线程安全,这里我们只是打印出来,实际使用中可能需要同步机制
for (File dir : watchList) { for (File dir : watchList) {
File src = new File(dir, path); File src = new File(dir, namePath);
if (src.exists()) { if (src.exists()) {
Log.d(TAG, "新创建的文件 " + path + " 属于目录: " + dir.getAbsolutePath()); Log.d(TAG, "新创建的文件 " + namePath + " 属于目录: " + dir.getAbsolutePath());
BackUpUtils.INSTANCE.backupFile(src, path); BackUpUtils.INSTANCE.backupFile(src, namePath);
break; break;
} }
} }
......
...@@ -109,7 +109,7 @@ ...@@ -109,7 +109,7 @@
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<TextView <TextView
android:id="@+id/tv_name" android:id="@+id/tv_path"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/black" android:textColor="@color/black"
......
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