fix: Database workflow

This commit is contained in:
J-Jamet
2025-10-09 19:41:36 +02:00
parent 366e8bf1d7
commit e5595a3275
49 changed files with 308 additions and 310 deletions

View File

@@ -330,9 +330,8 @@ class EntryActivity : DatabaseLockActivity() {
return coordinatorLayout
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
super.onDatabaseRetrieved(database)
mEntryViewModel.loadDatabase(database)
}

View File

@@ -444,13 +444,13 @@ class EntryEditActivity : DatabaseLockActivity(),
return true
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
super.onDatabaseRetrieved(database)
mAllowCustomFields = database?.allowEntryCustomFields() == true
mAllowOTP = database?.allowOTP == true
mAllowCustomFields = database.allowEntryCustomFields() == true
mAllowOTP = database.allowOTP == true
mEntryEditViewModel.loadTemplateEntry(database)
mTemplatesSelectorAdapter?.apply {
iconDrawableFactory = mDatabase?.iconDrawableFactory
iconDrawableFactory = database.iconDrawableFactory
notifyDataSetChanged()
}
}

View File

@@ -216,11 +216,9 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
if (database != null) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
launchGroupActivityIfLoaded(database)
}
}
override fun onDatabaseActionFinished(
database: ContextualDatabase,

View File

@@ -578,7 +578,7 @@ class GroupActivity : DatabaseLockActivity(),
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
super.onDatabaseRetrieved(database)
mBreadcrumbAdapter = BreadcrumbAdapter(this, database).apply {
@@ -618,18 +618,16 @@ class GroupActivity : DatabaseLockActivity(),
adapter = mBreadcrumbAdapter
}
mGroupEditViewModel.setGroupNamesNotAllowed(database?.groupNamesNotAllowed)
mGroupEditViewModel.setGroupNamesNotAllowed(database.groupNamesNotAllowed)
mRecyclingBinEnabled = !mDatabaseReadOnly
&& database?.isRecycleBinEnabled == true
&& database.isRecycleBinEnabled == true
mRootGroup = database?.rootGroup
mRootGroup = database.rootGroup
loadGroup()
// Update view
database?.let {
mBreadcrumbAdapter?.iconDrawableFactory = it.iconDrawableFactory
}
mBreadcrumbAdapter?.iconDrawableFactory = database.iconDrawableFactory
refreshDatabaseViews()
invalidateOptionsMenu()
}

View File

