From 631ebc657b03170bb570a922416c172cefb985a3 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 19 Oct 2020 16:01:11 +0200 Subject: [PATCH] Fix special mode in app background --- .../activities/FileDatabaseSelectActivity.kt | 35 +++++++++----- .../keepass/activities/GroupActivity.kt | 48 ++++++++----------- .../keepass/activities/PasswordActivity.kt | 41 +++++++++------- .../helpers/EntrySelectionHelper.kt | 8 +++- .../selection/SpecialModeActivity.kt | 8 ++++ 5 files changed, 80 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt index 8a4cc54b1..2a1ef1ec0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt @@ -249,36 +249,37 @@ class FileDatabaseSelectActivity : SpecialModeActivity(), PasswordActivity.launch(this@FileDatabaseSelectActivity, databaseUri, keyFile, searchInfo) + // Remove the search info from intent + if (searchInfo != null) { + finish() + } } catch (e: FileNotFoundException) { fileNoFoundAction(e) } - // Remove the search info from intent - if (searchInfo != null) { - finish() - } }, { searchInfo -> // Keyboard Selection Action try { PasswordActivity.launchForKeyboardResult(this@FileDatabaseSelectActivity, databaseUri, keyFile, searchInfo) + onLaunchActivitySpecialMode() } catch (e: FileNotFoundException) { fileNoFoundAction(e) } - finish() }, { searchInfo, assistStructure -> // Autofill Selection Action - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && assistStructure != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { try { PasswordActivity.launchForAutofillResult(this@FileDatabaseSelectActivity, databaseUri, keyFile, assistStructure, searchInfo) + onLaunchActivitySpecialMode() } catch (e: FileNotFoundException) { fileNoFoundAction(e) } } else { - finish() + onCancelSpecialMode() } }, { searchInfo -> // Registration Action @@ -286,10 +287,10 @@ class FileDatabaseSelectActivity : SpecialModeActivity(), PasswordActivity.launchForRegistration(this@FileDatabaseSelectActivity, databaseUri, keyFile, searchInfo) + onLaunchActivitySpecialMode() } catch (e: FileNotFoundException) { fileNoFoundAction(e) } - finish() }) } @@ -301,6 +302,9 @@ class FileDatabaseSelectActivity : SpecialModeActivity(), false, searchInfo, readOnly) + if (searchInfo != null) { + finish() + } }, { searchInfo -> GroupActivity.launchForKeyboardSelectionResult(this@FileDatabaseSelectActivity, @@ -308,27 +312,32 @@ class FileDatabaseSelectActivity : SpecialModeActivity(), searchInfo, readOnly) // Do not keep history - finish() + onLaunchActivitySpecialMode() }, { searchInfo, assistStructure -> - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && assistStructure != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { GroupActivity.launchForAutofillResult(this@FileDatabaseSelectActivity, assistStructure, false, searchInfo, readOnly) + onLaunchActivitySpecialMode() } else { - finish() + onCancelSpecialMode() } }, { searchInfo -> GroupActivity.launchForRegistration(this@FileDatabaseSelectActivity, searchInfo) - // Do not keep history - finish() + onLaunchActivitySpecialMode() }) } + override fun onCancelSpecialMode() { + super.onCancelSpecialMode() + finish() + } + private fun launchPasswordActivityWithPath(databaseUri: Uri) { launchPasswordActivity(databaseUri, null) // Delete flickering for kitkat <= diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt index a52ff243b..526e26377 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -209,41 +209,33 @@ class GroupActivity : LockingActivity(), GroupEditDialogFragment.TAG_CREATE_GROUP) } addNodeButtonView?.setAddEntryClickListener { - EntrySelectionHelper.doSpecialAction(intent, - { - mCurrentGroup?.let { currentGroup -> + mCurrentGroup?.let { currentGroup -> + EntrySelectionHelper.doSpecialAction(intent, + { EntryEditActivity.launch(this@GroupActivity, currentGroup) - } - }, - { searchInfo -> - mCurrentGroup?.let { currentGroup -> + }, + { searchInfo -> EntryEditActivity.launchForKeyboardSelectionResult(this@GroupActivity, currentGroup, searchInfo) - } - }, - { searchInfo, assistStructure -> - var finishActivity = true - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - mCurrentGroup?.let { currentGroup -> - assistStructure?.let { autofillStructure -> - finishActivity = false - EntryEditActivity.launchForAutofillResult(this@GroupActivity, - autofillStructure, - currentGroup, searchInfo) - } + onLaunchActivitySpecialMode() + }, + { searchInfo, assistStructure -> + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + EntryEditActivity.launchForAutofillResult(this@GroupActivity, + assistStructure, + currentGroup, searchInfo) + onLaunchActivitySpecialMode() + } else { + onCancelSpecialMode() } - } - if (finishActivity) - finish() - }, - { searchInfo -> - mCurrentGroup?.let { currentGroup -> + }, + { searchInfo -> EntryEditActivity.launchForRegistration(this@GroupActivity, currentGroup, searchInfo) + onLaunchActivitySpecialMode() } - finish() - } - ) + ) + } } mDatabase?.let { database -> diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt index 04556fd27..1bad5d5e9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt @@ -307,11 +307,13 @@ open class PasswordActivity : SpecialModeActivity() { populateKeyboardAndMoveAppToBackground(this@PasswordActivity, items[0], intent) + onValidateSpecialMode() } else { // Select the one we want GroupActivity.launchForKeyboardSelectionResult(this, true, searchInfo) + onLaunchActivitySpecialMode() } }, { @@ -320,14 +322,13 @@ open class PasswordActivity : SpecialModeActivity() { false, searchInfo, readOnly) + onLaunchActivitySpecialMode() }, { // Simply close if database not opened, normally not happened onCancelSpecialMode() } ) - // Do not keep history - finish() }, { searchInfo, assistStructure -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -338,27 +339,23 @@ open class PasswordActivity : SpecialModeActivity() { // Response is build AutofillHelper.buildResponse(this, items) onValidateSpecialMode() - finish() }, { - if (assistStructure != null) { - // Here no search info found, disable auto search - GroupActivity.launchForAutofillResult(this@PasswordActivity, - assistStructure, - false, - searchInfo, - readOnly) - } else { - onCancelSpecialMode() - finish() - } + // Here no search info found, disable auto search + GroupActivity.launchForAutofillResult(this@PasswordActivity, + assistStructure, + false, + searchInfo, + readOnly) + onLaunchActivitySpecialMode() }, { // Simply close if database not opened, normally not happened onCancelSpecialMode() - finish() } ) + } else { + onCancelSpecialMode() } }, { registerInfo -> @@ -369,22 +366,32 @@ open class PasswordActivity : SpecialModeActivity() { // No auto search, it's a registration GroupActivity.launchForRegistration(this, registerInfo) + onLaunchActivitySpecialMode() }, { // Here no search info found, disable auto search GroupActivity.launchForRegistration(this@PasswordActivity, registerInfo) + onLaunchActivitySpecialMode() }, { // Simply close if database not opened, normally not happened onCancelSpecialMode() } ) - // Do not keep history - finish() }) } + override fun onValidateSpecialMode() { + super.onValidateSpecialMode() + finish() + } + + override fun onCancelSpecialMode() { + super.onCancelSpecialMode() + finish() + } + private val onEditorActionListener = object : TextView.OnEditorActionListener { override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean { if (actionId == IME_ACTION_DONE) { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/helpers/EntrySelectionHelper.kt b/app/src/main/java/com/kunzisoft/keepass/activities/helpers/EntrySelectionHelper.kt index 68a067487..4d2d4bf97 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/helpers/EntrySelectionHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/helpers/EntrySelectionHelper.kt @@ -114,7 +114,7 @@ object EntrySelectionHelper { defaultAction: (searchInfo: SearchInfo?) -> Unit, keyboardSelectionAction: (searchInfo: SearchInfo?) -> Unit, autofillSelectionAction: (searchInfo: SearchInfo?, - assistStructure: AssistStructure?) -> Unit, + assistStructure: AssistStructure) -> Unit, registrationAction: (registerInfo: RegisterInfo?) -> Unit) { when (retrieveSpecialModeFromIntent(intent)) { @@ -139,7 +139,11 @@ object EntrySelectionHelper { when (typeMode) { TypeMode.DEFAULT -> defaultAction.invoke(searchInfo) TypeMode.MAGIKEYBOARD -> keyboardSelectionAction.invoke(searchInfo) - TypeMode.AUTOFILL -> autofillSelectionAction.invoke(searchInfo, null) + else -> { + // In this case, error + removeModesFromIntent(intent) + removeInfoFromIntent(intent) + } } } else { defaultAction.invoke(searchInfo) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/selection/SpecialModeActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/selection/SpecialModeActivity.kt index a2c33ae03..3ef8a98a7 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/selection/SpecialModeActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/selection/SpecialModeActivity.kt @@ -49,6 +49,14 @@ abstract class SpecialModeActivity : StylishActivity() { && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) } + fun onLaunchActivitySpecialMode() { + if (!isIntentSender()) { + EntrySelectionHelper.removeModesFromIntent(intent) + EntrySelectionHelper.removeInfoFromIntent(intent) + finish() + } + } + open fun onValidateSpecialMode() { if (isIntentSender()) { super.finish()