diff --git a/README.md b/README.md index 5f2d562..49bf6c8 100644 --- a/README.md +++ b/README.md @@ -39,3 +39,9 @@ _____ * add more things to be implemented * add input from Bing Maps, Mapquest apps * add other elevation api server options +* include shared-prefs import/export in history import/export + +## archive +* [Previous Versions of Libre Gps Parser](https://trentsonlinedocs.xyz/android_app_archive/libre_gps_parser/) + +* [archive sha256sums](https://raw.githubusercontent.com/TrentSPalmer/libre_gps_parser/master/archive_sha256sums.md) diff --git a/archive_sha256sums.md b/archive_sha256sums.md new file mode 100644 index 0000000..d0b1e3d --- /dev/null +++ b/archive_sha256sums.md @@ -0,0 +1,4 @@ +153330a42f353d19443581d436b5627b6d05c87808e67a2e713ff950e5317de4 libre_gps_parser/0.1.3/armv9/app.aab +ea3f466315375d1f0eea49c0a224b36bcce8517f6ca45c6c2ed558015a97c21a libre_gps_parser/0.1.3/armv9/app-release.apk +cb45d4e5ac5f2a71ccd2ad9a2c4c081725fe2d65dd5db7a95bd196f3be70b108 libre_gps_parser/0.1.3/arm64v10/app.aab +6f145facdf75c83d42bf6ab76a3e27166eac75b0557a990634659944f031a0b9 libre_gps_parser/0.1.3/arm64v10/app-release.apk diff --git a/lib/about.dart b/lib/about.dart index 77c332c..dd114a3 100644 --- a/lib/about.dart +++ b/lib/about.dart @@ -22,149 +22,151 @@ InkWell aboutApp(BuildContext context) { ), onTap: () { showDialog( - context: context, - builder: (BuildContext context) { - final double textHeight = 1.5; - Future _launchLicense() async{ - AndroidIntent intent = AndroidIntent( + context: context, + builder: (BuildContext context) { + final double textHeight = 1.5; + Future _launchLicense() async { + AndroidIntent intent = AndroidIntent( action: 'action_view', - data: Uri.encodeFull('https://github.com/TrentSPalmer/libre_gps_parser/blob/master/LICENSE'), - ); - await intent.launch(); - } - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'Libre Gps Parser', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, + data: Uri.encodeFull( + 'https://github.com/TrentSPalmer/libre_gps_parser/blob/master/LICENSE'), + ); + await intent.launch(); + } + + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Flexible( - child: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Version: 0.1.2\n', - style: TextStyle( - color: candyApple, + title: Text( + 'Libre Gps Parser', + textAlign: TextAlign.center, + style: TextStyle( + color: candyApple, + ), + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Flexible( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Version: 0.1.3\n', + style: TextStyle( + color: candyApple, + ), ), - ), - Text( - 'The essence of Libre Gps Parser, is to parse gps coordinates from ' - 'a map link that you share from the Google Maps Application. ' - 'After that you can use the gps coordinates to make api calls for ' - 'weather, elevation, and timezoneoffset.\n\n' - 'Parsing the gps coordinates is accomplished by getting the Google Map ' - 'link with an http request, and then filtering the raw text result. ' - 'Locally, data is cached in an sqlite database, in order to economize ' - 'network requests.\n\n' - 'This version of the application requires that you set up an elevation ' - 'api server, and provide an openweathermap api key. ' - 'Or you can disable elevation and weather in settings.' - '', - ), - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, + Text( + 'Edit: new feature, you can now share a location to Libre Gps Parser from Mapquest for Android.\n\n' + 'The essence of Libre Gps Parser, is to parse gps coordinates from ' + 'a map link that you share from the Google Maps Application. ' + 'After that you can use the gps coordinates to make api calls for ' + 'weather, elevation, and timezoneoffset.\n\n' + 'Parsing the gps coordinates is accomplished by getting the Google Map ' + 'link with an http request, and then filtering the raw text result. ' + 'Locally, data is cached in an sqlite database, in order to economize ' + 'network requests.\n\n' + 'This version of the application requires that you set up an elevation ' + 'api server, and provide an openweathermap api key. ' + 'Or you can disable elevation and weather in settings.' + '', ), - child: Wrap( - runSpacing: 30, - alignment: WrapAlignment.center, - children: [ - Container( - margin: EdgeInsets.symmetric( - horizontal: 15, - ), - child: ButtonTheme( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, + ), + child: Wrap( + runSpacing: 30, + alignment: WrapAlignment.center, + children: [ + Container( + margin: EdgeInsets.symmetric( + horizontal: 15, ), - height: 75, - child: RaisedButton( - color: peacockBlue, - child: Icon( - Icons.arrow_back, - size: 48.0, - color: Colors.white, - ), - onPressed: () { - Navigator.of(context).pop(); - } - ), - ), - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 15, - ), - child: ButtonTheme( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - height: 75, - child: RaisedButton( - color: peacockBlue, - child: Text( - "License", - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () { - _launchLicense(); - } - ), - ), - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 15, - ), - child: ButtonTheme( - height: 75, - child: RaisedButton( + child: ButtonTheme( shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), + borderRadius: BorderRadius.all( + Radius.circular(6.0)), ), - color: peacockBlue, - child: Text( - "Other Licenses", - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () { - showLicensePage(context: context); - } + height: 75, + child: RaisedButton( + color: peacockBlue, + child: Icon( + Icons.arrow_back, + size: 48.0, + color: Colors.white, + ), + onPressed: () { + Navigator.of(context).pop(); + }), ), ), - ), - ], + Container( + margin: EdgeInsets.symmetric( + horizontal: 15, + ), + child: ButtonTheme( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + ), + height: 75, + child: RaisedButton( + color: peacockBlue, + child: Text( + "License", + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () { + _launchLicense(); + }), + ), + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 15, + ), + child: ButtonTheme( + height: 75, + child: RaisedButton( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + ), + color: peacockBlue, + child: Text( + "Other Licenses", + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () { + showLicensePage(context: context); + }), + ), + ), + ], + ), ), - ), - ], + ], + ), ), ), - ), - ], - ), - ); - } - ); + ], + ), + ); + }); }, ); } diff --git a/lib/database_helper.dart b/lib/database_helper.dart index 474bd29..ef16e23 100644 --- a/lib/database_helper.dart +++ b/lib/database_helper.dart @@ -29,7 +29,7 @@ class DatabaseHelper { // is the timeOffSet automatically set by consulting teleport api // (not manually set by spinner) - static final String columnIsAutoTimeOffset = 'isAutoTimeOffset'; + static final String columnIsAutoTimeOffset = 'isAutoTimeOffset'; // make this a singleton class DatabaseHelper._privateConstructor(); @@ -47,10 +47,7 @@ class DatabaseHelper { // this opens the database (and creates it if it doesn't exist) _initDatabase() async { Directory documentsDirectory = await getApplicationDocumentsDirectory(); - String path = join( - documentsDirectory.path, - _databaseName - ); + String path = join(documentsDirectory.path, _databaseName); return await openDatabase( path, version: _databaseVersion, @@ -64,7 +61,8 @@ class DatabaseHelper { // you can only ADD one column at a time? Future _onUpgrade(Database db, int oldVersion, int newVersion) async { if ((oldVersion == 1) || (oldVersion == 2)) { - await db.execute('''ALTER TABLE $table ADD $columnIsAutoTimeOffset INT'''); + await db + .execute('''ALTER TABLE $table ADD $columnIsAutoTimeOffset INT'''); await db.execute('''ALTER TABLE $table ADD $columnNotes TEXT'''); } else if (oldVersion == 3) { await db.execute('''ALTER TABLE $table ADD $columnNotes TEXT'''); @@ -144,12 +142,9 @@ class DatabaseHelper { Database db = await instance.database; List result = await db.rawQuery( 'SELECT $columnMapLocation FROM $table ORDER BY $columnViewTime DESC LIMIT 2'); - return (result.length == 2) - ? result[1]['mapLocation'] - : 'none'; + return (result.length == 2) ? result[1]['mapLocation'] : 'none'; } - Future> sortedMapLocations() async { Database db = await instance.database; var result = await db.rawQuery( @@ -255,9 +250,10 @@ class DatabaseHelper { .delete(table, where: '$columnMapLocation = ?', whereArgs: [ml]); } - Future queryDBExport() async{ + Future queryDBExport() async { Database db = await instance.database; - List result = await db.rawQuery('SELECT $columnMapLocation,$columnNotes,$columnIsAutoTimeOffset,$columnTimeOffSet FROM $table'); - return(jsonEncode(result)); + List result = await db.rawQuery( + 'SELECT $columnMapLocation,$columnNotes,$columnIsAutoTimeOffset,$columnTimeOffSet FROM $table'); + return (jsonEncode(result)); } } diff --git a/lib/edit_notes.dart b/lib/edit_notes.dart index 1c915e5..41d55cb 100644 --- a/lib/edit_notes.dart +++ b/lib/edit_notes.dart @@ -18,7 +18,6 @@ class EditNotes extends StatefulWidget { } class _EditNotesState extends State { - final double textHeight = 1.5; final _textEditingController = TextEditingController(); final dbHelper = DatabaseHelper.instance; @@ -36,82 +35,79 @@ class _EditNotesState extends State { Future _requestPop() { if (_inputText != _oldNotes) { showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'Discard your changes?', - textAlign: TextAlign.center, - ), - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'Discard your changes?', + textAlign: TextAlign.center, ), - child: Wrap( - runSpacing: 30, - children: [ - Container( - margin: EdgeInsets.symmetric( - horizontal: 15, - ), - child: ButtonTheme( - height: 75, - child: RaisedButton( - color: peacockBlue, - child: Text( - "No", - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () { - Navigator.of(context).pop(); - } + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, + ), + child: Wrap( + runSpacing: 30, + children: [ + Container( + margin: EdgeInsets.symmetric( + horizontal: 15, + ), + child: ButtonTheme( + height: 75, + child: RaisedButton( + color: peacockBlue, + child: Text( + "No", + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () { + Navigator.of(context).pop(); + }), ), ), - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 15, - ), - child: ButtonTheme( - height: 75, - child: RaisedButton( - color: peacockBlue, - child: Text( - "Discard", - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () { - Navigator.of(context).pop(); - Navigator.of(context).pop(); - } + Container( + margin: EdgeInsets.symmetric( + horizontal: 15, + ), + child: ButtonTheme( + height: 75, + child: RaisedButton( + color: peacockBlue, + child: Text( + "Discard", + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () { + Navigator.of(context).pop(); + Navigator.of(context).pop(); + }), ), ), - ), - ], + ], + ), ), - ), - ], - ), - ); - } - ); + ], + ), + ); + }); return Future.value(false); } else { return Future.value(true); @@ -126,20 +122,19 @@ class _EditNotesState extends State { title: const Text('Notes, MarkDown Supported'), actions: [ IconButton( - icon: Icon(Icons.save), - onPressed: () async{ - Navigator.of(context).pop(this._inputText); - Map row = { - DatabaseHelper.columnMapLocation: widget.mapLocation, - DatabaseHelper.columnNotes: this._inputText, - }; - await dbHelper.update(row); - } - ), + icon: Icon(Icons.save), + onPressed: () async { + Navigator.of(context).pop(this._inputText); + Map row = { + DatabaseHelper.columnMapLocation: widget.mapLocation, + DatabaseHelper.columnNotes: this._inputText, + }; + await dbHelper.update(row); + }), ], ), body: Column( - children: [ + children: [ Expanded( child: TextField( controller: _textEditingController, @@ -151,7 +146,7 @@ class _EditNotesState extends State { ), ), Row( - children: [ + children: [ Expanded( child: Container(), ), @@ -160,155 +155,185 @@ class _EditNotesState extends State { child: ButtonTheme( height: 55, padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 - ), + top: 5, right: 12, bottom: 12, left: 10), child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'Import', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), ), - ), - onPressed: () async{ - Map _storagePermissions; - PermissionStatus _storagePermission = await PermissionHandler().checkPermissionStatus(PermissionGroup.storage); - if (_storagePermission == PermissionStatus.denied) { - _storagePermissions = await PermissionHandler().requestPermissions([PermissionGroup.storage]); - } - if ((_storagePermission == PermissionStatus.granted) || (_storagePermissions.toString() == PermissionStatus.granted.toString())) { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'You can import a markdown (or plain text) file.', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, - ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, - ), - child: ButtonTheme( - height: 55, - padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 - ), - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'Select File', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () async{ - String _filePath; - _filePath = await FilePicker.getFilePath(type: FileType.ANY); - Navigator.of(context).pop(); - try { - String _contents = await File(_filePath).readAsString(); - setState(() { - this._textEditingController.text = _contents; - this._inputText = _contents; - }); - } catch(e) { - print(e); - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'Oops, something went wrong', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, - ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, - ), - child: ButtonTheme( - height: 55, - padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 - ), - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'OK', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () async{ - Navigator.of(context).pop(); - } - ), - ), - ), - ], - ), - ); - } - ); - } - } - ), + color: peacockBlue, + child: Text( + 'Import', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () async { + Map + _storagePermissions; + PermissionStatus _storagePermission = + await PermissionHandler().checkPermissionStatus( + PermissionGroup.storage); + if (_storagePermission == PermissionStatus.denied) { + _storagePermissions = await PermissionHandler() + .requestPermissions([PermissionGroup.storage]); + } + if ((_storagePermission == + PermissionStatus.granted) || + (_storagePermissions.toString() == + PermissionStatus.granted.toString())) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + ), + title: Text( + 'You can import a markdown (or plain text) file.', + textAlign: TextAlign.center, + style: TextStyle( + color: candyApple, ), ), - ], - ), - ); - } - ); - } - } - ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, + ), + child: ButtonTheme( + height: 55, + padding: EdgeInsets.only( + top: 5, + right: 12, + bottom: 12, + left: 10), + child: RaisedButton( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all( + Radius.circular(6.0)), + ), + color: peacockBlue, + child: Text( + 'Select File', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () async { + String _filePath; + _filePath = await FilePicker + .getFilePath( + type: FileType.ANY); + Navigator.of(context).pop(); + try { + String _contents = + await File(_filePath) + .readAsString(); + setState(() { + this + ._textEditingController + .text = _contents; + this._inputText = + _contents; + }); + } catch (e) { + print(e); + showDialog( + context: context, + builder: (BuildContext + context) { + return AlertDialog( + backgroundColor: + ivory, + shape: + RoundedRectangleBorder( + borderRadius: BorderRadius + .all(Radius + .circular( + 6.0)), + ), + title: Text( + 'Oops, something went wrong', + textAlign: + TextAlign + .center, + style: TextStyle( + color: + candyApple, + ), + ), + content: Column( + mainAxisSize: + MainAxisSize + .min, + children: < + Widget>[ + Container( + margin: + EdgeInsets + .only( + top: 40, + bottom: 10, + ), + child: + ButtonTheme( + height: 55, + padding: EdgeInsets.only( + top: 5, + right: + 12, + bottom: + 12, + left: + 10), + child: RaisedButton( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + ), + color: peacockBlue, + child: Text( + 'OK', + style: + TextStyle( + height: + textHeight, + color: + Colors.white, + fontSize: + 24, + ), + ), + onPressed: () async { + Navigator.of(context) + .pop(); + }), + ), + ), + ], + ), + ); + }); + } + }), + ), + ), + ], + ), + ); + }); + } + }), ), ), ], @@ -319,7 +344,7 @@ class _EditNotesState extends State { ); } - Future loadNotes() async{ + Future loadNotes() async { String _notes = await dbHelper.queryNotes(widget.mapLocation); setState(() { _oldNotes = _notes; diff --git a/lib/elevation.dart b/lib/elevation.dart index 62e6f0c..0409603 100644 --- a/lib/elevation.dart +++ b/lib/elevation.dart @@ -66,90 +66,90 @@ InkWell elevAtion(BuildContext context, int elevation, int feetElevation) { ), onTap: () { showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'You have to set up an Open-Elevation Api Server, and specify this in ' - 'settings. The instructions are a little bit out-dated, but it\'s not ' - 'too difficult to muddle through and set something up on a vps or ' - 'RaspberryPi or whatever.\n\n' - 'A \$5 Digital Ocean Droplet doesn\'t have enough disk space, but ' - 'a \$5 LightSail instance does.', - textAlign: TextAlign.center, - ), - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'You have to set up an Open-Elevation Api Server, and specify this in ' + 'settings. The instructions are a little bit out-dated, but it\'s not ' + 'too difficult to muddle through and set something up on a vps or ' + 'RaspberryPi or whatever.\n\n' + 'A \$5 Digital Ocean Droplet doesn\'t have enough disk space, but ' + 'a \$5 LightSail instance does.', + textAlign: TextAlign.center, ), - child: ButtonTheme( - height: 75, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, ), - child: RaisedButton( - color: peacockBlue, - child: Column( - children: [ - Container( - width: 150, - margin: EdgeInsets.only( - top: 10, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Text( - 'github', + child: ButtonTheme( + height: 75, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), + ), + child: RaisedButton( + color: peacockBlue, + child: Column( + children: [ + Container( + width: 150, + margin: EdgeInsets.only( + top: 10, + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + children: [ + Text( + 'github', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + Icon( + Icons.open_in_browser, + size: 48, + color: Colors.white, + ), + ], + ), + ), + Container( + margin: EdgeInsets.only( + bottom: 15, + ), + child: Text( + 'open-elevation', style: TextStyle( height: textHeight, color: Colors.white, fontSize: 24, ), ), - Icon( - Icons.open_in_browser, - size: 48, - color: Colors.white, - ), - ], - ), - ), - Container( - margin: EdgeInsets.only( - bottom: 15, - ), - child: Text( - 'open-elevation', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, ), - ), + ], ), - ], - ), - onPressed: () { - Navigator.of(context).pop(); - urlLaunch('https://github.com/Jorl17/open-elevation/blob/master/docs/host-your-own.md'); - } + onPressed: () { + Navigator.of(context).pop(); + urlLaunch( + 'https://github.com/Jorl17/open-elevation/blob/master/docs/host-your-own.md'); + }), ), ), - ), - ], - ), - ); - } - ); + ], + ), + ); + }); }, ); } diff --git a/lib/global_helper_functions.dart b/lib/global_helper_functions.dart index 4b4f7b3..ab440fe 100644 --- a/lib/global_helper_functions.dart +++ b/lib/global_helper_functions.dart @@ -33,12 +33,13 @@ Future> refreshTimeOffSet(String mapLocation, String latLong) async { try { responseJson = jsonDecode(response.body); offSetMin = responseJson['_embedded']['location:nearest-cities'][0] - ['_embedded']['location:nearest-city']['_embedded'] - ['city:timezone']['_embedded']['tz:offsets-now'] - ['total_offset_min'] ?? - 2000; + ['_embedded']['location:nearest-city']['_embedded'] + ['city:timezone']['_embedded']['tz:offsets-now'] + ['total_offset_min'] ?? + 2000; } catch (e) { - print('$e in source file global_helper_functions.dart.getTimeOffSet, can\'t assign Map responseJson'); + print( + '$e in source file global_helper_functions.dart.getTimeOffSet, can\'t assign Map responseJson'); } Map row = { DatabaseHelper.columnMapLocation: mapLocation, @@ -58,7 +59,7 @@ Future> refreshTimeOffSet(String mapLocation, String latLong) async { } } -Future> getTimeOffSet(String mapLocation, String latLong) async{ +Future> getTimeOffSet(String mapLocation, String latLong) async { final dbHelper = DatabaseHelper.instance; final int _timeStamp = newTimeStamp(); int timeOffSetTime = await dbHelper.queryTimeOffSetTime(mapLocation); @@ -80,12 +81,13 @@ Future> getTimeOffSet(String mapLocation, String latLong) async{ try { responseJson = jsonDecode(response.body); offSetMin = responseJson['_embedded']['location:nearest-cities'][0] - ['_embedded']['location:nearest-city']['_embedded'] - ['city:timezone']['_embedded']['tz:offsets-now'] - ['total_offset_min'] ?? - 2000; + ['_embedded']['location:nearest-city']['_embedded'] + ['city:timezone']['_embedded']['tz:offsets-now'] + ['total_offset_min'] ?? + 2000; } catch (e) { - print('$e in source file global_helper_functions.dart.getTimeOffSet, can\'t assign Map responseJson'); + print( + '$e in source file global_helper_functions.dart.getTimeOffSet, can\'t assign Map responseJson'); } Map row = { DatabaseHelper.columnMapLocation: mapLocation, @@ -132,7 +134,9 @@ Future getWeather( Response response = await get(weatherApiUrl); if (response.statusCode == 200) { Map responseJson = jsonDecode(response.body); - weatherID = (responseJson['id'] != 0) ? responseJson['id'] : generateFakeWeatherId(lattLong); + weatherID = (responseJson['id'] != 0) + ? responseJson['id'] + : generateFakeWeatherId(lattLong); Map row = { DatabaseHelper.columnMapLocation: mapLocation, DatabaseHelper.columnWeatherID: weatherID @@ -150,8 +154,9 @@ Future getWeather( } return response.body; } - } catch(e) { - print('$e, can\'t connect to openweathermap in global_helper_functions'); + } catch (e) { + print( + '$e, can\'t connect to openweathermap in global_helper_functions'); weatherID ??= generateFakeWeatherId(lattLong); // assign if null String weather = await dbHelper.queryWeather(weatherID); return weather ?? 'NA'; @@ -178,7 +183,9 @@ Future getWeatherForeCast( weatherID = generateFakeWeatherId(lattLong); } int weatherIDExists = await dbHelper.queryWeatherIDExists(weatherID); - if (weatherIDExists == 0) { stale = true; } + if (weatherIDExists == 0) { + stale = true; + } if ((weatherID == null) || (stale == true)) { List latLong = lattLong.split(','); String weatherForeCastApiUrl; @@ -190,11 +197,11 @@ Future getWeatherForeCast( '${weatherForecastApiUrlPrefix}id=$weatherID&units=imperial&appid=$weatherApiID'; } try { - Response response = await get(weatherForeCastApiUrl); + Response response = await get(weatherForeCastApiUrl); if (response.statusCode == 200) { Map responseJson = jsonDecode(response.body); weatherID = responseJson['city']['id']; - weatherID ??= generateFakeWeatherId(lattLong); // assign if null + weatherID ??= generateFakeWeatherId(lattLong); // assign if null Map row = { DatabaseHelper.columnMapLocation: mapLocation, DatabaseHelper.columnWeatherID: weatherID @@ -212,8 +219,9 @@ Future getWeatherForeCast( } return response.body; } - } catch(e) { - print('$e, probably cant connect to openweathermap... no network connection? global_helper_functions.getWeatherForeCast'); + } catch (e) { + print( + '$e, probably cant connect to openweathermap... no network connection? global_helper_functions.getWeatherForeCast'); weatherID ??= generateFakeWeatherId(lattLong); // assign if null String weatherForeCast = await dbHelper.queryWeatherForeCast(weatherID); return (weatherForeCast); @@ -249,18 +257,39 @@ int newTimeStamp() { } Future parseMapUrl(String mapUrl) async { - try { - Response response = await get(mapUrl); - RegExp gmapUrl = RegExp( - r'https://www.google.com/(maps/preview)/(place)/([^/]*)/([^/]*)/data'); - String mapInfo = response.body; - Match match = gmapUrl.firstMatch(mapInfo); - String subMapInfo = match.group(4); - RegExp subGmapUrl = RegExp(r'@([^,]*,[^,]*),([^,]*,[^,]*)'); - Match subMatch = subGmapUrl.firstMatch(subMapInfo); - return subMatch.group(1); - } catch(e) { - print('$e can\'t connect to internet in global_helper_functions.parseMapUrl'); + if (mapUrl.contains('mapq.st')) { + try { + Response response = await get(mapUrl); + String mapInfo = response.body; + RegExp _latExp = RegExp( + r'()'); + Match _latMatch = _latExp.firstMatch(mapInfo); + RegExp _longExp = RegExp( + r'()'); + Match _longMatch = _longExp.firstMatch(mapInfo); + String result = _latMatch.group(4) + ',' + _longMatch.group(4); + return (result); + } catch (e) { + print( + '$e can\'t connect to internet in global_helper_functions.parseMapUrl'); + } + } else if ((mapUrl.contains('maps.google')) || + (mapUrl.contains('maps.app.goo.gl'))) { + try { + Response response = await get(mapUrl); + RegExp gmapUrl = RegExp( + r'https://www.google.com/(maps/preview)/(place)/([^/]*)/([^/]*)/data'); + String mapInfo = response.body; + Match match = gmapUrl.firstMatch(mapInfo); + String subMapInfo = match.group(4); + RegExp subGmapUrl = RegExp(r'@([^,]*,[^,]*),([^,]*,[^,]*)'); + Match subMatch = subGmapUrl.firstMatch(subMapInfo); + String result = subMatch.group(1); + return (result); + } catch (e) { + print( + '$e can\'t connect to internet in global_helper_functions.parseMapUrl'); + } } } @@ -300,8 +329,9 @@ String convertCoordinates(String latNLong) { String gpsDMS = lat[0] + '\u00B0 ' + latMinSec + ',' + long[0] + '\u00B0 ' + longMinSec; return gpsDMS; - } catch(e) { - print('$e in source file global_helper_functions.convertCoordinates, function parameter probably not a valid latNLong string'); + } catch (e) { + print( + '$e in source file global_helper_functions.convertCoordinates, function parameter probably not a valid latNLong string'); } } @@ -314,19 +344,20 @@ String getMinSec(String numString) { return minSecs; } - String weatherConditions(String weatherConditions) { int numSpaces = (' '.allMatches(weatherConditions)).length; if (numSpaces > 1) { int firstSpace = weatherConditions.indexOf(' '); int secondSpace = (weatherConditions.indexOf(' ', firstSpace + 1)); - return weatherConditions.replaceRange(secondSpace, (secondSpace + 1), '\n').toUpperCase(); + return weatherConditions + .replaceRange(secondSpace, (secondSpace + 1), '\n') + .toUpperCase(); } else { return weatherConditions.toUpperCase(); } } -Future urlLaunch(String url) async{ +Future urlLaunch(String url) async { if (await canLaunch(url)) { await launch(url); } else { @@ -338,7 +369,8 @@ int generateFakeWeatherId(String latLong) { List _latLongParts = latLong.split(','); List _shortLat = _latLongParts[0].split('.'); List _shortLong = _latLongParts[1].split('.'); - String _fakeIDString = _shortLat[0].replaceFirst('-','8') + _shortLong[0].replaceFirst('-','8'); + String _fakeIDString = _shortLat[0].replaceFirst('-', '8') + + _shortLong[0].replaceFirst('-', '8'); // you know a weatherID is fake because it is less than zero return (0 - int.parse(_fakeIDString)); } @@ -394,8 +426,11 @@ Future setPreferenceUseWeather(bool useWeather) async { Future getPreferenceDBExportFileName() async { SharedPreferences prefs = await SharedPreferences.getInstance(); - String dbExportFileName = prefs.getString("dbExportFileName") ?? "libre_gps_parser.json"; - return (dbExportFileName.length > 0) ? dbExportFileName : "libre_gps_parser.json"; + String dbExportFileName = + prefs.getString("dbExportFileName") ?? "libre_gps_parser.json"; + return (dbExportFileName.length > 0) + ? dbExportFileName + : "libre_gps_parser.json"; } Future setPreferenceDBExportFileName(String dbExportFileName) async { @@ -410,19 +445,21 @@ Future importDataBase(String importString) { List _importJson = jsonDecode(importString); int _importJsonLength = _importJson.length; for (int i = 0; i < _importJsonLength; i++) { - dbHelper.queryRowExists(_importJson[i]['mapLocation']).then((int rowExists) { + dbHelper + .queryRowExists(_importJson[i]['mapLocation']) + .then((int rowExists) { if (rowExists == 0) { Map row = { DatabaseHelper.columnMapLocation: _importJson[i]['mapLocation'], }; if (_importJson[i]['notes'] != null) { row['notes'] = _importJson[i]['notes']; - } + } if (_importJson[i]['isAutoTimeOffset'] == 0) { row['timeOffSet'] = _importJson[i]['timeOffSet']; row['timeOffSetTime'] = _timeStamp; row['isAutoTimeOffset'] = _importJson[i]['isAutoTimeOffset']; - } + } dbHelper.insert(row); } }); diff --git a/lib/lnl_dec.dart b/lib/lnl_dec.dart index a242be3..e97893c 100644 --- a/lib/lnl_dec.dart +++ b/lib/lnl_dec.dart @@ -6,17 +6,16 @@ import 'package:share/share.dart'; final double textHeight = 1.5; Row lnlDec(String latnLong) { - - Future _launchLnL() async{ + Future _launchLnL() async { AndroidIntent intent = AndroidIntent( - action: 'action_view', - data: Uri.encodeFull('geo:$latnLong?z=12'), - package: 'com.google.android.apps.maps', + action: 'action_view', + data: Uri.encodeFull('geo:$latnLong?z=12'), + package: 'com.google.android.apps.maps', ); await intent.launch(); } - List _latNLong = ['x','y']; + List _latNLong = ['x', 'y']; if ((latnLong == 'none') || (latnLong == null)) { return Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, @@ -125,5 +124,3 @@ Row lnlDec(String latnLong) { ); } } - - diff --git a/lib/lnl_deg.dart b/lib/lnl_deg.dart index 470b4b3..3af7d1d 100644 --- a/lib/lnl_deg.dart +++ b/lib/lnl_deg.dart @@ -5,7 +5,7 @@ import 'package:share/share.dart'; final double textHeight = 1.5; Row lnlDeg(String latnLongDMS) { - List _latNLong = ['x','y']; + List _latNLong = ['x', 'y']; if ((latnLongDMS == 'none') || (latnLongDMS == null)) { return Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, @@ -60,7 +60,7 @@ Row lnlDeg(String latnLongDMS) { ), ], ); - } else { + } else { _latNLong = latnLongDMS.split(','); return Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, diff --git a/lib/location.dart b/lib/location.dart index 2398c9e..aea89d5 100644 --- a/lib/location.dart +++ b/lib/location.dart @@ -18,31 +18,31 @@ class _LocationState extends State { @override Widget build(BuildContext context) { final double textHeight = 1.5; - List locationStringList = _getlocationStringList(widget.mapLocation); + List locationStringList = + _getlocationStringList(widget.mapLocation); - Future _launchUrl() async{ + Future _launchUrl() async { AndroidIntent intent = AndroidIntent( - action: 'action_view', - data: Uri.encodeFull(locationStringList[locationStringList.length - 1]), + action: 'action_view', + data: Uri.encodeFull(locationStringList[locationStringList.length - 1]), ); await intent.launch(); } List createLocation(List location) { - return location.map((line) { - line = (line.length < 25) ? line : - (line.substring(0,20) + '.....' ); - return Container( - child: Text( - line, - style: TextStyle( - height: textHeight, - fontSize: 16.0, - ), - ), - ); - }).toList(); - } + return location.map((line) { + line = (line.length < 25) ? line : (line.substring(0, 20) + '.....'); + return Container( + child: Text( + line, + style: TextStyle( + height: textHeight, + fontSize: 16.0, + ), + ), + ); + }).toList(); + } try { return Row( @@ -55,23 +55,23 @@ class _LocationState extends State { iconSize: 48, onPressed: () { showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'Sharing Options', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), ), - ), - content: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ + title: Text( + 'Sharing Options', + textAlign: TextAlign.center, + style: TextStyle( + color: candyApple, + ), + ), + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ IconButton( icon: Icon(Icons.share), tooltip: 'share link to another app', @@ -81,20 +81,19 @@ class _LocationState extends State { Share.share(widget.mapLocation); }, ), - IconButton( - icon: Icon(Icons.map), - tooltip: 'share link to maps', - iconSize: 48, - onPressed: () { - Navigator.of(context).pop(); - _launchUrl(); - }, - ), - ], - ), - ); - } - ); + IconButton( + icon: Icon(Icons.map), + tooltip: 'share link to maps', + iconSize: 48, + onPressed: () { + Navigator.of(context).pop(); + _launchUrl(); + }, + ), + ], + ), + ); + }); }, ), ), @@ -107,59 +106,58 @@ class _LocationState extends State { ), onTap: () { showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( margin: EdgeInsets.only( bottom: 25, ), - child: Text( - widget.mapLocation, - textAlign: TextAlign.center, - ), - ), - RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Container( - margin: EdgeInsets.only( - top: 12, - bottom: 20, - ), child: Text( - 'ok', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), + widget.mapLocation, + textAlign: TextAlign.center, ), ), - onPressed: () { - Navigator.of(context).pop(); - } - ), - ], - ), - ); - } - ); + RaisedButton( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + ), + color: peacockBlue, + child: Container( + margin: EdgeInsets.only( + top: 12, + bottom: 20, + ), + child: Text( + 'ok', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + ), + onPressed: () { + Navigator.of(context).pop(); + }), + ], + ), + ); + }); }, ), ), ], ); - } catch(e) { + } catch (e) { print('$e, probably could not call createLocation(locationStringList)'); return Wrap( spacing: 20.0, @@ -170,7 +168,6 @@ class _LocationState extends State { ), ], ); - } } @@ -178,34 +175,36 @@ class _LocationState extends State { List stringList; try { stringList = mapLocation.split('\n'); - } catch(e) { - print('$e in source file location.dart._getlocationStringList::first_try'); + } catch (e) { + print( + '$e in source file location.dart._getlocationStringList::first_try'); } if (stringList.length < 2) { - return ['','pending...','']; + return ['', 'pending...', '']; } else { try { if (stringList[1].contains(stringList[0])) { stringList.removeAt(0); } - } catch(e) { - print('$e in source file location.dart._getlocationStringList::second_try'); + } catch (e) { + print( + '$e in source file location.dart._getlocationStringList::second_try'); } // split up long address lines on the second to last comma - for (int i=0; i 1) { String currentLine = stringList[i]; stringList.removeAt(i); int commaCount = 0; - for (int j=0; j { final dbHelper = DatabaseHelper.instance; static const platform = const MethodChannel('app.channel.shared.data'); // "static" variables are hard-coded into the class rather than instances - static RegExp gmapExp = RegExp(r'(https://maps.app.goo.gl/|https://maps.google.com/)(.*$)'); + static RegExp mapExp = RegExp( + r'(https://maps.app.goo.gl/|https://maps.google.com/|https?://mapq.st/)(.*$)'); String widgetMapLocation = "none"; String latnLong = "none"; String latnLongDMS = "none"; @@ -83,11 +84,10 @@ class _LatNLongState extends State { Widget _timezone() { return TimeZone( - parentAction: this._userTzOffset, - timeOffSet: this.timeOffSet, - timeOffSetTime: this.timeOffSetTime, - isAutoTimeOffSet: this.isAutoTimeOffSet - ); + parentAction: this._userTzOffset, + timeOffSet: this.timeOffSet, + timeOffSetTime: this.timeOffSetTime, + isAutoTimeOffSet: this.isAutoTimeOffSet); } InkWell _delete() { @@ -104,98 +104,97 @@ class _LatNLongState extends State { ), onTap: () { showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'Really?', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'Delete this location from', - textAlign: TextAlign.center, + title: Text( + 'Really?', + textAlign: TextAlign.center, + style: TextStyle( + color: candyApple, ), - Text( - 'the face of the earth forever?', - textAlign: TextAlign.center, - ), - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'Delete this location from', + textAlign: TextAlign.center, ), - child: Wrap( - runSpacing: 30, - children: [ - Container( - margin: EdgeInsets.symmetric( - horizontal: 15, - ), - child: ButtonTheme( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), + Text( + 'the face of the earth forever?', + textAlign: TextAlign.center, + ), + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, + ), + child: Wrap( + runSpacing: 30, + children: [ + Container( + margin: EdgeInsets.symmetric( + horizontal: 15, ), - height: 75, - child: RaisedButton( - color: peacockBlue, - child: Text( - "launch iCBMs!", - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () { - Navigator.of(context).pop(); - _deleteLocation(); - } - ), - ), - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 15, - ), - child: ButtonTheme( - height: 75, - child: RaisedButton( + child: ButtonTheme( shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), + borderRadius: + BorderRadius.all(Radius.circular(6.0)), ), - color: peacockBlue, - child: Text( - "oops! nvrmnd!", - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () { - Navigator.of(context).pop(); - } + height: 75, + child: RaisedButton( + color: peacockBlue, + child: Text( + "launch iCBMs!", + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () { + Navigator.of(context).pop(); + _deleteLocation(); + }), ), ), - ), - ], + Container( + margin: EdgeInsets.symmetric( + horizontal: 15, + ), + child: ButtonTheme( + height: 75, + child: RaisedButton( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + ), + color: peacockBlue, + child: Text( + "oops! nvrmnd!", + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () { + Navigator.of(context).pop(); + }), + ), + ), + ], + ), ), - ), - ], - ), - ); - } - ); + ], + ), + ); + }); }, ); } @@ -216,10 +215,13 @@ class _LatNLongState extends State { ), ], ), - onTap: () async{ + onTap: () async { String _noteText = await Navigator.push( context, - MaterialPageRoute(builder: (context) => EditNotes(mapLocation: this.widgetMapLocation,)), + MaterialPageRoute( + builder: (context) => EditNotes( + mapLocation: this.widgetMapLocation, + )), ); if ((_noteText != null) && (_noteText != this.notes)) { setState(() { @@ -229,37 +231,42 @@ class _LatNLongState extends State { }, ), ), - ((this.notes.length > 0) ? Expanded( - flex: 5, - child: Container( - decoration: BoxDecoration( - border: Border( - left: BorderSide( - width: 1.0, - color: Colors.black, - ), - ), - ), - child: InkWell( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.view_agenda, - size: 48.0, - color: Colors.black, + ((this.notes.length > 0) + ? Expanded( + flex: 5, + child: Container( + decoration: BoxDecoration( + border: Border( + left: BorderSide( + width: 1.0, + color: Colors.black, + ), + ), ), - ], - ), - onTap: () async{ - await Navigator.push( - context, - MaterialPageRoute(builder: (context) => RenderNotes(notes: this.notes,)), - ); - }, - ), - ), - ) : Container()), + child: InkWell( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.view_agenda, + size: 48.0, + color: Colors.black, + ), + ], + ), + onTap: () async { + await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => RenderNotes( + notes: this.notes, + )), + ); + }, + ), + ), + ) + : Container()), ], ); } @@ -268,7 +275,7 @@ class _LatNLongState extends State { if (_deviceShortestSide < 400) { return Container( child: Column( - children: [ + children: [ Container( margin: EdgeInsets.only( left: 6, @@ -278,7 +285,9 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: (this.latnLong != null) ? lnlDec(this.latnLong) : lnlDec('none') , + child: (this.latnLong != null) + ? lnlDec(this.latnLong) + : lnlDec('none'), ), IntrinsicHeight( child: Row( @@ -294,7 +303,9 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: (this.latnLongDMS != null) ? lnlDeg(this.latnLongDMS) : lnlDeg('none'), + child: (this.latnLongDMS != null) + ? lnlDeg(this.latnLongDMS) + : lnlDeg('none'), ), ), ], @@ -314,7 +325,7 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: _editNotes(), + child: _editNotes(), ), ), Expanded( @@ -328,7 +339,7 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: streetView(this.latnLong), + child: streetView(this.latnLong), ), ), ], @@ -370,23 +381,26 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: aboutApp(context), + child: aboutApp(context), ), ), - ((this._useElev) ? Expanded( - flex: 4, - child: Container( - margin: EdgeInsets.only( - left: 3, - top: 3, - right: 3, - bottom: 3, - ), - padding: myBoxPadding, - decoration: myBoxDecoration(ivory), - child: elevAtion(context, this.elevation, this.feetElevation), - ), - ) : Container()), + ((this._useElev) + ? Expanded( + flex: 4, + child: Container( + margin: EdgeInsets.only( + left: 3, + top: 3, + right: 3, + bottom: 3, + ), + padding: myBoxPadding, + decoration: myBoxDecoration(ivory), + child: elevAtion( + context, this.elevation, this.feetElevation), + ), + ) + : Container()), Expanded( flex: 3, child: Container( @@ -398,7 +412,7 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: _delete(), + child: _delete(), ), ), ], @@ -407,20 +421,22 @@ class _LatNLongState extends State { IntrinsicHeight( child: Row( children: [ - ((this._useWTHR) ? Expanded( - flex: 7, - child: Container( - margin: EdgeInsets.only( - left: 6, - top: 3, - right: 6, - bottom: 3, - ), - padding: myBoxPadding, - decoration: myBoxDecoration(ivory), - child: _timezone(), - ), - ) : Container()), + ((this._useWTHR) + ? Expanded( + flex: 7, + child: Container( + margin: EdgeInsets.only( + left: 6, + top: 3, + right: 6, + bottom: 3, + ), + padding: myBoxPadding, + decoration: myBoxDecoration(ivory), + child: _timezone(), + ), + ) + : Container()), ], ), ), @@ -430,7 +446,7 @@ class _LatNLongState extends State { } else if ((_deviceShortestSide >= 400) && (_deviceShortestSide < 650)) { return Container( child: Column( - children: [ + children: [ IntrinsicHeight( child: Row( children: [ @@ -445,7 +461,9 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: (this.latnLongDMS != null) ? lnlDeg(this.latnLongDMS) : lnlDeg('none'), + child: (this.latnLongDMS != null) + ? lnlDeg(this.latnLongDMS) + : lnlDeg('none'), ), ), Expanded( @@ -459,7 +477,7 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: _delete(), + child: _delete(), ), ), ], @@ -474,7 +492,9 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: (this.latnLong != null) ? lnlDec(this.latnLong) : lnlDec('none') , + child: (this.latnLong != null) + ? lnlDec(this.latnLong) + : lnlDec('none'), ), IntrinsicHeight( child: Row( @@ -490,7 +510,7 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: _editNotes(), + child: _editNotes(), ), ), Expanded( @@ -504,7 +524,7 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: streetView(this.latnLong), + child: streetView(this.latnLong), ), ), ], @@ -540,7 +560,7 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: aboutApp(context), + child: aboutApp(context), ), ), ], @@ -549,34 +569,39 @@ class _LatNLongState extends State { IntrinsicHeight( child: Row( children: [ - ((this._useElev) ? Expanded( - flex: 3, - child: Container( - margin: EdgeInsets.only( - left: 6, - top: 3, - right: (this._useWTHR) ? 3 : 6, - bottom: 3, - ), - padding: myBoxPadding, - decoration: myBoxDecoration(ivory), - child: elevAtion(context, this.elevation, this.feetElevation), - ), - ) : Container()), - ((this._useWTHR) ? Expanded( - flex: 7, - child: Container( - margin: EdgeInsets.only( - left: (this._useElev) ? 3 : 6, - top: 3, - right: 6, - bottom: 3, - ), - padding: myBoxPadding, - decoration: myBoxDecoration(ivory), - child: _timezone(), - ), - ) : Container()), + ((this._useElev) + ? Expanded( + flex: 3, + child: Container( + margin: EdgeInsets.only( + left: 6, + top: 3, + right: (this._useWTHR) ? 3 : 6, + bottom: 3, + ), + padding: myBoxPadding, + decoration: myBoxDecoration(ivory), + child: elevAtion( + context, this.elevation, this.feetElevation), + ), + ) + : Container()), + ((this._useWTHR) + ? Expanded( + flex: 7, + child: Container( + margin: EdgeInsets.only( + left: (this._useElev) ? 3 : 6, + top: 3, + right: 6, + bottom: 3, + ), + padding: myBoxPadding, + decoration: myBoxDecoration(ivory), + child: _timezone(), + ), + ) + : Container()), ], ), ), @@ -586,7 +611,7 @@ class _LatNLongState extends State { } else if (_deviceShortestSide >= 650) { return Container( child: Column( - children: [ + children: [ IntrinsicHeight( child: Row( children: [ @@ -601,21 +626,23 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: _editNotes(), + child: _editNotes(), ), ), Expanded( flex: 5, child: Container( margin: EdgeInsets.only( - left: 3, - top: 6, - right: 3, - bottom: 3, + left: 3, + top: 6, + right: 3, + bottom: 3, ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: (this.latnLong != null) ? lnlDec(this.latnLong) : lnlDec('none'), + child: (this.latnLong != null) + ? lnlDec(this.latnLong) + : lnlDec('none'), ), ), Expanded( @@ -629,7 +656,7 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: _delete(), + child: _delete(), ), ), ], @@ -642,14 +669,16 @@ class _LatNLongState extends State { flex: 5, child: Container( margin: EdgeInsets.only( - left: 6, - top: 3, - right: 3, - bottom: 3, + left: 6, + top: 3, + right: 3, + bottom: 3, ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: (this.latnLongDMS != null) ? lnlDeg(this.latnLongDMS) : lnlDeg('none'), + child: (this.latnLongDMS != null) + ? lnlDeg(this.latnLongDMS) + : lnlDeg('none'), ), ), Expanded( @@ -663,7 +692,7 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: streetView(this.latnLong), + child: streetView(this.latnLong), ), ), Expanded( @@ -677,7 +706,7 @@ class _LatNLongState extends State { ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: aboutApp(context), + child: aboutApp(context), ), ), ], @@ -690,10 +719,10 @@ class _LatNLongState extends State { flex: 4, child: Container( margin: EdgeInsets.only( - left: 6, - top: 3, - right: 3, - bottom: 3, + left: 6, + top: 3, + right: 3, + bottom: 3, ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), @@ -702,34 +731,39 @@ class _LatNLongState extends State { ), ), ), - ((this._useElev) ? Expanded( - flex: 2, - child: Container( - margin: EdgeInsets.only( - left: 3, - top: 3, - right: (this._useWTHR) ? 3 : 6, - bottom: 3, - ), - padding: myBoxPadding, - decoration: myBoxDecoration(ivory), - child: elevAtion(context, this.elevation, this.feetElevation), - ), - ) : Container()), - ((this._useWTHR) ? Expanded( - flex: 4, - child: Container( - margin: EdgeInsets.only( - left: 3, - top: 3, - right: 6, - bottom: 3, - ), - padding: myBoxPadding, - decoration: myBoxDecoration(ivory), - child: _timezone(), - ), - ) : Container()), + ((this._useElev) + ? Expanded( + flex: 2, + child: Container( + margin: EdgeInsets.only( + left: 3, + top: 3, + right: (this._useWTHR) ? 3 : 6, + bottom: 3, + ), + padding: myBoxPadding, + decoration: myBoxDecoration(ivory), + child: elevAtion( + context, this.elevation, this.feetElevation), + ), + ) + : Container()), + ((this._useWTHR) + ? Expanded( + flex: 4, + child: Container( + margin: EdgeInsets.only( + left: 3, + top: 3, + right: 6, + bottom: 3, + ), + padding: myBoxPadding, + decoration: myBoxDecoration(ivory), + child: _timezone(), + ), + ) + : Container()), ], ), ), @@ -751,7 +785,7 @@ class _LatNLongState extends State { leading: Builder( builder: (BuildContext context) { return IconButton( - icon: const Icon(Icons.settings), onPressed: _settings); + icon: const Icon(Icons.settings), onPressed: _settings); }, ), title: Text('Libre Gps Parser'), @@ -764,28 +798,32 @@ class _LatNLongState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ _top(), - ((this._useWTHR) ? Weather( - weatherLocationID: this.weatherLocationID, - weatherConditions: this.weatherConditions, - weatherConditionsIcon: this.weatherConditionsIcon, - weatherCurrentTemp: this.weatherCurrentTemp, - weatherCurrentPressure: this.weatherCurrentPressure, - weatherCurrentHumidity: this.weatherCurrentHumidity, - weatherCurrentTempMin: this.weatherCurrentTempMin, - weatherCurrentTempMax: this.weatherCurrentTempMax, - weatherCurrentVisibility: this.weatherCurrentVisibility, - weatherCurrentWindSpd: this.weatherCurrentWindSpd, - weatherCurrentWindDir: this.weatherCurrentWindDir, - weatherCurrentSunrise: this.weatherCurrentSunrise, - weatherCurrentSunset: this.weatherCurrentSunset, - weatherCurrentDT: this.weatherCurrentDT, - timeOffSet: this.timeOffSet, - parentAction: this._refreshWeather, - ) : Container()), - ((this._useWTHR) ? WeatherForeCast( - weatherForeCast: this.weatherForeCast, - timeOffSet: this.timeOffSet, - ) : Container()), + ((this._useWTHR) + ? Weather( + weatherLocationID: this.weatherLocationID, + weatherConditions: this.weatherConditions, + weatherConditionsIcon: this.weatherConditionsIcon, + weatherCurrentTemp: this.weatherCurrentTemp, + weatherCurrentPressure: this.weatherCurrentPressure, + weatherCurrentHumidity: this.weatherCurrentHumidity, + weatherCurrentTempMin: this.weatherCurrentTempMin, + weatherCurrentTempMax: this.weatherCurrentTempMax, + weatherCurrentVisibility: this.weatherCurrentVisibility, + weatherCurrentWindSpd: this.weatherCurrentWindSpd, + weatherCurrentWindDir: this.weatherCurrentWindDir, + weatherCurrentSunrise: this.weatherCurrentSunrise, + weatherCurrentSunset: this.weatherCurrentSunset, + weatherCurrentDT: this.weatherCurrentDT, + timeOffSet: this.timeOffSet, + parentAction: this._refreshWeather, + ) + : Container()), + ((this._useWTHR) + ? WeatherForeCast( + weatherForeCast: this.weatherForeCast, + timeOffSet: this.timeOffSet, + ) + : Container()), ], ), ), @@ -794,7 +832,7 @@ class _LatNLongState extends State { ); } - void _settings() async{ + void _settings() async { int newSetting = await Navigator.push( context, MaterialPageRoute(builder: (context) => Settings()), @@ -804,7 +842,7 @@ class _LatNLongState extends State { } } - void _pushSaved() async{ + void _pushSaved() async { List sortedMapLocations = await dbHelper.sortedMapLocations(); await Navigator.of(context).push( MaterialPageRoute( @@ -865,7 +903,7 @@ class _LatNLongState extends State { Future updateState() async { var sharedData = await platform.invokeMethod("getSharedText"); if (sharedData != null && sharedData is String) { - if (gmapExp.hasMatch(sharedData)) { + if (mapExp.hasMatch(sharedData)) { setState(() { this.widgetMapLocation = sharedData; }); @@ -883,7 +921,7 @@ class _LatNLongState extends State { await _populateNotes(sharedData); } - Future _populateNotes(String mapLocation) async{ + Future _populateNotes(String mapLocation) async { String _notes = await dbHelper.queryNotes(mapLocation); if ((_notes != null) || (_notes != this.notes)) { if ((mapLocation.contains('Plataea')) && (_notes.length == 0)) { @@ -910,7 +948,8 @@ class _LatNLongState extends State { Map weatherForeCastJson = jsonDecode(weatherForeCast); int _threeHoursAgo = (newTimeStamp() - 10800); if (weatherForeCastJson['list'][1]['dt'] < _threeHoursAgo) { - weatherForeCast = await getWeatherForeCast(mapLocation, latLong, true); + weatherForeCast = + await getWeatherForeCast(mapLocation, latLong, true); setState(() { this.weatherForeCast = weatherForeCast; }); @@ -919,12 +958,12 @@ class _LatNLongState extends State { } } - Future _refreshWeather() async{ - await _populateWeather(this.widgetMapLocation,this.latnLong); - await _populateWeatherForeCast(this.widgetMapLocation,this.latnLong); + Future _refreshWeather() async { + await _populateWeather(this.widgetMapLocation, this.latnLong); + await _populateWeatherForeCast(this.widgetMapLocation, this.latnLong); } - Future _populateWeather(String mapLocation, String latLong) async{ + Future _populateWeather(String mapLocation, String latLong) async { if ((this._useWTHR) && (latLong != null)) { String weather = await getWeather(mapLocation, latLong, false); if (weather == 'NA') { @@ -943,9 +982,12 @@ class _LatNLongState extends State { } } - Future _updateWeather(Map weatherJson,String latLong) async { + Future _updateWeather( + Map weatherJson, String latLong) async { if (this._useWTHR) { - int _weatherId = (weatherJson['id'] != 0) ? weatherJson['id']: generateFakeWeatherId(latLong); + int _weatherId = (weatherJson['id'] != 0) + ? weatherJson['id'] + : generateFakeWeatherId(latLong); if ((_weatherId != this.weatherLocationID) || (weatherJson['dt'] != this.weatherCurrentDT)) { double tempTemp = (weatherJson['main']['temp'] != null) @@ -1053,7 +1095,7 @@ class _LatNLongState extends State { } Future _updateLatNLong(int timeStamp, String mapLocation) async { - String mapUrl = gmapExp.stringMatch(mapLocation); + String mapUrl = mapExp.stringMatch(mapLocation); await parseMapUrl(mapUrl).then((String lattLong) { setState(() { this.latnLong = lattLong; @@ -1102,7 +1144,7 @@ class _LatNLongState extends State { } } - Future _deleteLocation() async{ + Future _deleteLocation() async { String _secondNewest = await dbHelper.querySecondNewestMapLocation(); if (_secondNewest != 'none') { String locationToBeDeleted = this.widgetMapLocation; @@ -1122,10 +1164,12 @@ class _LatNLongState extends State { } } - Future _userTzOffset(int offset) async{ + Future _userTzOffset(int offset) async { if (this._useWTHR) { - if (offset > 1999) { // 2001 is magic number for auto - List _timeOffSet = await refreshTimeOffSet(this.widgetMapLocation,this.latnLong); + if (offset > 1999) { + // 2001 is magic number for auto + List _timeOffSet = + await refreshTimeOffSet(this.widgetMapLocation, this.latnLong); setState(() { this.timeOffSet = _timeOffSet[0]; this.timeOffSetTime = _timeOffSet[1]; @@ -1151,7 +1195,7 @@ class _LatNLongState extends State { } } - Future _getUseElevPref() async{ + Future _getUseElevPref() async { bool _useElevation = await getPreferenceUseElevation(); if (_useElevation != _useElev) { setState(() { @@ -1161,7 +1205,7 @@ class _LatNLongState extends State { await _getUseWeatherPref(); } - Future _getUseWeatherPref() async{ + Future _getUseWeatherPref() async { bool _useWeather = await getPreferenceUseWeather(); if (_useWeather != _useWTHR) { setState(() { diff --git a/lib/render_notes.dart b/lib/render_notes.dart index da9f68a..7eaf703 100644 --- a/lib/render_notes.dart +++ b/lib/render_notes.dart @@ -44,7 +44,7 @@ class _RenderNotesState extends State { SliverToBoxAdapter( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ + children: [ Container( margin: EdgeInsets.symmetric( horizontal: 10.0, @@ -54,7 +54,7 @@ class _RenderNotesState extends State { ), ), Row( - children: [ + children: [ Expanded( child: Container(), ), @@ -63,225 +63,280 @@ class _RenderNotesState extends State { child: ButtonTheme( height: 55, padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 - ), + top: 5, right: 12, bottom: 12, left: 10), child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'Export', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), ), - ), - onPressed: () async{ - Map _storagePermissions; - PermissionStatus _storagePermission = await PermissionHandler().checkPermissionStatus(PermissionGroup.storage); - if (_storagePermission == PermissionStatus.denied) { - _storagePermissions = await PermissionHandler().requestPermissions([PermissionGroup.storage]); - } - if ((_storagePermission == PermissionStatus.granted) || (_storagePermissions.toString() == PermissionStatus.granted.toString())) { - Directory sdcard = await getExternalStorageDirectory(); - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'File Name To Save As?', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, - ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextField( - controller: _textEditingController, - keyboardType: TextInputType.multiline, - maxLines: null, - decoration: InputDecoration( - hintText: 'i.e. timbuktu.md', - ), - onChanged: (text) { - _exportFileNameString = text; - }, + color: peacockBlue, + child: Text( + 'Export', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () async { + Map + _storagePermissions; + PermissionStatus _storagePermission = + await PermissionHandler() + .checkPermissionStatus( + PermissionGroup.storage); + if (_storagePermission == + PermissionStatus.denied) { + _storagePermissions = await PermissionHandler() + .requestPermissions( + [PermissionGroup.storage]); + } + if ((_storagePermission == + PermissionStatus.granted) || + (_storagePermissions.toString() == + PermissionStatus.granted.toString())) { + Directory sdcard = + await getExternalStorageDirectory(); + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), ), - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, - ), - child: ButtonTheme( - height: 55, - padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 - ), - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'Export', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () async{ - if (this._exportFileNameString.length > 0) { - String _fileName = '${sdcard.path}/${this._exportFileNameString}'; - File _file = File(_fileName); - File _result = await _file.writeAsString(widget.notes); - Navigator.of(context).pop(); - if (_result == null) { - setState(() { - this.fileName = _fileName; - }); - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'Writing To\n\'$fileName\'\n(sdcard) Failed!', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, - ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, - ), - child: ButtonTheme( - height: 55, - padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 - ), - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'OK', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () async{ - Navigator.of(context).pop(); - } - ), - ), - ), - ], - ), - ); - } - ); - } else { - setState(() { - this.fileName = _fileName; - }); - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'Writing To\n\'$fileName\'\n(sdcard) Succeeded!', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, - ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, - ), - child: ButtonTheme( - height: 55, - padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 - ), - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'OK', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () async{ - Navigator.of(context).pop(); - } - ), - ), - ), - ], - ), - ); - } - ); - } - } - } - ), + title: Text( + 'File Name To Save As?', + textAlign: TextAlign.center, + style: TextStyle( + color: candyApple, ), ), - ], - ), - ); - } - ); - } - } - ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextField( + controller: + _textEditingController, + keyboardType: + TextInputType.multiline, + maxLines: null, + decoration: InputDecoration( + hintText: 'i.e. timbuktu.md', + ), + onChanged: (text) { + _exportFileNameString = text; + }, + ), + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, + ), + child: ButtonTheme( + height: 55, + padding: EdgeInsets.only( + top: 5, + right: 12, + bottom: 12, + left: 10), + child: RaisedButton( + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius.all( + Radius.circular( + 6.0)), + ), + color: peacockBlue, + child: Text( + 'Export', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () async { + if (this + ._exportFileNameString + .length > + 0) { + String _fileName = + '${sdcard.path}/${this._exportFileNameString}'; + File _file = + File(_fileName); + File _result = + await _file + .writeAsString( + widget + .notes); + Navigator.of(context) + .pop(); + if (_result == null) { + setState(() { + this.fileName = + _fileName; + }); + showDialog( + context: context, + builder: + (BuildContext + context) { + return AlertDialog( + backgroundColor: + ivory, + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius.all( + Radius.circular(6.0)), + ), + title: Text( + 'Writing To\n\'$fileName\'\n(sdcard) Failed!', + textAlign: + TextAlign + .center, + style: + TextStyle( + color: + candyApple, + ), + ), + content: + Column( + mainAxisSize: + MainAxisSize + .min, + children: < + Widget>[ + Container( + margin: + EdgeInsets.only( + top: + 40, + bottom: + 10, + ), + child: + ButtonTheme( + height: + 55, + padding: EdgeInsets.only( + top: 5, + right: 12, + bottom: 12, + left: 10), + child: RaisedButton( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), + ), + color: peacockBlue, + child: Text( + 'OK', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () async { + Navigator.of(context).pop(); + }), + ), + ), + ], + ), + ); + }); + } else { + setState(() { + this.fileName = + _fileName; + }); + showDialog( + context: context, + builder: + (BuildContext + context) { + return AlertDialog( + backgroundColor: + ivory, + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius.all( + Radius.circular(6.0)), + ), + title: Text( + 'Writing To\n\'$fileName\'\n(sdcard) Succeeded!', + textAlign: + TextAlign + .center, + style: + TextStyle( + color: + candyApple, + ), + ), + content: + Column( + mainAxisSize: + MainAxisSize + .min, + children: < + Widget>[ + Container( + margin: + EdgeInsets.only( + top: + 40, + bottom: + 10, + ), + child: + ButtonTheme( + height: + 55, + padding: EdgeInsets.only( + top: 5, + right: 12, + bottom: 12, + left: 10), + child: RaisedButton( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), + ), + color: peacockBlue, + child: Text( + 'OK', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () async { + Navigator.of(context).pop(); + }), + ), + ), + ], + ), + ); + }); + } + } + }), + ), + ), + ], + ), + ); + }); + } + }), ), ), ], diff --git a/lib/settings.dart b/lib/settings.dart index 1b87ce5..3123ab8 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -32,391 +32,407 @@ class _SettingsState extends State { @override Widget build(BuildContext context) { - - Future _showDBImportDialog() async{ + Future _showDBImportDialog() async { Map _storagePermissions; - PermissionStatus _storagePermission = await PermissionHandler().checkPermissionStatus(PermissionGroup.storage); + PermissionStatus _storagePermission = await PermissionHandler() + .checkPermissionStatus(PermissionGroup.storage); if (_storagePermission == PermissionStatus.denied) { - _storagePermissions = await PermissionHandler().requestPermissions([PermissionGroup.storage]); + _storagePermissions = await PermissionHandler() + .requestPermissions([PermissionGroup.storage]); } - if ((_storagePermission == PermissionStatus.granted) || (_storagePermissions.toString() == PermissionStatus.granted.toString())) { + if ((_storagePermission == PermissionStatus.granted) || + (_storagePermissions.toString() == + PermissionStatus.granted.toString())) { showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'You can import a\njson backup of\nyour database', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, - ), - child: ButtonTheme( - height: 55, - padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 + title: Text( + 'You can import a\njson backup of\nyour database', + textAlign: TextAlign.center, + style: TextStyle( + color: candyApple, + ), + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, ), - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'Select File', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () async{ - String _filePath; - _filePath = await FilePicker.getFilePath(type: FileType.ANY); - Navigator.of(context).pop(); - try { - String _importString = await File(_filePath).readAsString(); - bool _imported = await importDataBase(_importString); - if (_imported) { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'Importing From\n\'$_filePath\'\n Succeeded!', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, - ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, + child: ButtonTheme( + height: 55, + padding: EdgeInsets.only( + top: 5, right: 12, bottom: 12, left: 10), + child: RaisedButton( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + ), + color: peacockBlue, + child: Text( + 'Select File', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () async { + String _filePath; + _filePath = await FilePicker.getFilePath( + type: FileType.ANY); + Navigator.of(context).pop(); + try { + String _importString = + await File(_filePath).readAsString(); + bool _imported = + await importDataBase(_importString); + if (_imported) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), ), - child: ButtonTheme( - height: 55, - padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 + title: Text( + 'Importing From\n\'$_filePath\'\n Succeeded!', + textAlign: TextAlign.center, + style: TextStyle( + color: candyApple, ), - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'OK', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, + ), + child: ButtonTheme( + height: 55, + padding: EdgeInsets.only( + top: 5, + right: 12, + bottom: 12, + left: 10), + child: RaisedButton( + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius.all( + Radius.circular( + 6.0)), + ), + color: peacockBlue, + child: Text( + 'OK', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () async { + Navigator.of(context) + .pop(); + }), ), ), - onPressed: () async{ - Navigator.of(context).pop(); - } - ), + ], ), - ), - ], - ), - ); + ); + }); } - ); - } - } catch(e) { - print(e); - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'Oops, something went wrong', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, - ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, + } catch (e) { + print(e); + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), ), - child: ButtonTheme( - height: 55, - padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 + title: Text( + 'Oops, something went wrong', + textAlign: TextAlign.center, + style: TextStyle( + color: candyApple, ), - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'OK', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, + ), + child: ButtonTheme( + height: 55, + padding: EdgeInsets.only( + top: 5, + right: 12, + bottom: 12, + left: 10), + child: RaisedButton( + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius.all( + Radius.circular( + 6.0)), + ), + color: peacockBlue, + child: Text( + 'OK', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () async { + Navigator.of(context) + .pop(); + }), ), ), - onPressed: () async{ - Navigator.of(context).pop(); - } - ), + ], ), - ), - ], - ), - ); + ); + }); } - ); - } - } + }), ), ), - ), - ], - ), - ); - } - ); + ], + ), + ); + }); } } - Future _showDBExportDialog() async{ + Future _showDBExportDialog() async { Map _storagePermissions; - PermissionStatus _storagePermission = await PermissionHandler().checkPermissionStatus(PermissionGroup.storage); + PermissionStatus _storagePermission = await PermissionHandler() + .checkPermissionStatus(PermissionGroup.storage); if (_storagePermission == PermissionStatus.denied) { - _storagePermissions = await PermissionHandler().requestPermissions([PermissionGroup.storage]); + _storagePermissions = await PermissionHandler() + .requestPermissions([PermissionGroup.storage]); } - if ((_storagePermission == PermissionStatus.granted) || (_storagePermissions.toString() == PermissionStatus.granted.toString())) { + if ((_storagePermission == PermissionStatus.granted) || + (_storagePermissions.toString() == + PermissionStatus.granted.toString())) { Directory sdcard = await getExternalStorageDirectory(); showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'Export File Name?', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'DataBase will be\nexported to json file.', - style: TextStyle( - fontSize: 16, - ), + title: Text( + 'Export File Name?', + textAlign: TextAlign.center, + style: TextStyle( + color: candyApple, ), - TextField( - controller: _dbExportFileNameController, - keyboardType: TextInputType.multiline, - maxLines: null, - decoration: InputDecoration( - hintText: this._dbExportFileNameString, - ), - onChanged: (text) { - this._dbExportFileNameString = (text.length > 0) ? text : "libre_gps_parser.json"; - }, - ), - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, - ), - child: ButtonTheme( - height: 55, - padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 - ), - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'Export', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () async{ - _updatedbExportFileName(); - final dbHelper = DatabaseHelper.instance; - String _dbExportString = await dbHelper.queryDBExport(); - String _absoluteDBExportFileName = '${sdcard.path}/${this._dbExportFileNameString}'; - File _file = File(_absoluteDBExportFileName); - File _result = await _file.writeAsString(_dbExportString); - Navigator.of(context).pop(); - if (_result == null) { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'Writing To\n\'$_absoluteDBExportFileName\'\n(sdcard) Failed!', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, - ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, - ), - child: ButtonTheme( - height: 55, - padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 - ), - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'OK', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () async{ - Navigator.of(context).pop(); - } - ), - ), - ), - ], - ), - ); - } - ); - } else { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - title: Text( - 'Writing To\n\'$_absoluteDBExportFileName\'\n(sdcard) Succeeded!', - textAlign: TextAlign.center, - style: TextStyle( - color: candyApple, - ), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, - ), - child: ButtonTheme( - height: 55, - padding: EdgeInsets.only( - top: 5, - right: 12, - bottom: 12, - left: 10 - ), - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - color: peacockBlue, - child: Text( - 'OK', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, - ), - ), - onPressed: () async{ - Navigator.of(context).pop(); - } - ), - ), - ), - ], - ), - ); - } - ); - } - } + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'DataBase will be\nexported to json file.', + style: TextStyle( + fontSize: 16, ), ), - ), - ], - ), - ); - } - ); + TextField( + controller: _dbExportFileNameController, + keyboardType: TextInputType.multiline, + maxLines: null, + decoration: InputDecoration( + hintText: this._dbExportFileNameString, + ), + onChanged: (text) { + this._dbExportFileNameString = + (text.length > 0) ? text : "libre_gps_parser.json"; + }, + ), + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, + ), + child: ButtonTheme( + height: 55, + padding: EdgeInsets.only( + top: 5, right: 12, bottom: 12, left: 10), + child: RaisedButton( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + ), + color: peacockBlue, + child: Text( + 'Export', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () async { + _updatedbExportFileName(); + final dbHelper = DatabaseHelper.instance; + String _dbExportString = + await dbHelper.queryDBExport(); + String _absoluteDBExportFileName = + '${sdcard.path}/${this._dbExportFileNameString}'; + File _file = File(_absoluteDBExportFileName); + File _result = + await _file.writeAsString(_dbExportString); + Navigator.of(context).pop(); + if (_result == null) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + ), + title: Text( + 'Writing To\n\'$_absoluteDBExportFileName\'\n(sdcard) Failed!', + textAlign: TextAlign.center, + style: TextStyle( + color: candyApple, + ), + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, + ), + child: ButtonTheme( + height: 55, + padding: EdgeInsets.only( + top: 5, + right: 12, + bottom: 12, + left: 10), + child: RaisedButton( + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius.all( + Radius.circular( + 6.0)), + ), + color: peacockBlue, + child: Text( + 'OK', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () async { + Navigator.of(context) + .pop(); + }), + ), + ), + ], + ), + ); + }); + } else { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + ), + title: Text( + 'Writing To\n\'$_absoluteDBExportFileName\'\n(sdcard) Succeeded!', + textAlign: TextAlign.center, + style: TextStyle( + color: candyApple, + ), + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, + ), + child: ButtonTheme( + height: 55, + padding: EdgeInsets.only( + top: 5, + right: 12, + bottom: 12, + left: 10), + child: RaisedButton( + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius.all( + Radius.circular( + 6.0)), + ), + color: peacockBlue, + child: Text( + 'OK', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + onPressed: () async { + Navigator.of(context) + .pop(); + }), + ), + ), + ], + ), + ); + }); + } + }), + ), + ), + ], + ), + ); + }); } } @@ -450,7 +466,8 @@ class _SettingsState extends State { child: Switch( value: this._useElevation, onChanged: (value) { - setPreferenceUseElevation(value).then((bool committed) { + setPreferenceUseElevation(value) + .then((bool committed) { setState(() { this._useElevation = value; }); @@ -465,45 +482,47 @@ class _SettingsState extends State { ], ), ), - ((this._useElevation) ? Container( - padding: myBoxPadding, - decoration: myBoxDecoration(ivory), - child: Column( - children: [ - Text( - 'Open-Elevation Api Server to Use', - ), - Text( - 'Current Value: ${this.elevationServer}', - ), - TextField( - controller: _elevationServerController, - decoration: InputDecoration( - hintText: this.elevationServer, + ((this._useElevation) + ? Container( + padding: myBoxPadding, + decoration: myBoxDecoration(ivory), + child: Column( + children: [ + Text( + 'Open-Elevation Api Server to Use', + ), + Text( + 'Current Value: ${this.elevationServer}', + ), + TextField( + controller: _elevationServerController, + decoration: InputDecoration( + hintText: this.elevationServer, + ), + ), + Container( + margin: EdgeInsets.only( + top: 20.0, + bottom: 5.0, + ), + child: RaisedButton.icon( + label: Text( + "Update Elevation Server", + ), + icon: Icon( + Icons.refresh, + size: 50.0, + ), + color: candyApple, + onPressed: () { + _updateElevationServer(); + }, + ), + ), + ], ), - ), - Container( - margin: EdgeInsets.only( - top: 20.0, - bottom: 5.0, - ), - child: RaisedButton.icon( - label: Text( - "Update Elevation Server", - ), - icon: Icon( - Icons.refresh, - size: 50.0, - ), - color: candyApple, - onPressed: () { - _updateElevationServer(); - }, - ), - ), - ], - ), - ) : Container()), + ) + : Container()), Container( padding: myBoxPadding, decoration: myBoxDecoration(ivory), @@ -540,138 +559,140 @@ class _SettingsState extends State { ], ), ), - ((this._useWeather) ? Container( + ((this._useWeather) + ? Container( + padding: myBoxPadding, + decoration: myBoxDecoration(ivory), + child: Column( + children: [ + Text( + 'Open Weather Map Api Key to Use', + ), + Text( + 'Current Value: ${this.shortOWMAK}...', + ), + TextField( + controller: _oWMKController, + decoration: InputDecoration( + hintText: '${this.shortOWMAK}...', + ), + ), + Container( + margin: EdgeInsets.only( + top: 20.0, + bottom: 5.0, + ), + child: RaisedButton.icon( + label: Text( + "Update ... Api Key", + ), + icon: Icon( + Icons.refresh, + size: 50.0, + ), + color: candyApple, + onPressed: () { + _updateOpenWeatherMapApiKey(); + }, + ), + ), + ], + ), + ) + : Container()), + Container( padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: Column( + child: Row( children: [ - Text( - 'Open Weather Map Api Key to Use', - ), - Text( - 'Current Value: ${this.shortOWMAK}...', - ), - TextField( - controller: _oWMKController, - decoration: InputDecoration( - hintText: '${this.shortOWMAK}...', - ), - ), - Container( - margin: EdgeInsets.only( - top: 20.0, - bottom: 5.0, - ), - child: RaisedButton.icon( - label: Text( - "Update ... Api Key", - ), + Expanded( + flex: 2, + child: IconButton( + alignment: Alignment.center, icon: Icon( - Icons.refresh, - size: 50.0, + Icons.arrow_back, + color: candyApple, ), - color: candyApple, + iconSize: 60.0, onPressed: () { - _updateOpenWeatherMapApiKey(); + _showDBExportDialog(); + }, + ), + ), + Expanded( + flex: 6, + child: Text( + 'Export DataBase', + textAlign: TextAlign.center, + style: TextStyle( + height: textHeight, + fontSize: 20, + ), + ), + ), + Expanded( + flex: 2, + child: IconButton( + alignment: Alignment.center, + icon: Icon( + Icons.arrow_forward, + color: candyApple, + ), + iconSize: 60.0, + onPressed: () { + _showDBExportDialog(); }, ), ), ], ), - ) : Container()), - Container( - padding: myBoxPadding, - decoration: myBoxDecoration(ivory), - child: Row( - children: [ - Expanded( - flex: 2, - child: IconButton( - alignment: Alignment.center, - icon: Icon( - Icons.arrow_back, - color: candyApple, - ), - iconSize: 60.0, - onPressed: () { - _showDBExportDialog(); - }, - ), - ), - Expanded( - flex: 6, - child: Text( - 'Export DataBase', - textAlign: TextAlign.center, - style: TextStyle( - height: textHeight, - fontSize: 20, - ), - ), - ), - Expanded( - flex: 2, - child: IconButton( - alignment: Alignment.center, - icon: Icon( - Icons.arrow_forward, - color: candyApple, - ), - iconSize: 60.0, - onPressed: () { - _showDBExportDialog(); - }, - ), - ), - ], - ), ), Container( padding: myBoxPadding, decoration: myBoxDecoration(ivory), - child: Row( - children: [ - Expanded( - flex: 2, - child: IconButton( - alignment: Alignment.center, - icon: Icon( - Icons.arrow_forward, - color: candyApple, - ), - iconSize: 60.0, - onPressed: () { - _showDBImportDialog(); - }, + child: Row( + children: [ + Expanded( + flex: 2, + child: IconButton( + alignment: Alignment.center, + icon: Icon( + Icons.arrow_forward, + color: candyApple, + ), + iconSize: 60.0, + onPressed: () { + _showDBImportDialog(); + }, + ), + ), + Expanded( + flex: 6, + child: Text( + 'Import DataBase', + textAlign: TextAlign.center, + style: TextStyle( + height: textHeight, + fontSize: 20, ), ), - Expanded( - flex: 6, - child: Text( - 'Import DataBase', - textAlign: TextAlign.center, - style: TextStyle( - height: textHeight, - fontSize: 20, - ), + ), + Expanded( + flex: 2, + child: IconButton( + alignment: Alignment.center, + icon: Icon( + Icons.arrow_back, + color: candyApple, ), + iconSize: 60.0, + onPressed: () { + _showDBImportDialog(); + }, ), - Expanded( - flex: 2, - child: IconButton( - alignment: Alignment.center, - icon: Icon( - Icons.arrow_back, - color: candyApple, - ), - iconSize: 60.0, - onPressed: () { - _showDBImportDialog(); - }, - ), - ), - ], - ), + ), + ], + ), ), ], ), @@ -738,5 +759,4 @@ class _SettingsState extends State { Navigator.pop(context, 3); return Future.value(false); } - } diff --git a/lib/street_view.dart b/lib/street_view.dart index 597b498..a189251 100644 --- a/lib/street_view.dart +++ b/lib/street_view.dart @@ -8,9 +8,9 @@ InkWell streetView(String latnLong) { return InkWell( onTap: () { AndroidIntent _intent = AndroidIntent( - action: 'action_view', - data: Uri.encodeFull('google.streetview:cbll=$latnLong'), - package: 'com.google.android.apps.maps'); + action: 'action_view', + data: Uri.encodeFull('google.streetview:cbll=$latnLong'), + package: 'com.google.android.apps.maps'); _intent.launch(); }, child: Row( diff --git a/lib/timezone.dart b/lib/timezone.dart index 1d1d8c3..8af2e42 100644 --- a/lib/timezone.dart +++ b/lib/timezone.dart @@ -34,103 +34,111 @@ class _TimeZoneState extends State { final double textHeight = 1.5; return Row( - children: [ + children: [ Expanded( flex: 7, child: InkWell( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'Time Offset:', - style: TextStyle( - height: textHeight, - color: candyApple, - fontSize: 16, - ), - ), - RichText( - text: TextSpan( - children: [ - TextSpan( - text: (widget.timeOffSet != 2000) ? '$offSet' : 'INVALID', - style: TextStyle( - height: textHeight, - color: Colors.black, - fontSize: 16, - ), - ), - TextSpan( - text: (widget.timeOffSet != 2000) ? ' minutes, ' : '', - style: TextStyle( - height: textHeight, - color: Colors.black, - fontSize: 16, - fontStyle: FontStyle.italic, - ), - ), - ], - ), - ), - RichText( - text: TextSpan( - children: [ - TextSpan( - text: (widget.isAutoTimeOffSet == 1) ? 'as of' : 'MANUAL SETTING', - style: TextStyle( - height: textHeight, - color: candyApple, - fontSize: 16, - ), - ), - TextSpan( - text: (widget.isAutoTimeOffSet == 1) ? ' $elapsedHours' : '', - style: TextStyle( - height: textHeight, - color: Colors.black, - fontSize: 16, - ), - ), - TextSpan( - text: (widget.isAutoTimeOffSet == 1) ? ' hrs' : '', - style: TextStyle( - height: textHeight, - color: Colors.black, - fontSize: 16, - fontStyle: FontStyle.italic, - ), - ), - TextSpan( - text: (widget.isAutoTimeOffSet == 1) ? ' ago' : '', - style: TextStyle( - height: textHeight, - color: Colors.black, - fontSize: 16, - ), - ), - ], - ), - ), - ], - ), - onTap: () { - showDialog( - context: context, - builder: (BuildContext context) { - final FixedExtentScrollController scrollController = - FixedExtentScrollController(initialItem: _getTimeZoneListIndex()); - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Time Offset:', + style: TextStyle( + height: textHeight, + color: candyApple, + fontSize: 16, ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ + ), + RichText( + text: TextSpan( + children: [ + TextSpan( + text: (widget.timeOffSet != 2000) + ? '$offSet' + : 'INVALID', + style: TextStyle( + height: textHeight, + color: Colors.black, + fontSize: 16, + ), + ), + TextSpan( + text: (widget.timeOffSet != 2000) ? ' minutes, ' : '', + style: TextStyle( + height: textHeight, + color: Colors.black, + fontSize: 16, + fontStyle: FontStyle.italic, + ), + ), + ], + ), + ), + RichText( + text: TextSpan( + children: [ + TextSpan( + text: (widget.isAutoTimeOffSet == 1) + ? 'as of' + : 'MANUAL SETTING', + style: TextStyle( + height: textHeight, + color: candyApple, + fontSize: 16, + ), + ), + TextSpan( + text: (widget.isAutoTimeOffSet == 1) + ? ' $elapsedHours' + : '', + style: TextStyle( + height: textHeight, + color: Colors.black, + fontSize: 16, + ), + ), + TextSpan( + text: (widget.isAutoTimeOffSet == 1) ? ' hrs' : '', + style: TextStyle( + height: textHeight, + color: Colors.black, + fontSize: 16, + fontStyle: FontStyle.italic, + ), + ), + TextSpan( + text: (widget.isAutoTimeOffSet == 1) ? ' ago' : '', + style: TextStyle( + height: textHeight, + color: Colors.black, + fontSize: 16, + ), + ), + ], + ), + ), + ], + ), + onTap: () { + showDialog( + context: context, + builder: (BuildContext context) { + final FixedExtentScrollController scrollController = + FixedExtentScrollController( + initialItem: _getTimeZoneListIndex()); + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), + ), + content: + Column(mainAxisSize: MainAxisSize.min, children: < + Widget>[ ButtonTheme( height: 75, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), + borderRadius: + BorderRadius.all(Radius.circular(6.0)), ), child: RaisedButton( onPressed: () { @@ -180,7 +188,8 @@ class _TimeZoneState extends State { }); } }, - children: List.generate(timeZoneList.length, (int index) { + children: List.generate(timeZoneList.length, + (int index) { return Column( children: [ Container( @@ -188,21 +197,25 @@ class _TimeZoneState extends State { color: ivory, ), Container( - alignment: Alignment(0.0,0.0), + alignment: Alignment(0.0, 0.0), height: 80, - width: (MediaQuery.of(context).size.width * .9), + width: (MediaQuery.of(context).size.width * + .9), decoration: BoxDecoration( color: peacockBlue, border: Border.all( width: 2.0, ), - borderRadius: BorderRadius.all(Radius.circular(6.0)), + borderRadius: BorderRadius.all( + Radius.circular(6.0)), ), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, children: [ Text( - _parseTimeZoneOffSet(timeZoneList[index]['offset']), + _parseTimeZoneOffSet( + timeZoneList[index]['offset']), style: TextStyle( height: textHeight, color: Colors.white, @@ -221,7 +234,7 @@ class _TimeZoneState extends State { ), ), Container( - height: 10, + height: 10, color: ivory, ), ], @@ -229,13 +242,11 @@ class _TimeZoneState extends State { }), ), ), - ] - ), - ); - }, - ); - } - ), + ]), + ); + }, + ); + }), ), Expanded( flex: 3, @@ -261,102 +272,104 @@ class _TimeZoneState extends State { */ onTap: () { showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: ivory, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), - ), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'The timezone offset should be set and refreshed automatically, ' - 'by querying an api from teleport. However, because the api is ' - 'free, the query is only refreshed once a week.\n' - 'Additionally, in some cases the result is invalid. Tap the ' - 'left side of TimeZone Widget to manually set the timezone offset.', - textAlign: TextAlign.center, - ), - Container( - margin: EdgeInsets.only( - top: 40, - bottom: 10, + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: ivory, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(6.0)), + ), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'The timezone offset should be set and refreshed automatically, ' + 'by querying an api from teleport. However, because the api is ' + 'free, the query is only refreshed once a week.\n' + 'Additionally, in some cases the result is invalid. Tap the ' + 'left side of TimeZone Widget to manually set the timezone offset.', + textAlign: TextAlign.center, ), - child: ButtonTheme( - height: 75, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(6.0)), + Container( + margin: EdgeInsets.only( + top: 40, + bottom: 10, ), - child: RaisedButton( - color: peacockBlue, - child: Column( - children: [ - Container( - width: 150, - margin: EdgeInsets.only( - top: 10, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Text( - 'List', + child: ButtonTheme( + height: 75, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + ), + child: RaisedButton( + color: peacockBlue, + child: Column( + children: [ + Container( + width: 150, + margin: EdgeInsets.only( + top: 10, + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + children: [ + Text( + 'List', + style: TextStyle( + height: textHeight, + color: Colors.white, + fontSize: 24, + ), + ), + Icon( + Icons.open_in_browser, + size: 48, + color: Colors.white, + ), + ], + ), + ), + Container( + margin: EdgeInsets.only( + bottom: 15, + ), + child: Text( + 'Of TimeZones', style: TextStyle( height: textHeight, color: Colors.white, fontSize: 24, ), ), - Icon( - Icons.open_in_browser, - size: 48, - color: Colors.white, - ), - ], - ), - ), - Container( - margin: EdgeInsets.only( - bottom: 15, - ), - child: Text( - 'Of TimeZones', - style: TextStyle( - height: textHeight, - color: Colors.white, - fontSize: 24, ), - ), + ], ), - ], - ), - onPressed: () { - Navigator.of(context).pop(); - urlLaunch('https://en.wikipedia.org/wiki/List_of_time_zone_abbreviations'); - } + onPressed: () { + Navigator.of(context).pop(); + urlLaunch( + 'https://en.wikipedia.org/wiki/List_of_time_zone_abbreviations'); + }), ), ), - ), - ], - ), - ); - } - ); + ], + ), + ); + }); }, ), ), ), ], ); - } int _getTimeZoneListIndex() { // 2001 is a magic number which means auto // as in the tz offset is automatically set - return timeZoneList.indexOf(timeZoneList.singleWhere((timeZone) => timeZone['offset'] == ((widget.isAutoTimeOffSet == 1) ? 2001 : widget.timeOffSet))); + return timeZoneList.indexOf(timeZoneList.singleWhere((timeZone) => + timeZone['offset'] == + ((widget.isAutoTimeOffSet == 1) ? 2001 : widget.timeOffSet))); } String _parseTimeZoneOffSet(int offset) { diff --git a/lib/timezones.dart b/lib/timezones.dart index 7b399aa..2ed692c 100644 --- a/lib/timezones.dart +++ b/lib/timezones.dart @@ -1,48 +1,46 @@ // https://en.wikipedia.org/wiki/List_of_time_zone_abbreviations final List> timeZoneList = [ - - { 'offset' : -720, 'tz' : 'BIT, IDLW' }, - { 'offset' : -660, 'tz' : 'NUT, SST' }, - { 'offset' : -600, 'tz' : 'HST, TAHT' }, - { 'offset' : -570, 'tz' : 'MART, MIT' }, - { 'offset' : -540, 'tz' : 'AKST, HDT' }, - { 'offset' : -480, 'tz' : 'AKDT, PST' }, - { 'offset' : -420, 'tz' : 'MST, PDT' }, - { 'offset' : -360, 'tz' : 'CST, GALT' }, - { 'offset' : -300, 'tz' : 'EST, PET' }, - { 'offset' : -240, 'tz' : 'AMT, AST' }, - { 'offset' : -210, 'tz' : 'NST, NT' }, - { 'offset' : -180, 'tz' : 'ADT, FKST' }, - { 'offset' : -150, 'tz' : 'NDT' }, - { 'offset' : -120, 'tz' : 'GST, UYST' }, - { 'offset' : -60, 'tz' : 'CVT, EGT' }, - { 'offset' : 0, 'tz' : 'GMT, UTC' }, - { 'offset' : 60, 'tz' : 'CET, BST' }, - { 'offset' : 120, 'tz' : 'EET, CEST' }, - { 'offset' : 180, 'tz' : 'FET, EEST' }, - { 'offset' : 210, 'tz' : 'IRST' }, - { 'offset' : 240, 'tz' : 'AMT, VOLT' }, - { 'offset' : 270, 'tz' : 'AFT, IRDT' }, - { 'offset' : 300, 'tz' : 'PKT, TFT' }, - { 'offset' : 330, 'tz' : 'IST, SLST' }, - { 'offset' : 345, 'tz' : 'NPT' }, - { 'offset' : 360, 'tz' : 'BST, VOST' }, - { 'offset' : 390, 'tz' : 'CCT, MMT' }, - { 'offset' : 420, 'tz' : 'CXT, THA' }, - { 'offset' : 480, 'tz' : 'AWST, HKT' }, - { 'offset' : 525, 'tz' : 'ACWST' }, - { 'offset' : 540, 'tz' : 'JST, YAKT' }, - { 'offset' : 570, 'tz' : 'ACST' }, - { 'offset' : 600, 'tz' : 'AEST, VLAT' }, - { 'offset' : 630, 'tz' : 'ACDT, LHST' }, - { 'offset' : 660, 'tz' : 'AEDT, VUT' }, - { 'offset' : 720, 'tz' : 'NZST, WAKT' }, - { 'offset' : 765, 'tz' : 'CHAST' }, - { 'offset' : 780, 'tz' : 'NZDT, TOT' }, - { 'offset' : 825, 'tz' : 'CHADT' }, - { 'offset' : 840, 'tz' : 'LINT' }, - { 'offset' : 2000, 'tz' : 'INVLD' }, - { 'offset' : 2001, 'tz' : 'AUTO' }, - + {'offset': -720, 'tz': 'BIT, IDLW'}, + {'offset': -660, 'tz': 'NUT, SST'}, + {'offset': -600, 'tz': 'HST, TAHT'}, + {'offset': -570, 'tz': 'MART, MIT'}, + {'offset': -540, 'tz': 'AKST, HDT'}, + {'offset': -480, 'tz': 'AKDT, PST'}, + {'offset': -420, 'tz': 'MST, PDT'}, + {'offset': -360, 'tz': 'CST, GALT'}, + {'offset': -300, 'tz': 'EST, PET'}, + {'offset': -240, 'tz': 'AMT, AST'}, + {'offset': -210, 'tz': 'NST, NT'}, + {'offset': -180, 'tz': 'ADT, FKST'}, + {'offset': -150, 'tz': 'NDT'}, + {'offset': -120, 'tz': 'GST, UYST'}, + {'offset': -60, 'tz': 'CVT, EGT'}, + {'offset': 0, 'tz': 'GMT, UTC'}, + {'offset': 60, 'tz': 'CET, BST'}, + {'offset': 120, 'tz': 'EET, CEST'}, + {'offset': 180, 'tz': 'FET, EEST'}, + {'offset': 210, 'tz': 'IRST'}, + {'offset': 240, 'tz': 'AMT, VOLT'}, + {'offset': 270, 'tz': 'AFT, IRDT'}, + {'offset': 300, 'tz': 'PKT, TFT'}, + {'offset': 330, 'tz': 'IST, SLST'}, + {'offset': 345, 'tz': 'NPT'}, + {'offset': 360, 'tz': 'BST, VOST'}, + {'offset': 390, 'tz': 'CCT, MMT'}, + {'offset': 420, 'tz': 'CXT, THA'}, + {'offset': 480, 'tz': 'AWST, HKT'}, + {'offset': 525, 'tz': 'ACWST'}, + {'offset': 540, 'tz': 'JST, YAKT'}, + {'offset': 570, 'tz': 'ACST'}, + {'offset': 600, 'tz': 'AEST, VLAT'}, + {'offset': 630, 'tz': 'ACDT, LHST'}, + {'offset': 660, 'tz': 'AEDT, VUT'}, + {'offset': 720, 'tz': 'NZST, WAKT'}, + {'offset': 765, 'tz': 'CHAST'}, + {'offset': 780, 'tz': 'NZDT, TOT'}, + {'offset': 825, 'tz': 'CHADT'}, + {'offset': 840, 'tz': 'LINT'}, + {'offset': 2000, 'tz': 'INVLD'}, + {'offset': 2001, 'tz': 'AUTO'}, ]; diff --git a/lib/weather.dart b/lib/weather.dart index 0a82255..40bffa8 100644 --- a/lib/weather.dart +++ b/lib/weather.dart @@ -63,76 +63,82 @@ class _WeatherState extends State { final bool _stale = (_staleness > 3600); Expanded _refresh() { - return _stale ? Expanded( - flex: 4, - child: Container( - child: IconButton( - icon: Icon(Icons.refresh), - tooltip: 'refresh weather', - iconSize: 60, - color: candyApple, - onPressed: () { - widget.parentAction(); - }, - ), - ),) : Expanded(child: Container()); + return _stale + ? Expanded( + flex: 4, + child: Container( + child: IconButton( + icon: Icon(Icons.refresh), + tooltip: 'refresh weather', + iconSize: 60, + color: candyApple, + onPressed: () { + widget.parentAction(); + }, + ), + ), + ) + : Expanded(child: Container()); } - + Expanded _staleNotice() { - return _stale ? Expanded( - flex: 6, - child: RichText( - textAlign: TextAlign.justify, - text: TextSpan( - children: [ - TextSpan( - text: 'The Current Weather Report is stale by more than ', - style: TextStyle( - color: Colors.black, - fontSize: 16, + return _stale + ? Expanded( + flex: 6, + child: RichText( + textAlign: TextAlign.justify, + text: TextSpan( + children: [ + TextSpan( + text: 'The Current Weather Report is stale by more than ', + style: TextStyle( + color: Colors.black, + fontSize: 16, + ), + ), + TextSpan( + text: '${(_staleness / 3600).floor()} ', + style: TextStyle( + color: candyApple, + fontSize: 16, + ), + ), + TextSpan( + text: 'hours', + style: TextStyle( + color: candyApple, + fontSize: 16, + fontStyle: FontStyle.italic, + ), + ), + TextSpan( + text: + '. You probably want to check your network connection and then ', + style: TextStyle( + color: Colors.black, + fontSize: 16, + ), + ), + TextSpan( + text: 'refresh', + style: TextStyle( + color: candyApple, + fontSize: 16, + fontStyle: FontStyle.italic, + ), + ), + TextSpan( + text: '.', + style: TextStyle( + color: Colors.black, + fontSize: 16, + ), + ), + ], ), ), - TextSpan( - text: '${(_staleness / 3600).floor()} ', - style: TextStyle( - color: candyApple, - fontSize: 16, - ), - ), - TextSpan( - text: 'hours', - style: TextStyle( - color: candyApple, - fontSize: 16, - fontStyle: FontStyle.italic, - ), - ), - TextSpan( - text: '. You probably want to check your network connection and then ', - style: TextStyle( - color: Colors.black, - fontSize: 16, - ), - ), - TextSpan( - text: 'refresh', - style: TextStyle( - color: candyApple, - fontSize: 16, - fontStyle: FontStyle.italic, - ), - ), - TextSpan( - text: '.', - style: TextStyle( - color: Colors.black, - fontSize: 16, - ), - ), - ], - ), - ), - ) : Expanded(child: Container()); + ) + : Expanded(child: Container()); } Column _currentConditions() { @@ -179,7 +185,7 @@ class _WeatherState extends State { ], ); } - + Column _temps() { return Column( crossAxisAlignment: CrossAxisAlignment.center, @@ -247,8 +253,7 @@ class _WeatherState extends State { ), ), TextSpan( - text: - '${widget.weatherCurrentTempMin.round()}\u00B0', + text: '${widget.weatherCurrentTempMin.round()}\u00B0', style: TextStyle( height: textHeight, color: Colors.black, @@ -298,8 +303,7 @@ class _WeatherState extends State { ), ), TextSpan( - text: - '${widget.weatherCurrentTempMax.round()}\u00B0', + text: '${widget.weatherCurrentTempMax.round()}\u00B0', style: TextStyle( height: textHeight, color: Colors.black, @@ -468,8 +472,7 @@ class _WeatherState extends State { text: TextSpan( children: [ TextSpan( - text: - '${(widget.weatherCurrentWindSpd * 1.60934).round()}', + text: '${(widget.weatherCurrentWindSpd * 1.60934).round()}', style: TextStyle( height: textHeight, color: Colors.black, @@ -901,7 +904,8 @@ class _WeatherState extends State { return Container( width: 100, child: CachedNetworkImage( - imageUrl: 'http://openweathermap.org/img/w/${widget.weatherConditionsIcon}.png', + imageUrl: + 'http://openweathermap.org/img/w/${widget.weatherConditionsIcon}.png', ), ); } @@ -909,8 +913,8 @@ class _WeatherState extends State { if (widget.weatherConditions == '') { return Container( margin: EdgeInsets.symmetric( - vertical: 3, - horizontal: 6, + vertical: 3, + horizontal: 6, ), padding: myBoxPadding, decoration: myBoxDecoration(_stale ? Colors.grey : ivory), @@ -937,285 +941,284 @@ class _WeatherState extends State { } else if (_deviceWidth < 400) { return Container( margin: EdgeInsets.symmetric( - vertical: 3, - horizontal: 6, + vertical: 3, + horizontal: 6, ), padding: myBoxPadding, decoration: myBoxDecoration(_stale ? Colors.grey : ivory), - child: Column( - children: [ - Padding( - padding: EdgeInsets.only( - top: 16.0, - bottom: 2.0, - right: 25.0, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _refresh(), - _staleNotice(), - ], - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.only( + top: 16.0, + bottom: 2.0, + right: 25.0, ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _icon(), - _currentConditions(), - ], - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _refresh(), + _staleNotice(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _updateTime(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _icon(), + _currentConditions(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _temps(), - _wind(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _updateTime(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _pressure(), - _visibility(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _temps(), + _wind(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _sunRise(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _pressure(), + _visibility(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _sunSet(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _sunRise(), + ], ), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _sunSet(), + ], + ), + ), + ], + ), ); } else if ((_deviceWidth >= 400) && (_deviceWidth < 650)) { return Container( margin: EdgeInsets.symmetric( - vertical: 3, - horizontal: 6, + vertical: 3, + horizontal: 6, ), padding: myBoxPadding, decoration: myBoxDecoration(_stale ? Colors.grey : ivory), - child: Column( - children: [ - Padding( - padding: EdgeInsets.only( - top: 16.0, - bottom: 2.0, - right: 25.0, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _refresh(), - _staleNotice(), - ], - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.only( + top: 16.0, + bottom: 2.0, + right: 25.0, ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _icon(), - _currentConditions(), - ], - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _refresh(), + _staleNotice(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _updateTime(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _icon(), + _currentConditions(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _temps(), - _wind(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _updateTime(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _sunRise(), - _pressure(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _temps(), + _wind(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _sunSet(), - _visibility(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _sunRise(), + _pressure(), + ], ), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _sunSet(), + _visibility(), + ], + ), + ), + ], + ), ); } else if ((_deviceWidth >= 650) && (_deviceWidth < 1000)) { return Container( margin: EdgeInsets.symmetric( - vertical: 3, - horizontal: 6, + vertical: 3, + horizontal: 6, ), padding: myBoxPadding, decoration: myBoxDecoration(_stale ? Colors.grey : ivory), - child: Column( - children: [ - Padding( - padding: EdgeInsets.only( - top: 16.0, - bottom: 2.0, - right: 25.0, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _refresh(), - _staleNotice(), - ], - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.only( + top: 16.0, + bottom: 2.0, + right: 25.0, ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _icon(), - _currentConditions(), - _temps(), - ], - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _refresh(), + _staleNotice(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _updateTime(), - _visibility(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _icon(), + _currentConditions(), + _temps(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _sunRise(), - _wind(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _updateTime(), + _visibility(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _sunSet(), - _pressure(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _sunRise(), + _wind(), + ], ), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _sunSet(), + _pressure(), + ], + ), + ), + ], + ), ); } else if (_deviceWidth >= 1000) { return Container( margin: EdgeInsets.symmetric( - vertical: 3, - horizontal: 6, + vertical: 3, + horizontal: 6, ), padding: myBoxPadding, decoration: myBoxDecoration(_stale ? Colors.grey : ivory), - child: Column( - children: [ - Padding( - padding: EdgeInsets.only( - top: 16.0, - bottom: 2.0, - right: 25.0, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _refresh(), - _staleNotice(), - ], - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.only( + top: 16.0, + bottom: 2.0, + right: 25.0, ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _icon(), - _currentConditions(), - _temps(), - _visibility(), - _updateTime(), - ], - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _refresh(), + _staleNotice(), + ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _pressure(), - _sunRise(), - _sunSet(), - _wind(), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _icon(), + _currentConditions(), + _temps(), + _visibility(), + _updateTime(), + ], ), - ], - ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _pressure(), + _sunRise(), + _sunSet(), + _wind(), + ], + ), + ), + ], + ), ); } - } Map get3WayTime(int secondsFromEpoch, int timeOffSet) { @@ -1223,7 +1226,9 @@ class _WeatherState extends State { DateTime.fromMillisecondsSinceEpoch(secondsFromEpoch * 1000).toUtc(); DateTime thereTime = utcTime.add(Duration(minutes: timeOffSet)); DateTime hereTime = utcTime.toLocal(); - String there = (timeOffSet != 2000) ? DateFormat('EEEE MMMM d, HH:mm').format(thereTime) : 'UNKNOWN, INVALID'; + String there = (timeOffSet != 2000) + ? DateFormat('EEEE MMMM d, HH:mm').format(thereTime) + : 'UNKNOWN, INVALID'; String here = DateFormat('EEEE MMMM d, HH:mm').format(hereTime); String utc = DateFormat('EEEE MMMM d, HH:mm').format(utcTime); return { diff --git a/lib/weather_forecast.dart b/lib/weather_forecast.dart index cffd161..4ec4e88 100644 --- a/lib/weather_forecast.dart +++ b/lib/weather_forecast.dart @@ -20,7 +20,7 @@ class WeatherForeCast extends StatefulWidget { class _WeatherForeCastState extends State { final double textHeight = 1.5; - + @override Widget build(BuildContext context) { Map foreCastJson; @@ -81,7 +81,8 @@ class _WeatherForeCastState extends State { return Container( width: 100, child: CachedNetworkImage( - imageUrl: 'http://openweathermap.org/img/w/${foreCast['weather'][0]['icon']}.png', + imageUrl: + 'http://openweathermap.org/img/w/${foreCast['weather'][0]['icon']}.png', ), ); } @@ -183,8 +184,7 @@ class _WeatherForeCastState extends State { ), ), TextSpan( - text: - '${foreCast['wind']['deg'].round()}\u00B0, ', + text: '${foreCast['wind']['deg'].round()}\u00B0, ', style: TextStyle( height: textHeight, color: Colors.black, @@ -207,7 +207,7 @@ class _WeatherForeCastState extends State { ], ); } - + Column _temp() { return Column( crossAxisAlignment: CrossAxisAlignment.center, @@ -225,8 +225,7 @@ class _WeatherForeCastState extends State { ), ), TextSpan( - text: - '${foreCast['main']['temp'].round()}\u00B0', + text: '${foreCast['main']['temp'].round()}\u00B0', style: TextStyle( height: textHeight, color: Colors.black, @@ -276,8 +275,7 @@ class _WeatherForeCastState extends State { ), ), TextSpan( - text: - '${foreCast['main']['temp_min'].round()}\u00B0', + text: '${foreCast['main']['temp_min'].round()}\u00B0', style: TextStyle( height: textHeight, color: Colors.black, @@ -327,8 +325,7 @@ class _WeatherForeCastState extends State { ), ), TextSpan( - text: - '${foreCast['main']['temp_max'].round()}\u00B0', + text: '${foreCast['main']['temp_max'].round()}\u00B0', style: TextStyle( height: textHeight, color: Colors.black, @@ -982,8 +979,8 @@ class _WeatherForeCastState extends State { foreCastJson = jsonDecode(widget.weatherForeCast); return Container( margin: EdgeInsets.symmetric( - vertical: 3, - horizontal: 6, + vertical: 3, + horizontal: 6, ), decoration: myBoxDecoration(ivory), padding: EdgeInsets.all(5.0), @@ -991,11 +988,11 @@ class _WeatherForeCastState extends State { children: createForeCast(foreCastJson['list']), ), ); - } catch(e) { + } catch (e) { return Container( margin: EdgeInsets.symmetric( - vertical: 3, - horizontal: 6, + vertical: 3, + horizontal: 6, ), padding: myBoxPadding, decoration: myBoxDecoration(ivory), @@ -1037,7 +1034,9 @@ class _WeatherForeCastState extends State { DateTime.fromMillisecondsSinceEpoch(secondsFromEpoch * 1000).toUtc(); DateTime thereTime = utcTime.add(Duration(minutes: timeOffSet)); DateTime hereTime = utcTime.toLocal(); - String there = (timeOffSet != 2000) ? DateFormat('EEEE MMMM d, HH:mm').format(thereTime) : 'UNKNOWN, INVALID'; + String there = (timeOffSet != 2000) + ? DateFormat('EEEE MMMM d, HH:mm').format(thereTime) + : 'UNKNOWN, INVALID'; String here = DateFormat('EEEE MMMM d, HH:mm').format(hereTime); String utc = DateFormat('EEEE MMMM d, HH:mm').format(utcTime); return { diff --git a/pubspec.yaml b/pubspec.yaml index fe6d159..8260ea9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ description: A new Flutter project. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.1.2+8 +version: 0.1.2+10 environment: sdk: ">=2.1.0 <3.0.0"