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