diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntrySelectionLauncherActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/EntrySelectionLauncherActivity.kt index 74af4eae9..679ab39ba 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntrySelectionLauncherActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntrySelectionLauncherActivity.kt @@ -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 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 cc3359cef..85524df24 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -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() } } diff --git a/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikeyboardService.kt b/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikeyboardService.kt index 84fadbe59..34770e605 100644 --- a/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikeyboardService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/magikeyboard/MagikeyboardService.kt @@ -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, actionPopulateKeyboard: (entryInfo: EntryInfo) -> Unit, actionEntrySelection: (autoSearch: Boolean) -> Unit) { diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt index bc6e9e3e7..7d3367341 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt @@ -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), diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/InputPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/InputPreferenceDialogFragmentCompat.kt index 86c83b36b..5803f309e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/InputPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/InputPreferenceDialogFragmentCompat.kt @@ -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 diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/KeyboardUtil.kt b/app/src/main/java/com/kunzisoft/keepass/utils/KeyboardUtil.kt new file mode 100644 index 000000000..22cd132b3 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/utils/KeyboardUtil.kt @@ -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" +} \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/view/MainCredentialView.kt b/app/src/main/java/com/kunzisoft/keepass/view/MainCredentialView.kt index 1c550ee5f..17c51b514 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/MainCredentialView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/MainCredentialView.kt @@ -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) } diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TemplateAbstractView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TemplateAbstractView.kt index c7cb63843..dd336c843 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TemplateAbstractView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TemplateAbstractView.kt @@ -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() } }