diff --git a/android/app/build.gradle b/android/app/build.gradle index 0038032..c892da8 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -49,6 +49,7 @@ android { targetSdkVersion 29 versionCode flutterVersionCode.toInteger() versionName flutterVersionName + multiDexEnabled true } signingConfigs { diff --git a/assets/qrcode-scan.png b/assets/qrcode-scan.png new file mode 100644 index 0000000..acd1434 Binary files /dev/null and b/assets/qrcode-scan.png differ diff --git a/lib/main.dart b/lib/main.dart index 700fe12..eabf207 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -12,45 +12,84 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:provider/provider.dart'; -import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:flutter/foundation.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; +import 'package:catcher/catcher.dart'; + +// import 'dart:io'; +// import 'package:flutter_logs/flutter_logs.dart'; +// import 'package:downloads_path_provider/downloads_path_provider.dart'; final bool enableSentry = true; -// Future getJsonEndpoints() { -// return rootBundle.loadString('config/gva_endpoints.json'); -// } - Future main() async { - WidgetsFlutterBinding.ensureInitialized(); - HomeProvider _homeProvider = HomeProvider(); - await _homeProvider.getAppPath(); - await _homeProvider.createDefaultAvatar(); - appVersion = await _homeProvider.getAppVersion(); - prefs = await SharedPreferences.getInstance(); - final HiveStore _store = - await HiveStore.open(path: '${appPath.path}/gqlCache'); + try { + WidgetsFlutterBinding.ensureInitialized(); - // Get a valid GVA endpoint - endPointGVA = await _homeProvider.getValidEndpoint(); + // var downloadsDirectory = DownloadsPathProvider.downloadsDirectory; + // File logFile = File(downloadsDirectory.toString() + '/gecko.log'); - if (kReleaseMode && enableSentry) { - await SentryFlutter.init( - (options) { - options.dsn = - 'https://c09587b46eaa42e8b9fda28d838ed180@o496840.ingest.sentry.io/5572110'; - }, - appRunner: () => runApp(Gecko(endPointGVA, _store)), - ); - } else { - print('Debug mode enabled: No sentry alerte'); + // await FlutterLogs.initLogs( + // logLevelsEnabled: [ + // LogLevel.INFO, + // LogLevel.WARNING, + // LogLevel.ERROR, + // LogLevel.SEVERE + // ], + // timeStampFormat: TimeStampFormat.TIME_FORMAT_READABLE, + // directoryStructure: DirectoryStructure.FOR_EVENT, + // logTypesEnabled: ["Locations", "APIs"], + // logFileExtension: LogFileExtension.LOG, + // logsWriteDirectoryName: downloadsDirectory.toString(), + // logsExportDirectoryName: downloadsDirectory.toString()); - runApp(Gecko(endPointGVA, _store)); + HomeProvider _homeProvider = HomeProvider(); + await _homeProvider.getAppPath(); + await _homeProvider.createDefaultAvatar(); + appVersion = await _homeProvider.getAppVersion(); + prefs = await SharedPreferences.getInstance(); + final HiveStore _store = + await HiveStore.open(path: '${appPath.path}/gqlCache'); + + // Get a valid GVA endpoint + endPointGVA = await _homeProvider.getValidEndpoint(); + + if (kReleaseMode && enableSentry) { + CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [ + SentryHandler(SentryClient(SentryOptions( + dsn: + "https://c09587b46eaa42e8b9fda28d838ed180@o496840.ingest.sentry.io/5572110"))) + ]); + // CatcherOptions releaseOptions = CatcherOptions(NotificationReportMode(), [ + // EmailManualHandler(["poka@p2p.legal"]) + // ]); + Catcher( + rootWidget: Gecko(endPointGVA, _store), debugConfig: debugOptions); + + // await SentryFlutter.init( + // (options) { + // options.dsn = + // 'https://c09587b46eaa42e8b9fda28d838ed180@o496840.ingest.sentry.io/5572110'; + // }, + // appRunner: () => runApp(Gecko(endPointGVA, _store)), + // ); + } else { + print('Debug mode enabled: No sentry alerte'); + + runApp(Gecko(endPointGVA, _store)); + } + } catch (e, stack) { + print(e); + if (kReleaseMode) { + await Sentry.captureException( + e, + stackTrace: stack, + ); + } } } -// ignore: must_be_immutable class Gecko extends StatelessWidget { Gecko(this.randomEndpoint, this._store); final String randomEndpoint; @@ -68,8 +107,8 @@ class Gecko extends StatelessWidget { link: _httpLink, ), ); - DubpRust.setup(); + return MultiProvider( providers: [ // Provider(create: (context) => HistoryProvider()), @@ -84,6 +123,7 @@ class Gecko extends StatelessWidget { child: GraphQLProvider( client: _client, child: MaterialApp( + navigatorKey: Catcher.navigatorKey, title: 'Ğecko', theme: ThemeData( primaryColor: Color(0xffFFD58D), diff --git a/lib/models/generateWallets.dart b/lib/models/generateWallets.dart index 77f1431..d7947eb 100644 --- a/lib/models/generateWallets.dart +++ b/lib/models/generateWallets.dart @@ -7,7 +7,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; -import 'package:sentry_flutter/sentry_flutter.dart' as sentry; import 'package:pdf/pdf.dart'; import 'package:pdf/widgets.dart' as pw; import 'package:printing/printing.dart'; @@ -81,6 +80,9 @@ class GenerateWalletsProvider with ChangeNotifier { .writeAsString('$nbrWallet:$_name:$_derivationNbr:$_pubkey'); } + print('CODE PIN :::'); + print(wallet.pin); + Navigator.pop(context, true); return _name; @@ -147,14 +149,8 @@ class GenerateWalletsProvider with ChangeNotifier { this.actualWallet = await generateWallet(this.generatedMnemonic); walletIsGenerated = true; // notifyListeners(); - } catch (e, stack) { + } catch (e) { print(e); - if (kReleaseMode) { - await sentry.Sentry.captureException( - e, - stackTrace: stack, - ); - } } // await checkIfWalletExist(); return generatedMnemonic; @@ -167,14 +163,8 @@ class GenerateWalletsProvider with ChangeNotifier { mnemonic: generatedMnemonic, secretCodeType: SecretCodeType.letters, walletType: WalletType.bip32Ed25519); - } catch (e, stack) { + } catch (e) { print(e); - if (kReleaseMode) { - await sentry.Sentry.captureException( - e, - stackTrace: stack, - ); - } } mnemonicController.text = generatedMnemonic; @@ -243,6 +233,8 @@ class GenerateWalletsProvider with ChangeNotifier { salt: _cesiumID, password: _cesiumPWD); cesiumPubkey.text = _walletPubkey; + pin.text = actualWallet.pin; + isPinChanged = true; print(_walletPubkey); } @@ -274,13 +266,24 @@ class GenerateWalletsProvider with ChangeNotifier { notifyListeners(); } - void showPinIfEmpty() { - if (!isPinChanged) { - changePinCode(reload: true); - isPinChanged = true; - } + void resetImportView() { + cesiumID.text = ''; + cesiumPWD.text = ''; + cesiumPubkey.text = ''; + pin.text = ''; + canImport = false; + isPinChanged = false; + isCesiumIDVisible = false; + isCesiumPWDVisible = false; + actualWallet = null; + notifyListeners(); } + // void makeError() { + // var tata = File(appPath.path + '/ddfhjftjfg'); + // tata.readAsLinesSync(); + // } + void reloadBuild() { notifyListeners(); } diff --git a/lib/models/history.dart b/lib/models/history.dart index da3ce26..0b6f6fb 100644 --- a/lib/models/history.dart +++ b/lib/models/history.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:permission_handler/permission_handler.dart'; -import 'package:sentry/sentry.dart' as sentry; import 'package:qrscan/qrscan.dart' as scanner; import 'dart:math'; import 'package:intl/intl.dart'; @@ -28,14 +27,8 @@ class HistoryProvider with ChangeNotifier { String barcode; try { barcode = await scanner.scan(); - } catch (e, stack) { + } catch (e) { print(e); - if (kReleaseMode) { - await sentry.Sentry.captureException( - e, - stackTrace: stack, - ); - } return 'false'; } if (barcode != null) { @@ -63,7 +56,6 @@ class HistoryProvider with ChangeNotifier { getShortPubkey(pubkey); this.outputPubkey.text = pubkey; - print(pubkeyShort); isHistoryScreen = false; historySwitchButtun = "Voir l'historique"; diff --git a/lib/models/home.dart b/lib/models/home.dart index 9d854de..6928728 100644 --- a/lib/models/home.dart +++ b/lib/models/home.dart @@ -6,6 +6,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'dart:async'; import 'package:gecko/globals.dart'; +import 'package:gecko/screens/history.dart'; +import 'package:gecko/screens/myWallets/walletsHome.dart'; import 'package:package_info/package_info.dart'; import 'package:path_provider/path_provider.dart'; @@ -15,6 +17,8 @@ class HomeProvider with ChangeNotifier { Icon searchIcon = Icon(Icons.search); final TextEditingController searchQuery = new TextEditingController(); Widget appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850])); + List currentTab = [HistoryScreen(), WalletsHome()]; + get currentIndex => _currentIndex; diff --git a/lib/screens/history.dart b/lib/screens/history.dart index 12c5d2b..a46980c 100644 --- a/lib/screens/history.dart +++ b/lib/screens/history.dart @@ -48,7 +48,9 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { child: Container( height: 40.0, width: 40.0, - child: Image.asset('images/scanner.png')), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 3), + child: Image.asset('assets/qrcode-scan.png'))), backgroundColor: Color( 0xffEFEFBF), //Color(0xffFFD68E), //Color.fromARGB(500, 204, 255, 255), ), @@ -174,7 +176,9 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { text: _historyProvider.pubkey)); _historyProvider.snackCopyKey(context); }, - child: Text(_historyProvider.pubkeyShort, + child: Text( + _historyProvider + .getShortPubkey(_historyProvider.pubkey), style: TextStyle( fontSize: 22, fontWeight: FontWeight.w800, diff --git a/lib/screens/home.dart b/lib/screens/home.dart index dc5ca63..3132443 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -1,17 +1,12 @@ import 'package:gecko/globals.dart'; import 'package:gecko/models/history.dart'; import 'package:gecko/models/home.dart'; -import 'package:gecko/screens/history.dart'; import 'package:flutter/material.dart'; import 'dart:ui'; -import 'package:gecko/screens/myWallets/walletsHome.dart'; import 'package:gecko/screens/settings.dart'; import 'package:provider/provider.dart'; -// ignore: must_be_immutable class HomeScreen extends StatelessWidget { - var currentTab = [HistoryScreen(), WalletsHome()]; - @override Widget build(BuildContext context) { HomeProvider _homeProvider = Provider.of(context); @@ -116,7 +111,7 @@ class HomeScreen extends StatelessWidget { backgroundColor: Color(0xffFFD58D), ), backgroundColor: Color(0xffF9F9F1), - body: currentTab[_homeProvider.currentIndex], + body: _homeProvider.currentTab[_homeProvider.currentIndex], bottomNavigationBar: BottomNavigationBar( backgroundColor: Color(0xffFFD58D), fixedColor: Colors.grey[850], diff --git a/lib/screens/myWallets/generateWallets.dart b/lib/screens/myWallets/generateWallets.dart index 0c16321..9b2f9fb 100644 --- a/lib/screens/myWallets/generateWallets.dart +++ b/lib/screens/myWallets/generateWallets.dart @@ -21,6 +21,8 @@ class GenerateWalletsScreen extends StatelessWidget { GenerateWalletsProvider _generateWalletProvider = Provider.of(context); _generateWalletProvider.generateMnemonic(); + + // _generateWalletProvider.makeError(); print('IS GENERATED ? : ' + _generateWalletProvider.walletIsGenerated.toString()); return Scaffold( diff --git a/lib/screens/myWallets/importWallet.dart b/lib/screens/myWallets/importWallet.dart index 2a548af..5955469 100644 --- a/lib/screens/myWallets/importWallet.dart +++ b/lib/screens/myWallets/importWallet.dart @@ -18,19 +18,9 @@ class ImportWalletScreen extends StatelessWidget { WalletOptionsProvider _walletOptions = Provider.of(context); - _generateWalletProvider.showPinIfEmpty(); - return WillPopScope( onWillPop: () { - _generateWalletProvider.cesiumID.text = ''; - _generateWalletProvider.cesiumPWD.text = ''; - _generateWalletProvider.cesiumPubkey.text = ''; - _generateWalletProvider.pin.text = ''; - _generateWalletProvider.canImport = false; - _generateWalletProvider.isPinChanged = false; - _generateWalletProvider.isCesiumIDVisible = false; - _generateWalletProvider.isCesiumPWDVisible = false; - _generateWalletProvider.reloadBuild(); + _generateWalletProvider.resetImportView(); return Future.value(true); }, child: Scaffold( @@ -38,15 +28,7 @@ class ImportWalletScreen extends StatelessWidget { leading: IconButton( icon: Icon(Icons.arrow_back, color: Colors.black), onPressed: () { - _generateWalletProvider.cesiumID.text = ''; - _generateWalletProvider.cesiumPWD.text = ''; - _generateWalletProvider.cesiumPubkey.text = ''; - _generateWalletProvider.pin.text = ''; - _generateWalletProvider.canImport = false; - _generateWalletProvider.isPinChanged = false; - _generateWalletProvider.isCesiumIDVisible = false; - _generateWalletProvider.isCesiumPWDVisible = false; - _generateWalletProvider.reloadBuild(); + _generateWalletProvider.resetImportView(); Navigator.of(context).pop(); }), title: SizedBox( @@ -195,6 +177,7 @@ class ImportWalletScreen extends StatelessWidget { .cesiumPWD.text) .then((value) { _myWalletProvider.rebuildWidget(); + _generateWalletProvider.resetImportView(); }); } : null, diff --git a/lib/screens/myWallets/walletsHome.dart b/lib/screens/myWallets/walletsHome.dart index e66b0d3..9ea2c06 100644 --- a/lib/screens/myWallets/walletsHome.dart +++ b/lib/screens/myWallets/walletsHome.dart @@ -9,6 +9,7 @@ import 'package:provider/provider.dart'; // ignore: must_be_immutable class WalletsHome extends StatelessWidget { final _derivationKey = GlobalKey(); + int firstWalletDerivation; @override Widget build(BuildContext context) { @@ -20,9 +21,14 @@ class WalletsHome extends StatelessWidget { myWalletProvider.listWallets = myWalletProvider.getAllWalletsNames(); final bool isWalletsExists = myWalletProvider.checkIfWalletExist(); + if (myWalletProvider.listWallets != '') { + firstWalletDerivation = + int.parse(myWalletProvider.listWallets.split('\n')[0].split(':')[2]); + } + return Scaffold( floatingActionButton: Visibility( - visible: (isWalletsExists), + visible: (isWalletsExists && firstWalletDerivation != -1), child: Container( height: 80.0, width: 80.0, diff --git a/pubspec.lock b/pubspec.lock index efabd63..9a59dae 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -36,6 +36,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0-nullsafety.1" + catcher: + dependency: "direct main" + description: + name: catcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.1" characters: dependency: transitive description: @@ -106,6 +113,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.5" + device_info: + dependency: transitive + description: + name: device_info + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + device_info_platform_interface: + dependency: transitive + description: + name: device_info_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + dio: + dependency: transitive + description: + name: dio + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.10" dubp: dependency: "direct main" description: @@ -160,6 +188,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.8.1" + flutter_logs: + dependency: "direct main" + description: + name: flutter_logs + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" + flutter_mailer: + dependency: transitive + description: + name: flutter_mailer + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -177,6 +219,13 @@ packages: description: flutter source: sdk version: "0.0.0" + fluttertoast: + dependency: transitive + description: + name: fluttertoast + url: "https://pub.dartlang.org" + source: hosted + version: "7.1.6" globbing: dependency: transitive description: @@ -317,6 +366,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.2" + logger: + dependency: "direct main" + description: + name: logger + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.4" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "0.11.4" + mailer: + dependency: transitive + description: + name: mailer + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" matcher: dependency: transitive description: @@ -331,6 +401,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.0-nullsafety.3" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.7" nested: dependency: transitive description: @@ -500,19 +577,19 @@ packages: source: hosted version: "0.24.1" sentry: - dependency: transitive + dependency: "direct main" description: name: sentry url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.0.4" sentry_flutter: dependency: "direct main" description: name: sentry_flutter url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.0.4" shared_preferences: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 74b7c4c..f38a631 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ description: A new Flutter project. # pub.dev using `pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.0.1+6 +version: 0.0.1+8 environment: sdk: ">=2.7.0 <3.0.0" @@ -23,7 +23,6 @@ dependencies: graphql_flutter: ^4.0.0 #^3.1.0 provider: ^4.3.2+3 truncate: ^2.1.2 - sentry_flutter: ^4.0.1 path_provider: ^1.6.24 pin_code_fields: ^6.0.2 http: ^0.12.2 @@ -34,7 +33,11 @@ dependencies: sync_http: ^0.2.0 crypto: ^2.1.5 fast_base58: - + logger: ^0.9.4 + flutter_logs: ^2.1.3 + sentry: ^4.0.4 + sentry_flutter: ^4.0.4 + catcher: ^0.4.1 flutter_icons: android: "ic_launcher" @@ -57,3 +60,4 @@ flutter: - assets/ - assets/OpenSans-Regular.ttf - assets/icon_user.png + - assets/qrcode-scan.png