diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt index 33354bdb2..3cf02802d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt @@ -47,6 +47,7 @@ import com.kunzisoft.keepass.database.exception.InvalidCredentialsDatabaseExcept import com.kunzisoft.keepass.hardware.HardwareKey import com.kunzisoft.keepass.hardware.HardwareKeyResponseHelper import com.kunzisoft.keepass.model.CipherEncryptDatabase +import com.kunzisoft.keepass.model.ProgressMessage import com.kunzisoft.keepass.model.SnapFileDatabaseInfo import com.kunzisoft.keepass.services.DatabaseTaskNotificationService import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_ASSIGN_PASSWORD_TASK @@ -176,19 +177,13 @@ class DatabaseTaskProvider { private val actionTaskListener = object: DatabaseTaskNotificationService.ActionTaskListener { override fun onStartAction(database: Database, - titleId: Int?, - messageId: Int?, - warningId: Int?, - cancelable: (() -> Unit)?) { - startDialog(titleId, messageId, warningId, cancelable) + progressMessage: ProgressMessage) { + startDialog(progressMessage) } override fun onUpdateAction(database: Database, - titleId: Int?, - messageId: Int?, - warningId: Int?, - cancelable: (() -> Unit)?) { - updateDialog(titleId, messageId, warningId, cancelable) + progressMessage: ProgressMessage) { + updateDialog(progressMessage) } override fun onStopAction(database: Database, @@ -242,10 +237,7 @@ class DatabaseTaskProvider { private var requestChallengeListener: DatabaseTaskNotificationService.RequestChallengeListener? = null - private fun startDialog(titleId: Int?, - messageId: Int?, - warningId: Int?, - cancelable: (() -> Unit)?) { + private fun startDialog(progressMessage: ProgressMessage) { activity?.let { activity -> activity.lifecycleScope.launch { if (progressTaskDialogFragment == null) { @@ -259,26 +251,17 @@ class DatabaseTaskProvider { PROGRESS_TASK_DIALOG_TAG ) } - updateDialog(titleId, messageId, warningId, cancelable) + updateDialog(progressMessage) } } } - private fun updateDialog(titleId: Int?, - messageId: Int?, - warningId: Int?, - cancelable: (() -> Unit)?) { + private fun updateDialog(progressMessage: ProgressMessage) { progressTaskDialogFragment?.apply { - titleId?.let { - updateTitle(it) - } - messageId?.let { - updateMessage(it) - } - warningId?.let { - updateWarning(it) - } - setCancellable(cancelable) + updateTitle(progressMessage.titleId) + updateMessage(progressMessage.messageId) + updateWarning(progressMessage.warningId) + setCancellable(progressMessage.cancelable) } } diff --git a/app/src/main/java/com/kunzisoft/keepass/model/ProgressMessage.kt b/app/src/main/java/com/kunzisoft/keepass/model/ProgressMessage.kt new file mode 100644 index 000000000..4b24b0d10 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/model/ProgressMessage.kt @@ -0,0 +1,13 @@ +package com.kunzisoft.keepass.model + +import androidx.annotation.StringRes + +data class ProgressMessage( + @StringRes + var titleId: Int, + @StringRes + var messageId: Int? = null, + @StringRes + var warningId: Int? = null, + var cancelable: (() -> Unit)? = null +) diff --git a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt index 8f688069e..f294920df 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt @@ -45,6 +45,7 @@ import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.Type import com.kunzisoft.keepass.hardware.HardwareKey import com.kunzisoft.keepass.model.CipherEncryptDatabase +import com.kunzisoft.keepass.model.ProgressMessage import com.kunzisoft.keepass.model.SnapFileDatabaseInfo import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.tasks.ProgressTaskUpdater @@ -79,10 +80,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress private var mCreationState = false private var mIconId: Int = R.drawable.notification_ic_database_load - private var mTitleId: Int = R.string.database_opened - private var mMessageId: Int? = null - private var mWarningId: Int? = null - private var mCancelable: (() -> Unit)? = null + private var mProgressMessage: ProgressMessage = ProgressMessage(R.string.database_opened) override fun retrieveChannelId(): String { return CHANNEL_DATABASE_ID @@ -154,15 +152,9 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress interface ActionTaskListener { fun onStartAction(database: Database, - titleId: Int?, - messageId: Int?, - warningId: Int?, - cancelable: (() -> Unit)? = null) + progressMessage: ProgressMessage) fun onUpdateAction(database: Database, - titleId: Int?, - messageId: Int?, - warningId: Int?, - cancelable: (() -> Unit)? = null) + progressMessage: ProgressMessage) fun onStopAction(database: Database, actionTask: String, result: ActionRunnable.Result) @@ -239,7 +231,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress if (mActionRunning) { mActionTaskListeners.forEach { actionTaskListener -> actionTaskListener.onStartAction( - database, mTitleId, mMessageId, mWarningId, mCancelable + database, mProgressMessage ) } } @@ -354,14 +346,14 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress mActionRunning = true sendBroadcast(Intent(DATABASE_START_TASK_ACTION).apply { - putExtra(DATABASE_TASK_TITLE_KEY, mTitleId) - putExtra(DATABASE_TASK_MESSAGE_KEY, mMessageId) - putExtra(DATABASE_TASK_WARNING_KEY, mWarningId) + putExtra(DATABASE_TASK_TITLE_KEY, mProgressMessage.titleId) + putExtra(DATABASE_TASK_MESSAGE_KEY, mProgressMessage.messageId) + putExtra(DATABASE_TASK_WARNING_KEY, mProgressMessage.warningId) }) mActionTaskListeners.forEach { actionTaskListener -> actionTaskListener.onStartAction( - database, mTitleId, mMessageId, mWarningId, mCancelable + database, mProgressMessage ) } @@ -451,7 +443,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress else R.drawable.notification_ic_database_load - mTitleId = when { + mProgressMessage.titleId = when { saveAction -> { R.string.saving_database } @@ -476,14 +468,14 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - mMessageId = when (intentAction) { + mProgressMessage.messageId = when (intentAction) { ACTION_DATABASE_LOAD_TASK, ACTION_DATABASE_MERGE_TASK, ACTION_DATABASE_RELOAD_TASK -> null else -> null } - mWarningId = + mProgressMessage.warningId = if (!saveAction || intentAction == ACTION_DATABASE_LOAD_TASK || intentAction == ACTION_DATABASE_MERGE_TASK @@ -495,7 +487,9 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress val notificationBuilder = buildNewNotification().apply { setSmallIcon(mIconId) intent?.let { - setContentTitle(getString(intent.getIntExtra(DATABASE_TASK_TITLE_KEY, mTitleId))) + setContentTitle(getString( + intent.getIntExtra(DATABASE_TASK_TITLE_KEY, mProgressMessage.titleId)) + ) } setAutoCancel(false) setContentIntent(null) @@ -601,17 +595,26 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - override fun updateMessage(resId: Int) { - mMessageId = resId + private fun notifyProgressMessage() { mDatabase?.let { database -> mActionTaskListeners.forEach { actionTaskListener -> actionTaskListener.onUpdateAction( - database, mTitleId, mMessageId, mWarningId, mCancelable + database, mProgressMessage ) } } } + override fun updateMessage(progressMessage: ProgressMessage) { + mProgressMessage = progressMessage + notifyProgressMessage() + } + + override fun updateMessage(resId: Int) { + mProgressMessage.messageId = resId + notifyProgressMessage() + } + override fun actionOnLock() { if (!TimeoutHelper.temporarilyDisableLock) { closeDatabase(mDatabase) @@ -636,24 +639,28 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress runBlocking { // Initialize the channels initializeChallengeResponse() - val previousMessageId = mMessageId - mCancelable = { - cancelChallengeResponse(R.string.error_cancel_by_user) + val previousMessage = mProgressMessage.copy() + mProgressMessage.apply { + messageId = R.string.waiting_challenge_request + cancelable = { + cancelChallengeResponse(R.string.error_cancel_by_user) + } } // Send the request - updateMessage(R.string.waiting_challenge_request) + updateMessage(mProgressMessage) val challengeResponseRequestListener = mRequestChallengeListenerChannel?.receive() challengeResponseRequestListener?.onChallengeResponseRequested(hardwareKey, seed) // Wait the response - updateMessage(R.string.waiting_challenge_response) + mProgressMessage.apply { + messageId = R.string.waiting_challenge_response + } + updateMessage(mProgressMessage) response = mResponseChallengeChannel?.receive() ?: byteArrayOf() // Close channels closeChallengeResponse() // Restore previous message - mCancelable = null - previousMessageId?.let { - updateMessage(it) - } + mProgressMessage.cancelable = null + updateMessage(previousMessage) } return response } diff --git a/app/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskDialogFragment.kt index fead3e950..e9240b73e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskDialogFragment.kt @@ -110,18 +110,18 @@ open class ProgressTaskDialogFragment : DialogFragment() { } } - fun updateTitle(@StringRes resId: Int) { - this.title = resId + fun updateTitle(@StringRes resId: Int?) { + this.title = resId ?: UNDEFINED updateView(titleView, title) } - fun updateMessage(@StringRes resId: Int) { - this.message = resId + fun updateMessage(@StringRes resId: Int?) { + this.message = resId ?: UNDEFINED updateView(messageView, message) } - fun updateWarning(@StringRes resId: Int) { - this.warning = resId + fun updateWarning(@StringRes resId: Int?) { + this.warning = resId ?: UNDEFINED updateView(warningView, warning) } diff --git a/app/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt b/app/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt index b3fed4b9f..d20757de2 100644 --- a/app/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt +++ b/app/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt @@ -20,7 +20,9 @@ package com.kunzisoft.keepass.tasks import androidx.annotation.StringRes +import com.kunzisoft.keepass.model.ProgressMessage interface ProgressTaskUpdater { + fun updateMessage(progressMessage: ProgressMessage) fun updateMessage(@StringRes resId: Int) }