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