Skip to content

Commit

Permalink
fix: retry asking camera permissions if previously denied
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewwahid authored and Sednaoui committed Mar 6, 2023
1 parent 3c0efca commit 58582b6
Show file tree
Hide file tree
Showing 6 changed files with 216 additions and 19 deletions.
1 change: 0 additions & 1 deletion android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ android {
}

defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.candidewallet"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
Expand Down
49 changes: 49 additions & 0 deletions ios/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,54 @@ end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)

target.build_configurations.each do |config|

config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',

## dart: PermissionGroup.calendar
# 'PERMISSION_EVENTS=1',

## dart: PermissionGroup.reminders
# 'PERMISSION_REMINDERS=1',

## dart: PermissionGroup.contacts
# 'PERMISSION_CONTACTS=1',

## dart: PermissionGroup.camera
'PERMISSION_CAMERA=1',

## dart: PermissionGroup.microphone
# 'PERMISSION_MICROPHONE=1',

## dart: PermissionGroup.speech
# 'PERMISSION_SPEECH_RECOGNIZER=1',

## dart: PermissionGroup.photos
# 'PERMISSION_PHOTOS=1',

## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
# 'PERMISSION_LOCATION=1',

## dart: PermissionGroup.notification
# 'PERMISSION_NOTIFICATIONS=1',

## dart: PermissionGroup.mediaLibrary
# 'PERMISSION_MEDIA_LIBRARY=1',

## dart: PermissionGroup.sensors
# 'PERMISSION_SENSORS=1',

## dart: PermissionGroup.bluetooth
# 'PERMISSION_BLUETOOTH=1',

## dart: PermissionGroup.appTrackingTransparency
# 'PERMISSION_APP_TRACKING_TRANSPARENCY=1',

## dart: PermissionGroup.criticalAlerts
# 'PERMISSION_CRITICAL_ALERTS=1'
]
end
end
end
76 changes: 61 additions & 15 deletions lib/screens/home/components/address_qr_scanner.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import 'dart:io';

import 'package:bot_toast/bot_toast.dart';
import 'package:candide_mobile_app/config/network.dart';
import 'package:candide_mobile_app/config/theme.dart';
import 'package:candide_mobile_app/utils/utils.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:phosphor_flutter/phosphor_flutter.dart';
import 'package:qr_code_scanner/qr_code_scanner.dart';

class AddressQRScanner extends StatefulWidget {
Expand All @@ -17,10 +17,21 @@ class AddressQRScanner extends StatefulWidget {
State<AddressQRScanner> createState() => _AddressQRScannerState();
}

class _AddressQRScannerState extends State<AddressQRScanner> {
class _AddressQRScannerState extends State<AddressQRScanner> with WidgetsBindingObserver {
final GlobalKey _qrKey = GlobalKey();
Barcode? result;
QRViewController? controller;
bool? cameraPermissionDenied;

_permissionRequest() async {
var permissionResult = await Permission.camera.request();
if (permissionResult.isDenied || permissionResult.isPermanentlyDenied) {
cameraPermissionDenied = true;
}else{
cameraPermissionDenied = false;
}
setState(() {});
}

void _onQRViewCreated(QRViewController controller) {
this.controller = controller;
Expand Down Expand Up @@ -50,19 +61,27 @@ class _AddressQRScannerState extends State<AddressQRScanner> {
}

@override
void dispose() {
controller?.dispose();
super.dispose();
void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) {
case AppLifecycleState.resumed:
_permissionRequest();
break;
default: break;
}
}

@override
void reassemble() {
super.reassemble();
if (Platform.isAndroid) {
controller!.pauseCamera();
} else if (Platform.isIOS) {
controller!.resumeCamera();
}
void initState() {
_permissionRequest();
super.initState();
WidgetsBinding.instance.addObserver(this);
}

@override
void dispose() {
controller?.dispose();
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}

@override
Expand All @@ -89,13 +108,40 @@ class _AddressQRScannerState extends State<AddressQRScanner> {
const Spacer(flex: 3,),
],
),
Expanded(
cameraPermissionDenied == null ? const FittedBox(
fit: BoxFit.scaleDown,
child: CircularProgressIndicator()
) : cameraPermissionDenied! ? Container(
height: Get.height * 0.65,
margin: const EdgeInsets.symmetric(horizontal: 15),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(PhosphorIcons.warning, size: 40, color: Colors.amber,),
const SizedBox(height: 10,),
const Text(
"We need your permission to use the camera in order to be able to scan a WalletConnect QR code",
textAlign: TextAlign.center,
),
const SizedBox(height: 20,),
const Text(
"You need to give this permission from the system settings",
textAlign: TextAlign.center,
),
const SizedBox(height: 10,),
ElevatedButton(
onPressed: () => openAppSettings(),
child: Text("Open settings" ,style: TextStyle(fontFamily: AppThemes.fonts.gilroyBold)),
)
],
),
) : Expanded(
child: QRView(
key: _qrKey,
onQRViewCreated: _onQRViewCreated,
),
),
widget.alertWidget,
!(cameraPermissionDenied ?? true) ? widget.alertWidget : const SizedBox.shrink(),
],
),
),
Expand Down
68 changes: 65 additions & 3 deletions lib/screens/home/wallet_connect/components/wc_scan_sheet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import 'package:candide_mobile_app/config/theme.dart';
import 'package:candide_mobile_app/controller/wallet_connect_controller.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:phosphor_flutter/phosphor_flutter.dart';
import 'package:qr_code_scanner/qr_code_scanner.dart';

