parent
cef6cc966c
commit
91c9973ee0
@ -0,0 +1,73 @@ |
|||||||
|
package net.pokeranalytics.android.ui.fragment |
||||||
|
|
||||||
|
import androidx.appcompat.app.AlertDialog |
||||||
|
import com.google.android.material.snackbar.Snackbar |
||||||
|
import io.realm.RealmObject |
||||||
|
import kotlinx.android.synthetic.main.fragment_data_list.* |
||||||
|
import net.pokeranalytics.android.R |
||||||
|
import net.pokeranalytics.android.model.interfaces.Deletable |
||||||
|
import net.pokeranalytics.android.model.interfaces.Identifiable |
||||||
|
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter |
||||||
|
import net.pokeranalytics.android.ui.fragment.components.RealmFragment |
||||||
|
|
||||||
|
open class DeletableItemFragment : RealmFragment() { |
||||||
|
|
||||||
|
private var deletedItem: RealmObject? = null |
||||||
|
private var lastDeletedItemPosition: Int = 0 |
||||||
|
|
||||||
|
/** |
||||||
|
* Delete item |
||||||
|
*/ |
||||||
|
fun deleteItem(dataListAdapter: RowRepresentableAdapter, items: List<*>, itemId: String) { |
||||||
|
|
||||||
|
if (isDetached || activity == null) { |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
// Save the delete position & create a copy of the object |
||||||
|
val itemPosition = items.indexOfFirst { (it as Identifiable).id == itemId } |
||||||
|
val itemToDelete = items.find { (it as Identifiable).id == itemId } |
||||||
|
|
||||||
|
if (itemToDelete is RealmObject && itemPosition != -1) { |
||||||
|
|
||||||
|
val deletableItem = (itemToDelete as Deletable) |
||||||
|
|
||||||
|
// Check if the object is valid for the deletion |
||||||
|
if (deletableItem.isValidForDelete(this.getRealm())) { |
||||||
|
deletedItem = getRealm().copyFromRealm(itemToDelete) |
||||||
|
lastDeletedItemPosition = itemPosition |
||||||
|
getRealm().executeTransaction { |
||||||
|
itemToDelete.deleteFromRealm() |
||||||
|
} |
||||||
|
dataListAdapter.notifyItemRemoved(itemPosition) |
||||||
|
showUndoSnackBar(dataListAdapter) |
||||||
|
} else { |
||||||
|
dataListAdapter.notifyItemChanged(itemPosition) |
||||||
|
val status = deletableItem.getDeleteStatus(this.getRealm()) |
||||||
|
val message = deletableItem.getFailedDeleteMessage(status) |
||||||
|
val builder = AlertDialog.Builder(requireContext()) |
||||||
|
.setMessage(message) |
||||||
|
.setNegativeButton(R.string.ok, null) |
||||||
|
builder.show() |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Show undo snack bar |
||||||
|
*/ |
||||||
|
private fun showUndoSnackBar(dataListAdapter: RowRepresentableAdapter) { |
||||||
|
val message = String.format(getString(R.string.data_deleted)) |
||||||
|
val snackBar = Snackbar.make(constraintLayout, message, Snackbar.LENGTH_INDEFINITE) |
||||||
|
snackBar.setAction(R.string.cancel) { |
||||||
|
getRealm().executeTransaction { realm -> |
||||||
|
deletedItem?.let { |
||||||
|
realm.copyToRealmOrUpdate(it) |
||||||
|
dataListAdapter.notifyItemInserted(lastDeletedItemPosition) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
snackBar.show() |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
Loading…
Reference in new issue