Skip to content

Commit 6854890

Browse files
committed
update the Delete process, remove Undo
1 parent 9da44fb commit 6854890

File tree

2 files changed

+60
-76
lines changed

2 files changed

+60
-76
lines changed

app/src/main/kotlin/com/simplemobiletools/filemanager/adapters/ItemsAdapter.kt

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import kotlinx.android.synthetic.main.list_item.view.*
2828
import java.io.File
2929
import java.util.*
3030

31-
class ItemsAdapter(val activity: SimpleActivity, var mItems: List<FileDirItem>, val listener: ItemOperationsListener?, val itemClick: (FileDirItem) -> Unit) :
31+
class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList<FileDirItem>, val listener: ItemOperationsListener?, val itemClick: (FileDirItem) -> Unit) :
3232
RecyclerView.Adapter<ItemsAdapter.ViewHolder>() {
3333
val multiSelector = MultiSelector()
3434
val views = ArrayList<View>()
@@ -157,17 +157,37 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: List<FileDirItem>,
157157
private fun askConfirmDelete() {
158158
ConfirmationDialog(activity) {
159159
actMode?.finish()
160-
prepareForDeleting()
160+
deleteFiles()
161161
}
162162
}
163163

164-
private fun prepareForDeleting() {
164+
private fun deleteFiles() {
165165
val selections = multiSelector.selectedPositions
166-
val paths = ArrayList<String>(selections.size)
167-
selections.forEach { paths.add(mItems[it].path) }
168-
listener?.prepareForDeleting(paths)
169-
}
166+
val files = ArrayList<File>(selections.size)
167+
val removeFiles = ArrayList<FileDirItem>(selections.size)
170168

169+
var isShowingPermDialog = false
170+
activity.runOnUiThread {
171+
if (activity.isShowingPermDialog(File(mItems[selections[0]].path))) {
172+
isShowingPermDialog = true
173+
}
174+
}
175+
176+
if (isShowingPermDialog)
177+
return
178+
179+
selections.reverse()
180+
selections.forEach {
181+
val file = mItems[it]
182+
files.add(File(file.path))
183+
removeFiles.add(file)
184+
notifyItemRemoved(it)
185+
}
186+
187+
mItems.removeAll(removeFiles)
188+
markedItems.clear()
189+
listener?.deleteFiles(files)
190+
}
171191

172192
private fun getSelectedMedia(): List<FileDirItem> {
173193
val positions = multiSelector.selectedPositions
@@ -176,7 +196,7 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: List<FileDirItem>,
176196
return selectedMedia
177197
}
178198

179-
fun updateItems(newItems: List<FileDirItem>) {
199+
fun updateItems(newItems: MutableList<FileDirItem>) {
180200
mItems = newItems
181201
notifyDataSetChanged()
182202
}
@@ -254,6 +274,6 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: List<FileDirItem>,
254274
interface ItemOperationsListener {
255275
fun refreshItems()
256276

257-
fun prepareForDeleting(paths: ArrayList<String>)
277+
fun deleteFiles(files: ArrayList<File>)
258278
}
259279
}

app/src/main/kotlin/com/simplemobiletools/filemanager/fragments/ItemsFragment.kt

Lines changed: 31 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import android.content.Intent
55
import android.net.Uri
66
import android.os.Bundle
77
import android.os.Parcelable
8-
import android.support.design.widget.Snackbar
98
import android.support.v7.widget.LinearLayoutManager
109
import android.view.LayoutInflater
1110
import android.view.View
@@ -28,12 +27,10 @@ import java.util.*
2827

2928
class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperationsListener {
3029
private var mListener: ItemInteractionListener? = null
31-
private var mSnackbar: Snackbar? = null
3230
private var mStoredTextColor = 0
3331

34-
lateinit var mItems: List<FileDirItem>
32+
lateinit var mItems: ArrayList<FileDirItem>
3533
lateinit var mConfig: Config
36-
lateinit var mToBeDeleted: MutableList<String>
3734

3835
private var mShowHidden = false
3936
var mPath = ""
@@ -46,7 +43,6 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat
4643
mConfig = context.config
4744
mShowHidden = mConfig.showHidden
4845
mItems = ArrayList<FileDirItem>()
49-
mToBeDeleted = ArrayList<String>()
5046
fillItems()
5147

5248
items_swipe_refresh.setOnRefreshListener({ fillItems() })
@@ -69,7 +65,6 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat
6965

7066
override fun onPause() {
7167
super.onPause()
72-
deleteItems()
7368
mStoredTextColor = context.config.textColor
7469
}
7570

@@ -93,7 +88,6 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat
9388
items_list.apply {
9489
this@apply.adapter = adapter
9590
addItemDecoration(RecyclerViewDivider(context))
96-
setOnTouchListener { view, motionEvent -> checkDelete(); false }
9791
}
9892
} else {
9993
val state = (items_list.layoutManager as LinearLayoutManager).onSaveInstanceState()
@@ -112,7 +106,7 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat
112106
mListener = listener
113107
}
114108

115-
private fun getItems(path: String): List<FileDirItem> {
109+
private fun getItems(path: String): ArrayList<FileDirItem> {
116110
val items = ArrayList<FileDirItem>()
117111
val files = File(path).listFiles()
118112
if (files != null) {
@@ -122,9 +116,6 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat
122116
if (!mShowHidden && curName.startsWith("."))
123117
continue
124118

125-
if (mToBeDeleted.contains(curPath))
126-
continue
127-
128119
val children = getChildren(file)
129120
val size = file.length()
130121

@@ -197,69 +188,42 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat
197188
return "$type/*"
198189
}
199190

200-
override fun prepareForDeleting(paths: ArrayList<String>) {
201-
mToBeDeleted = paths
202-
val deletedCnt = mToBeDeleted.size
203-
204-
if ((activity as SimpleActivity).isShowingPermDialog(File(mToBeDeleted[0])))
191+
override fun deleteFiles(files: ArrayList<File>) {
192+
val act = activity as SimpleActivity
193+
if (act.isShowingPermDialog(files[0])) {
205194
return
206-
207-
notifyDeletion(deletedCnt)
208-
}
209-
210-
private fun notifyDeletion(cnt: Int) {
211-
val res = resources
212-
/*val msg = res.getQuantityString(R.plurals.items_deleted, cnt, cnt)
213-
mSnackbar = Snackbar.make(items_holder, msg, Snackbar.LENGTH_INDEFINITE)
214-
mSnackbar!!.apply {
215-
setAction(res.getString(R.string.undo), undoDeletion)
216-
setActionTextColor(Color.WHITE)
217-
show()
218-
}
219-
fillItems()*/
220-
}
221-
222-
fun checkDelete() {
223-
if (mSnackbar?.isShown == true) {
224-
deleteItems()
225195
}
226-
}
227196

228-
private fun deleteItems() {
229-
if (mToBeDeleted.isEmpty())
230-
return
231-
232-
mSnackbar?.dismiss()
233-
mToBeDeleted
234-
.map(::File)
235-
.filter(File::exists)
236-
.forEach { deleteItem(it) }
237-
238-
mToBeDeleted.clear()
239-
}
240-
241-
private fun deleteItem(item: File) {
242-
if (item.isDirectory) {
243-
for (child in item.listFiles()) {
244-
deleteItem(child)
197+
Thread({
198+
var hadSuccess = false
199+
files.forEach {
200+
if (it.isDirectory) {
201+
for (child in it.listFiles()) {
202+
deleteFile(child, act)
203+
}
204+
}
205+
if (deleteFile(it, act)) {
206+
hadSuccess = true
207+
context.deleteFromMediaStore(it)
208+
}
245209
}
246-
}
247-
248-
if (context.needsStupidWritePermissions(item.absolutePath)) {
249-
val document = context.getFileDocument(item.absolutePath, mConfig.treeUri) ?: return
210+
if (!hadSuccess)
211+
act.runOnUiThread {
212+
act.toast(R.string.unknown_error_occurred)
213+
}
214+
}).start()
215+
}
250216

251-
// double check we have the uri to the proper file path, not some parent folder
252-
if (document.uri.toString().endsWith(item.absolutePath.getFilenameFromPath()))
253-
document.delete()
217+
private fun deleteFile(file: File, act: SimpleActivity): Boolean {
218+
if (file.delete() || act.tryFastDocumentDelete(file)) {
219+
return true
254220
} else {
255-
item.delete()
221+
val document = act.getFileDocument(file.absolutePath, context.config.treeUri) ?: return false
222+
if (document.isFile && document.delete()) {
223+
return true
224+
}
256225
}
257-
}
258-
259-
private val undoDeletion = View.OnClickListener {
260-
mToBeDeleted.clear()
261-
mSnackbar!!.dismiss()
262-
fillItems()
226+
return false
263227
}
264228

265229
override fun refreshItems() {

0 commit comments

Comments
 (0)