class WCScanSheet extends StatefulWidget {
Expand All @@ -13,14 +15,24 @@ class WCScanSheet extends StatefulWidget {
State<WCScanSheet> createState() => _WCScanSheetState();
}

class _WCScanSheetState extends State<WCScanSheet> {
class _WCScanSheetState extends State<WCScanSheet> with WidgetsBindingObserver {
final GlobalKey _qrKey = GlobalKey();
Barcode? result;
QRViewController? controller;
bool? cameraPermissionDenied;

_permissionRequest() async {
var permissionResult = await Permission.camera.request();
if (permissionResult.isDenied || permissionResult.isPermanentlyDenied) {
cameraPermissionDenied = true;
}else{
cameraPermissionDenied = false;
}
setState(() {});
}

void _onQRViewCreated(QRViewController controller) {
this.controller = controller;
//controller.resumeCamera();
controller.scannedDataStream.listen((scanData) {
if (scanData.code == null) return;
String uri = scanData.code!;
Expand All @@ -39,6 +51,29 @@ class _WCScanSheetState extends State<WCScanSheet> {
});
}

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) {
case AppLifecycleState.resumed:
_permissionRequest();
break;
default: break;
}
}

@override
void initState() {
_permissionRequest();
super.initState();
WidgetsBinding.instance.addObserver(this);
}

@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}

@override
Widget build(BuildContext context) {
return LayoutBuilder(
Expand All @@ -48,9 +83,36 @@ class _WCScanSheetState extends State<WCScanSheet> {
children: [
Expanded(
child: Stack(
fit: StackFit.expand,
alignment: Alignment.center,
children: [
QRView(
cameraPermissionDenied == null ? const FittedBox(
fit: BoxFit.scaleDown,
child: CircularProgressIndicator()
) : cameraPermissionDenied! ? Container(
margin: const EdgeInsets.symmetric(horizontal: 15),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(PhosphorIcons.warning, size: 40, color: Colors.amber,),
const SizedBox(height: 10,),
const Text(
"We need your permission to use the camera in order to be able to scan a WalletConnect QR code",
textAlign: TextAlign.center,
),
const SizedBox(height: 20,),
const Text(
"You need to give this permission from the system settings",
textAlign: TextAlign.center,
),
const SizedBox(height: 10,),
ElevatedButton(
onPressed: () => openAppSettings(),
child: Text("Open settings" ,style: TextStyle(fontFamily: AppThemes.fonts.gilroyBold)),
)
],
),
) : QRView(
key: _qrKey,
overlay: QrScannerOverlayShape(
borderColor: Get.theme.colorScheme.primary,
Expand Down
40 changes: 40 additions & 0 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -688,6 +688,46 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.11.1"
permission_handler:
dependency: "direct main"
description:
name: permission_handler
sha256: "33c6a1253d1f95fd06fa74b65b7ba907ae9811f9d5c1d3150e51417d04b8d6a8"
url: "https://pub.dev"
source: hosted
version: "10.2.0"
permission_handler_android:
dependency: transitive
description:
name: permission_handler_android
sha256: "8028362b40c4a45298f1cbfccd227c8dd6caf0e27088a69f2ba2ab15464159e2"
url: "https://pub.dev"
source: hosted
version: "10.2.0"
permission_handler_apple:
dependency: transitive
description:
name: permission_handler_apple
sha256: "9c370ef6a18b1c4b2f7f35944d644a56aa23576f23abee654cf73968de93f163"
url: "https://pub.dev"
source: hosted
version: "9.0.7"
permission_handler_platform_interface:
dependency: transitive
description:
name: permission_handler_platform_interface
sha256: "68abbc472002b5e6dfce47fe9898c6b7d8328d58b5d2524f75e277c07a97eb84"
url: "https://pub.dev"
source: hosted
version: "3.9.0"
permission_handler_windows:
dependency: transitive
description:
name: permission_handler_windows
sha256: f67cab14b4328574938ecea2db3475dad7af7ead6afab6338772c5f88963e38b
url: "https://pub.dev"
source: hosted
version: "0.1.2"
petitparser:
dependency: transitive
description:
Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ dependencies:
pausable_timer: ^1.0.0+6
short_uuids: ^2.0.0
flutter_cache_manager: ^3.3.0
permission_handler: ^10.2.0
#
flutter:
sdk: flutter
Expand Down

0 comments on commit 58582b6

Please sign in to comment.