Delete nodes with viewmodel

This commit is contained in:
J-Jamet
2021-08-05 12:46:40 +02:00
parent 7c0e7347c8
commit c8445fb711
5 changed files with 44 additions and 68 deletions

View File

@@ -86,7 +86,6 @@ class GroupActivity : LockingActivity(),
TimePickerDialog.OnTimeSetListener,
GroupFragment.NodeClickListener,
GroupFragment.NodesActionMenuListener,
DeleteNodesDialogFragment.DeleteNodeListener,
GroupFragment.OnScrollListener,
SortDialogFragment.SortSelectionListener {

View File

@@ -20,63 +20,35 @@
package com.kunzisoft.keepass.activities.dialogs
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.element.node.Node
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.getBundleFromListNodes
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.getListNodesFromBundle
import com.kunzisoft.keepass.viewmodels.NodesViewModel
open class DeleteNodesDialogFragment : DialogFragment() {
private var mNodesToDelete: List<Node> = ArrayList()
private var mListener: DeleteNodeListener? = null
override fun onAttach(context: Context) {
super.onAttach(context)
try {
mListener = context as DeleteNodeListener
} catch (e: ClassCastException) {
throw ClassCastException(context.toString()
+ " must implement " + DeleteNodeListener::class.java.name)
}
}
override fun onDetach() {
mListener = null
super.onDetach()
}
private val mNodesViewModel: NodesViewModel by activityViewModels()
protected open fun retrieveMessage(): String {
return getString(R.string.warning_permanently_delete_nodes)
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
arguments?.apply {
if (containsKey(DatabaseTaskNotificationService.GROUPS_ID_KEY)
&& containsKey(DatabaseTaskNotificationService.ENTRIES_ID_KEY)) {
// TODO Database
mNodesToDelete = getListNodesFromBundle(Database.getInstance(), this)
}
} ?: savedInstanceState?.apply {
if (containsKey(DatabaseTaskNotificationService.GROUPS_ID_KEY)
&& containsKey(DatabaseTaskNotificationService.ENTRIES_ID_KEY)) {
// TODO Database
mNodesToDelete = getListNodesFromBundle(Database.getInstance(), savedInstanceState)
}
mNodesViewModel.nodesToDelete.observe(this) {
this.mNodesToDelete = it
}
activity?.let { activity ->
// Use the Builder class for convenient dialog construction
val builder = AlertDialog.Builder(activity)
builder.setMessage(retrieveMessage())
builder.setPositiveButton(android.R.string.ok) { _, _ ->
mListener?.permanentlyDeleteNodes(mNodesToDelete)
mNodesViewModel.permanentlyDeleteNodes(mNodesToDelete)
}
builder.setNegativeButton(android.R.string.cancel) { _, _ -> dismiss() }
// Create the AlertDialog object and return it
@@ -84,21 +56,4 @@ open class DeleteNodesDialogFragment : DialogFragment() {
}
return super.onCreateDialog(savedInstanceState)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putAll(getBundleFromListNodes(mNodesToDelete))
}
interface DeleteNodeListener {
fun permanentlyDeleteNodes(nodes: List<Node>)
}
companion object {
fun getInstance(nodesToDelete: List<Node>): DeleteNodesDialogFragment {
return DeleteNodesDialogFragment().apply {
arguments = getBundleFromListNodes(nodesToDelete)
}
}
}
}

View File

@@ -20,20 +20,10 @@
package com.kunzisoft.keepass.activities.dialogs
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.node.Node
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.getBundleFromListNodes
class EmptyRecycleBinDialogFragment : DeleteNodesDialogFragment() {
override fun retrieveMessage(): String {
return getString(R.string.warning_empty_recycle_bin)
}
companion object {
fun getInstance(nodesToDelete: List<Node>): EmptyRecycleBinDialogFragment {
return EmptyRecycleBinDialogFragment().apply {
arguments = getBundleFromListNodes(nodesToDelete)
}
}
}
}

View File

@@ -28,6 +28,7 @@ import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.activity.viewModels
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.DeleteNodesDialogFragment
import com.kunzisoft.keepass.activities.dialogs.EmptyRecycleBinDialogFragment
@@ -49,11 +50,13 @@ import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.*
import com.kunzisoft.keepass.viewmodels.NodesViewModel
import java.util.*
abstract class LockingActivity : SpecialModeActivity(),
PasswordEncodingDialogFragment.Listener,
DeleteNodesDialogFragment.DeleteNodeListener {
PasswordEncodingDialogFragment.Listener {
private val mNodesViewModel: NodesViewModel by viewModels()
protected var mTimeoutEnable: Boolean = true
@@ -88,6 +91,10 @@ abstract class LockingActivity : SpecialModeActivity(),
intent.getBooleanExtra(TIMEOUT_ENABLE_KEY, TIMEOUT_ENABLE_KEY_DEFAULT)
}
mNodesViewModel.nodesToPermanentlyDelete.observe(this) { nodes ->
permanentlyDeleteNodes(nodes)
}
mExitLock = false
}
@@ -219,16 +226,17 @@ abstract class LockingActivity : SpecialModeActivity(),
else {
val deleteNodesDialogFragment: DeleteNodesDialogFragment =
if (recycleBin) {
EmptyRecycleBinDialogFragment.getInstance(nodes)
EmptyRecycleBinDialogFragment()
} else {
DeleteNodesDialogFragment.getInstance(nodes)
DeleteNodesDialogFragment()
}
deleteNodesDialogFragment.show(supportFragmentManager, "deleteNodesDialogFragment")
mNodesViewModel.deleteNodes(nodes)
}
}
}
override fun permanentlyDeleteNodes(nodes: List<Node>) {
private fun permanentlyDeleteNodes(nodes: List<Node>) {
deleteDatabaseNodes(nodes,!mReadOnly && mAutoSaveEnable)
}

View File

@@ -0,0 +1,24 @@
package com.kunzisoft.keepass.viewmodels
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.kunzisoft.keepass.database.element.node.Node
class NodesViewModel: ViewModel() {
val nodesToDelete : LiveData<List<Node>> get() = _nodesToDelete
private val _nodesToDelete = MutableLiveData<List<Node>>()
val nodesToPermanentlyDelete : LiveData<List<Node>> get() = _nodesToPermanentlyDelete
private val _nodesToPermanentlyDelete = SingleLiveEvent<List<Node>>()
fun deleteNodes(nodes: List<Node>) {
this._nodesToDelete.value = nodes
}
fun permanentlyDeleteNodes(nodes: List<Node>) {
this._nodesToDelete.value = listOf()
this._nodesToPermanentlyDelete.value = nodes
}
}