Merge branch 'feature/Merge_Action_tasks_#628' into develop

This commit is contained in:
J-Jamet
2020-07-23 13:49:43 +02:00
4 changed files with 207 additions and 220 deletions

View File

@@ -215,10 +215,9 @@ class ProgressDialogThread(private val activity: FragmentActivity) {
} }
private fun start(bundle: Bundle? = null, actionTask: String) { private fun start(bundle: Bundle? = null, actionTask: String) {
activity.stopService(intentDatabaseTask)
if (bundle != null) if (bundle != null)
intentDatabaseTask.putExtras(bundle) intentDatabaseTask.putExtras(bundle)
intentDatabaseTask.action = actionTask intentDatabaseTask.action = actionTask
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
activity.startForegroundService(intentDatabaseTask) activity.startForegroundService(intentDatabaseTask)
} else { } else {

View File

@@ -1,122 +0,0 @@
/*
* Copyright 2019 Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePassDX.
*
* KeePassDX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePassDX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with KeePassDX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.notifications
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.IBinder
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.GroupActivity
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.LOCK_ACTION
import com.kunzisoft.keepass.utils.closeDatabase
class DatabaseOpenNotificationService: LockNotificationService() {
override val notificationId: Int = 340
private fun stopNotificationAndSendLock() {
// Send lock action
sendBroadcast(Intent(LOCK_ACTION))
}
override fun actionOnLock() {
closeDatabase()
// Remove the lock timer (no more needed if it exists)
TimeoutHelper.cancelLockTimer(this)
// Service is stopped after receive the broadcast
super.actionOnLock()
}
private fun checkIntent(intent: Intent?) {
val notificationBuilder = buildNewNotification().apply {
setSmallIcon(R.drawable.notification_ic_database_open)
setContentTitle(getString(R.string.database_opened))
setAutoCancel(false)
}
when(intent?.action) {
ACTION_CLOSE_DATABASE -> {
startForeground(notificationId, notificationBuilder.build())
stopNotificationAndSendLock()
}
else -> {
val databaseIntent = Intent(this, GroupActivity::class.java)
var pendingDatabaseFlag = 0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
pendingDatabaseFlag = PendingIntent.FLAG_IMMUTABLE
}
val pendingDatabaseIntent = PendingIntent.getActivity(this, 0, databaseIntent, pendingDatabaseFlag)
val deleteIntent = Intent(this, DatabaseOpenNotificationService::class.java).apply {
action = ACTION_CLOSE_DATABASE
}
val pendingDeleteIntent = PendingIntent.getService(this, 0, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT)
val database = Database.getInstance()
if (database.loaded) {
startForeground(notificationId, notificationBuilder.apply {
setContentText(database.name + " (" + database.version + ")")
setContentIntent(pendingDatabaseIntent)
// Unfortunately swipe is disabled in lollipop+
setDeleteIntent(pendingDeleteIntent)
addAction(R.drawable.ic_lock_white_24dp, getString(R.string.lock),
pendingDeleteIntent)
}.build())
} else {
startForeground(notificationId, notificationBuilder.build())
stopSelf()
}
}
}
}
override fun onBind(intent: Intent): IBinder? {
checkIntent(intent)
return super.onBind(intent)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
super.onStartCommand(intent, flags, startId)
checkIntent(intent)
return START_STICKY
}
companion object {
const val ACTION_CLOSE_DATABASE = "ACTION_CLOSE_DATABASE"
fun start(context: Context) {
// Start the opening notification, keep it active to receive lock
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(Intent(context, DatabaseOpenNotificationService::class.java))
} else {
context.startService(Intent(context, DatabaseOpenNotificationService::class.java))
}
}
fun stop(context: Context) {
// Stop the opening notification
context.stopService(Intent(context, DatabaseOpenNotificationService::class.java))
}
}
}

View File

@@ -19,12 +19,15 @@
*/ */
package com.kunzisoft.keepass.notifications package com.kunzisoft.keepass.notifications
import android.app.PendingIntent
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Binder import android.os.Binder
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.IBinder import android.os.IBinder
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.GroupActivity
import com.kunzisoft.keepass.app.database.CipherDatabaseEntity import com.kunzisoft.keepass.app.database.CipherDatabaseEntity
import com.kunzisoft.keepass.database.action.* import com.kunzisoft.keepass.database.action.*
import com.kunzisoft.keepass.database.action.history.DeleteEntryHistoryDatabaseRunnable import com.kunzisoft.keepass.database.action.history.DeleteEntryHistoryDatabaseRunnable
@@ -42,22 +45,28 @@ import com.kunzisoft.keepass.tasks.ProgressTaskUpdater
import com.kunzisoft.keepass.timeout.TimeoutHelper import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.DATABASE_START_TASK_ACTION import com.kunzisoft.keepass.utils.DATABASE_START_TASK_ACTION
import com.kunzisoft.keepass.utils.DATABASE_STOP_TASK_ACTION import com.kunzisoft.keepass.utils.DATABASE_STOP_TASK_ACTION
import com.kunzisoft.keepass.utils.LOCK_ACTION
import com.kunzisoft.keepass.utils.closeDatabase
import kotlinx.coroutines.* import kotlinx.coroutines.*
import java.util.* import java.util.*
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdater { open class DatabaseTaskNotificationService : LockNotificationService(), ProgressTaskUpdater {
override val notificationId: Int = 575 override val notificationId: Int = 575
private lateinit var mDatabase: Database
private val mainScope = CoroutineScope(Dispatchers.Main) private val mainScope = CoroutineScope(Dispatchers.Main)
private var mActionTaskBinder = ActionTaskBinder() private var mActionTaskBinder = ActionTaskBinder()
private var mActionTaskListeners = LinkedList<ActionTaskListener>() private var mActionTaskListeners = LinkedList<ActionTaskListener>()
private var mAllowFinishAction = AtomicBoolean() private var mAllowFinishAction = AtomicBoolean()
private var mActionRunning = false
private var mTitleId: Int? = null 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 mMessageId: Int? = null
private var mWarningId: Int? = null private var mWarningId: Int? = null
@@ -66,8 +75,8 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
fun getService(): DatabaseTaskNotificationService = this@DatabaseTaskNotificationService fun getService(): DatabaseTaskNotificationService = this@DatabaseTaskNotificationService
fun addActionTaskListener(actionTaskListener: ActionTaskListener) { fun addActionTaskListener(actionTaskListener: ActionTaskListener) {
mActionTaskListeners.add(actionTaskListener)
mAllowFinishAction.set(true) mAllowFinishAction.set(true)
mActionTaskListeners.add(actionTaskListener)
} }
fun removeActionTaskListener(actionTaskListener: ActionTaskListener) { fun removeActionTaskListener(actionTaskListener: ActionTaskListener) {
@@ -84,66 +93,41 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
fun onStopAction(actionTask: String, result: ActionRunnable.Result) fun onStopAction(actionTask: String, result: ActionRunnable.Result)
} }
/**
* Force to call [ActionTaskListener.onStartAction] if the action is still running
*/
fun checkAction() { fun checkAction() {
mActionTaskListeners.forEach { actionTaskListener -> if (mActionRunning) {
actionTaskListener.onStartAction(mTitleId, mMessageId, mWarningId) mActionTaskListeners.forEach { actionTaskListener ->
} actionTaskListener.onStartAction(mTitleId, mMessageId, mWarningId)
}
private fun buildNotification(intent: Intent?) {
var saveAction = true
if (intent != null && intent.hasExtra(SAVE_DATABASE_KEY)) {
saveAction = intent.getBooleanExtra(SAVE_DATABASE_KEY, saveAction)
}
val intentAction = intent?.action
val titleId: Int = when (intentAction) {
ACTION_DATABASE_CREATE_TASK -> R.string.creating_database
ACTION_DATABASE_LOAD_TASK -> R.string.loading_database
else -> {
if (saveAction)
R.string.saving_database
else
R.string.command_execution
} }
} }
val messageId: Int? = when (intentAction) {
ACTION_DATABASE_LOAD_TASK -> null
else -> null
}
val warningId: Int? =
if (!saveAction
|| intentAction == ACTION_DATABASE_LOAD_TASK)
null
else
R.string.do_not_kill_app
// Assign elements for updates
mTitleId = titleId
mMessageId = messageId
mWarningId = warningId
// Create the notification
startForeground(notificationId, buildNewNotification()
.setSmallIcon(R.drawable.notification_ic_database_load)
.setContentTitle(getString(intent?.getIntExtra(DATABASE_TASK_TITLE_KEY, titleId) ?: titleId))
.setAutoCancel(false)
.setContentIntent(null).build())
} }
override fun onBind(intent: Intent): IBinder? { override fun onBind(intent: Intent): IBinder? {
buildNotification(intent) super.onBind(intent)
return mActionTaskBinder return mActionTaskBinder
} }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
super.onStartCommand(intent, flags, startId) super.onStartCommand(intent, flags, startId)
buildNotification(intent) mDatabase = Database.getInstance()
if (intent == null) return START_REDELIVER_INTENT // Create the notification
buildMessage(intent)
val intentAction = intent.action val intentAction = intent?.action
val actionRunnable: ActionRunnable? = when (intentAction) {
if (intentAction == null && !mDatabase.loaded) {
stopSelf()
}
if (intentAction == ACTION_DATABASE_CLOSE) {
// Send lock action
sendBroadcast(Intent(LOCK_ACTION))
}
val actionRunnable: ActionRunnable? = when (intentAction) {
ACTION_DATABASE_CREATE_TASK -> buildDatabaseCreateActionTask(intent) ACTION_DATABASE_CREATE_TASK -> buildDatabaseCreateActionTask(intent)
ACTION_DATABASE_LOAD_TASK -> buildDatabaseLoadActionTask(intent) ACTION_DATABASE_LOAD_TASK -> buildDatabaseLoadActionTask(intent)
ACTION_DATABASE_ASSIGN_PASSWORD_TASK -> buildDatabaseAssignPasswordActionTask(intent) ACTION_DATABASE_ASSIGN_PASSWORD_TASK -> buildDatabaseAssignPasswordActionTask(intent)
@@ -172,12 +156,13 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
else -> null else -> null
} }
actionRunnable?.let { actionRunnableNotNull -> // Build and launch the action
if (actionRunnable != null) {
// Build and launch the action
mainScope.launch { mainScope.launch {
executeAction(this@DatabaseTaskNotificationService, executeAction(this@DatabaseTaskNotificationService,
{ {
mActionRunning = true
sendBroadcast(Intent(DATABASE_START_TASK_ACTION).apply { sendBroadcast(Intent(DATABASE_START_TASK_ACTION).apply {
putExtra(DATABASE_TASK_TITLE_KEY, mTitleId) putExtra(DATABASE_TASK_TITLE_KEY, mTitleId)
putExtra(DATABASE_TASK_MESSAGE_KEY, mMessageId) putExtra(DATABASE_TASK_MESSAGE_KEY, mMessageId)
@@ -190,22 +175,143 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
}, },
{ {
actionRunnableNotNull actionRunnable
}, },
{ result -> { result ->
mActionTaskListeners.forEach { actionTaskListener -> mActionTaskListeners.forEach { actionTaskListener ->
actionTaskListener.onStopAction(intentAction!!, result) actionTaskListener.onStopAction(intentAction!!, result)
} }
removeIntentData(intent)
buildMessage(intent)
sendBroadcast(Intent(DATABASE_STOP_TASK_ACTION)) sendBroadcast(Intent(DATABASE_STOP_TASK_ACTION))
stopSelf() mActionRunning = false
} }
) )
} }
// Relaunch action if failed
return START_REDELIVER_INTENT
} }
return START_REDELIVER_INTENT return START_STICKY
}
private fun buildMessage(intent: Intent?) {
// Assign elements for updates
val intentAction = intent?.action
var saveAction = false
if (intent != null && intent.hasExtra(SAVE_DATABASE_KEY)) {
saveAction = intent.getBooleanExtra(SAVE_DATABASE_KEY, saveAction)
}
mIconId = if (intentAction == null)
R.drawable.notification_ic_database_open
else
R.drawable.notification_ic_database_load
mTitleId = when {
saveAction -> {
R.string.saving_database
}
intentAction == null -> {
R.string.database_opened
}
else -> {
when (intentAction) {
ACTION_DATABASE_CREATE_TASK -> R.string.creating_database
ACTION_DATABASE_LOAD_TASK -> R.string.loading_database
ACTION_DATABASE_SAVE -> R.string.saving_database
else -> {
R.string.command_execution
}
}
}
}
mMessageId = when (intentAction) {
ACTION_DATABASE_LOAD_TASK -> null
else -> null
}
mWarningId =
if (!saveAction
|| intentAction == ACTION_DATABASE_LOAD_TASK)
null
else
R.string.do_not_kill_app
val notificationBuilder = buildNewNotification().apply {
setSmallIcon(mIconId)
intent?.let {
setContentTitle(getString(intent.getIntExtra(DATABASE_TASK_TITLE_KEY, mTitleId)))
}
setAutoCancel(false)
setContentIntent(null)
}
if (intentAction == null) {
// Database is normally open
if (mDatabase.loaded) {
// Build Intents for notification action
var pendingDatabaseFlag = 0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
pendingDatabaseFlag = PendingIntent.FLAG_IMMUTABLE
}
val pendingDatabaseIntent = PendingIntent.getActivity(this,
0,
Intent(this, GroupActivity::class.java),
pendingDatabaseFlag)
val deleteIntent = Intent(this, DatabaseTaskNotificationService::class.java).apply {
action = ACTION_DATABASE_CLOSE
}
val pendingDeleteIntent = PendingIntent.getService(this, 0, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT)
// Add actions in notifications
notificationBuilder.apply {
setContentText(mDatabase.name + " (" + mDatabase.version + ")")
setContentIntent(pendingDatabaseIntent)
// Unfortunately swipe is disabled in lollipop+
setDeleteIntent(pendingDeleteIntent)
addAction(R.drawable.ic_lock_white_24dp, getString(R.string.lock),
pendingDeleteIntent)
}
}
}
// Create the notification
startForeground(notificationId, notificationBuilder.build())
}
private fun removeIntentData(intent: Intent?) {
intent?.action = null
intent?.removeExtra(DATABASE_TASK_TITLE_KEY)
intent?.removeExtra(DATABASE_TASK_MESSAGE_KEY)
intent?.removeExtra(DATABASE_TASK_WARNING_KEY)
intent?.removeExtra(DATABASE_URI_KEY)
intent?.removeExtra(MASTER_PASSWORD_CHECKED_KEY)
intent?.removeExtra(MASTER_PASSWORD_KEY)
intent?.removeExtra(KEY_FILE_CHECKED_KEY)
intent?.removeExtra(KEY_FILE_KEY)
intent?.removeExtra(READ_ONLY_KEY)
intent?.removeExtra(CIPHER_ENTITY_KEY)
intent?.removeExtra(FIX_DUPLICATE_UUID_KEY)
intent?.removeExtra(GROUP_KEY)
intent?.removeExtra(ENTRY_KEY)
intent?.removeExtra(GROUP_ID_KEY)
intent?.removeExtra(ENTRY_ID_KEY)
intent?.removeExtra(GROUPS_ID_KEY)
intent?.removeExtra(ENTRIES_ID_KEY)
intent?.removeExtra(PARENT_ID_KEY)
intent?.removeExtra(ENTRY_HISTORY_POSITION_KEY)
intent?.removeExtra(SAVE_DATABASE_KEY)
intent?.removeExtra(OLD_NODES_KEY)
intent?.removeExtra(NEW_NODES_KEY)
intent?.removeExtra(OLD_ELEMENT_KEY)
intent?.removeExtra(NEW_ELEMENT_KEY)
} }
/** /**
@@ -241,7 +347,9 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
TimeoutHelper.releaseTemporarilyDisableTimeout() TimeoutHelper.releaseTemporarilyDisableTimeout()
// Start the opening notification // Start the opening notification
if (TimeoutHelper.checkTimeAndLockIfTimeout(this@DatabaseTaskNotificationService)) { if (TimeoutHelper.checkTimeAndLockIfTimeout(this@DatabaseTaskNotificationService)) {
DatabaseOpenNotificationService.start(this@DatabaseTaskNotificationService) if (!mDatabase.loaded) {
stopSelf()
}
} }
} }
} }
@@ -256,6 +364,16 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
} }
} }
override fun actionOnLock() {
if (!TimeoutHelper.temporarilyDisableTimeout) {
closeDatabase()
// Remove the lock timer (no more needed if it exists)
TimeoutHelper.cancelLockTimer(this)
// Service is stopped after receive the broadcast
super.actionOnLock()
}
}
private fun buildDatabaseCreateActionTask(intent: Intent): ActionRunnable? { private fun buildDatabaseCreateActionTask(intent: Intent): ActionRunnable? {
if (intent.hasExtra(DATABASE_URI_KEY) if (intent.hasExtra(DATABASE_URI_KEY)
@@ -271,7 +389,7 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
return null return null
return CreateDatabaseRunnable(this, return CreateDatabaseRunnable(this,
Database.getInstance(), mDatabase,
databaseUri, databaseUri,
getString(R.string.database_default_name), getString(R.string.database_default_name),
getString(R.string.database), getString(R.string.database),
@@ -294,7 +412,6 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
&& intent.hasExtra(CIPHER_ENTITY_KEY) && intent.hasExtra(CIPHER_ENTITY_KEY)
&& intent.hasExtra(FIX_DUPLICATE_UUID_KEY) && intent.hasExtra(FIX_DUPLICATE_UUID_KEY)
) { ) {
val database = Database.getInstance()
val databaseUri: Uri? = intent.getParcelableExtra(DATABASE_URI_KEY) val databaseUri: Uri? = intent.getParcelableExtra(DATABASE_URI_KEY)
val masterPassword: String? = intent.getStringExtra(MASTER_PASSWORD_KEY) val masterPassword: String? = intent.getStringExtra(MASTER_PASSWORD_KEY)
val keyFileUri: Uri? = intent.getParcelableExtra(KEY_FILE_KEY) val keyFileUri: Uri? = intent.getParcelableExtra(KEY_FILE_KEY)
@@ -306,7 +423,7 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
return LoadDatabaseRunnable( return LoadDatabaseRunnable(
this, this,
database, mDatabase,
databaseUri, databaseUri,
masterPassword, masterPassword,
keyFileUri, keyFileUri,
@@ -338,7 +455,7 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
) { ) {
val databaseUri: Uri = intent.getParcelableExtra(DATABASE_URI_KEY) ?: return null val databaseUri: Uri = intent.getParcelableExtra(DATABASE_URI_KEY) ?: return null
AssignPasswordInDatabaseRunnable(this, AssignPasswordInDatabaseRunnable(this,
Database.getInstance(), mDatabase,
databaseUri, databaseUri,
intent.getBooleanExtra(MASTER_PASSWORD_CHECKED_KEY, false), intent.getBooleanExtra(MASTER_PASSWORD_CHECKED_KEY, false),
intent.getStringExtra(MASTER_PASSWORD_KEY), intent.getStringExtra(MASTER_PASSWORD_KEY),
@@ -365,7 +482,6 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
&& intent.hasExtra(PARENT_ID_KEY) && intent.hasExtra(PARENT_ID_KEY)
&& intent.hasExtra(SAVE_DATABASE_KEY) && intent.hasExtra(SAVE_DATABASE_KEY)
) { ) {
val database = Database.getInstance()
val parentId: NodeId<*>? = intent.getParcelableExtra(PARENT_ID_KEY) val parentId: NodeId<*>? = intent.getParcelableExtra(PARENT_ID_KEY)
val newGroup: Group? = intent.getParcelableExtra(GROUP_KEY) val newGroup: Group? = intent.getParcelableExtra(GROUP_KEY)
@@ -373,9 +489,9 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
|| newGroup == null) || newGroup == null)
return null return null
database.getGroupById(parentId)?.let { parent -> mDatabase.getGroupById(parentId)?.let { parent ->
AddGroupRunnable(this, AddGroupRunnable(this,
database, mDatabase,
newGroup, newGroup,
parent, parent,
intent.getBooleanExtra(SAVE_DATABASE_KEY, false), intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
@@ -391,7 +507,6 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
&& intent.hasExtra(GROUP_KEY) && intent.hasExtra(GROUP_KEY)
&& intent.hasExtra(SAVE_DATABASE_KEY) && intent.hasExtra(SAVE_DATABASE_KEY)
) { ) {
val database = Database.getInstance()
val groupId: NodeId<*>? = intent.getParcelableExtra(GROUP_ID_KEY) val groupId: NodeId<*>? = intent.getParcelableExtra(GROUP_ID_KEY)
val newGroup: Group? = intent.getParcelableExtra(GROUP_KEY) val newGroup: Group? = intent.getParcelableExtra(GROUP_KEY)
@@ -399,9 +514,9 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
|| newGroup == null) || newGroup == null)
return null return null
database.getGroupById(groupId)?.let { oldGroup -> mDatabase.getGroupById(groupId)?.let { oldGroup ->
UpdateGroupRunnable(this, UpdateGroupRunnable(this,
database, mDatabase,
oldGroup, oldGroup,
newGroup, newGroup,
intent.getBooleanExtra(SAVE_DATABASE_KEY, false), intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
@@ -417,7 +532,6 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
&& intent.hasExtra(PARENT_ID_KEY) && intent.hasExtra(PARENT_ID_KEY)
&& intent.hasExtra(SAVE_DATABASE_KEY) && intent.hasExtra(SAVE_DATABASE_KEY)
) { ) {
val database = Database.getInstance()
val parentId: NodeId<*>? = intent.getParcelableExtra(PARENT_ID_KEY) val parentId: NodeId<*>? = intent.getParcelableExtra(PARENT_ID_KEY)
val newEntry: Entry? = intent.getParcelableExtra(ENTRY_KEY) val newEntry: Entry? = intent.getParcelableExtra(ENTRY_KEY)
@@ -425,9 +539,9 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
|| newEntry == null) || newEntry == null)
return null return null
database.getGroupById(parentId)?.let { parent -> mDatabase.getGroupById(parentId)?.let { parent ->
AddEntryRunnable(this, AddEntryRunnable(this,
database, mDatabase,
newEntry, newEntry,
parent, parent,
intent.getBooleanExtra(SAVE_DATABASE_KEY, false), intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
@@ -443,7 +557,6 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
&& intent.hasExtra(ENTRY_KEY) && intent.hasExtra(ENTRY_KEY)
&& intent.hasExtra(SAVE_DATABASE_KEY) && intent.hasExtra(SAVE_DATABASE_KEY)
) { ) {
val database = Database.getInstance()
val entryId: NodeId<UUID>? = intent.getParcelableExtra(ENTRY_ID_KEY) val entryId: NodeId<UUID>? = intent.getParcelableExtra(ENTRY_ID_KEY)
val newEntry: Entry? = intent.getParcelableExtra(ENTRY_KEY) val newEntry: Entry? = intent.getParcelableExtra(ENTRY_KEY)
@@ -451,9 +564,9 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
|| newEntry == null) || newEntry == null)
return null return null
database.getEntryById(entryId)?.let { oldEntry -> mDatabase.getEntryById(entryId)?.let { oldEntry ->
UpdateEntryRunnable(this, UpdateEntryRunnable(this,
database, mDatabase,
oldEntry, oldEntry,
newEntry, newEntry,
intent.getBooleanExtra(SAVE_DATABASE_KEY, false), intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
@@ -470,13 +583,12 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
&& intent.hasExtra(PARENT_ID_KEY) && intent.hasExtra(PARENT_ID_KEY)
&& intent.hasExtra(SAVE_DATABASE_KEY) && intent.hasExtra(SAVE_DATABASE_KEY)
) { ) {
val database = Database.getInstance()
val parentId: NodeId<*> = intent.getParcelableExtra(PARENT_ID_KEY) ?: return null val parentId: NodeId<*> = intent.getParcelableExtra(PARENT_ID_KEY) ?: return null
database.getGroupById(parentId)?.let { newParent -> mDatabase.getGroupById(parentId)?.let { newParent ->
CopyNodesRunnable(this, CopyNodesRunnable(this,
database, mDatabase,
getListNodesFromBundle(database, intent.extras!!), getListNodesFromBundle(mDatabase, intent.extras!!),
newParent, newParent,
intent.getBooleanExtra(SAVE_DATABASE_KEY, false), intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
AfterActionNodesRunnable()) AfterActionNodesRunnable())
@@ -492,13 +604,12 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
&& intent.hasExtra(PARENT_ID_KEY) && intent.hasExtra(PARENT_ID_KEY)
&& intent.hasExtra(SAVE_DATABASE_KEY) && intent.hasExtra(SAVE_DATABASE_KEY)
) { ) {
val database = Database.getInstance()
val parentId: NodeId<*> = intent.getParcelableExtra(PARENT_ID_KEY) ?: return null val parentId: NodeId<*> = intent.getParcelableExtra(PARENT_ID_KEY) ?: return null
database.getGroupById(parentId)?.let { newParent -> mDatabase.getGroupById(parentId)?.let { newParent ->
MoveNodesRunnable(this, MoveNodesRunnable(this,
database, mDatabase,
getListNodesFromBundle(database, intent.extras!!), getListNodesFromBundle(mDatabase, intent.extras!!),
newParent, newParent,
intent.getBooleanExtra(SAVE_DATABASE_KEY, false), intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
AfterActionNodesRunnable()) AfterActionNodesRunnable())
@@ -513,10 +624,9 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
&& intent.hasExtra(ENTRIES_ID_KEY) && intent.hasExtra(ENTRIES_ID_KEY)
&& intent.hasExtra(SAVE_DATABASE_KEY) && intent.hasExtra(SAVE_DATABASE_KEY)
) { ) {
val database = Database.getInstance()
DeleteNodesRunnable(this, DeleteNodesRunnable(this,
database, mDatabase,
getListNodesFromBundle(database, intent.extras!!), getListNodesFromBundle(mDatabase, intent.extras!!),
intent.getBooleanExtra(SAVE_DATABASE_KEY, false), intent.getBooleanExtra(SAVE_DATABASE_KEY, false),
AfterActionNodesRunnable()) AfterActionNodesRunnable())
} else { } else {
@@ -529,12 +639,11 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
&& intent.hasExtra(ENTRY_HISTORY_POSITION_KEY) && intent.hasExtra(ENTRY_HISTORY_POSITION_KEY)
&& intent.hasExtra(SAVE_DATABASE_KEY) && intent.hasExtra(SAVE_DATABASE_KEY)
) { ) {
val database = Database.getInstance()
val entryId: NodeId<UUID> = intent.getParcelableExtra(ENTRY_ID_KEY) ?: return null val entryId: NodeId<UUID> = intent.getParcelableExtra(ENTRY_ID_KEY) ?: return null
database.getEntryById(entryId)?.let { mainEntry -> mDatabase.getEntryById(entryId)?.let { mainEntry ->
RestoreEntryHistoryDatabaseRunnable(this, RestoreEntryHistoryDatabaseRunnable(this,
database, mDatabase,
mainEntry, mainEntry,
intent.getIntExtra(ENTRY_HISTORY_POSITION_KEY, -1), intent.getIntExtra(ENTRY_HISTORY_POSITION_KEY, -1),
intent.getBooleanExtra(SAVE_DATABASE_KEY, false)) intent.getBooleanExtra(SAVE_DATABASE_KEY, false))
@@ -549,12 +658,11 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
&& intent.hasExtra(ENTRY_HISTORY_POSITION_KEY) && intent.hasExtra(ENTRY_HISTORY_POSITION_KEY)
&& intent.hasExtra(SAVE_DATABASE_KEY) && intent.hasExtra(SAVE_DATABASE_KEY)
) { ) {
val database = Database.getInstance()
val entryId: NodeId<UUID> = intent.getParcelableExtra(ENTRY_ID_KEY) ?: return null val entryId: NodeId<UUID> = intent.getParcelableExtra(ENTRY_ID_KEY) ?: return null
database.getEntryById(entryId)?.let { mainEntry -> mDatabase.getEntryById(entryId)?.let { mainEntry ->
DeleteEntryHistoryDatabaseRunnable(this, DeleteEntryHistoryDatabaseRunnable(this,
database, mDatabase,
mainEntry, mainEntry,
intent.getIntExtra(ENTRY_HISTORY_POSITION_KEY, -1), intent.getIntExtra(ENTRY_HISTORY_POSITION_KEY, -1),
intent.getBooleanExtra(SAVE_DATABASE_KEY, false)) intent.getBooleanExtra(SAVE_DATABASE_KEY, false))
@@ -577,7 +685,7 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
return null return null
return UpdateCompressionBinariesDatabaseRunnable(this, return UpdateCompressionBinariesDatabaseRunnable(this,
Database.getInstance(), mDatabase,
oldElement, oldElement,
newElement, newElement,
intent.getBooleanExtra(SAVE_DATABASE_KEY, false) intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
@@ -594,7 +702,7 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
private fun buildDatabaseUpdateElementActionTask(intent: Intent): ActionRunnable? { private fun buildDatabaseUpdateElementActionTask(intent: Intent): ActionRunnable? {
return if (intent.hasExtra(SAVE_DATABASE_KEY)) { return if (intent.hasExtra(SAVE_DATABASE_KEY)) {
return SaveDatabaseRunnable(this, return SaveDatabaseRunnable(this,
Database.getInstance(), mDatabase,
intent.getBooleanExtra(SAVE_DATABASE_KEY, false) intent.getBooleanExtra(SAVE_DATABASE_KEY, false)
).apply { ).apply {
mAfterSaveDatabase = { result -> mAfterSaveDatabase = { result ->
@@ -612,7 +720,7 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
private fun buildDatabaseSave(intent: Intent): ActionRunnable? { private fun buildDatabaseSave(intent: Intent): ActionRunnable? {
return if (intent.hasExtra(SAVE_DATABASE_KEY)) { return if (intent.hasExtra(SAVE_DATABASE_KEY)) {
SaveDatabaseRunnable(this, SaveDatabaseRunnable(this,
Database.getInstance(), mDatabase,
intent.getBooleanExtra(SAVE_DATABASE_KEY, false)) intent.getBooleanExtra(SAVE_DATABASE_KEY, false))
} else { } else {
null null
@@ -623,10 +731,6 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
private val TAG = DatabaseTaskNotificationService::class.java.name private val TAG = DatabaseTaskNotificationService::class.java.name
const val DATABASE_TASK_TITLE_KEY = "DATABASE_TASK_TITLE_KEY"
const val DATABASE_TASK_MESSAGE_KEY = "DATABASE_TASK_MESSAGE_KEY"
const val DATABASE_TASK_WARNING_KEY = "DATABASE_TASK_WARNING_KEY"
const val ACTION_DATABASE_CREATE_TASK = "ACTION_DATABASE_CREATE_TASK" const val ACTION_DATABASE_CREATE_TASK = "ACTION_DATABASE_CREATE_TASK"
const val ACTION_DATABASE_LOAD_TASK = "ACTION_DATABASE_LOAD_TASK" const val ACTION_DATABASE_LOAD_TASK = "ACTION_DATABASE_LOAD_TASK"
const val ACTION_DATABASE_ASSIGN_PASSWORD_TASK = "ACTION_DATABASE_ASSIGN_PASSWORD_TASK" const val ACTION_DATABASE_ASSIGN_PASSWORD_TASK = "ACTION_DATABASE_ASSIGN_PASSWORD_TASK"
@@ -652,6 +756,11 @@ class DatabaseTaskNotificationService : NotificationService(), ProgressTaskUpdat
const val ACTION_DATABASE_UPDATE_PARALLELISM_TASK = "ACTION_DATABASE_UPDATE_PARALLELISM_TASK" const val ACTION_DATABASE_UPDATE_PARALLELISM_TASK = "ACTION_DATABASE_UPDATE_PARALLELISM_TASK"
const val ACTION_DATABASE_UPDATE_ITERATIONS_TASK = "ACTION_DATABASE_UPDATE_ITERATIONS_TASK" const val ACTION_DATABASE_UPDATE_ITERATIONS_TASK = "ACTION_DATABASE_UPDATE_ITERATIONS_TASK"
const val ACTION_DATABASE_SAVE = "ACTION_DATABASE_SAVE" const val ACTION_DATABASE_SAVE = "ACTION_DATABASE_SAVE"
const val ACTION_DATABASE_CLOSE = "ACTION_DATABASE_CLOSE"
const val DATABASE_TASK_TITLE_KEY = "DATABASE_TASK_TITLE_KEY"
const val DATABASE_TASK_MESSAGE_KEY = "DATABASE_TASK_MESSAGE_KEY"
const val DATABASE_TASK_WARNING_KEY = "DATABASE_TASK_WARNING_KEY"
const val DATABASE_URI_KEY = "DATABASE_URI_KEY" const val DATABASE_URI_KEY = "DATABASE_URI_KEY"
const val MASTER_PASSWORD_CHECKED_KEY = "MASTER_PASSWORD_CHECKED_KEY" const val MASTER_PASSWORD_CHECKED_KEY = "MASTER_PASSWORD_CHECKED_KEY"

View File

@@ -20,6 +20,7 @@
package com.kunzisoft.keepass.notifications package com.kunzisoft.keepass.notifications
import android.content.Intent import android.content.Intent
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.LockReceiver import com.kunzisoft.keepass.utils.LockReceiver
import com.kunzisoft.keepass.utils.registerLockReceiver import com.kunzisoft.keepass.utils.registerLockReceiver
import com.kunzisoft.keepass.utils.unregisterLockReceiver import com.kunzisoft.keepass.utils.unregisterLockReceiver