From d68b8aaf0a741249b13ab678a5e5e98ebdad65d9 Mon Sep 17 00:00:00 2001 From: Shihaam Abdul Rahman Date: Thu, 28 May 2026 18:41:51 +0500 Subject: [PATCH] tap to copy OTP --- .../java/sh/sar/basedbank/ui/home/OtpFragment.kt | 15 +++++++++++++++ .../sar/basedbank/ui/login/CredentialsFragment.kt | 14 ++++++++++++++ app/src/main/res/layout/fragment_credentials.xml | 2 ++ app/src/main/res/layout/item_otp_card.xml | 2 ++ 4 files changed, 33 insertions(+) diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/OtpFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/OtpFragment.kt index a14c99d..532cf50 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/OtpFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/OtpFragment.kt @@ -1,9 +1,14 @@ package sh.sar.basedbank.ui.home +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager @@ -42,6 +47,16 @@ class OtpFragment : Fragment() { override fun onBindViewHolder(holder: VH, position: Int) { holder.b.tvOtpLabel.text = entries[position].label update(holder.b, entries[position].seed) + holder.b.root.setOnClickListener { + val code = holder.b.tvOtpCode.text.toString().replace(" ", "") + if (code.isNotEmpty()) { + val clipboard = it.context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + clipboard.setPrimaryClip(ClipData.newPlainText("OTP", code)) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + Toast.makeText(it.context, "OTP copied", Toast.LENGTH_SHORT).show() + } + } + } } fun tick() { diff --git a/app/src/main/java/sh/sar/basedbank/ui/login/CredentialsFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/login/CredentialsFragment.kt index 42d6398..089e853 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/login/CredentialsFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/login/CredentialsFragment.kt @@ -1,5 +1,8 @@ package sh.sar.basedbank.ui.login +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context import android.content.Intent import android.os.Bundle import android.view.LayoutInflater @@ -81,6 +84,17 @@ class CredentialsFragment : Fragment() { binding.btnLogin.isEnabled = false binding.btnLogin.setOnClickListener { attemptLogin() } + binding.cardOtp.setOnClickListener { + val code = binding.tvOtpCode.text.toString().replace(" ", "") + if (code.isNotEmpty()) { + val clipboard = requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + clipboard.setPrimaryClip(ClipData.newPlainText("OTP", code)) + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.TIRAMISU) { + Toast.makeText(requireContext(), "OTP copied", Toast.LENGTH_SHORT).show() + } + } + } + val loginFieldWatcher = object : TextWatcher { override fun afterTextChanged(s: Editable?) { updateLoginButtonState() } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} diff --git a/app/src/main/res/layout/fragment_credentials.xml b/app/src/main/res/layout/fragment_credentials.xml index 55ef8fe..db06192 100644 --- a/app/src/main/res/layout/fragment_credentials.xml +++ b/app/src/main/res/layout/fragment_credentials.xml @@ -116,6 +116,8 @@ android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:visibility="invisible" + android:clickable="true" + android:focusable="true" app:cardBackgroundColor="?attr/colorSecondaryContainer" app:cardCornerRadius="12dp" app:cardElevation="0dp"> diff --git a/app/src/main/res/layout/item_otp_card.xml b/app/src/main/res/layout/item_otp_card.xml index 37566f6..97f3235 100644 --- a/app/src/main/res/layout/item_otp_card.xml +++ b/app/src/main/res/layout/item_otp_card.xml @@ -6,6 +6,8 @@ android:layout_height="wrap_content" android:layout_marginHorizontal="16dp" android:layout_marginBottom="12dp" + android:clickable="true" + android:focusable="true" app:cardCornerRadius="16dp" app:cardElevation="2dp">