From cb74e82fa1d94a7a7437caf54d33d937176536d3 Mon Sep 17 00:00:00 2001 From: Trevor Date: Wed, 13 Aug 2025 11:59:56 -0500 Subject: [PATCH] Add fullscreen QR code viewer for easier scanning - Create QRCodeFullscreenActivity for large QR code display - Add click listener to QR code image in PolycentricBackupActivity - Add visual feedback with ripple effect and hint text - Add localized strings for fullscreen hint - Update layout to include hint text below QR code - Add activity to AndroidManifest.xml This makes it much easier to scan QR codes by providing a fullscreen view when tapping the QR code image. --- app/src/main/AndroidManifest.xml | 4 ++ .../activities/PolycentricBackupActivity.kt | 12 ++++ .../activities/QRCodeFullscreenActivity.kt | 62 +++++++++++++++++++ .../layout/activity_polycentric_backup.xml | 17 ++++- .../layout/activity_qr_code_fullscreen.xml | 54 ++++++++++++++++ app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 9 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/futo/platformplayer/activities/QRCodeFullscreenActivity.kt create mode 100644 app/src/main/res/layout/activity_qr_code_fullscreen.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d10ba7dd..6959861d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -242,5 +242,9 @@ android:name=".activities.PolycentricModerationActivity" android:exported="false" android:screenOrientation="portrait" /> + diff --git a/app/src/main/java/com/futo/platformplayer/activities/PolycentricBackupActivity.kt b/app/src/main/java/com/futo/platformplayer/activities/PolycentricBackupActivity.kt index b2375287..d10bf731 100644 --- a/app/src/main/java/com/futo/platformplayer/activities/PolycentricBackupActivity.kt +++ b/app/src/main/java/com/futo/platformplayer/activities/PolycentricBackupActivity.kt @@ -22,6 +22,7 @@ import com.futo.platformplayer.states.StateApp import com.futo.platformplayer.states.StateApp.Companion.withContext import com.futo.platformplayer.states.StatePolycentric import com.futo.platformplayer.views.buttons.BigButton +import com.futo.platformplayer.activities.QRCodeFullscreenActivity import com.futo.polycentric.core.ContentType import com.futo.polycentric.core.SignedEvent import com.futo.polycentric.core.StorageTypeCRDTItem @@ -49,6 +50,7 @@ class PolycentricBackupActivity : AppCompatActivity() { private lateinit var _imageQR: ImageView; private lateinit var _exportBundle: String; private lateinit var _textQR: TextView; + private lateinit var _textQRHint: TextView; private lateinit var _loader: View override fun attachBaseContext(newBase: Context?) { @@ -64,6 +66,7 @@ class PolycentricBackupActivity : AppCompatActivity() { _buttonCopy = findViewById(R.id.button_copy) _imageQR = findViewById(R.id.image_qr) _textQR = findViewById(R.id.text_qr) + _textQRHint = findViewById(R.id.text_qr_hint) _loader = findViewById(R.id.progress_loader) findViewById(R.id.button_back).setOnClickListener { finish(); @@ -71,6 +74,7 @@ class PolycentricBackupActivity : AppCompatActivity() { _imageQR.visibility = View.INVISIBLE _textQR.visibility = View.INVISIBLE + _textQRHint.visibility = View.INVISIBLE _loader.visibility = View.VISIBLE _buttonShare.visibility = View.INVISIBLE _buttonCopy.visibility = View.INVISIBLE @@ -92,8 +96,15 @@ class PolycentricBackupActivity : AppCompatActivity() { _imageQR.setImageBitmap(pair.second) _imageQR.visibility = View.VISIBLE _textQR.visibility = View.VISIBLE + _textQRHint.visibility = View.VISIBLE _buttonShare.visibility = View.VISIBLE _buttonCopy.visibility = View.VISIBLE + + // Add click listener to open QR code in fullscreen + _imageQR.setOnClickListener { + val intent = QRCodeFullscreenActivity.createIntent(this@PolycentricBackupActivity, pair.second, _exportBundle) + startActivity(intent) + } } catch (e: Exception) { Logger.e(TAG, getString(R.string.failed_to_generate_qr_code), e) @@ -107,6 +118,7 @@ class PolycentricBackupActivity : AppCompatActivity() { } _textQR.text = errorMessage _textQR.visibility = View.VISIBLE + _textQRHint.visibility = View.INVISIBLE _buttonShare.visibility = View.VISIBLE _buttonCopy.visibility = View.VISIBLE diff --git a/app/src/main/java/com/futo/platformplayer/activities/QRCodeFullscreenActivity.kt b/app/src/main/java/com/futo/platformplayer/activities/QRCodeFullscreenActivity.kt new file mode 100644 index 00000000..6e1a0f17 --- /dev/null +++ b/app/src/main/java/com/futo/platformplayer/activities/QRCodeFullscreenActivity.kt @@ -0,0 +1,62 @@ +package com.futo.platformplayer.activities + +import android.content.Context +import android.graphics.Bitmap +import android.os.Bundle +import android.view.View +import android.widget.ImageButton +import android.widget.ImageView +import androidx.appcompat.app.AppCompatActivity +import com.futo.platformplayer.R +import com.futo.platformplayer.setNavigationBarColorAndIcons +import com.futo.platformplayer.states.StateApp + +class QRCodeFullscreenActivity : AppCompatActivity() { + companion object { + private const val EXTRA_QR_BITMAP = "qr_bitmap" + private const val EXTRA_QR_TEXT = "qr_text" + + fun createIntent(context: Context, qrBitmap: Bitmap, qrText: String): android.content.Intent { + return android.content.Intent(context, QRCodeFullscreenActivity::class.java).apply { + putExtra(EXTRA_QR_BITMAP, qrBitmap) + putExtra(EXTRA_QR_TEXT, qrText) + } + } + } + + override fun attachBaseContext(newBase: Context?) { + super.attachBaseContext(StateApp.instance.getLocaleContext(newBase)) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_qr_code_fullscreen) + setNavigationBarColorAndIcons() + + val qrBitmap = intent.getParcelableExtra(EXTRA_QR_BITMAP) + val qrText = intent.getStringExtra(EXTRA_QR_TEXT) + + val imageQR = findViewById(R.id.image_qr_fullscreen) + val buttonBack = findViewById(R.id.button_back_fullscreen) + val buttonClose = findViewById(R.id.button_close_fullscreen) + + // Set the QR code image + qrBitmap?.let { bitmap -> + imageQR.setImageBitmap(bitmap) + } + + // Set click listeners + buttonBack.setOnClickListener { + finish() + } + + buttonClose.setOnClickListener { + finish() + } + + // Make the entire QR code area clickable to close + imageQR.setOnClickListener { + finish() + } + } +} diff --git a/app/src/main/res/layout/activity_polycentric_backup.xml b/app/src/main/res/layout/activity_polycentric_backup.xml index d6579dd7..1e57365a 100644 --- a/app/src/main/res/layout/activity_polycentric_backup.xml +++ b/app/src/main/res/layout/activity_polycentric_backup.xml @@ -29,6 +29,8 @@ android:id="@+id/image_qr" android:layout_width="200dp" android:layout_height="200dp" + android:background="?android:attr/selectableItemBackgroundBorderless" + android:padding="8dp" app:srcCompat="@drawable/ic_qr" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" @@ -47,6 +49,19 @@ app:layout_constraintLeft_toLeftOf="@id/image_qr" app:layout_constraintRight_toRightOf="@id/image_qr" /> + + diff --git a/app/src/main/res/layout/activity_qr_code_fullscreen.xml b/app/src/main/res/layout/activity_qr_code_fullscreen.xml new file mode 100644 index 00000000..6b73cb69 --- /dev/null +++ b/app/src/main/res/layout/activity_qr_code_fullscreen.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 8bca2053..74ce9082 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -405,6 +405,7 @@ Fehler beim Parsen von NewPipe-Abonnements Fehler beim Generieren des QR-Codes QR-Code zu groß. Verwenden Sie den Text unten, um Ihr Profil zu teilen. + Tippen Sie auf den QR-Code für Vollbildansicht Text teilen Text kopiert Muss mindestens 3 Zeichen lang sein. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index a0a9c153..e20b3695 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -382,6 +382,7 @@ Error al analizar las suscripciones de NewPipe Error al generar el código QR Código QR demasiado grande. Use el texto de abajo para compartir su perfil. + Toca el código QR para vista completa Compartir texto Texto copiado Debe tener al menos 3 caracteres de longitud. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b02636cf..9ecddc24 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -421,6 +421,7 @@ Échec de l\'analyse des abonnements NewPipe Échec de la génération du code QR Code QR trop volumineux. Utilisez le texte ci-dessous pour partager votre profil. + Appuyez sur le code QR pour la vue plein écran Partager le texte Texte copié Doit comporter au moins 3 caractères. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9bad490e..7cc3ffb8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -643,6 +643,7 @@ Failed to parse NewPipe Subscriptions Failed to generate QR code QR code too large. Use the text below to share your profile. + Tap QR code for fullscreen view Share Text Copied Text Must be at least 3 characters long.