Fix another entry in selection mode with Magikeyboard #1293

This commit is contained in:
J-Jamet
2022-04-14 14:12:35 +02:00
parent 9ed4271a14
commit 233f0c5bdb
5 changed files with 86 additions and 66 deletions

View File

@@ -60,6 +60,7 @@ import com.kunzisoft.keepass.database.element.node.Node
import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.NodeId
import com.kunzisoft.keepass.database.element.template.Template import com.kunzisoft.keepass.database.element.template.Template
import com.kunzisoft.keepass.education.EntryEditActivityEducation import com.kunzisoft.keepass.education.EntryEditActivityEducation
import com.kunzisoft.keepass.magikeyboard.MagikeyboardService
import com.kunzisoft.keepass.model.AttachmentState import com.kunzisoft.keepass.model.AttachmentState
import com.kunzisoft.keepass.model.EntryAttachmentState import com.kunzisoft.keepass.model.EntryAttachmentState
import com.kunzisoft.keepass.model.RegisterInfo import com.kunzisoft.keepass.model.RegisterInfo
@@ -434,9 +435,10 @@ class EntryEditActivity : DatabaseLockActivity(),
private fun entryValidatedForKeyboardSelection(database: Database, entry: Entry) { private fun entryValidatedForKeyboardSelection(database: Database, entry: Entry) {
// Populate Magikeyboard with entry // Populate Magikeyboard with entry
populateKeyboardAndMoveAppToBackground(this, MagikeyboardService.populateKeyboardAndMoveAppToBackground(
entry.getEntryInfo(database), this,
intent) entry.getEntryInfo(database)
)
onValidateSpecialMode() onValidateSpecialMode()
// Don't keep activity history for entry edition // Don't keep activity history for entry edition
finishForEntryResult(entry) finishForEntryResult(entry)

View File

@@ -19,20 +19,16 @@
*/ */
package com.kunzisoft.keepass.activities package com.kunzisoft.keepass.activities
import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.widget.Toast import android.widget.Toast
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
import com.kunzisoft.keepass.activities.legacy.DatabaseModeActivity import com.kunzisoft.keepass.activities.legacy.DatabaseModeActivity
import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.search.SearchHelper import com.kunzisoft.keepass.database.search.SearchHelper
import com.kunzisoft.keepass.magikeyboard.MagikeyboardService import com.kunzisoft.keepass.magikeyboard.MagikeyboardService
import com.kunzisoft.keepass.model.EntryInfo
import com.kunzisoft.keepass.model.SearchInfo import com.kunzisoft.keepass.model.SearchInfo
import com.kunzisoft.keepass.otp.OtpEntryFields import com.kunzisoft.keepass.otp.OtpEntryFields
import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.settings.PreferencesUtil
@@ -61,7 +57,7 @@ class EntrySelectionLauncherActivity : DatabaseModeActivity() {
keySelectionBundle.getParcelable<SearchInfo>(KEY_SEARCH_INFO)?.let { mSearchInfo -> keySelectionBundle.getParcelable<SearchInfo>(KEY_SEARCH_INFO)?.let { mSearchInfo ->
searchInfo = mSearchInfo searchInfo = mSearchInfo
} }
launch(database, searchInfo, true) launch(database, searchInfo)
} else { } else {
// To manage share // To manage share
var sharedWebDomain: String? = null var sharedWebDomain: String? = null
@@ -103,8 +99,7 @@ class EntrySelectionLauncherActivity : DatabaseModeActivity() {
} }
private fun launch(database: Database?, private fun launch(database: Database?,
searchInfo: SearchInfo, searchInfo: SearchInfo) {
forceSelection: Boolean = false) {
// Setting to integrate Magikeyboard // Setting to integrate Magikeyboard
val searchShareForMagikeyboard = PreferencesUtil.isKeyboardSearchShareEnable(this) val searchShareForMagikeyboard = PreferencesUtil.isKeyboardSearchShareEnable(this)
@@ -130,21 +125,22 @@ class EntrySelectionLauncherActivity : DatabaseModeActivity() {
.show() .show()
} }
} else if (searchShareForMagikeyboard) { } else if (searchShareForMagikeyboard) {
if (items.size == 1 && !forceSelection) { MagikeyboardService.performSelection(
// Automatically populate keyboard items,
val entryPopulate = items[0] { entryInfo ->
populateKeyboardAndMoveAppToBackground( // Automatically populate keyboard
this, MagikeyboardService.populateKeyboardAndMoveAppToBackground(
entryPopulate, this,
intent) entryInfo
Log.e("TEST", "One item activity") )
} else { },
// Select the one we want { autoSearch ->
GroupActivity.launchForKeyboardSelectionResult(this, GroupActivity.launchForKeyboardSelectionResult(this,
openedDatabase, openedDatabase,
searchInfo, searchInfo,
true) autoSearch)
} }
)
} else { } else {
GroupActivity.launchForSearchResult(this, GroupActivity.launchForSearchResult(this,
openedDatabase, openedDatabase,
@@ -214,14 +210,3 @@ class EntrySelectionLauncherActivity : DatabaseModeActivity() {
} }
} }
} }
fun populateKeyboardAndMoveAppToBackground(activity: Activity,
entry: EntryInfo,
intent: Intent,
toast: Boolean = true) {
// Populate Magikeyboard with entry
MagikeyboardService.addEntryAndLaunchNotificationIfAllowed(activity, entry, toast)
// Consume the selection mode
EntrySelectionHelper.removeModesFromIntent(intent)
activity.moveTaskToBack(true)
}

