From 4a8f67093fb749cad64818938d7e7660453de5c7 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 11 Aug 2021 14:05:00 +0200 Subject: [PATCH] Refactoring lock timer code --- .../activities/AutofillLauncherActivity.kt | 2 +- .../keepass/activities/EntryActivity.kt | 10 ++--- .../keepass/activities/EntryEditActivity.kt | 9 +++-- .../EntrySelectionLauncherActivity.kt | 2 +- .../activities/FileDatabaseSelectActivity.kt | 2 +- .../keepass/activities/GroupActivity.kt | 9 +++-- .../keepass/activities/IconPickerActivity.kt | 11 +++-- .../keepass/activities/ImageViewerActivity.kt | 11 +++-- .../MagikeyboardLauncherActivity.kt | 2 +- .../keepass/activities/PasswordActivity.kt | 4 +- .../dialogs/GroupEditDialogFragment.kt | 16 ++++---- .../fragments/DatabaseDialogFragment.kt | 11 ++++- .../activities/fragments/DatabaseFragment.kt | 15 +++++-- .../activities/fragments/EntryEditFragment.kt | 2 + .../activities/fragments/EntryFragment.kt | 1 + .../activities/fragments/GroupFragment.kt | 1 + .../activities/fragments/IconFragment.kt | 2 + .../fragments/IconPickerFragment.kt | 1 + .../{selection => legacy}/DatabaseActivity.kt | 2 +- .../{lock => legacy}/LockingActivity.kt | 40 ++++++++++++++----- .../SpecialModeActivity.kt | 2 +- .../settings/AutofillSettingsActivity.kt | 2 +- .../settings/MagikeyboardSettingsActivity.kt | 2 +- .../NestedDatabaseSettingsFragment.kt | 5 +-- .../keepass/settings/SettingsActivity.kt | 10 ++--- .../keepass/timeout/TimeoutHelper.kt | 14 +++---- 26 files changed, 115 insertions(+), 73 deletions(-) rename app/src/main/java/com/kunzisoft/keepass/activities/{selection => legacy}/DatabaseActivity.kt (99%) rename app/src/main/java/com/kunzisoft/keepass/activities/{lock => legacy}/LockingActivity.kt (92%) rename app/src/main/java/com/kunzisoft/keepass/activities/{selection => legacy}/SpecialModeActivity.kt (99%) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/AutofillLauncherActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/AutofillLauncherActivity.kt index f45fd2cf2..194b8fbc1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/AutofillLauncherActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/AutofillLauncherActivity.kt @@ -31,7 +31,7 @@ import androidx.annotation.RequiresApi import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper import com.kunzisoft.keepass.activities.helpers.SpecialMode -import com.kunzisoft.keepass.activities.selection.DatabaseActivity +import com.kunzisoft.keepass.activities.legacy.DatabaseActivity import com.kunzisoft.keepass.autofill.AutofillHelper import com.kunzisoft.keepass.autofill.AutofillHelper.EXTRA_INLINE_SUGGESTIONS_REQUEST import com.kunzisoft.keepass.autofill.KeeAutofillService 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 f40d633f6..cfe4b5bce 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.kt @@ -41,11 +41,9 @@ import com.kunzisoft.keepass.activities.fragments.EntryFragment import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper import com.kunzisoft.keepass.activities.helpers.SpecialMode -import com.kunzisoft.keepass.activities.lock.LockingActivity -import com.kunzisoft.keepass.activities.lock.resetAppTimeoutWhenViewFocusedOrChanged +import com.kunzisoft.keepass.activities.legacy.LockingActivity 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.icon.IconImage import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.education.EntryActivityEducation @@ -226,10 +224,12 @@ class EntryActivity : LockingActivity() { } } + override fun viewToInvalidateTimeout(): View? { + return coordinatorLayout + } + override fun onDatabaseRetrieved(database: Database?) { super.onDatabaseRetrieved(database) - // Focus view to reinitialize timeout - coordinatorLayout?.resetAppTimeoutWhenViewFocusedOrChanged(this, database) mEntryViewModel.setDatabase(database) mEntryViewModel.loadEntry(mMainEntryId, mHistoryPosition) 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 b1f2fd4b1..0e74c18e2 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt @@ -46,8 +46,7 @@ import com.kunzisoft.keepass.activities.dialogs.FileTooBigDialogFragment.Compani import com.kunzisoft.keepass.activities.fragments.EntryEditFragment import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper -import com.kunzisoft.keepass.activities.lock.LockingActivity -import com.kunzisoft.keepass.activities.lock.resetAppTimeoutWhenViewFocusedOrChanged +import com.kunzisoft.keepass.activities.legacy.LockingActivity import com.kunzisoft.keepass.adapters.TemplatesSelectorAdapter import com.kunzisoft.keepass.autofill.AutofillComponent import com.kunzisoft.keepass.autofill.AutofillHelper @@ -263,10 +262,12 @@ class EntryEditActivity : LockingActivity(), } } + override fun viewToInvalidateTimeout(): View? { + return coordinatorLayout + } + override fun onDatabaseRetrieved(database: Database?) { super.onDatabaseRetrieved(database) - // Focus view to reinitialize timeout - coordinatorLayout?.resetAppTimeoutWhenViewFocusedOrChanged(this, database) mEntryEditViewModel.setDatabase(database) mAllowCustomFields = database?.allowEntryCustomFields() == true mAllowOTP = database?.allowOTP == true diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntrySelectionLauncherActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/EntrySelectionLauncherActivity.kt index 4d23f7182..4dd09cbc0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntrySelectionLauncherActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntrySelectionLauncherActivity.kt @@ -25,7 +25,7 @@ import android.net.Uri import android.widget.Toast import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper -import com.kunzisoft.keepass.activities.selection.DatabaseActivity +import com.kunzisoft.keepass.activities.legacy.DatabaseActivity import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.search.SearchHelper import com.kunzisoft.keepass.magikeyboard.MagikeyboardService diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt index e7b350e13..b94003328 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt @@ -45,7 +45,7 @@ import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper import com.kunzisoft.keepass.activities.helpers.SpecialMode import com.kunzisoft.keepass.activities.helpers.setOpenDocumentClickListener -import com.kunzisoft.keepass.activities.selection.SpecialModeActivity +import com.kunzisoft.keepass.activities.legacy.SpecialModeActivity import com.kunzisoft.keepass.adapters.FileDatabaseHistoryAdapter import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction import com.kunzisoft.keepass.autofill.AutofillComponent 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 a8b2c099a..2e701547c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -45,8 +45,7 @@ import com.kunzisoft.keepass.activities.fragments.GroupFragment import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper import com.kunzisoft.keepass.activities.helpers.SpecialMode -import com.kunzisoft.keepass.activities.lock.LockingActivity -import com.kunzisoft.keepass.activities.lock.resetAppTimeoutWhenViewFocusedOrChanged +import com.kunzisoft.keepass.activities.legacy.LockingActivity import com.kunzisoft.keepass.adapters.SearchEntryCursorAdapter import com.kunzisoft.keepass.autofill.AutofillComponent import com.kunzisoft.keepass.autofill.AutofillHelper @@ -311,10 +310,12 @@ class GroupActivity : LockingActivity(), } } + override fun viewToInvalidateTimeout(): View? { + return rootContainerView + } + override fun onDatabaseRetrieved(database: Database?) { super.onDatabaseRetrieved(database) - // Focus view to reinitialize timeout - rootContainerView?.resetAppTimeoutWhenViewFocusedOrChanged(this, database) mGroupViewModel.setDatabase(database) mGroupEditViewModel.setGroupNamesNotAllowed(database?.groupNamesNotAllowed) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/IconPickerActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/IconPickerActivity.kt index 7a502a849..270038e56 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/IconPickerActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/IconPickerActivity.kt @@ -36,8 +36,7 @@ import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.fragments.IconPickerFragment import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper import com.kunzisoft.keepass.activities.helpers.setOpenDocumentClickListener -import com.kunzisoft.keepass.activities.lock.LockingActivity -import com.kunzisoft.keepass.activities.lock.resetAppTimeoutWhenViewFocusedOrChanged +import com.kunzisoft.keepass.activities.legacy.LockingActivity import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.icon.IconImage import com.kunzisoft.keepass.database.element.icon.IconImageCustom @@ -144,6 +143,10 @@ class IconPickerActivity : LockingActivity() { } } + override fun viewToInvalidateTimeout(): View? { + return findViewById(R.id.icon_picker_container) + } + override fun onDatabaseRetrieved(database: Database?) { super.onDatabaseRetrieved(database) @@ -154,10 +157,6 @@ class IconPickerActivity : LockingActivity() { } else { uploadButton.visibility = View.GONE } - - // Focus view to reinitialize timeout - findViewById(R.id.icon_picker_container) - ?.resetAppTimeoutWhenViewFocusedOrChanged(this, database) } private fun updateIconsSelectedViews() { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/ImageViewerActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/ImageViewerActivity.kt index d4a3f7682..ef80e7541 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/ImageViewerActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/ImageViewerActivity.kt @@ -31,7 +31,7 @@ import android.widget.ImageView import androidx.appcompat.widget.Toolbar import com.igreenwood.loupe.Loupe import com.kunzisoft.keepass.R -import com.kunzisoft.keepass.activities.lock.LockingActivity +import com.kunzisoft.keepass.activities.legacy.LockingActivity import com.kunzisoft.keepass.database.element.Attachment import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.tasks.BinaryDatabaseManager @@ -39,6 +39,7 @@ import kotlin.math.max class ImageViewerActivity : LockingActivity() { + private var imageContainerView: ViewGroup? = null private lateinit var imageView: ImageView private lateinit var progressView: View @@ -52,11 +53,11 @@ class ImageViewerActivity : LockingActivity() { supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayShowHomeEnabled(true) - val imageContainerView: ViewGroup = findViewById(R.id.image_viewer_container) + imageContainerView = findViewById(R.id.image_viewer_container) imageView = findViewById(R.id.image_viewer_image) progressView = findViewById(R.id.image_viewer_progress) - Loupe.create(imageView, imageContainerView) { + Loupe.create(imageView, imageContainerView!!) { onViewTranslateListener = object : Loupe.OnViewTranslateListener { override fun onStart(view: ImageView) { @@ -79,6 +80,10 @@ class ImageViewerActivity : LockingActivity() { } } + override fun viewToInvalidateTimeout(): View? { + return imageContainerView + } + override fun onDatabaseRetrieved(database: Database?) { super.onDatabaseRetrieved(database) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/MagikeyboardLauncherActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/MagikeyboardLauncherActivity.kt index f39f86633..84867d9ce 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/MagikeyboardLauncherActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/MagikeyboardLauncherActivity.kt @@ -19,7 +19,7 @@ */ package com.kunzisoft.keepass.activities -import com.kunzisoft.keepass.activities.selection.DatabaseActivity +import com.kunzisoft.keepass.activities.legacy.DatabaseActivity import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.search.SearchHelper diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt index 841a69e76..c75588090 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt @@ -43,8 +43,8 @@ import com.google.android.material.snackbar.Snackbar import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.dialogs.DuplicateUuidDialog import com.kunzisoft.keepass.activities.helpers.* -import com.kunzisoft.keepass.activities.lock.LockingActivity -import com.kunzisoft.keepass.activities.selection.SpecialModeActivity +import com.kunzisoft.keepass.activities.legacy.LockingActivity +import com.kunzisoft.keepass.activities.legacy.SpecialModeActivity import com.kunzisoft.keepass.app.database.CipherDatabaseEntity import com.kunzisoft.keepass.autofill.AutofillComponent import com.kunzisoft.keepass.autofill.AutofillHelper diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupEditDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupEditDialogFragment.kt index f7040846f..08b330e0a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupEditDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/GroupEditDialogFragment.kt @@ -67,13 +67,6 @@ class GroupEditDialogFragment : DatabaseDialogFragment() { } } - override fun onDatabaseRetrieved(database: Database?) { - mPopulateIconMethod = { imageView, icon -> - database?.iconDrawableFactory?.assignDatabaseIcon(imageView, icon, mIconColor) - } - mPopulateIconMethod?.invoke(iconButtonView, mGroupInfo.icon) - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -113,6 +106,13 @@ class GroupEditDialogFragment : DatabaseDialogFragment() { } } + override fun onDatabaseRetrieved(database: Database?) { + mPopulateIconMethod = { imageView, icon -> + database?.iconDrawableFactory?.assignDatabaseIcon(imageView, icon, mIconColor) + } + mPopulateIconMethod?.invoke(iconButtonView, mGroupInfo.icon) + } + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { activity?.let { activity -> val root = activity.layoutInflater.inflate(R.layout.fragment_group_edit, null) @@ -128,6 +128,8 @@ class GroupEditDialogFragment : DatabaseDialogFragment() { mIconColor = ta.getColor(0, Color.WHITE) ta.recycle() + resetAppTimeoutWhenViewFocusedOrChanged(root) + if (savedInstanceState != null && savedInstanceState.containsKey(KEY_ACTION_ID) && savedInstanceState.containsKey(KEY_GROUP_INFO)) { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/DatabaseDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/DatabaseDialogFragment.kt index 116cb5fb9..3936d6a0c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/DatabaseDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/DatabaseDialogFragment.kt @@ -1,9 +1,11 @@ package com.kunzisoft.keepass.activities.fragments import android.os.Bundle +import android.view.View import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.kunzisoft.keepass.activities.DatabaseRetrieval +import com.kunzisoft.keepass.activities.legacy.resetAppTimeoutWhenViewFocusedOrChanged import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.viewmodels.DatabaseViewModel @@ -11,16 +13,23 @@ import com.kunzisoft.keepass.viewmodels.DatabaseViewModel abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval { private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() + private var mDatabase: Database? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mDatabaseViewModel.database.observe(this) { database -> - // TODO requireView().resetAppTimeoutWhenViewFocusedOrChanged(requireContext(), database) + this.mDatabase = database onDatabaseRetrieved(database) } } + protected fun resetAppTimeoutWhenViewFocusedOrChanged(view: View?) { + context?.let { + view?.resetAppTimeoutWhenViewFocusedOrChanged(it, mDatabase?.loaded) + } + } + override fun onDatabaseActionFinished( database: Database, actionTask: String, diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/DatabaseFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/DatabaseFragment.kt index e74afd91b..8b74f62e5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/DatabaseFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/DatabaseFragment.kt @@ -1,8 +1,10 @@ package com.kunzisoft.keepass.activities.fragments +import android.os.Bundle +import android.view.View import androidx.fragment.app.activityViewModels import com.kunzisoft.keepass.activities.DatabaseRetrieval -import com.kunzisoft.keepass.activities.lock.resetAppTimeoutWhenViewFocusedOrChanged +import com.kunzisoft.keepass.activities.legacy.resetAppTimeoutWhenViewFocusedOrChanged import com.kunzisoft.keepass.activities.stylish.StylishFragment import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.binary.BinaryData @@ -14,12 +16,11 @@ abstract class DatabaseFragment : StylishFragment(), DatabaseRetrieval { private val mDatabaseViewModel: DatabaseViewModel by activityViewModels() private var mDatabase: Database? = null - override fun onStart() { - super.onStart() + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> if (mDatabase == null || mDatabase != database) { - requireView().resetAppTimeoutWhenViewFocusedOrChanged(requireContext(), database) this.mDatabase = database onDatabaseRetrieved(database) } @@ -30,6 +31,12 @@ abstract class DatabaseFragment : StylishFragment(), DatabaseRetrieval { } } + protected fun resetAppTimeoutWhenViewFocusedOrChanged(view: View?) { + context?.let { + view?.resetAppTimeoutWhenViewFocusedOrChanged(it, mDatabase?.loaded) + } + } + override fun onDatabaseActionFinished( database: Database, actionTask: String, diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryEditFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryEditFragment.kt index 0735cb66b..53ea74c57 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryEditFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryEditFragment.kt @@ -125,6 +125,8 @@ class EntryEditFragment: DatabaseFragment() { } // To prevent flickering rootView.showByFading() + // Apply timeout reset + resetAppTimeoutWhenViewFocusedOrChanged(rootView) } mEntryEditViewModel.requestEntryInfoUpdate.observe(viewLifecycleOwner) { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryFragment.kt index 36c4f2f7c..92ac31f43 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryFragment.kt @@ -99,6 +99,7 @@ class EntryFragment: DatabaseFragment() { assignEntryInfo(entryInfo) // Smooth appearing rootView.showByFading() + resetAppTimeoutWhenViewFocusedOrChanged(rootView) } mEntryViewModel.onAttachmentAction.observe(viewLifecycleOwner) { entryAttachmentState -> diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/GroupFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/GroupFragment.kt index 3950c3a79..0aa8def66 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/GroupFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/GroupFragment.kt @@ -247,6 +247,7 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen layoutManager = mLayoutManager adapter = mAdapter } + resetAppTimeoutWhenViewFocusedOrChanged(view) mGroupViewModel.group.observe(viewLifecycleOwner) { mCurrentGroup = it.group diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/IconFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/IconFragment.kt index 96b8b97dc..f63a7645c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/IconFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/IconFragment.kt @@ -67,6 +67,8 @@ abstract class IconFragment : DatabaseFragment(), iconPickerAdapter = IconPickerAdapter(requireContext(), tintColor) iconPickerAdapter.iconPickerListener = this iconsGridView.adapter = iconPickerAdapter + + resetAppTimeoutWhenViewFocusedOrChanged(view) } override fun onDatabaseRetrieved(database: Database?) { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/IconPickerFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/IconPickerFragment.kt index 1d333e8d0..e056d89f1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/IconPickerFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/IconPickerFragment.kt @@ -34,6 +34,7 @@ class IconPickerFragment : DatabaseFragment() { viewPager = view.findViewById(R.id.icon_picker_pager) tabLayout = view.findViewById(R.id.icon_picker_tabs) + resetAppTimeoutWhenViewFocusedOrChanged(view) arguments?.apply { if (containsKey(ICON_TAB_ARG)) { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/selection/DatabaseActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseActivity.kt similarity index 99% rename from app/src/main/java/com/kunzisoft/keepass/activities/selection/DatabaseActivity.kt rename to app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseActivity.kt index d83594c50..50215e110 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/selection/DatabaseActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseActivity.kt @@ -1,4 +1,4 @@ -package com.kunzisoft.keepass.activities.selection +package com.kunzisoft.keepass.activities.legacy import android.net.Uri import android.os.Bundle diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/LockingActivity.kt similarity index 92% rename from app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt rename to app/src/main/java/com/kunzisoft/keepass/activities/legacy/LockingActivity.kt index 14038f130..5f24be153 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/lock/LockingActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/LockingActivity.kt @@ -17,13 +17,14 @@ * along with KeePassDX. If not, see . * */ -package com.kunzisoft.keepass.activities.lock +package com.kunzisoft.keepass.activities.legacy import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle +import android.util.Log import android.view.MotionEvent import android.view.View import android.view.ViewGroup @@ -35,7 +36,6 @@ import com.kunzisoft.keepass.activities.dialogs.PasswordEncodingDialogFragment import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper import com.kunzisoft.keepass.activities.helpers.SpecialMode -import com.kunzisoft.keepass.activities.selection.SpecialModeActivity import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Entry import com.kunzisoft.keepass.database.element.Group @@ -102,6 +102,11 @@ abstract class LockingActivity : SpecialModeActivity(), super.onDatabaseRetrieved(database) mDatabase = database + // Focus view to reinitialize timeout, + // view is not necessary loaded so retry later in resume + viewToInvalidateTimeout() + ?.resetAppTimeoutWhenViewFocusedOrChanged(this, database?.loaded) + database?.let { // End activity if database not loaded if (!database.loaded) { @@ -128,7 +133,7 @@ abstract class LockingActivity : SpecialModeActivity(), TimeoutHelper.checkTimeAndLockIfTimeout(this) // If onCreate already record time if (!mExitLock) - TimeoutHelper.recordTime(this, database) + TimeoutHelper.recordTime(this, database.loaded) } // Force read only if the database is like that @@ -137,6 +142,8 @@ abstract class LockingActivity : SpecialModeActivity(), } } + abstract fun viewToInvalidateTimeout(): View? + override fun onDatabaseActionFinished( database: Database, actionTask: String, @@ -299,13 +306,21 @@ abstract class LockingActivity : SpecialModeActivity(), mReadOnlyToSave = ReadOnlyHelper.retrieveReadOnlyFromIntent(intent) mAutoSaveEnable = PreferencesUtil.isAutoSaveDatabaseEnabled(this) + // Invalidate timeout by touch + mDatabase?.let { database -> + viewToInvalidateTimeout() + ?.resetAppTimeoutWhenViewFocusedOrChanged(this, database.loaded) + } + invalidateOptionsMenu() LOCKING_ACTIVITY_UI_VISIBLE = true } protected fun checkTimeAndLockIfTimeoutOrResetTimeout(action: (() -> Unit)? = null) { - TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(this, mDatabase, action) + TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(this, + mDatabase?.loaded == true, + action) } override fun onSaveInstanceState(outState: Bundle) { @@ -335,7 +350,8 @@ abstract class LockingActivity : SpecialModeActivity(), override fun onBackPressed() { if (mTimeoutEnable) { - TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(this, mDatabase) { + TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(this, + mDatabase?.loaded == true) { super.onBackPressed() } } else { @@ -361,23 +377,25 @@ abstract class LockingActivity : SpecialModeActivity(), * To reset the app timeout when a view is focused or changed */ @SuppressLint("ClickableViewAccessibility") -fun View.resetAppTimeoutWhenViewFocusedOrChanged(context: Context, database: Database?) { +fun View.resetAppTimeoutWhenViewFocusedOrChanged(context: Context, databaseLoaded: Boolean?) { setOnTouchListener { _, event -> when (event.action) { MotionEvent.ACTION_DOWN -> { - //Log.d(LockingActivity.TAG, "View touched, try to reset app timeout") - TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(context, database) + Log.d(LockingActivity.TAG, "View touched, try to reset app timeout") + TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(context, + databaseLoaded ?: false) } } false } setOnFocusChangeListener { _, _ -> - //Log.d(LockingActivity.TAG, "View focused, try to reset app timeout") - TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(context, database) + Log.d(LockingActivity.TAG, "View focused, try to reset app timeout") + TimeoutHelper.checkTimeAndLockIfTimeoutOrResetTimeout(context, + databaseLoaded ?: false) } if (this is ViewGroup) { for (i in 0..childCount) { - getChildAt(i)?.resetAppTimeoutWhenViewFocusedOrChanged(context, database) + getChildAt(i)?.resetAppTimeoutWhenViewFocusedOrChanged(context, databaseLoaded) } } } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/selection/SpecialModeActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/SpecialModeActivity.kt similarity index 99% rename from app/src/main/java/com/kunzisoft/keepass/activities/selection/SpecialModeActivity.kt rename to app/src/main/java/com/kunzisoft/keepass/activities/legacy/SpecialModeActivity.kt index 23d77d6bd..1e36a384e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/selection/SpecialModeActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/SpecialModeActivity.kt @@ -1,4 +1,4 @@ -package com.kunzisoft.keepass.activities.selection +package com.kunzisoft.keepass.activities.legacy import android.os.Bundle import android.view.View diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/AutofillSettingsActivity.kt b/app/src/main/java/com/kunzisoft/keepass/settings/AutofillSettingsActivity.kt index 29c13c85a..894e7c995 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/AutofillSettingsActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/AutofillSettingsActivity.kt @@ -23,7 +23,7 @@ import android.os.Bundle import android.view.MenuItem import androidx.appcompat.widget.Toolbar import com.kunzisoft.keepass.R -import com.kunzisoft.keepass.activities.selection.SpecialModeActivity +import com.kunzisoft.keepass.activities.legacy.SpecialModeActivity class AutofillSettingsActivity : SpecialModeActivity() { diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/MagikeyboardSettingsActivity.kt b/app/src/main/java/com/kunzisoft/keepass/settings/MagikeyboardSettingsActivity.kt index fc1a04db9..ba36534db 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/MagikeyboardSettingsActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/MagikeyboardSettingsActivity.kt @@ -24,7 +24,7 @@ import androidx.appcompat.widget.Toolbar import android.view.MenuItem import com.kunzisoft.keepass.R -import com.kunzisoft.keepass.activities.selection.SpecialModeActivity +import com.kunzisoft.keepass.activities.legacy.SpecialModeActivity class MagikeyboardSettingsActivity : SpecialModeActivity() { diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt index 2fdc3d82c..eedd9e7fb 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt @@ -33,7 +33,7 @@ import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.DatabaseRetrieval import com.kunzisoft.keepass.activities.dialogs.AssignMasterKeyDialogFragment import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper -import com.kunzisoft.keepass.activities.lock.resetAppTimeoutWhenViewFocusedOrChanged +import com.kunzisoft.keepass.activities.legacy.resetAppTimeoutWhenViewFocusedOrChanged import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm import com.kunzisoft.keepass.database.crypto.kdf.KdfEngine import com.kunzisoft.keepass.database.element.Database @@ -75,14 +75,13 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> mDatabase = database + view.resetAppTimeoutWhenViewFocusedOrChanged(requireContext(), database?.loaded) onDatabaseRetrieved(database) } mDatabaseViewModel.actionFinished.observe(viewLifecycleOwner) { onDatabaseActionFinished(it.database, it.actionTask, it.result) } - - view.resetAppTimeoutWhenViewFocusedOrChanged(requireContext(), mDatabase) } override fun onCreateScreenPreference(screen: Screen, savedInstanceState: Bundle?, rootKey: String?) { diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt b/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt index dc9f85c01..1f7fbab9a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/SettingsActivity.kt @@ -34,8 +34,7 @@ import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.dialogs.AssignMasterKeyDialogFragment import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper -import com.kunzisoft.keepass.activities.lock.LockingActivity -import com.kunzisoft.keepass.activities.lock.resetAppTimeoutWhenViewFocusedOrChanged +import com.kunzisoft.keepass.activities.legacy.LockingActivity import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.tasks.ActionRunnable @@ -107,11 +106,8 @@ open class SettingsActivity return MainPreferenceFragment() } - override fun onDatabaseRetrieved(database: Database?) { - super.onDatabaseRetrieved(database) - - // Focus view to reinitialize timeout - coordinatorLayout?.resetAppTimeoutWhenViewFocusedOrChanged(this, database) + override fun viewToInvalidateTimeout(): View? { + return coordinatorLayout } override fun onDatabaseActionFinished( diff --git a/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt b/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt index 7b2fb4fd0..ee94f66b0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt @@ -53,8 +53,8 @@ object TimeoutHelper { * Start the lock timer by creating an alarm, * if the method is recalled with a previous lock timer pending, the previous one is deleted */ - private fun startLockTimer(context: Context, database: Database) { - if (database.loaded) { + private fun startLockTimer(context: Context, databaseLoaded: Boolean) { + if (databaseLoaded) { val timeout = PreferencesUtil.getAppTimeout(context) if (timeout != NEVER) { // No timeout don't start timeout service @@ -84,14 +84,14 @@ object TimeoutHelper { /** * Record the current time, to check it later with checkTime and start a new lock timer */ - fun recordTime(context: Context, database: Database) { + fun recordTime(context: Context, databaseLoaded: Boolean) { // To prevent spam registration, record after at least 2 seconds if (lastAppTimeoutRecord == null || lastAppTimeoutRecord!! + 2000 <= System.currentTimeMillis()) { Log.d(TAG, "Record app timeout") // Record timeout time in case timeout service is killed PreferencesUtil.saveCurrentTime(context) - startLockTimer(context, database) + startLockTimer(context, databaseLoaded) lastAppTimeoutRecord = System.currentTimeMillis() } } @@ -147,12 +147,10 @@ object TimeoutHelper { * Check the time previously record then, if timeout lock the database, else reset the timer */ fun checkTimeAndLockIfTimeoutOrResetTimeout(context: Context, - database: Database?, + databaseLoaded: Boolean, action: (() -> Unit)? = null) { if (checkTimeAndLockIfTimeout(context)) { - database?.let { - recordTime(context, it) - } + recordTime(context, databaseLoaded) action?.invoke() } }