From 43207b316f1a570e571f7a254e453cd982a52d66 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Fri, 30 Jul 2021 23:00:28 +0200 Subject: [PATCH] Fix entry history --- .../keepass/activities/EntryActivity.kt | 72 +++++---- .../keepass/activities/EntryEditActivity.kt | 8 +- .../keepass/activities/GroupActivity.kt | 2 +- .../activities/fragments/ListNodesFragment.kt | 7 +- .../activities/lock/LockingActivity.kt | 14 +- .../activities/selection/DatabaseActivity.kt | 10 +- .../database/action/DatabaseTaskProvider.kt | 8 +- .../keepass/viewmodels/EntryViewModel.kt | 151 +++++++++--------- 8 files changed, 145 insertions(+), 127 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt index 25d3fc9e4..d4e74fbac 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt @@ -81,8 +81,10 @@ class EntryActivity : LockingActivity() { private val mEntryViewModel: EntryViewModel by viewModels() - private var mEntryId: NodeId? = null + private var mMainEntryId: NodeId? = null private var mHistoryPosition: Int = -1 + private var mEntryIsHistory: Boolean = false + private var mUrl: String? = null private var mAttachmentFileBinderManager: AttachmentFileBinderManager? = null private var mAttachmentsToDownload: HashMap = HashMap() @@ -122,7 +124,7 @@ class EntryActivity : LockingActivity() { // Get Entry from UUID try { intent.getParcelableExtra?>(KEY_ENTRY)?.let { entryId -> - mEntryId = entryId + mMainEntryId = entryId intent.removeExtra(KEY_ENTRY) mHistoryPosition = intent.getIntExtra(KEY_ENTRY_HISTORY_POSITION, -1) intent.removeExtra(KEY_ENTRY_HISTORY_POSITION) @@ -140,6 +142,30 @@ class EntryActivity : LockingActivity() { lockAndExit() } + mEntryViewModel.mainEntryId.observe(this) { mainEntryId -> + this.mMainEntryId = mainEntryId + invalidateOptionsMenu() + } + + mEntryViewModel.historyPosition.observe(this) { historyPosition -> + this.mHistoryPosition = historyPosition + val entryIsHistory = historyPosition > -1 + this.mEntryIsHistory = entryIsHistory + // Assign history dedicated view + historyView?.visibility = if (entryIsHistory) View.VISIBLE else View.GONE + if (entryIsHistory) { + val taColorAccent = theme.obtainStyledAttributes(intArrayOf(R.attr.colorAccent)) + collapsingToolbarLayout?.contentScrim = ColorDrawable(taColorAccent.getColor(0, Color.BLACK)) + taColorAccent.recycle() + } + invalidateOptionsMenu() + } + + mEntryViewModel.url.observe(this) { url -> + this.mUrl = url + invalidateOptionsMenu() + } + mEntryViewModel.entryInfo.observe(this) { entryInfo -> // Manage entry copy to start notification if allowed (at the first start) if (savedInstanceState == null) { @@ -168,18 +194,6 @@ class EntryActivity : LockingActivity() { loadingView?.hideByFading() } - mEntryViewModel.entryIsHistory.observe(this) { entryIsHistory -> - // Assign history dedicated view - historyView?.visibility = if (entryIsHistory) View.VISIBLE else View.GONE - if (entryIsHistory) { - val taColorAccent = theme.obtainStyledAttributes(intArrayOf(R.attr.colorAccent)) - collapsingToolbarLayout?.contentScrim = ColorDrawable(taColorAccent.getColor(0, Color.BLACK)) - taColorAccent.recycle() - } - - invalidateOptionsMenu() - } - mEntryViewModel.onOtpElementUpdated.observe(this) { otpElement -> if (otpElement == null) entryProgress?.visibility = View.GONE @@ -219,7 +233,7 @@ class EntryActivity : LockingActivity() { coordinatorLayout?.resetAppTimeoutWhenViewFocusedOrChanged(this, database) mEntryViewModel.setDatabase(database) - mEntryViewModel.loadEntry(mEntryId, mHistoryPosition) + mEntryViewModel.loadEntry(mMainEntryId, mHistoryPosition) // Assign title icon mIcon?.let { icon -> @@ -306,16 +320,14 @@ class EntryActivity : LockingActivity() { inflater.inflate(R.menu.entry, menu) inflater.inflate(R.menu.database, menu) - if (mEntryViewModel.getEntry()?.url?.isEmpty() != false) { + if (mUrl?.isEmpty() != false) { menu.findItem(R.id.menu_goto_url)?.isVisible = false } - val entryIsHistory = mEntryViewModel.getEntryIsHistory() - - if (entryIsHistory && !mReadOnly) { + if (mEntryIsHistory && !mReadOnly) { inflater.inflate(R.menu.entry_history, menu) } - if (entryIsHistory || mReadOnly) { + if (mEntryIsHistory || mReadOnly) { menu.findItem(R.id.menu_save_database)?.isVisible = false menu.findItem(R.id.menu_edit)?.isVisible = false } @@ -366,29 +378,29 @@ class EntryActivity : LockingActivity() { return true } R.id.menu_edit -> { - mEntryViewModel.getEntry()?.let { entry -> - EntryEditActivity.launch(this@EntryActivity, entry) + mMainEntryId?.let { entryId -> + EntryEditActivity.launch(this@EntryActivity, entryId) } return true } R.id.menu_goto_url -> { - mEntryViewModel.getEntry()?.url?.let { url -> + mUrl?.let { url -> UriUtil.gotoUrl(this, url) } return true } R.id.menu_restore_entry_history -> { - mEntryViewModel.getMainEntry()?.let { mainEntry -> + mMainEntryId?.let { mainEntryId -> restoreEntryHistory( - mainEntry, - mEntryViewModel.getEntryHistoryPosition()) + mainEntryId, + mHistoryPosition) } } R.id.menu_delete_entry_history -> { - mEntryViewModel.getMainEntry()?.let { mainEntry -> + mMainEntryId?.let { mainEntryId -> deleteEntryHistory( - mainEntry, - mEntryViewModel.getEntryHistoryPosition()) + mainEntryId, + mHistoryPosition) } } R.id.menu_save_database -> { @@ -405,7 +417,7 @@ class EntryActivity : LockingActivity() { override fun finish() { // Transit data in previous Activity after an update Intent().apply { - putExtra(EntryEditActivity.ADD_OR_UPDATE_ENTRY_KEY, mEntryViewModel.getEntry()) + putExtra(EntryEditActivity.ADD_OR_UPDATE_ENTRY_KEY, mMainEntryId) setResult(EntryEditActivity.UPDATE_ENTRY_RESULT_CODE, this) } super.finish() diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt index e5c0374a0..d1734ed9f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt @@ -661,7 +661,7 @@ class EntryEditActivity : LockingActivity(), try { val bundle = Bundle() val intentEntry = Intent() - bundle.putParcelable(ADD_OR_UPDATE_ENTRY_KEY, entry) + bundle.putParcelable(ADD_OR_UPDATE_ENTRY_KEY, entry.nodeId) intentEntry.putExtras(bundle) when (actionTask) { ACTION_DATABASE_CREATE_ENTRY_TASK -> { @@ -698,13 +698,13 @@ class EntryEditActivity : LockingActivity(), * Launch EntryEditActivity to update an existing entry * * @param activity from activity - * @param entry Entry to update + * @param entryId Entry to update */ fun launch(activity: Activity, - entry: Entry) { + entryId: NodeId) { if (TimeoutHelper.checkTimeAndLockIfTimeout(activity)) { val intent = Intent(activity, EntryEditActivity::class.java) - intent.putExtra(KEY_ENTRY, entry.nodeId) + intent.putExtra(KEY_ENTRY, entryId) activity.startActivityForResult(intent, ADD_OR_UPDATE_ENTRY_REQUEST_CODE) } } 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 fa72cd67a..9a364f71e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -772,7 +772,7 @@ class GroupActivity : LockingActivity(), .show(supportFragmentManager, GroupEditDialogFragment.TAG_CREATE_GROUP) } - Type.ENTRY -> EntryEditActivity.launch(this@GroupActivity, node as Entry) + Type.ENTRY -> EntryEditActivity.launch(this@GroupActivity, (node as Entry).nodeId) } return true } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/ListNodesFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/ListNodesFragment.kt index b2d709d2d..202eeec40 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/ListNodesFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/ListNodesFragment.kt @@ -39,6 +39,7 @@ import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Group import com.kunzisoft.keepass.database.element.SortNodeEnum import com.kunzisoft.keepass.database.element.node.Node +import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.Type import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.viewmodels.GroupViewModel @@ -397,9 +398,9 @@ class ListNodesFragment : DatabaseFragment(), SortDialogFragment.SortSelectionLi EntryEditActivity.ADD_OR_UPDATE_ENTRY_REQUEST_CODE -> { if (resultCode == EntryEditActivity.ADD_ENTRY_RESULT_CODE || resultCode == EntryEditActivity.UPDATE_ENTRY_RESULT_CODE) { - data?.getParcelableExtra(EntryEditActivity.ADD_OR_UPDATE_ENTRY_KEY)?.let { changedNode -> - if (resultCode == EntryEditActivity.ADD_ENTRY_RESULT_CODE) - addNode(changedNode) + data?.getParcelableExtra>(EntryEditActivity.ADD_OR_UPDATE_ENTRY_KEY)?.let { changedNodeId -> + // TODO if (resultCode == EntryEditActivity.ADD_ENTRY_RESULT_CODE) + // addNode(changedNode) if (resultCode == EntryEditActivity.UPDATE_ENTRY_RESULT_CODE) mAdapter?.notifyDataSetChanged() } ?: Log.e(this.javaClass.name, "New node can be retrieve in Activity Result") 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 dcaa8567b..8055b2b26 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 @@ -40,6 +40,7 @@ import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Entry import com.kunzisoft.keepass.database.element.Group import com.kunzisoft.keepass.database.element.node.Node +import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.icons.IconDrawableFactory import com.kunzisoft.keepass.model.GroupInfo import com.kunzisoft.keepass.model.MainCredential @@ -48,6 +49,7 @@ import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.timeout.TimeoutHelper import com.kunzisoft.keepass.utils.* +import java.util.* abstract class LockingActivity : SpecialModeActivity(), PasswordEncodingDialogFragment.Listener, @@ -256,14 +258,14 @@ abstract class LockingActivity : SpecialModeActivity(), updateDatabaseGroup(oldGroup, updateGroup, !mReadOnly && mAutoSaveEnable) } - fun restoreEntryHistory(mainEntry: Entry, - entryHistoryPosition: Int,) { - restoreDatabaseEntryHistory(mainEntry, entryHistoryPosition, !mReadOnly && mAutoSaveEnable) + fun restoreEntryHistory(mainEntryId: NodeId, + entryHistoryPosition: Int) { + restoreDatabaseEntryHistory(mainEntryId, entryHistoryPosition, !mReadOnly && mAutoSaveEnable) } - fun deleteEntryHistory(mainEntry: Entry, - entryHistoryPosition: Int,) { - deleteDatabaseEntryHistory(mainEntry, entryHistoryPosition, !mReadOnly && mAutoSaveEnable) + fun deleteEntryHistory(mainEntryId: NodeId, + entryHistoryPosition: Int) { + deleteDatabaseEntryHistory(mainEntryId, entryHistoryPosition, !mReadOnly && mAutoSaveEnable) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/selection/DatabaseActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/selection/DatabaseActivity.kt index a514f9184..1636e5406 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/selection/DatabaseActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/selection/DatabaseActivity.kt @@ -11,9 +11,11 @@ import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Entry import com.kunzisoft.keepass.database.element.Group import com.kunzisoft.keepass.database.element.node.Node +import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.viewmodels.DatabaseViewModel +import java.util.* abstract class DatabaseActivity: StylishActivity(), DatabaseRetrieval { @@ -186,16 +188,16 @@ abstract class DatabaseActivity: StylishActivity(), DatabaseRetrieval { mDatabaseTaskProvider?.startDatabaseUpdateGroup(oldGroup, groupToUpdate, save) } - fun restoreDatabaseEntryHistory(mainEntry: Entry, + fun restoreDatabaseEntryHistory(mainEntryId: NodeId, entryHistoryPosition: Int, save: Boolean) { - mDatabaseTaskProvider?.startDatabaseRestoreEntryHistory(mainEntry, entryHistoryPosition, save) + mDatabaseTaskProvider?.startDatabaseRestoreEntryHistory(mainEntryId, entryHistoryPosition, save) } - fun deleteDatabaseEntryHistory(mainEntry: Entry, + fun deleteDatabaseEntryHistory(mainEntryId: NodeId, entryHistoryPosition: Int, save: Boolean) { - mDatabaseTaskProvider?.startDatabaseDeleteEntryHistory(mainEntry, entryHistoryPosition, save) + mDatabaseTaskProvider?.startDatabaseDeleteEntryHistory(mainEntryId, entryHistoryPosition, save) } override fun onResume() { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt index 0e027d453..1ee8761c4 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt @@ -447,22 +447,22 @@ class DatabaseTaskProvider(private val activity: FragmentActivity) { ----------------- */ - fun startDatabaseRestoreEntryHistory(mainEntry: Entry, + fun startDatabaseRestoreEntryHistory(mainEntryId: NodeId, entryHistoryPosition: Int, save: Boolean) { start(Bundle().apply { - putParcelable(DatabaseTaskNotificationService.ENTRY_ID_KEY, mainEntry.nodeId) + putParcelable(DatabaseTaskNotificationService.ENTRY_ID_KEY, mainEntryId) putInt(DatabaseTaskNotificationService.ENTRY_HISTORY_POSITION_KEY, entryHistoryPosition) putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save) } , ACTION_DATABASE_RESTORE_ENTRY_HISTORY) } - fun startDatabaseDeleteEntryHistory(mainEntry: Entry, + fun startDatabaseDeleteEntryHistory(mainEntryId: NodeId, entryHistoryPosition: Int, save: Boolean) { start(Bundle().apply { - putParcelable(DatabaseTaskNotificationService.ENTRY_ID_KEY, mainEntry.nodeId) + putParcelable(DatabaseTaskNotificationService.ENTRY_ID_KEY, mainEntryId) putInt(DatabaseTaskNotificationService.ENTRY_HISTORY_POSITION_KEY, entryHistoryPosition) putBoolean(DatabaseTaskNotificationService.SAVE_DATABASE_KEY, save) } diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/EntryViewModel.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/EntryViewModel.kt index b5a5fde58..06346691d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/EntryViewModel.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/EntryViewModel.kt @@ -1,3 +1,22 @@ +/* + * Copyright 2021 Jeremy Jamet / Kunzisoft. + * + * This file is part of KeePassDX. + * + * KeePassDX is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * KeePassDX is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with KeePassDX. If not, see . + * + */ package com.kunzisoft.keepass.viewmodels import androidx.lifecycle.LiveData @@ -6,7 +25,6 @@ import androidx.lifecycle.ViewModel import com.kunzisoft.keepass.app.database.IOActionTask import com.kunzisoft.keepass.database.element.Attachment import com.kunzisoft.keepass.database.element.Database -import com.kunzisoft.keepass.database.element.Entry import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.NodeIdUUID import com.kunzisoft.keepass.database.element.template.Template @@ -19,20 +37,22 @@ import java.util.* class EntryViewModel: ViewModel() { private var mDatabase: Database? = null - private var mEntryTemplate: Template? = null - private var mEntry: Entry? = null - private var mLastEntryVersion: Entry? = null - private var mHistoryPosition: Int = -1 val template : LiveData