Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion android/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ pluginManagement {

plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "8.7.3" apply false
id("com.android.application") version "8.9.1" apply false
id("org.jetbrains.kotlin.android") version "2.1.0" apply false
}

Expand Down
6 changes: 5 additions & 1 deletion lib/l10n/app_de.arb
Original file line number Diff line number Diff line change
Expand Up @@ -377,5 +377,9 @@
"share_ready_message": "Bereit zum Teilen",
"lnurl_copied_message": "LNURL in die Zwischenablage kopiert",
"qr_scanner_title": "QR scannen",
"qr_scanner_instructions": "Kamera auf den QR-Code richten\num Rechnung oder Adresse zu scannen"
"qr_scanner_instructions": "Kamera auf den QR-Code richten\num Rechnung oder Adresse zu scannen",
"qr_from_gallery_button": "Galerie",
"qr_decoding": "QR wird decodiert\u2026",
"qr_not_found_in_image": "Kein QR-Code im ausgewählten Bild gefunden",
"error_loading_image": "Fehler beim Laden des Bildes"
}
6 changes: 5 additions & 1 deletion lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -392,5 +392,9 @@
"share_ready_message": "Ready to share",
"lnurl_copied_message": "LNURL copied to clipboard",
"qr_scanner_title": "Scan QR",
"qr_scanner_instructions": "Point the camera at the QR code\nto scan the invoice or address"
"qr_scanner_instructions": "Point the camera at the QR code\nto scan the invoice or address",
"qr_from_gallery_button": "Gallery",
"qr_decoding": "Decoding QR\u2026",
"qr_not_found_in_image": "No QR code found in the selected image",
"error_loading_image": "Error loading image"
}
6 changes: 5 additions & 1 deletion lib/l10n/app_es.arb
Original file line number Diff line number Diff line change
Expand Up @@ -377,5 +377,9 @@
"share_ready_message": "Listo para compartir",
"lnurl_copied_message": "LNURL copiado al portapapeles",
"qr_scanner_title": "Escanear QR",
"qr_scanner_instructions": "Apunta la cámara al código QR\npara escanear la factura o dirección"
"qr_scanner_instructions": "Apunta la cámara al código QR\npara escanear la factura o dirección",
"qr_from_gallery_button": "Galería",
"qr_decoding": "Decodificando QR\u2026",
"qr_not_found_in_image": "No se encontró ningún código QR en la imagen seleccionada",
"error_loading_image": "Error al cargar la imagen"
}
6 changes: 5 additions & 1 deletion lib/l10n/app_fr.arb
Original file line number Diff line number Diff line change
Expand Up @@ -377,5 +377,9 @@
"share_ready_message": "Prêt à partager",
"lnurl_copied_message": "LNURL copié dans le presse-papiers",
"qr_scanner_title": "Scanner QR",
"qr_scanner_instructions": "Pointez la caméra vers le code QR\npour scanner la facture ou l'adresse"
"qr_scanner_instructions": "Pointez la caméra vers le code QR\npour scanner la facture ou l'adresse",
"qr_from_gallery_button": "Galerie",
"qr_decoding": "Décodage du QR\u2026",
"qr_not_found_in_image": "Aucun code QR trouvé dans l'image sélectionnée",
"error_loading_image": "Erreur lors du chargement de l'image"
}
6 changes: 5 additions & 1 deletion lib/l10n/app_it.arb
Original file line number Diff line number Diff line change
Expand Up @@ -377,5 +377,9 @@
"share_ready_message": "Pronto da condividere",
"lnurl_copied_message": "LNURL copiato negli appunti",
"qr_scanner_title": "Scansiona QR",
"qr_scanner_instructions": "Punta la fotocamera sul codice QR\nper scansionare la fattura o l'indirizzo"
"qr_scanner_instructions": "Punta la fotocamera sul codice QR\nper scansionare la fattura o l'indirizzo",
"qr_from_gallery_button": "Galleria",
"qr_decoding": "Decodifica QR in corso\u2026",
"qr_not_found_in_image": "Nessun codice QR trovato nell'immagine selezionata",
"error_loading_image": "Errore durante il caricamento dell'immagine"
}
6 changes: 5 additions & 1 deletion lib/l10n/app_pt.arb
Original file line number Diff line number Diff line change
Expand Up @@ -377,5 +377,9 @@
"share_ready_message": "Pronto para compartilhar",
"lnurl_copied_message": "LNURL copiado para a área de transferência",
"qr_scanner_title": "Escanear QR",
"qr_scanner_instructions": "Aponte a câmera para o código QR\npara escanear a fatura ou endereço"
"qr_scanner_instructions": "Aponte a câmera para o código QR\npara escanear a fatura ou endereço",
"qr_from_gallery_button": "Galeria",
"qr_decoding": "Decodificando QR\u2026",
"qr_not_found_in_image": "Nenhum código QR encontrado na imagem selecionada",
"error_loading_image": "Erro ao carregar a imagem"
}
6 changes: 5 additions & 1 deletion lib/l10n/app_ru.arb
Original file line number Diff line number Diff line change
Expand Up @@ -377,5 +377,9 @@
"share_ready_message": "Готово к отправке",
"lnurl_copied_message": "LNURL скопирован в буфер обмена",
"qr_scanner_title": "Сканировать QR",
"qr_scanner_instructions": "Наведите камеру на QR-код\nчтобы сканировать счёт или адрес"
"qr_scanner_instructions": "Наведите камеру на QR-код\nчтобы сканировать счёт или адрес",
"qr_from_gallery_button": "Галерея",
"qr_decoding": "Декодирование QR\u2026",
"qr_not_found_in_image": "QR-код не найден в выбранном изображении",
"error_loading_image": "Ошибка загрузки изображения"
}
24 changes: 24 additions & 0 deletions lib/l10n/generated/app_localizations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1925,6 +1925,30 @@ abstract class AppLocalizations {
/// In es, this message translates to:
/// **'Apunta la cámara al código QR\npara escanear la factura o dirección'**
String get qr_scanner_instructions;

/// No description provided for @qr_from_gallery_button.
///
/// In es, this message translates to:
/// **'Galería'**
String get qr_from_gallery_button;

/// No description provided for @qr_decoding.
///
/// In es, this message translates to:
/// **'Decodificando QR…'**
String get qr_decoding;

/// No description provided for @qr_not_found_in_image.
///
/// In es, this message translates to:
/// **'No se encontró ningún código QR en la imagen seleccionada'**
String get qr_not_found_in_image;

/// No description provided for @error_loading_image.
///
/// In es, this message translates to:
/// **'Error al cargar la imagen'**
String get error_loading_image;
}

