mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
fix: Encapsulate Keyboard code
This commit is contained in:
@@ -31,6 +31,7 @@ import com.kunzisoft.keepass.database.helper.SearchHelper
|
||||
import com.kunzisoft.keepass.magikeyboard.MagikeyboardService
|
||||
import com.kunzisoft.keepass.model.SearchInfo
|
||||
import com.kunzisoft.keepass.otp.OtpEntryFields
|
||||
import com.kunzisoft.keepass.utils.KeyboardUtil.isKeyboardActivatedInSettings
|
||||
import com.kunzisoft.keepass.utils.getParcelableCompat
|
||||
import com.kunzisoft.keepass.utils.WebDomain
|
||||
|
||||
@@ -116,7 +117,7 @@ class EntrySelectionLauncherActivity : DatabaseModeActivity() {
|
||||
searchInfo: SearchInfo) {
|
||||
|
||||
// Setting to integrate Magikeyboard
|
||||
val searchShareForMagikeyboard = MagikeyboardService.activatedInSettings(this)
|
||||
val searchShareForMagikeyboard = isKeyboardActivatedInSettings()
|
||||
|
||||
// If database is open
|
||||
val readOnly = database?.isReadOnly != false
|
||||
|
||||
@@ -35,7 +35,6 @@ import android.util.Log
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.widget.ImageView
|
||||
import android.widget.ProgressBar
|
||||
import android.widget.TextView
|
||||
@@ -49,7 +48,6 @@ import androidx.appcompat.view.ActionMode
|
||||
import androidx.appcompat.widget.SearchView
|
||||
import androidx.appcompat.widget.Toolbar
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.GravityCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.core.view.WindowInsetsControllerCompat
|
||||
@@ -97,6 +95,7 @@ import com.kunzisoft.keepass.settings.SettingsActivity
|
||||
import com.kunzisoft.keepass.tasks.ActionRunnable
|
||||
import com.kunzisoft.keepass.timeout.TimeoutHelper
|
||||
import com.kunzisoft.keepass.utils.BACK_PREVIOUS_KEYBOARD_ACTION
|
||||
import com.kunzisoft.keepass.utils.KeyboardUtil.showKeyboard
|
||||
import com.kunzisoft.keepass.utils.UriUtil.openUrl
|
||||
import com.kunzisoft.keepass.utils.getParcelableCompat
|
||||
import com.kunzisoft.keepass.utils.getParcelableExtraCompat
|
||||
@@ -223,8 +222,7 @@ class GroupActivity : DatabaseLockActivity(),
|
||||
&& PreferencesUtil.isKeyboardPreviousSearchEnable(this@GroupActivity)) {
|
||||
// Change to the previous keyboard and show it
|
||||
sendBroadcast(Intent(BACK_PREVIOUS_KEYBOARD_ACTION))
|
||||
ContextCompat.getSystemService(this, InputMethodManager::class.java)
|
||||
?.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
|
||||
view.showKeyboard()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,16 +25,17 @@ import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.inputmethodservice.InputMethodService
|
||||
import android.media.AudioManager
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import android.view.*
|
||||
import android.view.Gravity
|
||||
import android.view.HapticFeedbackConstants
|
||||
import android.view.KeyEvent
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.ImageView
|
||||
import android.widget.PopupWindow
|
||||
import android.widget.TextView
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.graphics.BlendModeColorFilterCompat
|
||||
import androidx.core.graphics.BlendModeCompat
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
@@ -53,8 +54,14 @@ import com.kunzisoft.keepass.model.SearchInfo
|
||||
import com.kunzisoft.keepass.otp.OtpEntryFields.OTP_TOKEN_FIELD
|
||||
import com.kunzisoft.keepass.services.KeyboardEntryNotificationService
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.utils.*
|
||||
import java.util.*
|
||||
import com.kunzisoft.keepass.utils.KeyboardUtil.showKeyboardPicker
|
||||
import com.kunzisoft.keepass.utils.KeyboardUtil.switchToPreviousKeyboard
|
||||
import com.kunzisoft.keepass.utils.LOCK_ACTION
|
||||
import com.kunzisoft.keepass.utils.LockReceiver
|
||||
import com.kunzisoft.keepass.utils.REMOVE_ENTRY_MAGIKEYBOARD_ACTION
|
||||
import com.kunzisoft.keepass.utils.registerLockReceiver
|
||||
import com.kunzisoft.keepass.utils.unregisterLockReceiver
|
||||
import java.util.UUID
|
||||
|
||||
class MagikeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionListener {
|
||||
|
||||
@@ -239,24 +246,6 @@ class MagikeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionL
|
||||
}
|
||||
}
|
||||
|
||||
private fun switchToPreviousKeyboard() {
|
||||
var imeManager: InputMethodManager? = null
|
||||
try {
|
||||
imeManager = ContextCompat.getSystemService(this, InputMethodManager::class.java)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
switchToPreviousInputMethod()
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
window.window?.let { window ->
|
||||
imeManager?.switchToLastInputMethod(window.attributes.token)
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Unable to switch to the previous IME", e)
|
||||
imeManager?.showInputMethodPicker()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onKey(primaryCode: Int, keyCodes: IntArray) {
|
||||
val inputConnection = currentInputConnection
|
||||
|
||||
@@ -267,11 +256,11 @@ class MagikeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionL
|
||||
playClick(primaryCode)
|
||||
|
||||
when (primaryCode) {
|
||||
KEY_BACK_KEYBOARD -> switchToPreviousKeyboard()
|
||||
|
||||
KEY_BACK_KEYBOARD -> {
|
||||
switchToPreviousKeyboard()
|
||||
}
|
||||
KEY_CHANGE_KEYBOARD -> {
|
||||
ContextCompat.getSystemService(this, InputMethodManager::class.java)
|
||||
?.showInputMethodPicker()
|
||||
showKeyboardPicker()
|
||||
}
|
||||
KEY_ENTRY -> {
|
||||
var searchInfo: SearchInfo? = null
|
||||
@@ -471,14 +460,6 @@ class MagikeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionL
|
||||
KeyboardEntryNotificationService.launchNotificationIfAllowed(context, entry, toast)
|
||||
}
|
||||
|
||||
fun activatedInSettings(context: Context): Boolean {
|
||||
return ContextCompat.getSystemService(context, InputMethodManager::class.java)
|
||||
?.enabledInputMethodList
|
||||
?.any {
|
||||
it.packageName == context.packageName
|
||||
} ?: false
|
||||
}
|
||||
|
||||
fun performSelection(items: List<EntryInfo>,
|
||||
actionPopulateKeyboard: (entryInfo: EntryInfo) -> Unit,
|
||||
actionEntrySelection: (autoSearch: Boolean) -> Unit) {
|
||||
|
||||
@@ -33,11 +33,11 @@ import com.kunzisoft.keepass.biometric.AdvancedUnlockManager
|
||||
import com.kunzisoft.keepass.database.element.SortNodeEnum
|
||||
import com.kunzisoft.keepass.database.search.SearchParameters
|
||||
import com.kunzisoft.keepass.education.Education
|
||||
import com.kunzisoft.keepass.magikeyboard.MagikeyboardService
|
||||
import com.kunzisoft.keepass.password.PassphraseGenerator
|
||||
import com.kunzisoft.keepass.timeout.TimeoutHelper
|
||||
import com.kunzisoft.keepass.utils.KeyboardUtil.isKeyboardActivatedInSettings
|
||||
import com.kunzisoft.keepass.utils.UriUtil.isContributingUser
|
||||
import java.util.*
|
||||
import java.util.Properties
|
||||
|
||||
object PreferencesUtil {
|
||||
|
||||
@@ -631,7 +631,7 @@ object PreferencesUtil {
|
||||
}
|
||||
|
||||
fun isKeyboardSaveSearchInfoEnable(context: Context): Boolean {
|
||||
if (!MagikeyboardService.activatedInSettings(context))
|
||||
if (!context.isKeyboardActivatedInSettings())
|
||||
return false
|
||||
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
return prefs.getBoolean(context.getString(R.string.keyboard_save_search_info_key),
|
||||
|
||||
@@ -21,13 +21,11 @@ package com.kunzisoft.keepass.settings.preferencedialogfragment
|
||||
|
||||
import android.view.View
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.widget.Button
|
||||
import android.widget.CompoundButton
|
||||
import android.widget.EditText
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.preference.PreferenceDialogFragmentCompat
|
||||
import com.kunzisoft.keepass.R
|
||||
|
||||
@@ -157,20 +155,6 @@ abstract class InputPreferenceDialogFragmentCompat : PreferenceDialogFragmentCom
|
||||
switchElementView?.visibility = View.GONE
|
||||
}
|
||||
|
||||
protected fun hideKeyboard(): Boolean {
|
||||
context?.let {
|
||||
ContextCompat.getSystemService(it, InputMethodManager::class.java)?.let { inputManager ->
|
||||
activity?.currentFocus?.let { focus ->
|
||||
val windowToken = focus.windowToken
|
||||
if (windowToken != null) {
|
||||
return inputManager.hideSoftInputFromWindow(windowToken, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
fun setSwitchAction(onCheckedChange: ((isChecked: Boolean)-> Unit)?, defaultChecked: Boolean) {
|
||||
switchElementView?.visibility = if (onCheckedChange == null) View.GONE else View.VISIBLE
|
||||
switchElementView?.isChecked = defaultChecked
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
package com.kunzisoft.keepass.utils
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.inputmethodservice.InputMethodService
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import androidx.core.content.ContextCompat
|
||||
|
||||
object KeyboardUtil {
|
||||
|
||||
fun Activity.hideKeyboard(): Boolean {
|
||||
ContextCompat.getSystemService(this, InputMethodManager::class.java)?.let { inputManager ->
|
||||
this.currentFocus?.let { focus ->
|
||||
focus.windowToken?.let {windowToken ->
|
||||
return inputManager.hideSoftInputFromWindow(
|
||||
windowToken, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
fun View.hideKeyboard(): Boolean {
|
||||
return ContextCompat.getSystemService(context, InputMethodManager::class.java)
|
||||
?.hideSoftInputFromWindow(windowToken, 0) ?: false
|
||||
}
|
||||
|
||||
fun View.showKeyboard() {
|
||||
ContextCompat.getSystemService(context, InputMethodManager::class.java)
|
||||
?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
|
||||
}
|
||||
|
||||
fun InputMethodService.switchToPreviousKeyboard() {
|
||||
var imeManager: InputMethodManager? = null
|
||||
try {
|
||||
imeManager = ContextCompat.getSystemService(this, InputMethodManager::class.java)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
switchToPreviousInputMethod()
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
window.window?.let { window ->
|
||||
imeManager?.switchToLastInputMethod(window.attributes.token)
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Unable to switch to the previous IME", e)
|
||||
imeManager?.showInputMethodPicker()
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.showKeyboardPicker() {
|
||||
ContextCompat.getSystemService(this, InputMethodManager::class.java)
|
||||
?.showInputMethodPicker()
|
||||
}
|
||||
|
||||
fun Context.isKeyboardActivatedInSettings(): Boolean {
|
||||
return ContextCompat.getSystemService(this, InputMethodManager::class.java)
|
||||
?.enabledInputMethodList
|
||||
?.any {
|
||||
it.packageName == this.packageName
|
||||
} ?: false
|
||||
}
|
||||
|
||||
private const val TAG = "KeyboardUtil"
|
||||
}
|
||||
@@ -29,19 +29,17 @@ import android.util.AttributeSet
|
||||
import android.view.KeyEvent
|
||||
import android.view.LayoutInflater
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.widget.CompoundButton
|
||||
import android.widget.EditText
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.activities.helpers.ExternalFileHelper
|
||||
import com.kunzisoft.keepass.activities.helpers.setOpenDocumentClickListener
|
||||
import com.kunzisoft.keepass.database.MainCredential
|
||||
import com.kunzisoft.keepass.hardware.HardwareKey
|
||||
import com.kunzisoft.keepass.model.CredentialStorage
|
||||
import com.kunzisoft.keepass.utils.KeyboardUtil.showKeyboard
|
||||
|
||||
class MainCredentialView @JvmOverloads constructor(context: Context,
|
||||
attrs: AttributeSet? = null,
|
||||
@@ -231,8 +229,7 @@ class MainCredentialView @JvmOverloads constructor(context: Context,
|
||||
fun focusPasswordFieldAndOpenKeyboard() {
|
||||
passwordTextView.postDelayed({
|
||||
passwordTextView.requestFocusFromTouch()
|
||||
ContextCompat.getSystemService(context, InputMethodManager::class.java)
|
||||
?.showSoftInput(passwordTextView, InputMethodManager.SHOW_IMPLICIT)
|
||||
passwordTextView.showKeyboard()
|
||||
}, 100)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.kunzisoft.keepass.view
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.os.Parcel
|
||||
@@ -11,11 +10,9 @@ import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.ImageView
|
||||
import androidx.annotation.IdRes
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.database.element.DateInstant
|
||||
import com.kunzisoft.keepass.database.element.Field
|
||||
@@ -27,6 +24,7 @@ import com.kunzisoft.keepass.model.EntryInfo
|
||||
import com.kunzisoft.keepass.otp.OtpElement
|
||||
import com.kunzisoft.keepass.otp.OtpEntryFields
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.utils.KeyboardUtil.hideKeyboard
|
||||
import com.kunzisoft.keepass.utils.readParcelableCompat
|
||||
|
||||
|
||||
@@ -102,8 +100,7 @@ abstract class TemplateAbstractView<
|
||||
}
|
||||
buildTemplateAndPopulateInfo()
|
||||
clearFocus()
|
||||
ContextCompat.getSystemService(context, InputMethodManager::class.java)
|
||||
?.hideSoftInputFromWindow(windowToken, 0)
|
||||
hideKeyboard()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user