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"/>
+
+