@@ -174,10 +174,10 @@ class IconPickerActivity : DatabaseLockActivity() {
return true
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
super.onDatabaseRetrieved(database)
if (database?.allowCustomIcons == true) {
if (database.allowCustomIcons) {
uploadButton.setOpenDocumentClickListener(mExternalFileHelper)
} else {
uploadButton.visibility = View.GONE

View File

@@ -101,7 +101,7 @@ class ImageViewerActivity : DatabaseLockActivity() {
return true
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
super.onDatabaseRetrieved(database)
try {
@@ -119,7 +119,6 @@ class ImageViewerActivity : DatabaseLockActivity() {
resources.displayMetrics.heightPixels * 2
)
database?.let { database ->
BinaryDatabaseManager.loadBitmap(
database,
attachment.binaryData,
@@ -132,7 +131,6 @@ class ImageViewerActivity : DatabaseLockActivity() {
imageView.setImageBitmap(bitmapLoaded)
}
}
}
} ?: finish()
} catch (e: Exception) {
Log.e(TAG, "Unable to view the binary", e)

View File

@@ -306,9 +306,8 @@ class MainCredentialActivity : DatabaseModeActivity() {
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
super.onDatabaseRetrieved(database)
if (database != null) {
// Trying to load another database
if (mDatabaseFileUri != null
&& database.fileUri != null
@@ -320,7 +319,6 @@ class MainCredentialActivity : DatabaseModeActivity() {
}
launchGroupActivityIfLoaded(database)
}
}
override fun onDatabaseActionFinished(
database: ContextualDatabase,

View File

@@ -44,11 +44,13 @@ abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval {
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
mDatabaseViewModel.databaseState.collect { database ->
database?.let {
onDatabaseRetrieved(database)
}
}
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -70,7 +72,7 @@ abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval {
resetAppTimeoutOnTouchOrFocus()
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
// Can be overridden by a subclass
}

View File

@@ -62,14 +62,14 @@ class GroupDialogFragment : DatabaseDialogFragment() {
private lateinit var uuidContainerView: ViewGroup
private lateinit var uuidReferenceView: TextView
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
super.onDatabaseRetrieved(database)
mPopulateIconMethod = { imageView, icon ->
database?.iconDrawableFactory?.assignDatabaseIcon(imageView, icon, mIconColor)
database.iconDrawableFactory.assignDatabaseIcon(imageView, icon, mIconColor)
}
mPopulateIconMethod?.invoke(iconView, mGroupInfo.icon)
if (database?.allowCustomSearchableGroup() == true) {
if (database.allowCustomSearchableGroup()) {
searchableLabelView.visibility = View.VISIBLE
searchableView.visibility = View.VISIBLE
} else {

View File

@@ -112,32 +112,32 @@ class GroupEditDialogFragment : DatabaseDialogFragment() {
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
super.onDatabaseRetrieved(database)
mPopulateIconMethod = { imageView, icon ->
database?.iconDrawableFactory?.assignDatabaseIcon(imageView, icon, mIconColor)
database.iconDrawableFactory.assignDatabaseIcon(imageView, icon, mIconColor)
}
mPopulateIconMethod?.invoke(iconButtonView, mGroupInfo.icon)
searchableContainerView.visibility = if (database?.allowCustomSearchableGroup() == true) {
searchableContainerView.visibility = if (database.allowCustomSearchableGroup()) {
View.VISIBLE
} else {
View.GONE
}
if (database?.allowAutoType() == true) {
if (database.allowAutoType()) {
autoTypeContainerView.visibility = View.VISIBLE
} else {
autoTypeContainerView.visibility = View.GONE
}
tagsAdapter = TagsProposalAdapter(requireContext(), database?.tagPool)
tagsAdapter = TagsProposalAdapter(requireContext(), database.tagPool)
tagsCompletionView.apply {
threshold = 1
setAdapter(tagsAdapter)
}
tagsContainerView.visibility = if (database?.allowTags() == true) View.VISIBLE else View.GONE
tagsContainerView.visibility = if (database.allowTags()) View.VISIBLE else View.GONE
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

View File

@@ -45,10 +45,10 @@ class IconEditDialogFragment : DatabaseDialogFragment() {
private var mCustomIcon: IconImageCustom? = null
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
super.onDatabaseRetrieved(database)
mPopulateIconMethod = { imageView, icon ->
database?.iconDrawableFactory?.assignDatabaseIcon(imageView, icon)
database.iconDrawableFactory.assignDatabaseIcon(imageView, icon)
}
mCustomIcon?.let { customIcon ->
populateViewsWithCustomIcon(customIcon)

View File

@@ -43,11 +43,13 @@ abstract class DatabaseFragment : Fragment(), DatabaseRetrieval {
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
mDatabaseViewModel.databaseState.collect { database ->
database?.let {
onDatabaseRetrieved(database)
}
}
}
}
}
protected fun resetAppTimeoutWhenViewFocusedOrChanged(view: View?) {
context?.let {

View File

@@ -273,13 +273,13 @@ class EntryEditFragment: DatabaseFragment() {
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
templateView.populateIconMethod = { imageView, icon ->
database?.iconDrawableFactory?.assignDatabaseIcon(imageView, icon, mIconColor)
database.iconDrawableFactory.assignDatabaseIcon(imageView, icon, mIconColor)
}
mAllowMultipleAttachments = database?.allowMultipleAttachments == true
mAllowMultipleAttachments = database.allowMultipleAttachments == true
attachmentsAdapter?.database = database
attachmentsAdapter?.onListSizeChangedListener = { previousSize, newSize ->
@@ -290,12 +290,12 @@ class EntryEditFragment: DatabaseFragment() {
}
}
tagsAdapter = TagsProposalAdapter(requireContext(), database?.tagPool)
tagsAdapter = TagsProposalAdapter(requireContext(), database.tagPool)
tagsCompletionView.apply {
threshold = 1
setAdapter(tagsAdapter)
}
tagsContainerView.visibility = if (database?.allowTags() == true) View.VISIBLE else View.GONE
tagsContainerView.visibility = if (database.allowTags()) View.VISIBLE else View.GONE
}
private fun assignEntryInfo(entryInfo: EntryInfo?) {

View File

@@ -133,7 +133,7 @@ class EntryFragment: DatabaseFragment() {
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
context?.let { context ->
attachmentsAdapter = EntryAttachmentsItemsAdapter(context)
attachmentsAdapter?.database = database

View File

@@ -154,9 +154,8 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen
super.onDetach()
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
context?.let { context ->
database?.let { database ->
mAdapter = NodesAdapter(context, database).apply {
setOnNodeClickListener(object : NodesAdapter.NodeClickCallback {
override fun onNodeClick(database: ContextualDatabase, node: Node) {
@@ -195,7 +194,6 @@ class GroupFragment : DatabaseFragment(), SortDialogFragment.SortSelectionListen
mNodesRecyclerView?.adapter = mAdapter
}
}
}
override fun onDatabaseActionFinished(
database: ContextualDatabase,

View File

@@ -71,8 +71,8 @@ abstract class IconFragment<T: IconImageDraw> : DatabaseFragment(),
resetAppTimeoutWhenViewFocusedOrChanged(view)
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
iconPickerAdapter.iconDrawableFactory = database?.iconDrawableFactory
override fun onDatabaseRetrieved(database: ContextualDatabase) {
iconPickerAdapter.iconDrawableFactory = database.iconDrawableFactory
CoroutineScope(Dispatchers.IO).launch {
val populateList = launch {

View File

@@ -48,9 +48,9 @@ class IconPickerFragment : DatabaseFragment() {
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
iconPickerPagerAdapter = IconPickerPagerAdapter(this,
if (database?.allowCustomIcons == true) 2 else 1)
if (database.allowCustomIcons) 2 else 1)
viewPager.adapter = iconPickerPagerAdapter
TabLayoutMediator(tabLayout, viewPager) { tab, position ->
tab.text = when (position) {

View File

@@ -107,7 +107,7 @@ class KeyGeneratorFragment : DatabaseFragment() {
super.onDestroyView()
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
// Nothing here
}

View File

@@ -244,7 +244,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
// Nothing here
}

View File

@@ -320,7 +320,7 @@ class PasswordGeneratorFragment : DatabaseFragment() {
super.onDestroy()
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
// Nothing here
}

View File

@@ -111,13 +111,24 @@ abstract class DatabaseActivity : StylishActivity(), DatabaseRetrieval {
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
mDatabaseViewModel.databaseState.collect { database ->
// Nullable function
onUnknownDatabaseRetrieved(database)
database?.let {
onDatabaseRetrieved(database)
}
}
}
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
/**
* Nullable function to retrieve a database
*/
open fun onUnknownDatabaseRetrieved(database: ContextualDatabase?) {
// optional method implementation
}
override fun onDatabaseRetrieved(database: ContextualDatabase) {
// optional method implementation
}

View File

@@ -90,22 +90,16 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
mExitLock = false
}
open fun finishActivityIfDatabaseNotLoaded(): Boolean {
return true
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
// End activity if database not loaded
if (finishActivityIfDatabaseNotLoaded() && (database != null && !database.loaded)) {
if (database.loaded.not())
finish()
}
// Focus view to reinitialize timeout,
// view is not necessary loaded so retry later in resume
viewToInvalidateTimeout()
?.resetAppTimeoutWhenViewTouchedOrFocused(this, database?.loaded)
?.resetAppTimeoutWhenViewTouchedOrFocused(this, database.loaded)
database?.let {
// check timeout
if (mTimeoutEnable) {
if (mLockReceiver == null) {
@@ -132,7 +126,6 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
checkRegister()
}
}
override fun finish() {
// To fix weird crash

View File

@@ -4,8 +4,11 @@ import com.kunzisoft.keepass.database.ContextualDatabase
import com.kunzisoft.keepass.tasks.ActionRunnable
interface DatabaseRetrieval {
fun onDatabaseRetrieved(database: ContextualDatabase?)
fun onDatabaseActionFinished(database: ContextualDatabase,
fun onDatabaseRetrieved(database: ContextualDatabase)
fun onDatabaseActionFinished(
database: ContextualDatabase,
actionTask: String,
result: ActionRunnable.Result)
result: ActionRunnable.Result
)
}

View File

@@ -152,8 +152,8 @@ class AutofillLauncherActivity : DatabaseModeActivity() {
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
override fun onUnknownDatabaseRetrieved(database: ContextualDatabase?) {
super.onUnknownDatabaseRetrieved(database)
autofillLauncherViewModel.launchActionIfNeeded(intent, mSpecialMode, database)
}

View File

@@ -51,8 +51,8 @@ class EntrySelectionLauncherActivity : DatabaseModeActivity() {
return false
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
override fun onUnknownDatabaseRetrieved(database: ContextualDatabase?) {
super.onUnknownDatabaseRetrieved(database)
val keySelectionBundle = intent.getBundleExtra(KEY_SELECTION_BUNDLE)
if (keySelectionBundle != null) {

View File

@@ -81,10 +81,6 @@ class PasskeyLauncherActivity : DatabaseLockActivity() {
return false
}
override fun finishActivityIfDatabaseNotLoaded(): Boolean {
return false
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {
@@ -167,12 +163,10 @@ class PasskeyLauncherActivity : DatabaseLockActivity() {
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
if (database != null) {
override fun onUnknownDatabaseRetrieved(database: ContextualDatabase?) {
super.onUnknownDatabaseRetrieved(database)
passkeyLauncherViewModel.launchActionIfNeeded(intent, mSpecialMode, database)
}
}
override fun onDatabaseActionFinished(
database: ContextualDatabase,

View File

@@ -99,11 +99,11 @@ class PasskeyProviderService : CredentialProviderService() {
override fun onBeginGetCredentialRequest(
request: BeginGetCredentialRequest,
cancellationSignal: CancellationSignal,
callback: OutcomeReceiver<BeginGetCredentialResponse, GetCredentialException>,
callback: OutcomeReceiver<BeginGetCredentialResponse, GetCredentialException>
) {
Log.d(javaClass.simpleName, "onBeginGetCredentialRequest called")
try {
processGetCredentialsRequest(request)?.let { response ->
processGetCredentialsRequest(request) { response ->
callback.onResult(response)
}
} catch (e: Exception) {
@@ -112,20 +112,25 @@ class PasskeyProviderService : CredentialProviderService() {
}
}
private fun processGetCredentialsRequest(request: BeginGetCredentialRequest): BeginGetCredentialResponse? {
val credentialEntries: MutableList<CredentialEntry> = mutableListOf()
private fun processGetCredentialsRequest(
request: BeginGetCredentialRequest,
callback: (BeginGetCredentialResponse?) -> Unit
) {
var knownOption = false
for (option in request.beginGetCredentialOptions) {
when (option) {
is BeginGetPublicKeyCredentialOption -> {
knownOption = true
populatePasskeyData(option) { listCredentials ->
credentialEntries.addAll(listCredentials)
}
return BeginGetCredentialResponse(credentialEntries)
callback(BeginGetCredentialResponse(listCredentials))
}
}
}
}
if (knownOption.not()) {
throw IOException("unknown type of beginGetCredentialOption")
}
}
private fun populatePasskeyData(
option: BeginGetPublicKeyCredentialOption,

View File

@@ -38,7 +38,6 @@ import java.io.IOException
class AutofillLauncherViewModel(application: Application): CredentialLauncherViewModel(application) {
private var mAutofillComponent: AutofillComponent? = null
private var mSelectionResult: ActivityResult? = null
private var mLockDatabaseAfterSelection: Boolean = false
@@ -52,16 +51,6 @@ class AutofillLauncherViewModel(application: Application): CredentialLauncherVie
override fun onResult() {
super.onResult()
mAutofillComponent = null
mSelectionResult = null
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
super.onDatabaseRetrieved(database)
if (database != null) {
mSelectionResult?.let { selectionResult ->
manageSelectionResult(database, selectionResult)
}
}
}
override suspend fun launchAction(
@@ -151,26 +140,11 @@ class AutofillLauncherViewModel(application: Application): CredentialLauncherVie
}
}
override fun manageSelectionResult(activityResult: ActivityResult) {
// Waiting for the database if needed
when (activityResult.resultCode) {
RESULT_OK -> {
mSelectionResult = activityResult
mDatabase?.let { database ->
manageSelectionResult(database, activityResult)
}
}
RESULT_CANCELED -> {
cancelResult()
}
}
}
private fun manageSelectionResult(
override fun manageSelectionResult(
database: ContextualDatabase,
activityResult: ActivityResult
) {
mSelectionResult = null
super.manageSelectionResult(database, activityResult)
val intent = activityResult.data
viewModelScope.launch(CoroutineExceptionHandler { _, e ->
Log.e(TAG, "Unable to create selection response for autofill", e)

View File

@@ -23,6 +23,7 @@ abstract class CredentialLauncherViewModel(application: Application): AndroidVie
protected var mDatabase: ContextualDatabase? = null
protected var isResultLauncherRegistered: Boolean = false
private var mSelectionResult: ActivityResult? = null
protected val mCredentialUiState = MutableStateFlow<UIState>(UIState.Loading)
val credentialUiState: StateFlow<UIState> = mCredentialUiState
@@ -34,6 +35,7 @@ abstract class CredentialLauncherViewModel(application: Application): AndroidVie
open fun onResult() {
isResultLauncherRegistered = false
mSelectionResult = null
}
fun setResult(intent: Intent, lockDatabase: Boolean = false) {
@@ -54,11 +56,31 @@ abstract class CredentialLauncherViewModel(application: Application): AndroidVie
)
}
open fun onDatabaseRetrieved(database: ContextualDatabase?) {
private fun onDatabaseRetrieved(database: ContextualDatabase) {
mDatabase = database
mSelectionResult?.let { selectionResult ->
manageSelectionResult(database, selectionResult)
}
}
abstract fun manageSelectionResult(activityResult: ActivityResult)
fun manageSelectionResult(activityResult: ActivityResult) {
// Waiting for the database if needed
when (activityResult.resultCode) {
RESULT_OK -> {
mSelectionResult = activityResult
mDatabase?.let { database ->
manageSelectionResult(database, activityResult)
}
}
RESULT_CANCELED -> {
cancelResult()
}
}
}
open fun manageSelectionResult(database: ContextualDatabase, activityResult: ActivityResult) {
mSelectionResult = null
}
abstract fun manageRegistrationResult(activityResult: ActivityResult)
@@ -66,12 +88,14 @@ abstract class CredentialLauncherViewModel(application: Application): AndroidVie
showError(e)
}
fun launchActionIfNeeded(
open fun launchActionIfNeeded(
intent: Intent,
specialMode: SpecialMode,
database: ContextualDatabase?
) {
database?.let {
onDatabaseRetrieved(database)
}
if (isResultLauncherRegistered.not()) {
isResultLauncherRegistered = true
viewModelScope.launch(CoroutineExceptionHandler { _, e ->

View File

@@ -147,6 +147,17 @@ class PasskeyLauncherViewModel(application: Application): CredentialLauncherView
}
}
override fun launchActionIfNeeded(
intent: Intent,
specialMode: SpecialMode,
database: ContextualDatabase?
) {
// Launch with database when a nodeId is present
if (database != null || intent.retrieveNodeId() == null) {
super.launchActionIfNeeded(intent, specialMode, database)
}
}
override suspend fun launchAction(
intent: Intent,
specialMode: SpecialMode,
@@ -305,7 +316,11 @@ class PasskeyLauncherViewModel(application: Application): CredentialLauncherView
}
}
override fun manageSelectionResult(activityResult: ActivityResult) {
override fun manageSelectionResult(
database: ContextualDatabase,
activityResult: ActivityResult
) {
super.manageSelectionResult(database, activityResult)
val intent = activityResult.data
viewModelScope.launch(CoroutineExceptionHandler { _, e ->
Log.e(TAG, "Unable to create selection response for passkey", e)

View File

@@ -48,7 +48,7 @@ class HardwareKeyActivity: DatabaseModeActivity(){
return false
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
val hardwareKey = HardwareKey.getHardwareKeyFromString(
intent.getStringExtra(DATA_HARDWARE_KEY)
)

View File

@@ -165,11 +165,13 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
mDatabaseViewModel.databaseState.collect { database ->
database?.let {
onDatabaseRetrieved(database)
}
}
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -221,21 +223,20 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
mDatabaseViewModel.reloadDatabase(false)
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
mDatabaseReadOnly = database?.isReadOnly == true
mMergeDataAllowed = database?.isMergeDataAllowed() == true
override fun onDatabaseRetrieved(database: ContextualDatabase) {
mDatabaseReadOnly = database.isReadOnly
mMergeDataAllowed = database.isMergeDataAllowed()
database?.let {
if (it.loaded) {
if (database.loaded) {
when (mScreen) {
Screen.DATABASE -> {
onCreateDatabasePreference(it)
onCreateDatabasePreference(database)
}
Screen.DATABASE_SECURITY -> {
onCreateDatabaseSecurityPreference(it)
onCreateDatabaseSecurityPreference(database)
}
Screen.DATABASE_MASTER_KEY -> {
onCreateDatabaseMasterKeyPreference(it)
onCreateDatabaseMasterKeyPreference(database)
}
else -> {
}
@@ -244,7 +245,6 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
Log.e(javaClass.name, "Database isn't ready")
}
}
}
private fun onCreateDatabasePreference(database: ContextualDatabase) {
val dbGeneralPrefCategory: PreferenceCategory? = findPreference(getString(R.string.database_category_general_key))

View File

@@ -159,10 +159,6 @@ open class SettingsActivity
return coordinatorLayout
}
override fun finishActivityIfDatabaseNotLoaded(): Boolean {
return false
}
override fun onDatabaseActionFinished(
database: ContextualDatabase,
actionTask: String,

View File

@@ -95,9 +95,8 @@ class DatabaseColorPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialog
return dialog
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
database?.let {
var initColor = it.customColor
override fun onDatabaseRetrieved(database: ContextualDatabase) {
var initColor = database.customColor
if (initColor != null) {
enableSwitchView.isChecked = true
} else {
@@ -107,7 +106,6 @@ class DatabaseColorPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialog
chromaColorView.currentColor = initColor
arguments?.putInt(ARG_INITIAL_COLOR, initColor)
}
}
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)

View File

@@ -50,15 +50,14 @@ class DatabaseDataCompressionPreferenceDialogFragmentCompat
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
setExplanationText(R.string.database_data_compression_summary)
mRecyclerView?.adapter = mCompressionAdapter
database?.let {
compressionSelected = it.compressionAlgorithm
mCompressionAdapter?.setItems(it.availableCompressionAlgorithms, compressionSelected)
}
compressionSelected = database.compressionAlgorithm
mCompressionAdapter?.setItems(
items = database.availableCompressionAlgorithms,
itemUsed = compressionSelected
)
}
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {

View File

@@ -24,8 +24,8 @@ import com.kunzisoft.keepass.database.ContextualDatabase
class DatabaseDefaultUsernamePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
inputText = database?.defaultUsername?: ""
override fun onDatabaseRetrieved(database: ContextualDatabase) {
inputText = database.defaultUsername
}
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {

View File

@@ -24,8 +24,8 @@ import com.kunzisoft.keepass.database.ContextualDatabase
class DatabaseDescriptionPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
inputText = database?.description ?: ""
override fun onDatabaseRetrieved(database: ContextualDatabase) {
inputText = database.description
}
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {

View File

@@ -51,12 +51,10 @@ class DatabaseEncryptionAlgorithmPreferenceDialogFragmentCompat
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
database?.let {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
algorithmSelected = database.encryptionAlgorithm
mEncryptionAlgorithmAdapter?.setItems(database.availableEncryptionAlgorithms, algorithmSelected)
}
}
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)

View File

@@ -54,11 +54,12 @@ class DatabaseKeyDerivationPreferenceDialogFragmentCompat
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
database?.let {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
kdfEngineSelected = database.kdfEngine
mKdfAdapter?.setItems(database.availableKdfEngines, kdfEngineSelected)
}
mKdfAdapter?.setItems(
items = database.availableKdfEngines,
itemUsed = kdfEngineSelected
)
}
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {

View File

@@ -31,8 +31,8 @@ class DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat : DatabaseSavePrefer
setExplanationText(R.string.max_history_items_summary)
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
database?.historyMaxItems?.let { maxItemsDatabase ->
override fun onDatabaseRetrieved(database: ContextualDatabase) {
val maxItemsDatabase = database.historyMaxItems
inputText = maxItemsDatabase.toString()
setSwitchAction({ isChecked ->
inputText = if (!isChecked) {
@@ -43,7 +43,6 @@ class DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat : DatabaseSavePrefer
showInputText(isChecked)
}, maxItemsDatabase > NONE_MAX_HISTORY_ITEMS)
}
}
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)

View File

@@ -34,8 +34,8 @@ class DatabaseMaxHistorySizePreferenceDialogFragmentCompat : DatabaseSavePrefere
setExplanationText(R.string.max_history_size_summary)
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
database?.historyMaxSize?.let { maxItemsDatabase ->
override fun onDatabaseRetrieved(database: ContextualDatabase) {
val maxItemsDatabase = database.historyMaxSize
dataByte = DataByte(maxItemsDatabase, DataByte.ByteFormat.BYTE)
.toBetterByteFormat()
inputText = dataByte.number.toString()
@@ -58,7 +58,6 @@ class DatabaseMaxHistorySizePreferenceDialogFragmentCompat : DatabaseSavePrefere
showInputText(isChecked)
}, maxItemsDatabase > INFINITE_MAX_HISTORY_SIZE)
}
}
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {
super.onDialogClosed(database, positiveResult)

View File

@@ -34,15 +34,13 @@ class DatabaseMemoryUsagePreferenceDialogFragmentCompat : DatabaseSavePreference
setExplanationText(R.string.memory_usage_explanation)
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
database?.let {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
val memoryBytes = database.memoryUsage
dataByte = DataByte(memoryBytes, DataByte.ByteFormat.BYTE)
.toBetterByteFormat()
inputText = dataByte.number.toString()
setUnitText(dataByte.format.stringId)
}
}
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {
if (positiveResult) {

View File

@@ -24,8 +24,8 @@ import com.kunzisoft.keepass.database.ContextualDatabase
class DatabaseNamePreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat() {
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
inputText = database?.name ?: ""
override fun onDatabaseRetrieved(database: ContextualDatabase) {
inputText = database.name
}
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {

View File

@@ -31,8 +31,8 @@ class DatabaseParallelismPreferenceDialogFragmentCompat : DatabaseSavePreference
setExplanationText(R.string.parallelism_explanation)
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
inputText = database?.parallelism?.toString() ?: MIN_PARALLELISM.toString()
override fun onDatabaseRetrieved(database: ContextualDatabase) {
inputText = database.parallelism.toString()
}
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {

View File

@@ -48,12 +48,10 @@ class DatabaseRecycleBinGroupPreferenceDialogFragmentCompat
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
database?.let {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
mGroupRecycleBin = database.recycleBin
mGroupsAdapter?.setItems(database.getAllGroupsWithoutRoot(), mGroupRecycleBin)
}
}
override fun onItemSelected(item: Group) {
mGroupRecycleBin = item

View File

@@ -46,7 +46,7 @@ class DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat : DatabaseSavePre
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {}
override fun onDatabaseRetrieved(database: ContextualDatabase) {}
companion object {

View File

@@ -32,8 +32,8 @@ class DatabaseRoundsPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialo
explanationText = getString(R.string.rounds_explanation)
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
inputText = database?.numberKeyEncryptionRounds?.toString() ?: MIN_ITERATIONS.toString()
override fun onDatabaseRetrieved(database: ContextualDatabase) {
inputText = database.numberKeyEncryptionRounds.toString()
}
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {

View File

@@ -72,11 +72,13 @@ abstract class DatabaseSavePreferenceDialogFragmentCompat
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
mDatabaseViewModel.databaseState.collect { database ->
database?.let {
onDatabaseRetrieved(database)
}
}
}
}
}
override fun onDatabaseActionFinished(
database: ContextualDatabase,

View File

@@ -48,12 +48,10 @@ class DatabaseTemplatesGroupPreferenceDialogFragmentCompat
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
database?.let {
override fun onDatabaseRetrieved(database: ContextualDatabase) {
mGroupTemplates = database.templatesGroup
mGroupsAdapter?.setItems(database.getAllGroupsWithoutRoot(), mGroupTemplates)
}
}
override fun onItemSelected(item: Group) {
mGroupTemplates = item