mirror of
https://github.com/SimpleMobileTools/Simple-File-Manager.git
synced 2025-02-17 04:10:39 +01:00
update the Delete process, remove Undo
This commit is contained in:
parent
9da44fbee9
commit
6854890b8e
@ -28,7 +28,7 @@ import kotlinx.android.synthetic.main.list_item.view.*
|
||||
import java.io.File
|
||||
import java.util.*
|
||||
|
||||
class ItemsAdapter(val activity: SimpleActivity, var mItems: List<FileDirItem>, val listener: ItemOperationsListener?, val itemClick: (FileDirItem) -> Unit) :
|
||||
class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDirItem>, val listener: ItemOperationsListener?, val itemClick: (FileDirItem) -> Unit) :
|
||||
RecyclerView.Adapter<ItemsAdapter.ViewHolder>() {
|
||||
val multiSelector = MultiSelector()
|
||||
val views = ArrayList<View>()
|
||||
@ -157,17 +157,37 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: List<FileDirItem>,
|
||||
private fun askConfirmDelete() {
|
||||
ConfirmationDialog(activity) {
|
||||
actMode?.finish()
|
||||
prepareForDeleting()
|
||||
deleteFiles()
|
||||
}
|
||||
}
|
||||
|
||||
private fun prepareForDeleting() {
|
||||
private fun deleteFiles() {
|
||||
val selections = multiSelector.selectedPositions
|
||||
val paths = ArrayList<String>(selections.size)
|
||||
selections.forEach { paths.add(mItems[it].path) }
|
||||
listener?.prepareForDeleting(paths)
|
||||
}
|
||||
val files = ArrayList<File>(selections.size)
|
||||
val removeFiles = ArrayList<FileDirItem>(selections.size)
|
||||
|
||||
var isShowingPermDialog = false
|
||||
activity.runOnUiThread {
|
||||
if (activity.isShowingPermDialog(File(mItems[selections[0]].path))) {
|
||||
isShowingPermDialog = true
|
||||
}
|
||||
}
|
||||
|
||||
if (isShowingPermDialog)
|
||||
return
|
||||
|
||||
selections.reverse()
|
||||
selections.forEach {
|
||||
val file = mItems[it]
|
||||
files.add(File(file.path))
|
||||
removeFiles.add(file)
|
||||
notifyItemRemoved(it)
|
||||
}
|
||||
|
||||
mItems.removeAll(removeFiles)
|
||||
markedItems.clear()
|
||||
listener?.deleteFiles(files)
|
||||
}
|
||||
|
||||
private fun getSelectedMedia(): List<FileDirItem> {
|
||||
val positions = multiSelector.selectedPositions
|
||||
@ -176,7 +196,7 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: List<FileDirItem>,
|
||||
return selectedMedia
|
||||
}
|
||||
|
||||
fun updateItems(newItems: List<FileDirItem>) {
|
||||
fun updateItems(newItems: MutableList<FileDirItem>) {
|
||||
mItems = newItems
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
@ -254,6 +274,6 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: List<FileDirItem>,
|
||||
interface ItemOperationsListener {
|
||||
fun refreshItems()
|
||||
|
||||
fun prepareForDeleting(paths: ArrayList<String>)
|
||||
fun deleteFiles(files: ArrayList<File>)
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,6 @@ import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.os.Parcelable
|
||||
import android.support.design.widget.Snackbar
|
||||
import android.support.v7.widget.LinearLayoutManager
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
@ -28,12 +27,10 @@ import java.util.*
|
||||
|
||||
class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperationsListener {
|
||||
private var mListener: ItemInteractionListener? = null
|
||||
private var mSnackbar: Snackbar? = null
|
||||
private var mStoredTextColor = 0
|
||||
|
||||
lateinit var mItems: List<FileDirItem>
|
||||
lateinit var mItems: ArrayList<FileDirItem>
|
||||
lateinit var mConfig: Config
|
||||
lateinit var mToBeDeleted: MutableList<String>
|
||||
|
||||
private var mShowHidden = false
|
||||
var mPath = ""
|
||||
@ -46,7 +43,6 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat
|
||||
mConfig = context.config
|
||||
mShowHidden = mConfig.showHidden
|
||||
mItems = ArrayList<FileDirItem>()
|
||||
mToBeDeleted = ArrayList<String>()
|
||||
fillItems()
|
||||
|
||||
items_swipe_refresh.setOnRefreshListener({ fillItems() })
|
||||
@ -69,7 +65,6 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
deleteItems()
|
||||
mStoredTextColor = context.config.textColor
|
||||
}
|
||||
|
||||
@ -93,7 +88,6 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat
|
||||
items_list.apply {
|
||||
this@apply.adapter = adapter
|
||||
addItemDecoration(RecyclerViewDivider(context))
|
||||
setOnTouchListener { view, motionEvent -> checkDelete(); false }
|
||||
}
|
||||
} else {
|
||||
val state = (items_list.layoutManager as LinearLayoutManager).onSaveInstanceState()
|
||||
@ -112,7 +106,7 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat
|
||||
mListener = listener
|
||||
}
|
||||
|
||||
private fun getItems(path: String): List<FileDirItem> {
|
||||
private fun getItems(path: String): ArrayList<FileDirItem> {
|
||||
val items = ArrayList<FileDirItem>()
|
||||
val files = File(path).listFiles()
|
||||
if (files != null) {
|
||||
@ -122,9 +116,6 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat
|
||||
if (!mShowHidden && curName.startsWith("."))
|
||||
continue
|
||||
|
||||
if (mToBeDeleted.contains(curPath))
|
||||
continue
|
||||
|
||||
val children = getChildren(file)
|
||||
val size = file.length()
|
||||
|
||||
@ -197,69 +188,42 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat
|
||||
return "$type/*"
|
||||
}
|
||||
|
||||
override fun prepareForDeleting(paths: ArrayList<String>) {
|
||||
mToBeDeleted = paths
|
||||
val deletedCnt = mToBeDeleted.size
|
||||
|
||||
if ((activity as SimpleActivity).isShowingPermDialog(File(mToBeDeleted[0])))
|
||||
override fun deleteFiles(files: ArrayList<File>) {
|
||||
val act = activity as SimpleActivity
|
||||
if (act.isShowingPermDialog(files[0])) {
|
||||
return
|
||||
|
||||
notifyDeletion(deletedCnt)
|
||||
}
|
||||
|
||||
private fun notifyDeletion(cnt: Int) {
|
||||
val res = resources
|
||||
/*val msg = res.getQuantityString(R.plurals.items_deleted, cnt, cnt)
|
||||
mSnackbar = Snackbar.make(items_holder, msg, Snackbar.LENGTH_INDEFINITE)
|
||||
mSnackbar!!.apply {
|
||||
setAction(res.getString(R.string.undo), undoDeletion)
|
||||
setActionTextColor(Color.WHITE)
|
||||
show()
|
||||
}
|
||||
fillItems()*/
|
||||
|
||||
Thread({
|
||||
var hadSuccess = false
|
||||
files.forEach {
|
||||
if (it.isDirectory) {
|
||||
for (child in it.listFiles()) {
|
||||
deleteFile(child, act)
|
||||
}
|
||||
}
|
||||
if (deleteFile(it, act)) {
|
||||
hadSuccess = true
|
||||
context.deleteFromMediaStore(it)
|
||||
}
|
||||
}
|
||||
if (!hadSuccess)
|
||||
act.runOnUiThread {
|
||||
act.toast(R.string.unknown_error_occurred)
|
||||
}
|
||||
}).start()
|
||||
}
|
||||
|
||||
fun checkDelete() {
|
||||
if (mSnackbar?.isShown == true) {
|
||||
deleteItems()
|
||||
}
|
||||
}
|
||||
|
||||
private fun deleteItems() {
|
||||
if (mToBeDeleted.isEmpty())
|
||||
return
|
||||
|
||||
mSnackbar?.dismiss()
|
||||
mToBeDeleted
|
||||
.map(::File)
|
||||
.filter(File::exists)
|
||||
.forEach { deleteItem(it) }
|
||||
|
||||
mToBeDeleted.clear()
|
||||
}
|
||||
|
||||
private fun deleteItem(item: File) {
|
||||
if (item.isDirectory) {
|
||||
for (child in item.listFiles()) {
|
||||
deleteItem(child)
|
||||
private fun deleteFile(file: File, act: SimpleActivity): Boolean {
|
||||
if (file.delete() || act.tryFastDocumentDelete(file)) {
|
||||
return true
|
||||
} else {
|
||||
val document = act.getFileDocument(file.absolutePath, context.config.treeUri) ?: return false
|
||||
if (document.isFile && document.delete()) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
if (context.needsStupidWritePermissions(item.absolutePath)) {
|
||||
val document = context.getFileDocument(item.absolutePath, mConfig.treeUri) ?: return
|
||||
|
||||
// double check we have the uri to the proper file path, not some parent folder
|
||||
if (document.uri.toString().endsWith(item.absolutePath.getFilenameFromPath()))
|
||||
document.delete()
|
||||
} else {
|
||||
item.delete()
|
||||
}
|
||||
}
|
||||
|
||||
private val undoDeletion = View.OnClickListener {
|
||||
mToBeDeleted.clear()
|
||||
mSnackbar!!.dismiss()
|
||||
fillItems()
|
||||
return false
|
||||
}
|
||||
|
||||
override fun refreshItems() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user