Commit 985eb386 authored by wanglei's avatar wanglei

feat:白包bug修复

parent bd6767e7
......@@ -3,20 +3,7 @@
<component name="deploymentTargetDropDown">
<value>
<entry key="app">
<State>
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="3426369207001D6" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2024-03-21T08:35:33.717775700Z" />
</State>
<State />
</entry>
</value>
</component>
......
......@@ -5,7 +5,7 @@
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#JAVA_HOME" />
<option name="gradleJvm" value="jbr-17" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
......
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
......
......@@ -6,7 +6,6 @@ interface AdapterCommonDataFunction {
abstract fun setData(data: List<FileBean>)
abstract fun addData(data: List<FileBean>)
abstract fun addDataFinish(data: List<FileBean>)
abstract fun clearData()
abstract fun removeData(data: List<FileBean>)
abstract fun getSelectData(): List<FileBean>
......
......@@ -20,19 +20,11 @@ abstract class CommonAdapter<T : ViewHolder?>() : RecyclerView.Adapter<T>(),
@SuppressLint("NotifyDataSetChanged")
override fun addData(data: List<FileBean>) {
fileList.addAll(data)
if (firstRefresh) {
notifyDataSetChanged()
firstRefresh = false
}
}
@SuppressLint("NotifyDataSetChanged")
override fun addDataFinish(data: List<FileBean>) {
fileList.addAll(data)
notifyDataSetChanged()
}
@SuppressLint("NotifyDataSetChanged")
override fun clearData() {
if (fileList.size == 0) return
......@@ -61,12 +53,11 @@ abstract class CommonAdapter<T : ViewHolder?>() : RecyclerView.Adapter<T>(),
@SuppressLint("NotifyDataSetChanged")
override fun toggleSelect(select: Boolean) {
fileList.mapIndexed { index, fileBean ->
if (fileBean.isSelect != select) {
fileBean.isSelect = select
notifyItemChanged(index, "单条刷新")
}
fileList.forEach {
fileBean ->
fileBean.isSelect=select
}
notifyDataSetChanged()
}
......
......@@ -174,9 +174,10 @@ fun File.isDocument(): Boolean {
return isWord() or isExcel() or isPPt() or isPdf() or isTxt()
}
fun File.toFileBean(): FileBean {
fun File.toFileBean(id: Long = 0): FileBean {
val timeE = SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH).format(lastModified())
return FileBean(
id = id,
name = name,
path = absolutePath,
size = length(),
......
......@@ -3,6 +3,7 @@ package com.zxhy.solarmasterace.filebrowser
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
......@@ -72,25 +73,61 @@ class FileBrowserActivity : AppCompatActivity() {
private fun showBrowser() {
when (title) {
"Duplicate picture" -> dupImageMode()
"Scan large files" -> largeFileMode()
"Scan empty file" -> emptyFileMode()
"Image" -> imageMode()
"Video" -> videoMode()
"Audio" -> audioMode()
"Apk" -> apkMode()
"Zip" -> zipMode()
"Log file" -> logFileMode()
"Word" -> wordMode()
"Excel" -> excelMode()
"PPT" -> pptMode()
"PDF" -> pdfMode()
"TXT" -> txtMode()
"Documents" -> documentMode()
"Audio" -> audioMode()//
"Apk" -> apkMode()//
"Zip" -> zipMode()//
"Log file" -> logFileMode()//
"Word" -> wordMode()//
"Excel" -> excelMode()//
"PPT" -> pptMode()//
"PDF" -> pdfMode()//
"TXT" -> txtMode()//
"Documents" -> documentMode()//
"Scan large files" -> largeFileMode()//
"Scan empty file" -> emptyFileMode()//
"Duplicate picture" -> dupImageMode()
}
}
@SuppressLint("SetTextI18n")
private fun loadImageFile() {
val dialog = showLoadingDialog()
fileGridAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
imageFile(lifecycleScope,
onDo = { data ->
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
fileGridAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
waitList.addAll(data)
fileGridAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
}
}
)
}
private fun documentMode() {
cardUi()
loadDocumentFile()
......@@ -99,18 +136,26 @@ class FileBrowserActivity : AppCompatActivity() {
private fun loadDocumentFile() {
val dialog = showLoadingDialog()
cardFileAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
lifecycleScope.launch(Dispatchers.IO) {
documentFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addDataFinish(data)
waitList.addAll(data)
cardFileAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
......@@ -128,18 +173,26 @@ class FileBrowserActivity : AppCompatActivity() {
private fun loadTxtFile() {
val dialog = showLoadingDialog()
cardFileAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
lifecycleScope.launch(Dispatchers.IO) {
txtFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addDataFinish(data)
waitList.addAll(data)
cardFileAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
......@@ -157,18 +210,26 @@ class FileBrowserActivity : AppCompatActivity() {
private fun loadPdfFile() {
val dialog = showLoadingDialog()
cardFileAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
lifecycleScope.launch(Dispatchers.IO) {
pdfFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addDataFinish(data)
waitList.addAll(data)
cardFileAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
......@@ -187,18 +248,26 @@ class FileBrowserActivity : AppCompatActivity() {
private fun loadPptFile() {
val dialog = showLoadingDialog()
cardFileAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
lifecycleScope.launch(Dispatchers.IO) {
pptFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addDataFinish(data)
waitList.addAll(data)
cardFileAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
......@@ -267,18 +336,26 @@ class FileBrowserActivity : AppCompatActivity() {
private fun loadExcelFile() {
val dialog = showLoadingDialog()
cardFileAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
lifecycleScope.launch(Dispatchers.IO) {
excelFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addDataFinish(data)
waitList.addAll(data)
cardFileAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
......@@ -323,47 +400,64 @@ class FileBrowserActivity : AppCompatActivity() {
loadImageFile()
}
@SuppressLint("SetTextI18n")
private fun loadWordFile() {
private fun loadLargeFile() {
val dialog = showLoadingDialog()
cardFileAdapter.clearData()
lifecycleScope.launch(Dispatchers.IO) {
wordFile(
onDo = { data ->
launch(Dispatchers.Main) {
var doLaunch = false
val waitList = ArrayList<FileBean>()
largeFile(
lifecycleScope,
onDo = { data ->
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addDataFinish(data)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
}
} else {
waitList.addAll(data)
}
)
}
},
onFinish = { data, count ->
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
waitList.addAll(data)
cardFileAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
}
}
)
}
@SuppressLint("SetTextI18n")
private fun loadImageFile() {
private fun loadWordFile() {
val dialog = showLoadingDialog()
fileGridAdapter.clearData()
cardFileAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
lifecycleScope.launch(Dispatchers.IO) {
imageFile(
wordFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
fileGridAdapter.addData(data)
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
fileGridAdapter.addDataFinish(data)
waitList.addAll(data)
cardFileAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
......@@ -373,22 +467,31 @@ class FileBrowserActivity : AppCompatActivity() {
}
}
@SuppressLint("SetTextI18n")
private fun loadVideoFile() {
val dialog = showLoadingDialog()
fileGridAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
lifecycleScope.launch(Dispatchers.IO) {
videoFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
fileGridAdapter.addData(data)
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
fileGridAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
fileGridAdapter.addDataFinish(data)
waitList.addAll(data)
fileGridAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
......@@ -399,23 +502,7 @@ class FileBrowserActivity : AppCompatActivity() {
}
private fun largeFileMode() {
binding.tvTip1.visibility = View.VISIBLE
binding.tvTip2.visibility = View.VISIBLE
cardFileAdapter = CardFileAdapter {
binding.ivAll.isSelected = it
}
binding.rv.adapter = cardFileAdapter
binding.ivAll.setOnClickListener {
it.isSelected = !it.isSelected
cardFileAdapter.toggleSelect(it.isSelected)
}
binding.tvDelete.background =
ContextCompat.getDrawable(this, R.drawable.bg_ff5c67e5_corners)
binding.tvDelete.text = "删除"
binding.tvDelete.setTextColor(ContextCompat.getColor(this, R.color.white))
binding.tvDelete.setOnClickListener {
deleteCardFile(cardFileAdapter.getSelectData())
}
cardUi()
loadLargeFile()
}
......@@ -438,47 +525,31 @@ class FileBrowserActivity : AppCompatActivity() {
deleteFiles(files.map { it.file() })
}
@SuppressLint("SetTextI18n")
private fun loadLargeFile() {
val dialog = showLoadingDialog()
cardFileAdapter.clearData()
lifecycleScope.launch(Dispatchers.IO) {
largeFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addDataFinish(data)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
}
}
)
}
}
@SuppressLint("SetTextI18n")
private fun loadAudioFile() {
val dialog = showLoadingDialog()
cardFileAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
lifecycleScope.launch(Dispatchers.IO) {
audioFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addDataFinish(data)
waitList.addAll(data)
cardFileAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
......@@ -492,18 +563,26 @@ class FileBrowserActivity : AppCompatActivity() {
private fun loadApkFile() {
val dialog = showLoadingDialog()
cardFileAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
lifecycleScope.launch(Dispatchers.IO) {
apkFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addDataFinish(data)
waitList.addAll(data)
cardFileAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
......@@ -517,18 +596,26 @@ class FileBrowserActivity : AppCompatActivity() {
private fun loadZipFile() {
val dialog = showLoadingDialog()
cardFileAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
lifecycleScope.launch(Dispatchers.IO) {
zipFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addDataFinish(data)
waitList.addAll(data)
cardFileAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
......@@ -542,18 +629,27 @@ class FileBrowserActivity : AppCompatActivity() {
private fun loadLogFile() {
val dialog = showLoadingDialog()
cardFileAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
lifecycleScope.launch(Dispatchers.IO) {
logFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
Log.e("TAG", data.toString())
cardFileAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addDataFinish(data)
waitList.addAll(data)
cardFileAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
......@@ -572,18 +668,26 @@ class FileBrowserActivity : AppCompatActivity() {
private fun loadEmptyFile() {
val dialog = showLoadingDialog()
cardFileAdapter.clearData()
var doLaunch = false
val waitList = ArrayList<FileBean>()
lifecycleScope.launch(Dispatchers.IO) {
emptyFile(
onDo = { data ->
launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
if (doLaunch) {
doLaunch = true
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addData(data)
}
} else {
waitList.addAll(data)
}
},
onFinish = { data, count ->
launch(Dispatchers.Main) {
lifecycleScope.launch(Dispatchers.Main) {
dialog.dismiss()
cardFileAdapter.addDataFinish(data)
waitList.addAll(data)
cardFileAdapter.addData(waitList)
binding.tvTip1.text = "$count items"
binding.ivAll.isSelected = false
showEmptyUi()
......
package com.zxhy.solarmasterace.internalstorage
import android.annotation.SuppressLint
import android.content.Context
import android.os.Environment
import android.util.Log
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import com.zxhy.solarmasterace.R
import com.zxhy.solarmasterace.adapter.CommonAdapter
import com.zxhy.solarmasterace.adapter.ItemCardFileViewHolder
......@@ -21,6 +23,7 @@ class FileDirectoryAdapter(
private var currentDir = Environment.getExternalStorageDirectory()
private var isSelectMode = false
private var pageTurn = true
private var operationFile = arrayListOf<FileBean>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemCardFileViewHolder {
return ItemCardFileViewHolder(R.layout.item_card_file.inflate(parent))
......@@ -68,6 +71,18 @@ class FileDirectoryAdapter(
if (!pageTurn) return@setOnClickListener
nextPage(data)
}
//该列表是选中列表
if (operationFile.map { it.path }.contains(data.path)) {
root.setOnClickListener { }
root.setCardBackgroundColor(
ContextCompat.getColor(
context, R.color.color_F4F4F4
)
)
} else {
root.setCardBackgroundColor(ContextCompat.getColor(context, R.color.white))
}
}
} else {
holder.binding.apply {
......@@ -118,4 +133,16 @@ class FileDirectoryAdapter(
return currentDir
}
//当选中选中的列表,无法复制 移动到自身
fun notifyCannotSelect(data: List<FileBean>) {
val selectList = arrayListOf<FileBean>()
selectList.addAll(data)
operationFile = selectList
notifyDataSetChanged()
}
fun clearCannotSelect() {
operationFile = arrayListOf()
}
}
\ No newline at end of file
......@@ -31,8 +31,7 @@ class InternalStorageActivity : AppCompatActivity() {
private val MODE_BROWSE = 0
private val MODE_SELECT = 1
private val MODE_SELECTED_OPERATION = 2
private val MODE_LOCK = -1
private var currentMode = MODE_BROWSE //0普通浏览模式 1可选模式 2选中操作模式 -1无权限锁功能模式
private var currentMode = MODE_BROWSE //0普通浏览模式 1可选模式 2选中操作模式
private lateinit var activityLauncher: ActivityLauncher
override fun onCreate(savedInstanceState: Bundle?) {
......@@ -148,16 +147,21 @@ class InternalStorageActivity : AppCompatActivity() {
val files = fileDirectoryAdapter.getSelectData().map { it.file() }
deleteFiles(files) {
showCardTip("Successfully deleted!")
switchBrowseMode()
}
}
binding.ivMove.setOnClickListener {
val moveFile = arrayListOf<File>()
fileDirectoryAdapter.getSelectData().map { moveFile.add(it.file()) }
val selectList = fileDirectoryAdapter.getSelectData()
selectList.map { moveFile.add(it.file()) }
fileDirectoryAdapter.notifyCannotSelect(selectList)
switchSelectedOperationMode("Motion", moveFile)
}
binding.ivCopy.setOnClickListener {
val copyFile = arrayListOf<File>()
fileDirectoryAdapter.getSelectData().map { copyFile.add(it.file()) }
val selectList = fileDirectoryAdapter.getSelectData()
selectList.map { copyFile.add(it.file()) }
fileDirectoryAdapter.notifyCannotSelect(selectList)
switchSelectedOperationMode("Copy", copyFile)
}
}
......@@ -185,6 +189,7 @@ class InternalStorageActivity : AppCompatActivity() {
binding.tvDefine.setOnClickListener {
moveFiles(files) {
showCardTip("Successfully moved!")
fileDirectoryAdapter.clearCannotSelect()
switchBrowseMode()
}
}
......@@ -193,6 +198,7 @@ class InternalStorageActivity : AppCompatActivity() {
"Copy" -> {
binding.tvDefine.setOnClickListener {
copyFiles(files) {
fileDirectoryAdapter.clearCannotSelect()
showCardTip("Successfully copied!")
switchBrowseMode()
}
......@@ -210,7 +216,10 @@ class InternalStorageActivity : AppCompatActivity() {
val dir = fileDirectoryAdapter.getCurrentDir() ?: File("")
files.forEach {
if (it.isFile) {
it.copyTo(File(dir, it.name))
val destFile = File(dir, it.name)
if (!destFile.exists()) {
it.copyTo(destFile)
}
} else {
FileHelper.copyDirectory(it, File(dir, it.name))
}
......
package com.zxhy.solarmasterace.quicktools
import android.os.Environment
import androidx.lifecycle.LifecycleCoroutineScope
import androidx.lifecycle.lifecycleScope
import com.zxhy.solarmasterace.data.DupFileBean
import com.zxhy.solarmasterace.data.FileBean
import com.zxhy.solarmasterace.data.isApk
......@@ -16,6 +18,8 @@ import com.zxhy.solarmasterace.data.isVideo
import com.zxhy.solarmasterace.data.isWord
import com.zxhy.solarmasterace.data.isZip
import com.zxhy.solarmasterace.data.toFileBean
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
import java.util.Stack
......@@ -52,23 +56,28 @@ fun dupImage(): List<DupFileBean> {
}
fun largeFile(
lifecycleScope: LifecycleCoroutineScope,
onDo: ((file: List<FileBean>) -> Unit)? = null,
onFinish: ((file: List<FileBean>, count: Int) -> Unit)? = null
) {
val rootDir = Environment.getExternalStorageDirectory()
val tempList = arrayListOf<FileBean>()
var count = 0
FileHelper.linkedLisTraverseFolder(rootDir) {
if (it.length() > 10 * 1024 * 1024) {
tempList.add(it.toFileBean())
count++
if (tempList.size == 10) {
onDo?.invoke(tempList)
tempList.clear()
lifecycleScope.launch(Dispatchers.IO) {
val rootDir = Environment.getExternalStorageDirectory()
val tempList = arrayListOf<FileBean>()
var count = 0
FileHelper.linkedLisTraverseFolder(rootDir) {
if (it.length() > 10 * 1024 * 1024) {
tempList.add(it.toFileBean())
count++
if (tempList.size == 10) {
onDo?.invoke(tempList)
tempList.clear()
}
}
}
onFinish?.invoke(tempList, count)
}
onFinish?.invoke(tempList, count)
}
fun audioFile(
......@@ -295,25 +304,29 @@ fun emptyFile(
}
fun imageFile(
lifecycleCoroutineScope: LifecycleCoroutineScope,
onDo: ((file: List<FileBean>) -> Unit)? = null,
onFinish: ((file: List<FileBean>, count: Int) -> Unit)? = null
onFinish: ((file: List<FileBean>, count: Long) -> Unit)? = null
) {
val rootDir = Environment.getExternalStorageDirectory()
val tempList = arrayListOf<FileBean>()
var count = 0
FileHelper.linkedLisTraverseFolder(rootDir) {
if (it.isImage()) {
tempList.add(it.toFileBean())
count++
if (tempList.size == 10) {
onDo?.invoke(tempList)
tempList.clear()
lifecycleCoroutineScope.launch(Dispatchers.IO) {
val rootDir = Environment.getExternalStorageDirectory()
val tempList = arrayListOf<FileBean>()
var count = 0L
FileHelper.linkedLisTraverseFolder(rootDir) {
if (it.isImage()) {
tempList.add(it.toFileBean(count))
count++
if (tempList.size == 10) {
onDo?.invoke(tempList)
tempList.clear()
}
}
}
onFinish?.invoke(tempList, count)
}
onFinish?.invoke(tempList, count)
}
fun videoFile(
onDo: ((file: List<FileBean>) -> Unit)? = null,
onFinish: ((file: List<FileBean>, count: Int) -> Unit)? = null
......
......@@ -83,13 +83,15 @@ object FileHelper {
val currentFile = stackFiles.peek()
val subFiles = currentFile.listFiles()
for (i in subFiles!!.indices) {
if (subFiles[i].isFile) {
if (!subFiles[i].delete()) {
return false
if (subFiles != null) {
for (i in subFiles.indices) {
if (subFiles[i].isFile) {
if (!subFiles[i].delete()) {
return false
}
} else {
stackFiles.push(subFiles[i])
}
} else {
stackFiles.push(subFiles[i])
}
}
if (currentFile === stackFiles.peek()) {
......@@ -108,15 +110,22 @@ object FileHelper {
* @param target 目标文件夹
*/
fun copyDirectory(source: File, target: File) {
if (source.isDirectory) {
if (!target.exists()) target.mkdir()
try {
if (source.isDirectory) {
if (!target.exists()) target.mkdir()
source.list()?.map { sub ->
copyDirectory(File(source, sub), File(target, sub))
source.list()?.map { sub ->
copyDirectory(File(source, sub), File(target, sub))
}
} else {
if (!target.exists()) {
source.copyTo(target)
}
}
} else {
source.copyTo(target)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
\ No newline at end of file
......@@ -6,4 +6,6 @@
<color name="color_FF4CE0AB">#FF4CE0AB</color>
<color name="color_FF333333">#FF333333</color>
<color name="color_FF999999">#FF999999</color>
<color name="color_999999">#999999</color>
<color name="color_F4F4F4">#F4F4F4</color>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment