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 38e0dae5e..5a6ad087e 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 @@ -29,6 +29,7 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.view.ActionMode +import androidx.core.view.MenuProvider import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -104,6 +105,40 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen } } + private val menuProvider: MenuProvider = object: MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { + menuInflater.inflate(R.menu.tree, menu) + } + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean { + return when (menuItem.itemId) { + R.id.menu_sort -> { + context?.let { context -> + val sortDialogFragment: SortDialogFragment = + if (mRecycleBinEnable) { + SortDialogFragment.getInstance( + PreferencesUtil.getListSort(context), + PreferencesUtil.getAscendingSort(context), + PreferencesUtil.getGroupsBeforeSort(context), + PreferencesUtil.getRecycleBinBottomSort(context) + ) + } else { + SortDialogFragment.getInstance( + PreferencesUtil.getListSort(context), + PreferencesUtil.getAscendingSort(context), + PreferencesUtil.getGroupsBeforeSort(context) + ) + } + + sortDialogFragment.show(childFragmentManager, "sortDialog") + } + true + } + else -> false + } + } + } + override fun onAttach(context: Context) { super.onAttach(context) @@ -142,12 +177,6 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen super.onDetach() } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - setHasOptionsMenu(true) - } - override fun onDatabaseRetrieved(database: ContextualDatabase?) { mRecycleBinEnable = database?.isRecycleBinEnabled == true mRecycleBin = database?.recycleBin @@ -219,6 +248,8 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + activity?.addMenuProvider(menuProvider, viewLifecycleOwner) + mNodesRecyclerView = view.findViewById(R.id.nodes_list) notFoundView = view.findViewById(R.id.not_found_container) @@ -298,42 +329,6 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen } } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.tree, menu) - - super.onCreateOptionsMenu(menu, inflater) - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - - R.id.menu_sort -> { - context?.let { context -> - val sortDialogFragment: SortDialogFragment = - if (mRecycleBinEnable) { - SortDialogFragment.getInstance( - PreferencesUtil.getListSort(context), - PreferencesUtil.getAscendingSort(context), - PreferencesUtil.getGroupsBeforeSort(context), - PreferencesUtil.getRecycleBinBottomSort(context) - ) - } else { - SortDialogFragment.getInstance( - PreferencesUtil.getListSort(context), - PreferencesUtil.getAscendingSort(context), - PreferencesUtil.getGroupsBeforeSort(context) - ) - } - - sortDialogFragment.show(childFragmentManager, "sortDialog") - } - return true - } - - else -> return super.onOptionsItemSelected(item) - } - } - fun actionNodesCallback(database: ContextualDatabase, nodes: List, menuListener: NodesActionMenuListener?, diff --git a/app/src/main/java/com/kunzisoft/keepass/biometric/AdvancedUnlockFragment.kt b/app/src/main/java/com/kunzisoft/keepass/biometric/AdvancedUnlockFragment.kt index 1370deb29..5affaad14 100644 --- a/app/src/main/java/com/kunzisoft/keepass/biometric/AdvancedUnlockFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/biometric/AdvancedUnlockFragment.kt @@ -32,6 +32,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.RequiresApi import androidx.biometric.BiometricManager import androidx.biometric.BiometricPrompt +import androidx.core.view.MenuProvider import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import com.kunzisoft.keepass.R @@ -103,6 +104,25 @@ class AdvancedUnlockFragment: StylishFragment(), AdvancedUnlockManager.AdvancedU keepConnection = false } + private val menuProvider: MenuProvider = object: MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + // biometric menu + if (mAllowAdvancedUnlockMenu) + menuInflater.inflate(R.menu.advanced_unlock, menu) + } + } + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean { + when (menuItem.itemId) { + R.id.menu_keystore_remove_key -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + deleteEncryptedDatabaseKey() + } + } + return false + } + } + override fun onAttach(context: Context) { super.onAttach(context) @@ -121,8 +141,6 @@ class AdvancedUnlockFragment: StylishFragment(), AdvancedUnlockManager.AdvancedU override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setHasOptionsMenu(true) - cipherDatabaseAction = CipherDatabaseAction.getInstance(requireContext().applicationContext) mAdvancedUnlockViewModel.onInitAdvancedUnlockModeRequested.observe(this) { @@ -149,6 +167,12 @@ class AdvancedUnlockFragment: StylishFragment(), AdvancedUnlockManager.AdvancedU return rootView } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + activity?.addMenuProvider(menuProvider, viewLifecycleOwner) + } + override fun onResume() { super.onResume() context?.let { @@ -158,26 +182,6 @@ class AdvancedUnlockFragment: StylishFragment(), AdvancedUnlockManager.AdvancedU keepConnection = false } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - super.onCreateOptionsMenu(menu, inflater) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - // biometric menu - if (mAllowAdvancedUnlockMenu) - inflater.inflate(R.menu.advanced_unlock, menu) - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.menu_keystore_remove_key -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - deleteEncryptedDatabaseKey() - } - } - - return super.onOptionsItemSelected(item) - } - private fun onDatabaseLoaded(databaseUri: Uri?) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // To get device credential unlock result, only if same database uri 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 36d4dfdaa..d8c11720f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt @@ -23,6 +23,7 @@ import android.graphics.Color import android.os.Bundle import android.util.Log import android.view.* +import androidx.core.view.MenuProvider import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import androidx.preference.Preference @@ -72,9 +73,52 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev private var mMemoryPref: InputKdfSizePreference? = null private var mParallelismPref: InputKdfNumberPreference? = null + private val menuProvider: MenuProvider = object: MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { + menuInflater.inflate(R.menu.database, menu) + if (mDatabaseReadOnly) { + menu.findItem(R.id.menu_save_database)?.isVisible = false + menu.findItem(R.id.menu_merge_database)?.isVisible = false + } + if (!mMergeDataAllowed) { + menu.findItem(R.id.menu_merge_database)?.isVisible = false + } + } + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean { + return when (menuItem.itemId) { + R.id.menu_save_database -> { + saveDatabase(!mDatabaseReadOnly) + true + } + R.id.menu_merge_database -> { + mergeDatabase(!mDatabaseReadOnly) + true + } + R.id.menu_reload_database -> { + reloadDatabase() + true + } + R.id.menu_app_settings -> { + // Check the time lock before launching settings + // TODO activity menu + (activity as SettingsActivity?)?.let { + SettingsActivity.launch(it, true) + } + true + } + else -> { + false + } + } + } + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + activity?.addMenuProvider(menuProvider, viewLifecycleOwner) + mDatabaseViewModel.database.observe(viewLifecycleOwner) { database -> mDatabase = database view.resetAppTimeoutWhenViewTouchedOrFocused(requireContext(), database?.loaded) @@ -87,8 +131,6 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev } override fun onCreateScreenPreference(screen: Screen, savedInstanceState: Bundle?, rootKey: String?) { - setHasOptionsMenu(true) - mScreen = screen val database = mDatabase // Load the preferences from an XML resource @@ -653,47 +695,6 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev } } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - super.onCreateOptionsMenu(menu, inflater) - - inflater.inflate(R.menu.database, menu) - if (mDatabaseReadOnly) { - menu.findItem(R.id.menu_save_database)?.isVisible = false - menu.findItem(R.id.menu_merge_database)?.isVisible = false - } - if (!mMergeDataAllowed) { - menu.findItem(R.id.menu_merge_database)?.isVisible = false - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - R.id.menu_save_database -> { - saveDatabase(!mDatabaseReadOnly) - true - } - R.id.menu_merge_database -> { - mergeDatabase(!mDatabaseReadOnly) - true - } - R.id.menu_reload_database -> { - reloadDatabase() - true - } - R.id.menu_app_settings -> { - // Check the time lock before launching settings - // TODO activity menu - (activity as SettingsActivity?)?.let { - SettingsActivity.launch(it, true) - } - true - } - else -> { - super.onOptionsItemSelected(item) - } - } - } - override fun onPreferenceTreeClick(preference: Preference): Boolean { // To reload group when database settings are modified when (preference.key) {