Fix progress task dialog

This commit is contained in:
J-Jamet
2020-04-25 15:41:33 +02:00
parent 24818575dc
commit 8201b42135
3 changed files with 37 additions and 41 deletions

View File

@@ -30,7 +30,8 @@ import androidx.fragment.app.FragmentActivity
import com.kunzisoft.keepass.activities.lock.LockingActivity
import com.kunzisoft.keepass.app.database.CipherDatabaseEntity
import com.kunzisoft.keepass.crypto.keyDerivation.KdfEngine
import com.kunzisoft.keepass.database.element.*
import com.kunzisoft.keepass.database.element.Entry
import com.kunzisoft.keepass.database.element.Group
import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm
import com.kunzisoft.keepass.database.element.node.Node
import com.kunzisoft.keepass.database.element.node.NodeId
@@ -54,6 +55,8 @@ import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Compa
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_DEFAULT_USERNAME_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_DESCRIPTION_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_ENCRYPTION_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_ENTRY_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_GROUP_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_ITERATIONS_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_KEY_DERIVATION_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_MAX_HISTORY_ITEMS_TASK
@@ -61,12 +64,10 @@ import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Compa
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_MEMORY_USAGE_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_NAME_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_PARALLELISM_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_ENTRY_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_UPDATE_GROUP_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.getBundleFromListNodes
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.tasks.ProgressTaskDialogFragment
import com.kunzisoft.keepass.tasks.ProgressTaskDialogFragment.Companion.retrieveProgressDialog
import com.kunzisoft.keepass.tasks.ProgressTaskDialogFragment.Companion.PROGRESS_TASK_DIALOG_TAG
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.DATABASE_START_TASK_ACTION
import com.kunzisoft.keepass.utils.DATABASE_STOP_TASK_ACTION
@@ -85,6 +86,8 @@ class ProgressDialogThread(private val activity: FragmentActivity) {
private var serviceConnection: ServiceConnection? = null
private var progressTaskDialogFragment: ProgressTaskDialogFragment? = null
private val actionTaskListener = object: DatabaseTaskNotificationService.ActionTaskListener {
override fun onStartAction(titleId: Int?, messageId: Int?, warningId: Int?) {
TimeoutHelper.temporarilyDisableTimeout()
@@ -98,9 +101,8 @@ class ProgressDialogThread(private val activity: FragmentActivity) {
}
override fun onStopAction(actionTask: String, result: ActionRunnable.Result) {
onActionFinish?.invoke(actionTask, result)
// Remove the progress task
ProgressTaskDialogFragment.stop(activity)
stopDialog()
TimeoutHelper.releaseTemporarilyDisableTimeout()
val inTime = if (activity is LockingActivity) {
@@ -113,16 +115,21 @@ class ProgressDialogThread(private val activity: FragmentActivity) {
if (actionTask != ACTION_DATABASE_LOAD_TASK && inTime) {
DatabaseOpenNotificationService.start(activity)
}
onActionFinish?.invoke(actionTask, result)
}
}
private fun startOrUpdateDialog(titleId: Int?, messageId: Int?, warningId: Int?) {
var progressTaskDialogFragment = retrieveProgressDialog(activity)
if (progressTaskDialogFragment == null) {
progressTaskDialogFragment = ProgressTaskDialogFragment.build()
ProgressTaskDialogFragment.start(activity, progressTaskDialogFragment)
progressTaskDialogFragment = activity.supportFragmentManager
.findFragmentByTag(PROGRESS_TASK_DIALOG_TAG) as ProgressTaskDialogFragment?
}
progressTaskDialogFragment.apply {
if (progressTaskDialogFragment == null) {
progressTaskDialogFragment = ProgressTaskDialogFragment()
progressTaskDialogFragment?.show(activity.supportFragmentManager, PROGRESS_TASK_DIALOG_TAG)
}
progressTaskDialogFragment?.apply {
titleId?.let {
updateTitle(it)
}
@@ -135,6 +142,11 @@ class ProgressDialogThread(private val activity: FragmentActivity) {
}
}
private fun stopDialog() {
progressTaskDialogFragment?.dismissAllowingStateLoss()
progressTaskDialogFragment = null
}
private fun initServiceConnection() {
if (serviceConnection == null) {
serviceConnection = object : ServiceConnection {
@@ -171,7 +183,7 @@ class ProgressDialogThread(private val activity: FragmentActivity) {
}
fun registerProgressTask() {
ProgressTaskDialogFragment.stop(activity)
stopDialog()
// Register a database task receiver to stop loading dialog when service finish the task
databaseTaskBroadcastReceiver = object : BroadcastReceiver() {
@@ -199,7 +211,7 @@ class ProgressDialogThread(private val activity: FragmentActivity) {
}
fun unregisterProgressTask() {
ProgressTaskDialogFragment.stop(activity)
stopDialog()
mBinder?.removeActionTaskListener(actionTaskListener)
mBinder = null

View File

@@ -39,6 +39,7 @@ import com.kunzisoft.keepass.tasks.ProgressTaskUpdater
import com.kunzisoft.keepass.utils.DATABASE_START_TASK_ACTION
import com.kunzisoft.keepass.utils.DATABASE_STOP_TASK_ACTION
import java.util.*
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.collections.ArrayList
class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdater {
@@ -59,6 +60,7 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
fun getService(): DatabaseTaskNotificationService = this@DatabaseTaskNotificationService
fun addActionTaskListener(actionTaskListener: ActionTaskListener) {
actionRunnableAsyncTask?.allowFinishTask?.set(true)
mActionTaskListeners.add(actionTaskListener)
}
@@ -80,7 +82,6 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
}
override fun onBind(intent: Intent): IBinder? {
actionRunnableAsyncTask?.allowFinishTask = true
return mActionTaskBinder
}
@@ -178,7 +179,7 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
}
)
// To keep the task active until a binder is connected
actionRunnableAsyncTask?.allowFinishTask = mActionTaskListeners.size >= 1
actionRunnableAsyncTask?.allowFinishTask?.set(mActionTaskListeners.size >= 1)
actionRunnableAsyncTask?.execute({ actionRunnableNotNull })
}
@@ -571,7 +572,7 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
private val onPostExecute: (result: ActionRunnable.Result) -> Unit)
: AsyncTask<((ProgressTaskUpdater?) -> ActionRunnable), Void, ActionRunnable.Result>() {
var allowFinishTask = false
var allowFinishTask = AtomicBoolean(false)
override fun onPreExecute() {
super.onPreExecute()
@@ -586,8 +587,11 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
resultTask = result
}
}
while(!allowFinishTask) {
Thread.sleep(50)
// Min wait to show the dialog
Thread.sleep(200)
// Additional wait if the dialog take time to show (device with low memory)
while(!allowFinishTask.get()) {
Thread.sleep(100)
}
return resultTask
}

View File

@@ -22,13 +22,12 @@ package com.kunzisoft.keepass.tasks
import android.annotation.SuppressLint
import android.app.Dialog
import android.os.Bundle
import androidx.annotation.StringRes
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentActivity
import androidx.appcompat.app.AlertDialog
import android.view.View
import android.widget.ProgressBar
import android.widget.TextView
import androidx.annotation.StringRes
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
import com.kunzisoft.keepass.R
open class ProgressTaskDialogFragment : DialogFragment(), ProgressTaskUpdater {
@@ -106,27 +105,8 @@ open class ProgressTaskDialogFragment : DialogFragment(), ProgressTaskUpdater {
companion object {
private const val PROGRESS_TASK_DIALOG_TAG = "progressDialogFragment"
const val PROGRESS_TASK_DIALOG_TAG = "progressDialogFragment"
const val UNDEFINED = -1
fun build(): ProgressTaskDialogFragment {
// Create an instance of the dialog fragment
return ProgressTaskDialogFragment()
}
fun start(activity: FragmentActivity,
dialog: ProgressTaskDialogFragment) {
dialog.show(activity.supportFragmentManager, PROGRESS_TASK_DIALOG_TAG)
}
fun retrieveProgressDialog(activity: FragmentActivity): ProgressTaskDialogFragment? {
return activity.supportFragmentManager
.findFragmentByTag(PROGRESS_TASK_DIALOG_TAG) as ProgressTaskDialogFragment?
}
fun stop(activity: FragmentActivity) {
retrieveProgressDialog(activity)?.dismissAllowingStateLoss()
}
}
}