From c8445fb7116d8ef0be1a3e396e5296354054f099 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 5 Aug 2021 12:46:40 +0200 Subject: [PATCH] Delete nodes with viewmodel --- .../keepass/activities/GroupActivity.kt | 1 - .../dialogs/DeleteNodesDialogFragment.kt | 59 +++---------------- .../dialogs/EmptyRecycleBinDialogFragment.kt | 10 ---- .../activities/lock/LockingActivity.kt | 18 ++++-- .../keepass/viewmodels/NodesViewModel.kt | 24 ++++++++ 5 files changed, 44 insertions(+), 68 deletions(-) create mode 100644 app/src/main/java/com/kunzisoft/keepass/viewmodels/NodesViewModel.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt index a662db609..7690ed529 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -86,7 +86,6 @@ class GroupActivity : LockingActivity(), TimePickerDialog.OnTimeSetListener, GroupFragment.NodeClickListener, GroupFragment.NodesActionMenuListener, - DeleteNodesDialogFragment.DeleteNodeListener, GroupFragment.OnScrollListener, SortDialogFragment.SortSelectionListener { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DeleteNodesDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DeleteNodesDialogFragment.kt index 4fdec2a57..221182772 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DeleteNodesDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DeleteNodesDialogFragment.kt @@ -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 = 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) - } - - companion object { - fun getInstance(nodesToDelete: List): DeleteNodesDialogFragment { - return DeleteNodesDialogFragment().apply { - arguments = getBundleFromListNodes(nodesToDelete) - } - } - } } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/EmptyRecycleBinDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/EmptyRecycleBinDialogFragment.kt index 542e8dcb9..fedf1ece7 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/EmptyRecycleBinDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/EmptyRecycleBinDialogFragment.kt @@ -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): EmptyRecycleBinDialogFragment { - return EmptyRecycleBinDialogFragment().apply { - arguments = getBundleFromListNodes(nodesToDelete) - } - } - } } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt index 4c47ad0fe..94717e81b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt @@ -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) { + private fun permanentlyDeleteNodes(nodes: List) { deleteDatabaseNodes(nodes,!mReadOnly && mAutoSaveEnable) } diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/NodesViewModel.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/NodesViewModel.kt new file mode 100644 index 000000000..538f6ddf4 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/NodesViewModel.kt @@ -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> get() = _nodesToDelete + private val _nodesToDelete = MutableLiveData>() + + val nodesToPermanentlyDelete : LiveData> get() = _nodesToPermanentlyDelete + private val _nodesToPermanentlyDelete = SingleLiveEvent>() + + fun deleteNodes(nodes: List) { + this._nodesToDelete.value = nodes + } + + fun permanentlyDeleteNodes(nodes: List) { + this._nodesToDelete.value = listOf() + this._nodesToPermanentlyDelete.value = nodes + } +} \ No newline at end of file