From 89a1588133e769bd24b5031262e32da04f008d3b Mon Sep 17 00:00:00 2001 From: mrxx0 <0mrxx0@proton.me> Date: Mon, 4 May 2026 13:40:32 +0200 Subject: [PATCH] Show an UI feedback when copying to clipboard Instead of using a snackbar show a checkmark and a text view when user copy the qr scan result. --- .../camera/ui/activities/MainActivity.kt | 28 +++++++++++++------ app/src/main/res/drawable/ic_check.xml | 25 +++++++++++++++++ .../main/res/layout/scan_result_dialog.xml | 15 ++++++++++ 3 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/drawable/ic_check.xml diff --git a/app/src/main/java/app/grapheneos/camera/ui/activities/MainActivity.kt b/app/src/main/java/app/grapheneos/camera/ui/activities/MainActivity.kt index 6895accce..91c1ac656 100644 --- a/app/src/main/java/app/grapheneos/camera/ui/activities/MainActivity.kt +++ b/app/src/main/java/app/grapheneos/camera/ui/activities/MainActivity.kt @@ -1198,17 +1198,29 @@ open class MainActivity : AppCompatActivity(), }) val ctc: ImageButton = dialogBinding.copyQrText + val confirmationLabel = dialogBinding.copyConfirmation + ctc.setOnClickListener { - val clipboardManager = getSystemService( - Context.CLIPBOARD_SERVICE - ) as ClipboardManager - val clipData = ClipData.newPlainText( - "text", - textView.text - ) + val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager + val clipData = ClipData.newPlainText("text", textView.text) clipboardManager.setPrimaryClip(clipData) - showMessage(getString(R.string.copied_text_to_clipboard)) + ctc.setImageResource(R.drawable.ic_check) + ctc.imageTintList = null + ctc.animate().scaleX(1.2f).scaleY(1.2f).setDuration(100).withEndAction { + ctc.animate().scaleX(1.0f).scaleY(1.0f).setDuration(100) + } + confirmationLabel.visibility = View.VISIBLE + confirmationLabel.postDelayed({ + confirmationLabel.visibility = View.GONE + }, 2000) + + ctc.postDelayed({ + ctc.animate().alpha(0f).setDuration(150).withEndAction { + ctc.setImageResource(R.drawable.copy_to_clipboard) + ctc.animate().alpha(1f).setDuration(150).start() + } + }, 2000) } val sButton: ImageButton = dialogBinding.shareQrText diff --git a/app/src/main/res/drawable/ic_check.xml b/app/src/main/res/drawable/ic_check.xml new file mode 100644 index 000000000..c3e2fbefe --- /dev/null +++ b/app/src/main/res/drawable/ic_check.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/layout/scan_result_dialog.xml b/app/src/main/res/layout/scan_result_dialog.xml index 5a37639e7..ac105b747 100644 --- a/app/src/main/res/layout/scan_result_dialog.xml +++ b/app/src/main/res/layout/scan_result_dialog.xml @@ -84,4 +84,19 @@ android:layout_width="match_parent" android:textColor="?android:attr/textColorPrimary"/> + +