@@ -35,82 +35,19 @@ import net.lingala.zip4j.model.LocalFileHeader
3535import net.lingala.zip4j.model.ZipParameters
3636import net.lingala.zip4j.model.enums.EncryptionMethod
3737import org.fossify.commons.adapters.MyRecyclerViewAdapter
38- import org.fossify.commons.dialogs.ConfirmationDialog
39- import org.fossify.commons.dialogs.FilePickerDialog
40- import org.fossify.commons.dialogs.PropertiesDialog
41- import org.fossify.commons.dialogs.RadioGroupDialog
42- import org.fossify.commons.dialogs.RenameDialog
43- import org.fossify.commons.dialogs.RenameItemDialog
44- import org.fossify.commons.dialogs.RenameItemsDialog
45- import org.fossify.commons.extensions.applyColorFilter
46- import org.fossify.commons.extensions.beGone
47- import org.fossify.commons.extensions.beVisible
48- import org.fossify.commons.extensions.beVisibleIf
49- import org.fossify.commons.extensions.convertToBitmap
50- import org.fossify.commons.extensions.copyToClipboard
51- import org.fossify.commons.extensions.createDirectorySync
52- import org.fossify.commons.extensions.deleteFile
53- import org.fossify.commons.extensions.deleteFileBg
54- import org.fossify.commons.extensions.deleteFolderBg
55- import org.fossify.commons.extensions.formatDate
56- import org.fossify.commons.extensions.formatSize
57- import org.fossify.commons.extensions.getAndroidSAFFileItems
58- import org.fossify.commons.extensions.getAndroidSAFUri
59- import org.fossify.commons.extensions.getColoredDrawableWithColor
60- import org.fossify.commons.extensions.getDefaultCopyDestinationPath
61- import org.fossify.commons.extensions.getDocumentFile
62- import org.fossify.commons.extensions.getDoesFilePathExist
63- import org.fossify.commons.extensions.getFileCount
64- import org.fossify.commons.extensions.getFileInputStreamSync
65- import org.fossify.commons.extensions.getFileOutputStreamSync
66- import org.fossify.commons.extensions.getFilenameFromPath
67- import org.fossify.commons.extensions.getIsPathDirectory
68- import org.fossify.commons.extensions.getMimeType
69- import org.fossify.commons.extensions.getParentPath
70- import org.fossify.commons.extensions.getProperSize
71- import org.fossify.commons.extensions.getTextSize
72- import org.fossify.commons.extensions.getTimeFormat
73- import org.fossify.commons.extensions.handleDeletePasswordProtection
74- import org.fossify.commons.extensions.hasOTGConnected
75- import org.fossify.commons.extensions.highlightTextPart
76- import org.fossify.commons.extensions.isPathOnOTG
77- import org.fossify.commons.extensions.isRestrictedSAFOnlyRoot
78- import org.fossify.commons.extensions.relativizeWith
79- import org.fossify.commons.extensions.setupViewBackground
80- import org.fossify.commons.extensions.showErrorToast
81- import org.fossify.commons.extensions.toFileDirItem
82- import org.fossify.commons.extensions.toast
83- import org.fossify.commons.helpers.CONFLICT_OVERWRITE
84- import org.fossify.commons.helpers.CONFLICT_SKIP
85- import org.fossify.commons.helpers.VIEW_TYPE_LIST
86- import org.fossify.commons.helpers.ensureBackgroundThread
87- import org.fossify.commons.helpers.getFilePlaceholderDrawables
38+ import org.fossify.commons.dialogs.*
39+ import org.fossify.commons.extensions.*
40+ import org.fossify.commons.helpers.*
8841import org.fossify.commons.models.FileDirItem
8942import org.fossify.commons.models.RadioItem
9043import org.fossify.commons.views.MyRecyclerView
9144import org.fossify.filemanager.R
9245import org.fossify.filemanager.activities.SimpleActivity
9346import org.fossify.filemanager.activities.SplashActivity
94- import org.fossify.filemanager.databinding.ItemDirGridBinding
95- import org.fossify.filemanager.databinding.ItemEmptyBinding
96- import org.fossify.filemanager.databinding.ItemFileDirListBinding
97- import org.fossify.filemanager.databinding.ItemFileGridBinding
98- import org.fossify.filemanager.databinding.ItemSectionBinding
47+ import org.fossify.filemanager.databinding.*
9948import org.fossify.filemanager.dialogs.CompressAsDialog
100- import org.fossify.filemanager.extensions.config
101- import org.fossify.filemanager.extensions.isPathOnRoot
102- import org.fossify.filemanager.extensions.isZipFile
103- import org.fossify.filemanager.extensions.setAs
104- import org.fossify.filemanager.extensions.setLastModified
105- import org.fossify.filemanager.extensions.sharePaths
106- import org.fossify.filemanager.extensions.toggleItemVisibility
107- import org.fossify.filemanager.extensions.tryOpenPathIntent
108- import org.fossify.filemanager.helpers.OPEN_AS_AUDIO
109- import org.fossify.filemanager.helpers.OPEN_AS_IMAGE
110- import org.fossify.filemanager.helpers.OPEN_AS_OTHER
111- import org.fossify.filemanager.helpers.OPEN_AS_TEXT
112- import org.fossify.filemanager.helpers.OPEN_AS_VIDEO
113- import org.fossify.filemanager.helpers.RootHelpers
49+ import org.fossify.filemanager.extensions.*
50+ import org.fossify.filemanager.helpers.*
11451import org.fossify.filemanager.interfaces.ItemOperationsListener
11552import org.fossify.filemanager.models.ListItem
11653import java.io.BufferedInputStream
@@ -532,39 +469,30 @@ class ItemsAdapter(
532469 copyHidden = config.shouldShowHidden()
533470 ) {
534471 if (! isCopyOperation) {
535- files.forEach { sourceFileDir ->
536- val sourcePath = sourceFileDir.path
537- if (
538- activity.isRestrictedSAFOnlyRoot(sourcePath)
539- && activity.getDoesFilePathExist(sourcePath)
540- ) {
541- activity.deleteFile(sourceFileDir, true ) {
542- listener?.refreshFragment()
543- activity.runOnUiThread {
544- finishActMode()
545- }
546- }
547- } else {
548- val sourceFile = File (sourcePath)
549- if (
550- activity.getDoesFilePathExist(source)
551- && activity.getIsPathDirectory(source)
552- && sourceFile.list()?.isEmpty() == true
553- && sourceFile.getProperSize(true ) == 0L
554- && sourceFile.getFileCount(true ) == 0
555- ) {
556- val sourceFolder = sourceFile.toFileDirItem(activity)
557- activity.deleteFile(sourceFolder, true ) {
558- listener?.refreshFragment()
559- activity.runOnUiThread {
560- finishActMode()
472+ ensureBackgroundThread {
473+ val sourceFoldersToCheck = HashSet <String >()
474+
475+ files.forEach { sourceFileDir ->
476+ val sourcePath = sourceFileDir.path
477+
478+ if (activity.getDoesFilePathExist(sourcePath)) {
479+ activity.deleteFile(sourceFileDir, true ) {
480+ val parentPath = sourcePath.getParentPath()
481+ if (parentPath.isNotEmpty()) {
482+ sourceFoldersToCheck.add(parentPath)
561483 }
562484 }
563- } else {
564- listener?.refreshFragment()
565- finishActMode()
566485 }
567486 }
487+
488+ sourceFoldersToCheck.forEach { folderPath ->
489+ checkAndDeleteEmptyFolder(folderPath)
490+ }
491+
492+ activity.runOnUiThread {
493+ listener?.refreshFragment()
494+ finishActMode()
495+ }
568496 }
569497 } else {
570498 listener?.refreshFragment()
@@ -575,6 +503,26 @@ class ItemsAdapter(
575503 }
576504 }
577505
506+ private fun checkAndDeleteEmptyFolder (folderPath : String ) {
507+ if (! activity.getDoesFilePathExist(folderPath) || ! activity.getIsPathDirectory(folderPath)) {
508+ return
509+ }
510+
511+ val folder = File (folderPath)
512+ val contents = folder.listFiles()
513+
514+ if (contents == null || contents.isEmpty()) {
515+ val parentPath = folderPath.getParentPath()
516+ val folderItem = folder.toFileDirItem(activity)
517+
518+ activity.deleteFile(folderItem, true ) {
519+ if (parentPath.isNotEmpty()) {
520+ checkAndDeleteEmptyFolder(parentPath)
521+ }
522+ }
523+ }
524+ }
525+
578526 private fun copyMoveRootItems (
579527 files : ArrayList <FileDirItem >,
580528 destinationPath : String ,
0 commit comments