diff --git a/app/src/main/java/pl/lebihan/authnkey/CredentialBottomSheet.kt b/app/src/main/java/pl/lebihan/authnkey/CredentialBottomSheet.kt index 0b7067e..738b333 100644 --- a/app/src/main/java/pl/lebihan/authnkey/CredentialBottomSheet.kt +++ b/app/src/main/java/pl/lebihan/authnkey/CredentialBottomSheet.kt @@ -1,8 +1,10 @@ package pl.lebihan.authnkey import android.animation.ObjectAnimator +import android.content.Context import android.content.DialogInterface import android.os.Bundle +import android.text.InputType import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -12,6 +14,7 @@ import android.view.inputmethod.InputMethodManager import android.widget.ImageView import android.widget.ProgressBar import android.widget.TextView +import androidx.core.content.edit import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.bottomsheet.BottomSheetBehavior @@ -60,6 +63,10 @@ class CredentialBottomSheet : BottomSheetDialogFragment() { var onPinEntered: ((String) -> Unit)? = null var onAccountSelected: ((Int) -> Unit)? = null + private val useNumericKeyboard: Boolean + get() = requireContext().getSharedPreferences("authnkey_prefs", Context.MODE_PRIVATE) + .getBoolean("use_numeric_keyboard", true) + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -99,6 +106,7 @@ class CredentialBottomSheet : BottomSheetDialogFragment() { if (pendingShowPinInput) { pinInputLayout.visibility = View.VISIBLE btnContinue.visibility = View.VISIBLE + applyKeyboardMode(useNumericKeyboard) pinEditText.requestFocus() } @@ -121,6 +129,10 @@ class CredentialBottomSheet : BottomSheetDialogFragment() { } } + pinInputLayout.setStartIconOnClickListener { + onKeyboardModeToggled() + } + (dialog as? BottomSheetDialog)?.behavior?.apply { state = BottomSheetBehavior.STATE_EXPANDED skipCollapsed = true @@ -147,6 +159,50 @@ class CredentialBottomSheet : BottomSheetDialogFragment() { } } + private fun applyKeyboardMode(numeric: Boolean) { + pinInputLayout.setStartIconDrawable( + if (numeric) R.drawable.keyboard_24 else R.drawable.dialpad_24 + ) + + pinEditText.inputType = if (numeric) { + InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_PASSWORD + } else { + InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD + } + } + + private fun onKeyboardModeToggled() { + val newMode = !useNumericKeyboard + + requireContext().getSharedPreferences("authnkey_prefs", Context.MODE_PRIVATE) + .edit { + putBoolean("use_numeric_keyboard", newMode) + } + + pinEditText.inputType = if (newMode) { + InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_PASSWORD + } else { + InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD + } + + val iconRes = if (newMode) R.drawable.keyboard_24 else R.drawable.dialpad_24 + pinInputLayout.findViewById(com.google.android.material.R.id.text_input_start_icon)?.let { iconView -> + iconView.animate() + .alpha(0f) + .setDuration(100) + .withEndAction { + pinInputLayout.setStartIconDrawable(iconRes) + iconView.alpha = 1f + } + .start() + } ?: pinInputLayout.setStartIconDrawable(iconRes) + + pinEditText.post { + val imm = requireContext().getSystemService(InputMethodManager::class.java) + imm?.restartInput(pinEditText) + } + } + fun setState(state: State) { if (::iconStatus.isInitialized) { applyState(state) @@ -224,6 +280,7 @@ class CredentialBottomSheet : BottomSheetDialogFragment() { hideAccounts() pinEditText.text?.clear() pinInputLayout.error = null + applyKeyboardMode(useNumericKeyboard) pinEditText.requestFocus() setState(State.PIN) pinEditText.post { diff --git a/app/src/main/res/drawable/dialpad_24.xml b/app/src/main/res/drawable/dialpad_24.xml new file mode 100644 index 0000000..f3e4add --- /dev/null +++ b/app/src/main/res/drawable/dialpad_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/keyboard_24.xml b/app/src/main/res/drawable/keyboard_24.xml new file mode 100644 index 0000000..b40da89 --- /dev/null +++ b/app/src/main/res/drawable/keyboard_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/bottom_sheet_credential.xml b/app/src/main/res/layout/bottom_sheet_credential.xml index e04befa..7ea05fd 100644 --- a/app/src/main/res/layout/bottom_sheet_credential.xml +++ b/app/src/main/res/layout/bottom_sheet_credential.xml @@ -76,6 +76,8 @@ android:layout_marginBottom="16dp" android:visibility="gone" android:hint="@string/pin_hint" + app:startIconDrawable="@drawable/keyboard_24" + app:startIconContentDescription="@string/toggle_keyboard_type" app:endIconMode="password_toggle" style="@style/Widget.Material3.TextInputLayout.OutlinedBox"> @@ -83,7 +85,6 @@ android:id="@+id/pinEditText" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="textPassword" android:imeOptions="actionDone" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e08e1fc..265e63c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -52,6 +52,7 @@ Security Key Drag handle + Toggle keyboard type USB permission denied