View File

@@ -67,6 +67,7 @@ import com.kunzisoft.keepass.database.element.node.Type
import com.kunzisoft.keepass.database.search.SearchHelper import com.kunzisoft.keepass.database.search.SearchHelper
import com.kunzisoft.keepass.database.search.SearchParameters import com.kunzisoft.keepass.database.search.SearchParameters
import com.kunzisoft.keepass.education.GroupActivityEducation import com.kunzisoft.keepass.education.GroupActivityEducation
import com.kunzisoft.keepass.magikeyboard.MagikeyboardService
import com.kunzisoft.keepass.model.GroupInfo import com.kunzisoft.keepass.model.GroupInfo
import com.kunzisoft.keepass.model.MainCredential import com.kunzisoft.keepass.model.MainCredential
import com.kunzisoft.keepass.model.RegisterInfo import com.kunzisoft.keepass.model.RegisterInfo
@@ -890,10 +891,9 @@ class GroupActivity : DatabaseLockActivity(),
private fun entrySelectedForKeyboardSelection(database: Database, entry: Entry) { private fun entrySelectedForKeyboardSelection(database: Database, entry: Entry) {
reloadCurrentGroup() reloadCurrentGroup()
// Populate Magikeyboard with entry // Populate Magikeyboard with entry
populateKeyboardAndMoveAppToBackground( MagikeyboardService.populateKeyboardAndMoveAppToBackground(
this, this,
entry.getEntryInfo(database), entry.getEntryInfo(database)
intent
) )
onValidateSpecialMode() onValidateSpecialMode()
} }
@@ -1660,20 +1660,24 @@ class GroupActivity : DatabaseLockActivity(),
database, database,
searchInfo, searchInfo,
{ _, items -> { _, items ->
// Response is build MagikeyboardService.performSelection(
if (items.size == 1) { items,
populateKeyboardAndMoveAppToBackground(activity, { entryInfo ->
items[0], // Keyboard populated
activity.intent) MagikeyboardService.populateKeyboardAndMoveAppToBackground(
onValidateSpecialMode() activity,
} else { entryInfo
// Select the one we want )
launchForKeyboardSelectionResult(activity, onValidateSpecialMode()
database, },
searchInfo, { autoSearch ->
true) launchForKeyboardSelectionResult(activity,
onLaunchActivitySpecialMode() database,
} searchInfo,
autoSearch)
onLaunchActivitySpecialMode()
}
)
}, },
{ {
// Here no search info found, disable auto search // Here no search info found, disable auto search

View File

@@ -113,7 +113,7 @@ object EntrySelectionHelper {
?: SpecialMode.DEFAULT ?: SpecialMode.DEFAULT
} }
fun addTypeModeInIntent(intent: Intent, typeMode: TypeMode) { private fun addTypeModeInIntent(intent: Intent, typeMode: TypeMode) {
intent.putExtra(KEY_TYPE_MODE, typeMode as Serializable) intent.putExtra(KEY_TYPE_MODE, typeMode as Serializable)
} }

View File

@@ -20,6 +20,7 @@
package com.kunzisoft.keepass.magikeyboard package com.kunzisoft.keepass.magikeyboard
import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.inputmethodservice.InputMethodService import android.inputmethodservice.InputMethodService
@@ -38,6 +39,7 @@ import androidx.core.graphics.BlendModeColorFilterCompat
import androidx.core.graphics.BlendModeCompat import androidx.core.graphics.BlendModeCompat
import com.kunzisoft.keepass.R import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.EntrySelectionLauncherActivity import com.kunzisoft.keepass.activities.EntrySelectionLauncherActivity
import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
import com.kunzisoft.keepass.adapters.FieldsAdapter import com.kunzisoft.keepass.adapters.FieldsAdapter
import com.kunzisoft.keepass.database.action.DatabaseTaskProvider import com.kunzisoft.keepass.database.action.DatabaseTaskProvider
import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Database
@@ -351,38 +353,35 @@ class MagikeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionL
mDatabase, mDatabase,
searchInfo, searchInfo,
{ _, items -> { _, items ->
if (items.size == 1) { performSelection(
if (entryUUID == null) { items,
{
// Automatically populate keyboard // Automatically populate keyboard
removeEntryInfo()
addEntryAndLaunchNotificationIfAllowed( addEntryAndLaunchNotificationIfAllowed(
this, this,
items[0], items[0],
true true
) )
assignKeyboardView() assignKeyboardView()
} else { },
// Choose another one {
launchEntrySelection(null) launchEntrySelection(searchInfo)
} }
} else { )
// Select if multiple
launchEntrySelection(searchInfo)
}
}, },
{ _ -> {
// Select if not found // Select if not found
launchEntrySelection(searchInfo) launchEntrySelection(searchInfo)
}, },
{ {
// Select if database not opened // Select if database not opened
removeEntryInfo()
launchEntrySelection(searchInfo) launchEntrySelection(searchInfo)
} }
) )
} }
private fun launchEntrySelection(searchInfo: SearchInfo?) { private fun launchEntrySelection(searchInfo: SearchInfo?) {
removeEntryInfo()
EntrySelectionLauncherActivity.launch(this, searchInfo) EntrySelectionLauncherActivity.launch(this, searchInfo)
} }
@@ -476,5 +475,35 @@ class MagikeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionL
it.packageName == context.packageName it.packageName == context.packageName
} ?: false } ?: false
} }
fun performSelection(items: List<EntryInfo>,
actionPopulateKeyboard: (entryInfo: EntryInfo) -> Unit,
actionEntrySelection: (autoSearch: Boolean) -> Unit) {
if (items.size == 1) {
val itemFound = items[0]
if (entryUUID != itemFound.id) {
actionPopulateKeyboard.invoke(itemFound)
} else {
// Force selection if magikeyboard already populated
actionEntrySelection.invoke(false)
}
} else if (items.size > 1) {
// Select the one we want in the selection
actionEntrySelection.invoke(true)
} else {
// Select an arbitrary one
actionEntrySelection.invoke(false)
}
}
fun populateKeyboardAndMoveAppToBackground(activity: Activity,
entry: EntryInfo,
toast: Boolean = true) {
// Populate Magikeyboard with entry
addEntryAndLaunchNotificationIfAllowed(activity, entry, toast)
// Consume the selection mode
EntrySelectionHelper.removeModesFromIntent(activity.intent)
activity.moveTaskToBack(true)
}
} }
} }