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, TimePickerDialog.OnTimeSetListener,
GroupFragment.NodeClickListener, GroupFragment.NodeClickListener,
GroupFragment.NodesActionMenuListener, GroupFragment.NodesActionMenuListener,
DeleteNodesDialogFragment.DeleteNodeListener,
GroupFragment.OnScrollListener, GroupFragment.OnScrollListener,
SortDialogFragment.SortSelectionListener { SortDialogFragment.SortSelectionListener {

View File

@@ -20,63 +20,35 @@
package com.kunzisoft.keepass.activities.dialogs package com.kunzisoft.keepass.activities.dialogs
import android.app.Dialog import android.app.Dialog
import android.content.Context
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.element.node.Node import com.kunzisoft.keepass.database.element.node.Node
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService import com.kunzisoft.keepass.viewmodels.NodesViewModel
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.getBundleFromListNodes
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.getListNodesFromBundle
open class DeleteNodesDialogFragment : DialogFragment() { open class DeleteNodesDialogFragment : DialogFragment() {
private var mNodesToDelete: List<Node> = ArrayList() private var mNodesToDelete: List<Node> = ArrayList()
private var mListener: DeleteNodeListener? = null private val mNodesViewModel: NodesViewModel by activityViewModels()
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()
}
protected open fun retrieveMessage(): String { protected open fun retrieveMessage(): String {
return getString(R.string.warning_permanently_delete_nodes) return getString(R.string.warning_permanently_delete_nodes)
} }
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
mNodesViewModel.nodesToDelete.observe(this) {
arguments?.apply { this.mNodesToDelete = it
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)
}
} }
activity?.let { activity -> activity?.let { activity ->
// Use the Builder class for convenient dialog construction // Use the Builder class for convenient dialog construction
val builder = AlertDialog.Builder(activity) val builder = AlertDialog.Builder(activity)
builder.setMessage(retrieveMessage()) builder.setMessage(retrieveMessage())
builder.setPositiveButton(android.R.string.ok) { _, _ -> builder.setPositiveButton(android.R.string.ok) { _, _ ->
mListener?.permanentlyDeleteNodes(mNodesToDelete) mNodesViewModel.permanentlyDeleteNodes(mNodesToDelete)
} }
builder.setNegativeButton(android.R.string.cancel) { _, _ -> dismiss() } builder.setNegativeButton(android.R.string.cancel) { _, _ -> dismiss() }
// Create the AlertDialog object and return it // Create the AlertDialog object and return it
@@ -84,21 +56,4 @@ open class DeleteNodesDialogFragment : DialogFragment() {
} }
return super.onCreateDialog(savedInstanceState) 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 package com.kunzisoft.keepass.activities.dialogs
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.database.element.node.Node
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.getBundleFromListNodes
class EmptyRecycleBinDialogFragment : DeleteNodesDialogFragment() { class EmptyRecycleBinDialogFragment : DeleteNodesDialogFragment() {
override fun retrieveMessage(): String { override fun retrieveMessage(): String {
return getString(R.string.warning_empty_recycle_bin) 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.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.activity.viewModels
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.DeleteNodesDialogFragment import com.kunzisoft.keepass.activities.dialogs.DeleteNodesDialogFragment
import com.kunzisoft.keepass.activities.dialogs.EmptyRecycleBinDialogFragment 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.tasks.ActionRunnable
import com.kunzisoft.keepass.timeout.TimeoutHelper import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.* import com.kunzisoft.keepass.utils.*
import com.kunzisoft.keepass.viewmodels.NodesViewModel
import java.util.* import java.util.*
abstract class LockingActivity : SpecialModeActivity(), abstract class LockingActivity : SpecialModeActivity(),
PasswordEncodingDialogFragment.Listener, PasswordEncodingDialogFragment.Listener {
DeleteNodesDialogFragment.DeleteNodeListener {
private val mNodesViewModel: NodesViewModel by viewModels()
protected var mTimeoutEnable: Boolean = true protected var mTimeoutEnable: Boolean = true
@@ -88,6 +91,10 @@ abstract class LockingActivity : SpecialModeActivity(),
intent.getBooleanExtra(TIMEOUT_ENABLE_KEY, TIMEOUT_ENABLE_KEY_DEFAULT) intent.getBooleanExtra(TIMEOUT_ENABLE_KEY, TIMEOUT_ENABLE_KEY_DEFAULT)
} }
mNodesViewModel.nodesToPermanentlyDelete.observe(this) { nodes ->
permanentlyDeleteNodes(nodes)
}
mExitLock = false mExitLock = false
} }
@@ -219,16 +226,17 @@ abstract class LockingActivity : SpecialModeActivity(),
else { else {
val deleteNodesDialogFragment: DeleteNodesDialogFragment = val deleteNodesDialogFragment: DeleteNodesDialogFragment =
if (recycleBin) { if (recycleBin) {
EmptyRecycleBinDialogFragment.getInstance(nodes) EmptyRecycleBinDialogFragment()
} else { } else {
DeleteNodesDialogFragment.getInstance(nodes) DeleteNodesDialogFragment()
} }
deleteNodesDialogFragment.show(supportFragmentManager, "deleteNodesDialogFragment") deleteNodesDialogFragment.show(supportFragmentManager, "deleteNodesDialogFragment")
mNodesViewModel.deleteNodes(nodes)
} }
} }
} }
override fun permanentlyDeleteNodes(nodes: List<Node>) { private fun permanentlyDeleteNodes(nodes: List<Node>) {
deleteDatabaseNodes(nodes,!mReadOnly && mAutoSaveEnable) 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
}
}