class _AppLocalizationsDelegate
Expand Down
13 changes: 13 additions & 0 deletions lib/l10n/generated/app_localizations_de.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1014,4 +1014,17 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get qr_scanner_instructions =>
'Kamera auf den QR-Code richten\num Rechnung oder Adresse zu scannen';

@override
String get qr_from_gallery_button => 'Galerie';

@override
String get qr_decoding => 'QR wird decodiert…';

@override
String get qr_not_found_in_image =>
'Kein QR-Code im ausgewählten Bild gefunden';

@override
String get error_loading_image => 'Fehler beim Laden des Bildes';
}
12 changes: 12 additions & 0 deletions lib/l10n/generated/app_localizations_en.dart
Original file line number Diff line number Diff line change
Expand Up @@ -989,4 +989,16 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get qr_scanner_instructions =>
'Point the camera at the QR code\nto scan the invoice or address';

@override
String get qr_from_gallery_button => 'Gallery';

@override
String get qr_decoding => 'Decoding QR…';

@override
String get qr_not_found_in_image => 'No QR code found in the selected image';

@override
String get error_loading_image => 'Error loading image';
}
13 changes: 13 additions & 0 deletions lib/l10n/generated/app_localizations_es.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1003,4 +1003,17 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get qr_scanner_instructions =>
'Apunta la cámara al código QR\npara escanear la factura o dirección';

@override
String get qr_from_gallery_button => 'Galería';

@override
String get qr_decoding => 'Decodificando QR…';

@override
String get qr_not_found_in_image =>
'No se encontró ningún código QR en la imagen seleccionada';

@override
String get error_loading_image => 'Error al cargar la imagen';
}
13 changes: 13 additions & 0 deletions lib/l10n/generated/app_localizations_fr.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1020,4 +1020,17 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get qr_scanner_instructions =>
'Pointez la caméra vers le code QR\npour scanner la facture ou l\'adresse';

