mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
fix: Database workflow
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,10 +216,8 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
if (database != null) {
|
||||
launchGroupActivityIfLoaded(database)
|
||||
}
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {
|
||||
launchGroupActivityIfLoaded(database)
|
||||
}
|
||||
|
||||
override fun onDatabaseActionFinished(
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -101,7 +101,7 @@ class ImageViewerActivity : DatabaseLockActivity() {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {
|
||||
super.onDatabaseRetrieved(database)
|
||||
|
||||
try {
|
||||
@@ -119,18 +119,16 @@ class ImageViewerActivity : DatabaseLockActivity() {
|
||||
resources.displayMetrics.heightPixels * 2
|
||||
)
|
||||
|
||||
database?.let { database ->
|
||||
BinaryDatabaseManager.loadBitmap(
|
||||
database,
|
||||
attachment.binaryData,
|
||||
mImagePreviewMaxWidth
|
||||
) { bitmapLoaded ->
|
||||
if (bitmapLoaded == null) {
|
||||
finish()
|
||||
} else {
|
||||
progressView.visibility = View.GONE
|
||||
imageView.setImageBitmap(bitmapLoaded)
|
||||
}
|
||||
BinaryDatabaseManager.loadBitmap(
|
||||
database,
|
||||
attachment.binaryData,
|
||||
mImagePreviewMaxWidth
|
||||
) { bitmapLoaded ->
|
||||
if (bitmapLoaded == null) {
|
||||
finish()
|
||||
} else {
|
||||
progressView.visibility = View.GONE
|
||||
imageView.setImageBitmap(bitmapLoaded)
|
||||
}
|
||||
}
|
||||
} ?: finish()
|
||||
|
||||
@@ -306,20 +306,18 @@ 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
|
||||
&& mDatabaseFileUri != database.fileUri) {
|
||||
Toast.makeText(this,
|
||||
R.string.warning_database_already_opened,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
launchGroupActivityIfLoaded(database)
|
||||
// Trying to load another database
|
||||
if (mDatabaseFileUri != null
|
||||
&& database.fileUri != null
|
||||
&& mDatabaseFileUri != database.fileUri) {
|
||||
Toast.makeText(this,
|
||||
R.string.warning_database_already_opened,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
launchGroupActivityIfLoaded(database)
|
||||
}
|
||||
|
||||
override fun onDatabaseActionFinished(
|
||||
|
||||
@@ -44,7 +44,9 @@ abstract class DatabaseDialogFragment : DialogFragment(), DatabaseRetrieval {
|
||||
lifecycleScope.launch {
|
||||
repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
||||
mDatabaseViewModel.databaseState.collect { database ->
|
||||
onDatabaseRetrieved(database)
|
||||
database?.let {
|
||||
onDatabaseRetrieved(database)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -43,7 +43,9 @@ abstract class DatabaseFragment : Fragment(), DatabaseRetrieval {
|
||||
lifecycleScope.launch {
|
||||
repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
||||
mDatabaseViewModel.databaseState.collect { database ->
|
||||
onDatabaseRetrieved(database)
|
||||
database?.let {
|
||||
onDatabaseRetrieved(database)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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?) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -154,46 +154,44 @@ 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) {
|
||||
if (nodeActionSelectionMode) {
|
||||
if (listActionNodes.contains(node)) {
|
||||
// Remove selected item if already selected
|
||||
listActionNodes.remove(node)
|
||||
} else {
|
||||
// Add selected item if not already selected
|
||||
listActionNodes.add(node)
|
||||
}
|
||||
nodeClickListener?.onNodeSelected(database, listActionNodes)
|
||||
setActionNodes(listActionNodes)
|
||||
notifyNodeChanged(node)
|
||||
mAdapter = NodesAdapter(context, database).apply {
|
||||
setOnNodeClickListener(object : NodesAdapter.NodeClickCallback {
|
||||
override fun onNodeClick(database: ContextualDatabase, node: Node) {
|
||||
if (nodeActionSelectionMode) {
|
||||
if (listActionNodes.contains(node)) {
|
||||
// Remove selected item if already selected
|
||||
listActionNodes.remove(node)
|
||||
} else {
|
||||
nodeClickListener?.onNodeClick(database, node)
|
||||
// Add selected item if not already selected
|
||||
listActionNodes.add(node)
|
||||
}
|
||||
nodeClickListener?.onNodeSelected(database, listActionNodes)
|
||||
setActionNodes(listActionNodes)
|
||||
notifyNodeChanged(node)
|
||||
} else {
|
||||
nodeClickListener?.onNodeClick(database, node)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onNodeLongClick(database: ContextualDatabase, node: Node): Boolean {
|
||||
if (nodeActionPasteMode == PasteMode.UNDEFINED) {
|
||||
// Select the first item after a long click
|
||||
if (!listActionNodes.contains(node))
|
||||
listActionNodes.add(node)
|
||||
override fun onNodeLongClick(database: ContextualDatabase, node: Node): Boolean {
|
||||
if (nodeActionPasteMode == PasteMode.UNDEFINED) {
|
||||
// Select the first item after a long click
|
||||
if (!listActionNodes.contains(node))
|
||||
listActionNodes.add(node)
|
||||
|
||||
nodeClickListener?.onNodeSelected(database, listActionNodes)
|
||||
nodeClickListener?.onNodeSelected(database, listActionNodes)
|
||||
|
||||
setActionNodes(listActionNodes)
|
||||
notifyNodeChanged(node)
|
||||
activity?.hideKeyboard()
|
||||
}
|
||||
return true
|
||||
setActionNodes(listActionNodes)
|
||||
notifyNodeChanged(node)
|
||||
activity?.hideKeyboard()
|
||||
}
|
||||
})
|
||||
}
|
||||
mNodesRecyclerView?.adapter = mAdapter
|
||||
return true
|
||||
}
|
||||
})
|
||||
}
|
||||
mNodesRecyclerView?.adapter = mAdapter
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -107,7 +107,7 @@ class KeyGeneratorFragment : DatabaseFragment() {
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {
|
||||
// Nothing here
|
||||
}
|
||||
|
||||
|
||||
@@ -244,7 +244,7 @@ class PassphraseGeneratorFragment : DatabaseFragment() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {
|
||||
// Nothing here
|
||||
}
|
||||
|
||||
|
||||
@@ -320,7 +320,7 @@ class PasswordGeneratorFragment : DatabaseFragment() {
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {
|
||||
// Nothing here
|
||||
}
|
||||
|
||||
|
||||
@@ -111,13 +111,24 @@ abstract class DatabaseActivity : StylishActivity(), DatabaseRetrieval {
|
||||
lifecycleScope.launch {
|
||||
repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
||||
mDatabaseViewModel.databaseState.collect { database ->
|
||||
onDatabaseRetrieved(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
|
||||
}
|
||||
|
||||
|
||||
@@ -90,48 +90,41 @@ 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) {
|
||||
mLockReceiver = LockReceiver {
|
||||
closeDatabase(database)
|
||||
mExitLock = true
|
||||
closeOptionsMenu()
|
||||
finish()
|
||||
}
|
||||
registerLockReceiver(mLockReceiver)
|
||||
// check timeout
|
||||
if (mTimeoutEnable) {
|
||||
if (mLockReceiver == null) {
|
||||
mLockReceiver = LockReceiver {
|
||||
closeDatabase(database)
|
||||
mExitLock = true
|
||||
closeOptionsMenu()
|
||||
finish()
|
||||
}
|
||||
|
||||
// After the first creation
|
||||
// or If simply swipe with another application
|
||||
// If the time is out -> close the Activity
|
||||
TimeoutHelper.checkTimeAndLockIfTimeout(this)
|
||||
// If onCreate already record time
|
||||
if (!mExitLock)
|
||||
TimeoutHelper.recordTime(this, database.loaded)
|
||||
registerLockReceiver(mLockReceiver)
|
||||
}
|
||||
|
||||
mDatabaseReadOnly = database.isReadOnly
|
||||
mMergeDataAllowed = database.isMergeDataAllowed()
|
||||
|
||||
checkRegister()
|
||||
// After the first creation
|
||||
// or If simply swipe with another application
|
||||
// If the time is out -> close the Activity
|
||||
TimeoutHelper.checkTimeAndLockIfTimeout(this)
|
||||
// If onCreate already record time
|
||||
if (!mExitLock)
|
||||
TimeoutHelper.recordTime(this, database.loaded)
|
||||
}
|
||||
|
||||
mDatabaseReadOnly = database.isReadOnly
|
||||
mMergeDataAllowed = database.isMergeDataAllowed()
|
||||
|
||||
checkRegister()
|
||||
}
|
||||
|
||||
override fun finish() {
|
||||
|
||||
@@ -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,
|
||||
actionTask: String,
|
||||
result: ActionRunnable.Result)
|
||||
fun onDatabaseRetrieved(database: ContextualDatabase)
|
||||
|
||||
fun onDatabaseActionFinished(
|
||||
database: ContextualDatabase,
|
||||
actionTask: String,
|
||||
result: ActionRunnable.Result
|
||||
)
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,11 +163,9 @@ class PasskeyLauncherActivity : DatabaseLockActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
super.onDatabaseRetrieved(database)
|
||||
if (database != null) {
|
||||
passkeyLauncherViewModel.launchActionIfNeeded(intent, mSpecialMode, database)
|
||||
}
|
||||
override fun onUnknownDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
super.onUnknownDatabaseRetrieved(database)
|
||||
passkeyLauncherViewModel.launchActionIfNeeded(intent, mSpecialMode, database)
|
||||
}
|
||||
|
||||
override fun onDatabaseActionFinished(
|
||||
|
||||
@@ -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,19 +112,24 @@ 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)
|
||||
callback(BeginGetCredentialResponse(listCredentials))
|
||||
}
|
||||
return BeginGetCredentialResponse(credentialEntries)
|
||||
}
|
||||
}
|
||||
}
|
||||
throw IOException("unknown type of beginGetCredentialOption")
|
||||
if (knownOption.not()) {
|
||||
throw IOException("unknown type of beginGetCredentialOption")
|
||||
}
|
||||
}
|
||||
|
||||
private fun populatePasskeyData(
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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?
|
||||
) {
|
||||
onDatabaseRetrieved(database)
|
||||
database?.let {
|
||||
onDatabaseRetrieved(database)
|
||||
}
|
||||
if (isResultLauncherRegistered.not()) {
|
||||
isResultLauncherRegistered = true
|
||||
viewModelScope.launch(CoroutineExceptionHandler { _, e ->
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
@@ -165,7 +165,9 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev
|
||||
lifecycleScope.launch {
|
||||
repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
||||
mDatabaseViewModel.databaseState.collect { database ->
|
||||
onDatabaseRetrieved(database)
|
||||
database?.let {
|
||||
onDatabaseRetrieved(database)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -221,28 +223,26 @@ 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) {
|
||||
when (mScreen) {
|
||||
Screen.DATABASE -> {
|
||||
onCreateDatabasePreference(it)
|
||||
}
|
||||
Screen.DATABASE_SECURITY -> {
|
||||
onCreateDatabaseSecurityPreference(it)
|
||||
}
|
||||
Screen.DATABASE_MASTER_KEY -> {
|
||||
onCreateDatabaseMasterKeyPreference(it)
|
||||
}
|
||||
else -> {
|
||||
}
|
||||
if (database.loaded) {
|
||||
when (mScreen) {
|
||||
Screen.DATABASE -> {
|
||||
onCreateDatabasePreference(database)
|
||||
}
|
||||
Screen.DATABASE_SECURITY -> {
|
||||
onCreateDatabaseSecurityPreference(database)
|
||||
}
|
||||
Screen.DATABASE_MASTER_KEY -> {
|
||||
onCreateDatabaseMasterKeyPreference(database)
|
||||
}
|
||||
else -> {
|
||||
}
|
||||
} else {
|
||||
Log.e(javaClass.name, "Database isn't ready")
|
||||
}
|
||||
} else {
|
||||
Log.e(javaClass.name, "Database isn't ready")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -159,10 +159,6 @@ open class SettingsActivity
|
||||
return coordinatorLayout
|
||||
}
|
||||
|
||||
override fun finishActivityIfDatabaseNotLoaded(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun onDatabaseActionFinished(
|
||||
database: ContextualDatabase,
|
||||
actionTask: String,
|
||||
|
||||
@@ -95,18 +95,16 @@ class DatabaseColorPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialog
|
||||
return dialog
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
database?.let {
|
||||
var initColor = it.customColor
|
||||
if (initColor != null) {
|
||||
enableSwitchView.isChecked = true
|
||||
} else {
|
||||
enableSwitchView.isChecked = false
|
||||
initColor = DEFAULT_COLOR
|
||||
}
|
||||
chromaColorView.currentColor = initColor
|
||||
arguments?.putInt(ARG_INITIAL_COLOR, initColor)
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {
|
||||
var initColor = database.customColor
|
||||
if (initColor != null) {
|
||||
enableSwitchView.isChecked = true
|
||||
} else {
|
||||
enableSwitchView.isChecked = false
|
||||
initColor = DEFAULT_COLOR
|
||||
}
|
||||
chromaColorView.currentColor = initColor
|
||||
arguments?.putInt(ARG_INITIAL_COLOR, initColor)
|
||||
}
|
||||
|
||||
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -51,11 +51,9 @@ class DatabaseEncryptionAlgorithmPreferenceDialogFragmentCompat
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
database?.let {
|
||||
algorithmSelected = database.encryptionAlgorithm
|
||||
mEncryptionAlgorithmAdapter?.setItems(database.availableEncryptionAlgorithms, algorithmSelected)
|
||||
}
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {
|
||||
algorithmSelected = database.encryptionAlgorithm
|
||||
mEncryptionAlgorithmAdapter?.setItems(database.availableEncryptionAlgorithms, algorithmSelected)
|
||||
}
|
||||
|
||||
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {
|
||||
|
||||
@@ -54,11 +54,12 @@ class DatabaseKeyDerivationPreferenceDialogFragmentCompat
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
database?.let {
|
||||
kdfEngineSelected = database.kdfEngine
|
||||
mKdfAdapter?.setItems(database.availableKdfEngines, kdfEngineSelected)
|
||||
}
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {
|
||||
kdfEngineSelected = database.kdfEngine
|
||||
mKdfAdapter?.setItems(
|
||||
items = database.availableKdfEngines,
|
||||
itemUsed = kdfEngineSelected
|
||||
)
|
||||
}
|
||||
|
||||
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {
|
||||
|
||||
@@ -31,18 +31,17 @@ class DatabaseMaxHistoryItemsPreferenceDialogFragmentCompat : DatabaseSavePrefer
|
||||
setExplanationText(R.string.max_history_items_summary)
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
database?.historyMaxItems?.let { maxItemsDatabase ->
|
||||
inputText = maxItemsDatabase.toString()
|
||||
setSwitchAction({ isChecked ->
|
||||
inputText = if (!isChecked) {
|
||||
NONE_MAX_HISTORY_ITEMS.toString()
|
||||
} else {
|
||||
DEFAULT_MAX_HISTORY_ITEMS.toString()
|
||||
}
|
||||
showInputText(isChecked)
|
||||
}, maxItemsDatabase > NONE_MAX_HISTORY_ITEMS)
|
||||
}
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {
|
||||
val maxItemsDatabase = database.historyMaxItems
|
||||
inputText = maxItemsDatabase.toString()
|
||||
setSwitchAction({ isChecked ->
|
||||
inputText = if (!isChecked) {
|
||||
NONE_MAX_HISTORY_ITEMS.toString()
|
||||
} else {
|
||||
DEFAULT_MAX_HISTORY_ITEMS.toString()
|
||||
}
|
||||
showInputText(isChecked)
|
||||
}, maxItemsDatabase > NONE_MAX_HISTORY_ITEMS)
|
||||
}
|
||||
|
||||
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {
|
||||
|
||||
@@ -34,30 +34,29 @@ class DatabaseMaxHistorySizePreferenceDialogFragmentCompat : DatabaseSavePrefere
|
||||
setExplanationText(R.string.max_history_size_summary)
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
database?.historyMaxSize?.let { maxItemsDatabase ->
|
||||
dataByte = DataByte(maxItemsDatabase, DataByte.ByteFormat.BYTE)
|
||||
.toBetterByteFormat()
|
||||
inputText = dataByte.number.toString()
|
||||
if (dataByte.number >= 0) {
|
||||
setUnitText(dataByte.format.stringId)
|
||||
} else {
|
||||
unitText = null
|
||||
}
|
||||
|
||||
setSwitchAction({ isChecked ->
|
||||
if (!isChecked) {
|
||||
dataByte = INFINITE_MAX_HISTORY_SIZE_DATA_BYTE
|
||||
inputText = INFINITE_MAX_HISTORY_SIZE.toString()
|
||||
unitText = null
|
||||
} else {
|
||||
dataByte = DEFAULT_MAX_HISTORY_SIZE_DATA_BYTE
|
||||
inputText = dataByte.number.toString()
|
||||
setUnitText(dataByte.format.stringId)
|
||||
}
|
||||
showInputText(isChecked)
|
||||
}, maxItemsDatabase > INFINITE_MAX_HISTORY_SIZE)
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {
|
||||
val maxItemsDatabase = database.historyMaxSize
|
||||
dataByte = DataByte(maxItemsDatabase, DataByte.ByteFormat.BYTE)
|
||||
.toBetterByteFormat()
|
||||
inputText = dataByte.number.toString()
|
||||
if (dataByte.number >= 0) {
|
||||
setUnitText(dataByte.format.stringId)
|
||||
} else {
|
||||
unitText = null
|
||||
}
|
||||
|
||||
setSwitchAction({ isChecked ->
|
||||
if (!isChecked) {
|
||||
dataByte = INFINITE_MAX_HISTORY_SIZE_DATA_BYTE
|
||||
inputText = INFINITE_MAX_HISTORY_SIZE.toString()
|
||||
unitText = null
|
||||
} else {
|
||||
dataByte = DEFAULT_MAX_HISTORY_SIZE_DATA_BYTE
|
||||
inputText = dataByte.number.toString()
|
||||
setUnitText(dataByte.format.stringId)
|
||||
}
|
||||
showInputText(isChecked)
|
||||
}, maxItemsDatabase > INFINITE_MAX_HISTORY_SIZE)
|
||||
}
|
||||
|
||||
override fun onDialogClosed(database: ContextualDatabase?, positiveResult: Boolean) {
|
||||
|
||||
@@ -34,14 +34,12 @@ class DatabaseMemoryUsagePreferenceDialogFragmentCompat : DatabaseSavePreference
|
||||
setExplanationText(R.string.memory_usage_explanation)
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
database?.let {
|
||||
val memoryBytes = database.memoryUsage
|
||||
dataByte = DataByte(memoryBytes, DataByte.ByteFormat.BYTE)
|
||||
.toBetterByteFormat()
|
||||
inputText = dataByte.number.toString()
|
||||
setUnitText(dataByte.format.stringId)
|
||||
}
|
||||
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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -48,11 +48,9 @@ class DatabaseRecycleBinGroupPreferenceDialogFragmentCompat
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
database?.let {
|
||||
mGroupRecycleBin = database.recycleBin
|
||||
mGroupsAdapter?.setItems(database.getAllGroupsWithoutRoot(), mGroupRecycleBin)
|
||||
}
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {
|
||||
mGroupRecycleBin = database.recycleBin
|
||||
mGroupsAdapter?.setItems(database.getAllGroupsWithoutRoot(), mGroupRecycleBin)
|
||||
}
|
||||
|
||||
override fun onItemSelected(item: Group) {
|
||||
|
||||
@@ -46,7 +46,7 @@ class DatabaseRemoveUnlinkedDataPreferenceDialogFragmentCompat : DatabaseSavePre
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {}
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {}
|
||||
|
||||
companion object {
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -72,7 +72,9 @@ abstract class DatabaseSavePreferenceDialogFragmentCompat
|
||||
lifecycleScope.launch {
|
||||
repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
||||
mDatabaseViewModel.databaseState.collect { database ->
|
||||
onDatabaseRetrieved(database)
|
||||
database?.let {
|
||||
onDatabaseRetrieved(database)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,11 +48,9 @@ class DatabaseTemplatesGroupPreferenceDialogFragmentCompat
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase?) {
|
||||
database?.let {
|
||||
mGroupTemplates = database.templatesGroup
|
||||
mGroupsAdapter?.setItems(database.getAllGroupsWithoutRoot(), mGroupTemplates)
|
||||
}
|
||||
override fun onDatabaseRetrieved(database: ContextualDatabase) {
|
||||
mGroupTemplates = database.templatesGroup
|
||||
mGroupsAdapter?.setItems(database.getAllGroupsWithoutRoot(), mGroupTemplates)
|
||||
}
|
||||
|
||||
override fun onItemSelected(item: Group) {
|
||||
|
||||
Reference in New Issue
Block a user