mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Delete nodes with viewmodel
This commit is contained in:
@@ -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 {
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user