From d56246767b48a186dff1080129a68c6ca1a2f7cc Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 5 Aug 2020 16:37:30 +0200 Subject: [PATCH] Better focus implementation --- .../keepass/activities/EntryEditActivity.kt | 17 ++++++-------- .../dialogs/SetOTPDialogFragment.kt | 23 +++++++++++++++++++ .../keepass/view/EntryEditCustomField.kt | 6 +++++ app/src/main/res/layout/fragment_set_otp.xml | 3 +++ 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt index 74d4509c6..beed23785 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.kt @@ -353,21 +353,18 @@ class EntryEditActivity : LockingActivity(), EntryCustomFieldDialogFragment.getInstance().show(supportFragmentManager, "customFieldDialog") } - private fun scrollToView(view: View?, showKeyboard: Boolean = false) { - if (showKeyboard) - window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) - scrollView?.post { - //scrollView?.smoothScrollTo(0, customFieldView.bottom) - scrollView?.fullScroll(View.FOCUS_DOWN) - view?.post { - view.requestFocus() + private fun scrollToView(view: View?) { + view?.post { + view.requestFocus() + scrollView?.post { + scrollView?.smoothScrollTo(0, view.bottom) } } } override fun onNewCustomFieldApproved(label: String) { val customFieldView = entryEditContentsView?.putCustomField(label, ProtectedString()) - scrollToView(customFieldView, true) + scrollToView(customFieldView) } override fun onNewCustomFieldCanceled(label: String) {} @@ -495,7 +492,7 @@ class EntryEditActivity : LockingActivity(), val otpField = OtpEntryFields.buildOtpField(otpElement, mEntry?.title, mEntry?.username) val otpCustomView = entryEditContentsView?.putCustomField(otpField.name, otpField.protectedValue) - scrollToView(otpCustomView, false) + scrollToView(otpCustomView) mEntry?.putExtraField(otpField.name, otpField.protectedValue) } diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetOTPDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetOTPDialogFragment.kt index d58b2f123..bad872cb6 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetOTPDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetOTPDialogFragment.kt @@ -28,6 +28,7 @@ import android.text.TextWatcher import android.view.MotionEvent import android.view.View import android.view.ViewGroup +import android.view.inputmethod.EditorInfo import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.EditText @@ -152,6 +153,28 @@ class SetOTPDialogFragment : DialogFragment() { otpCounterTextView?.setOnTouchListener(mOnTouchListener) otpDigitsTextView?.setOnTouchListener(mOnTouchListener) + // To manage focus + otpPeriodTextView?.setOnEditorActionListener { _, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_NEXT) { + otpDigitsTextView?.requestFocus() + true + } else + false + } + otpCounterTextView?.setOnEditorActionListener { _, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_NEXT) { + otpDigitsTextView?.requestFocus() + true + } else + false + } + otpCounterTextView?.setOnEditorActionListener { _, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_NEXT) { + root?.requestFocus(View.FOCUS_DOWN) + true + } else + false + } // HOTP / TOTP Type selection val otpTypeArray = OtpType.values() diff --git a/app/src/main/java/com/kunzisoft/keepass/view/EntryEditCustomField.kt b/app/src/main/java/com/kunzisoft/keepass/view/EntryEditCustomField.kt index ddcd7af62..34224051c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/EntryEditCustomField.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/EntryEditCustomField.kt @@ -20,6 +20,7 @@ package com.kunzisoft.keepass.view import android.content.Context +import android.graphics.Rect import android.util.AttributeSet import android.util.Log import android.view.LayoutInflater @@ -101,6 +102,11 @@ class EntryEditCustomField @JvmOverloads constructor(context: Context, valueView.applyFontVisibility() } + override fun requestFocus(direction: Int, previouslyFocusedRect: Rect?): Boolean { + valueView.requestFocus(direction, previouslyFocusedRect) + return true + } + private fun deleteViewFromParent() { try { val parent = parent as ViewGroup diff --git a/app/src/main/res/layout/fragment_set_otp.xml b/app/src/main/res/layout/fragment_set_otp.xml index f87239a05..6ffc6e9d3 100644 --- a/app/src/main/res/layout/fragment_set_otp.xml +++ b/app/src/main/res/layout/fragment_set_otp.xml @@ -142,6 +142,7 @@ tools:text="30" android:maxLength="3" android:digits="0123456789" + android:imeOptions="actionNext" tools:targetApi="jelly_bean" /> @@ -190,6 +192,7 @@ tools:text="6" android:maxLength="2" android:digits="0123456789" + android:imeOptions="actionNext" tools:targetApi="jelly_bean" />