diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt index 54119d48..d28884f8 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/DataListActivity.kt @@ -11,6 +11,7 @@ import net.pokeranalytics.android.ui.fragment.DataListFragment class DataListActivity : PokerAnalyticsActivity() { enum class IntentKey(val keyName: String) { DATA_TYPE("DATA_TYPE"), + ITEM_DELETED("ITEM_DELETED") } companion object { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index 2127315e..cd37e9d7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -1,5 +1,7 @@ package net.pokeranalytics.android.ui.fragment +import android.app.Activity +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -11,9 +13,14 @@ import com.google.android.material.snackbar.Snackbar import io.realm.RealmObject import io.realm.RealmResults import kotlinx.android.synthetic.main.fragment_data_list.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.Identifiable +import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource @@ -28,12 +35,17 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.SettingRow class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { + companion object { + const val REQUEST_CODE_DETAILS = 1000 + } + private lateinit var dataType: SettingRow private lateinit var items: RealmResults<*> private lateinit var dataListAdapter: RowRepresentableAdapter private var deletedItem: RealmObject? = null private var lastDeletedItemPosition: Int = 0 + private var lastItemClickedPosition: Int = 0 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_data_list, container, false) @@ -44,6 +56,19 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc initUI() } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == REQUEST_CODE_DETAILS && resultCode == Activity.RESULT_OK) { + val needToDeleteItem = data?.getBooleanExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, false) ?: false + if (needToDeleteItem) { + GlobalScope.launch(Dispatchers.Main) { + delay(300) + deleteItem(lastItemClickedPosition) + } + } + } + } + override fun onResume() { super.onResume() this.recyclerView?.adapter?.notifyDataSetChanged() @@ -68,10 +93,12 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { this.dataType.relatedResultsRepresentable?.let { - EditableDataActivity.newInstance( - requireContext(), + lastItemClickedPosition = position + EditableDataActivity.newInstanceForResult( + this, it.ordinal, - (row as Identifiable).id + (row as Identifiable).id, + REQUEST_CODE_DETAILS ) } } @@ -94,29 +121,7 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc dataListAdapter = RowRepresentableAdapter(this, this) val swipeToDelete = SwipeToDeleteCallback(dataListAdapter) { position -> - - // Save the delete position & create a copy of the object - val mRecentlyDeletedItem = rowRepresentableForPosition(position) - lastDeletedItemPosition = position - - if (mRecentlyDeletedItem is RealmObject) { - - // Check if the object is valid for the deletion - if ((mRecentlyDeletedItem as Deletable).isValidForDelete(this.getRealm())) { - deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem) - getRealm().executeTransaction { - mRecentlyDeletedItem.deleteFromRealm() - } - dataListAdapter.notifyItemRemoved(position) - showUndoSnackBar() - } else { - dataListAdapter.notifyItemChanged(position) - val builder = AlertDialog.Builder(requireContext()) - .setMessage((mRecentlyDeletedItem as Deletable).getFailedDeleteMessage()) - .setNegativeButton(R.string.ok, null) - builder.show() - } - } + deleteItem(position) } val itemTouchHelper = ItemTouchHelper(swipeToDelete) @@ -139,6 +144,39 @@ class DataListFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSourc } } + /** + * Delete item + */ + private fun deleteItem(position: Int) { + + if (isDetached || activity == null) { + return + } + + // Save the delete position & create a copy of the object + val mRecentlyDeletedItem = rowRepresentableForPosition(position) + lastDeletedItemPosition = position + + if (mRecentlyDeletedItem is RealmObject) { + + // Check if the object is valid for the deletion + if ((mRecentlyDeletedItem as Deletable).isValidForDelete(this.getRealm())) { + deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem) + getRealm().executeTransaction { + mRecentlyDeletedItem.deleteFromRealm() + } + dataListAdapter.notifyItemRemoved(position) + showUndoSnackBar() + } else { + dataListAdapter.notifyItemChanged(position) + val builder = AlertDialog.Builder(requireContext()) + .setMessage((mRecentlyDeletedItem as Deletable).getFailedDeleteMessage()) + .setNegativeButton(R.string.ok, null) + builder.show() + } + } + } + /** * Show undo snack bar */ diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt index 9a07a96d..44e8b118 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/EditableDataFragment.kt @@ -16,6 +16,7 @@ import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.interfaces.Editable import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.model.interfaces.SaveValidityStatus +import net.pokeranalytics.android.ui.activity.DataListActivity import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -185,27 +186,22 @@ open class EditableDataFragment : PokerAnalyticsFragment(), RowRepresentableDele * Delete data */ private fun deleteData() { - val builder = AlertDialog.Builder(requireContext()) - builder - .setMessage(R.string.are_you_sure_you_want_to_delete) - .setNegativeButton(R.string.cancel, null) - .setPositiveButton(R.string.yes) { _, _ -> - val deletable = this.item as Deletable - val realm = this.getRealm() - if (deletable.isValidForDelete(realm)) { - realm.executeTransaction { - this.liveDataType.deleteData(it, deletable) - } - this.activity?.finish() - } else { - val message = deletable.getFailedDeleteMessage() - val builder = AlertDialog.Builder(requireContext()) - .setMessage(message) - .setNegativeButton(R.string.ok, null) - builder.show() - } - } - builder.show() + + val deletable = this.item as Deletable + val realm = this.getRealm() + + if (deletable.isValidForDelete(realm)) { + val intent = Intent() + intent.putExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, true) + activity?.setResult(RESULT_OK, intent) + activity?.finish() + } else { + val message = deletable.getFailedDeleteMessage() + val builder = AlertDialog.Builder(requireContext()) + .setMessage(message) + .setNegativeButton(R.string.ok, null) + builder.show() + } } /**