@override
String get qr_from_gallery_button => 'Galerie';

@override
String get qr_decoding => 'Décodage du QR…';

@override
String get qr_not_found_in_image =>
'Aucun code QR trouvé dans l\'image sélectionnée';

@override
String get error_loading_image => 'Erreur lors du chargement de l\'image';
}
14 changes: 14 additions & 0 deletions lib/l10n/generated/app_localizations_it.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1017,4 +1017,18 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get qr_scanner_instructions =>
'Punta la fotocamera sul codice QR\nper scansionare la fattura o l\'indirizzo';

@override
String get qr_from_gallery_button => 'Galleria';

@override
String get qr_decoding => 'Decodifica QR in corso…';

@override
String get qr_not_found_in_image =>
'Nessun codice QR trovato nell\'immagine selezionata';

@override
String get error_loading_image =>
'Errore durante il caricamento dell\'immagine';
}
13 changes: 13 additions & 0 deletions lib/l10n/generated/app_localizations_pt.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1003,4 +1003,17 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get qr_scanner_instructions =>
'Aponte a câmera para o código QR\npara escanear a fatura ou endereço';

@override
String get qr_from_gallery_button => 'Galeria';

@override
String get qr_decoding => 'Decodificando QR…';

@override
String get qr_not_found_in_image =>
'Nenhum código QR encontrado na imagem selecionada';

@override
String get error_loading_image => 'Erro ao carregar a imagem';
}
13 changes: 13 additions & 0 deletions lib/l10n/generated/app_localizations_ru.dart
Original file line number Diff line number Diff line change
Expand Up @@ -993,4 +993,17 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get qr_scanner_instructions =>
'Наведите камеру на QR-код\nчтобы сканировать счёт или адрес';

@override
String get qr_from_gallery_button => 'Галерея';

@override
String get qr_decoding => 'Декодирование QR…';

@override
String get qr_not_found_in_image =>
'QR-код не найден в выбранном изображении';

@override
String get error_loading_image => 'Ошибка загрузки изображения';
}
80 changes: 80 additions & 0 deletions lib/widgets/qr_scanner_widget.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
import '../l10n/generated/app_localizations.dart';
import '../theme/app_tokens.dart';
Expand Down Expand Up @@ -178,6 +179,62 @@ class _QRScannerWidgetState extends State<QRScannerWidget> {
}
}

Future<void> _pickFromGallery() async {
try {
final picker = ImagePicker();
final XFile? image = await picker.pickImage(
source: ImageSource.gallery,
maxWidth: 1024,
maxHeight: 1024,
);

if (image == null) return;

if (!mounted) return;

ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
AppLocalizations.of(context)!.qr_decoding,
),
duration: const Duration(seconds: 1),
),
);

final BarcodeCapture? result = await controller.analyzeImage(
image.path,
);

if (result != null &&
result.barcodes.isNotEmpty &&
result.barcodes.first.rawValue != null) {
hasScanned = true;
controller.stop();
if (!mounted) return;
widget.onScanned(result.barcodes.first.rawValue!);
} else {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
AppLocalizations.of(context)!.qr_not_found_in_image,
),
),
);
}
} catch (e) {
debugPrint('Error loading image from gallery: $e');
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
AppLocalizations.of(context)!.error_loading_image,
),
Comment thread
coderabbitai[bot] marked this conversation as resolved.
),
);
}
}

@override
Widget build(BuildContext context) {
final t = context.tokens;
Expand Down Expand Up @@ -341,6 +398,29 @@ class _QRScannerWidgetState extends State<QRScannerWidget> {
),
),

// Pick from gallery button
Container(
width: 56,
height: 56,
decoration: BoxDecoration(
color: t.textPrimary.withValues(alpha: 0.15),
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: t.textPrimary.withValues(alpha: 0.2),
width: 1,
),
),
child: IconButton(
icon: Icon(
Icons.photo_library_outlined,
color: t.textPrimary,
size: 24,
),
onPressed: _pickFromGallery,
tooltip: AppLocalizations.of(context)!.qr_from_gallery_button,
),
),
Comment thread
coderabbitai[bot] marked this conversation as resolved.

// Switch camera button
Container(
width: 56,
Expand Down
Loading