From 74cb1e4cfc60cd4e6885267b3da2dd53b05f0ad2 Mon Sep 17 00:00:00 2001 From: Maximilian Betz <Maximilian.Betz@awi.de> Date: Tue, 8 Mar 2022 14:02:44 +0100 Subject: [PATCH] added login feature not working yet --- assets/awi_logo.png | Bin 0 -> 7671 bytes lib/configuration.dart | 6 +- lib/datamodel.dart | 27 +++++++- lib/login.dart | 153 +++++++++++++++++++++++++++-------------- lib/main.dart | 3 +- lib/viewevents.dart | 2 +- pubspec.yaml | 3 +- 7 files changed, 136 insertions(+), 58 deletions(-) create mode 100644 assets/awi_logo.png diff --git a/assets/awi_logo.png b/assets/awi_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6246037121002e6e99ead4898b08ef1f9f79d890 GIT binary patch literal 7671 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∨?x_FHm>^17sqFDYginO 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 literal 0 HcmV?d00001 diff --git a/lib/configuration.dart b/lib/configuration.dart index 8007b44..0ea45e2 100644 --- a/lib/configuration.dart +++ b/lib/configuration.dart @@ -7,7 +7,7 @@ import 'datamodel.dart'; Future<List<Device>> updateDevices(int collectionId) async { debugPrint("Start HTTP GET Collection Devices. Collection Id: " + collectionId.toString()); - String url = 'https://sensor.awi.de/rest/sensors/collections/getItemsOfCollection/' + collectionId.toString(); + String url = 'https://sandbox.sensor.awi.de/rest/sensors/collections/getItemsOfCollection/' + collectionId.toString(); // Get Access to local device and current event store. EventStoreInstance eventsStore = EventStoreInstance(); @@ -46,7 +46,7 @@ Future<List<Collection>> fetchCollections() async { List<Collection> collectionList = []; final response = await http - .get(Uri.parse('https://sensor.awi.de/rest/sensors/collections/getAllCollections?pointInTime=2018-07-03T12%3A30%3A55.389Z')); + .get(Uri.parse('https://sandbox.sensor.awi.de/rest/sensors/collections/getAllCollections?pointInTime=2018-07-03T12%3A30%3A55.389Z')); if (response.statusCode == 200) { return (json.decode(response.body) as List) @@ -84,8 +84,6 @@ class _MyHomePageState extends State<Configuration> { Widget build(BuildContext context) { final ConfigurationStoreInstance configuration = ConfigurationStoreInstance(); - //final CollectionStoreInstance collections = CollectionStoreInstance(); - //final CollectionCurrentInstance activeCollection = CollectionCurrentInstance(); return Scaffold( appBar: AppBar( diff --git a/lib/datamodel.dart b/lib/datamodel.dart index 7c8aa4d..cc65b9b 100644 --- a/lib/datamodel.dart +++ b/lib/datamodel.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:shared_preferences/shared_preferences.dart'; @@ -107,15 +109,37 @@ class EventType{ } } +class SensorLogin{ + String mail; + String password; + String token; + + SensorLogin( + this.mail, + this.password, + this.token //REST API access Token + ); + + String toJsonString() { + return '{ "username": $mail, "authPassword": $password }'; + } + + Map<String, dynamic> toJson() => { + "username": mail, + "authPassword": password + }; +} + + // Storage classes // ConfigurationStoreBase for Collection, devices, event types, login information // EventStoreBase for created event information. abstract class ConfigurationStoreBase { List<Collection> collections = []; Collection currentCollection = Collection(id: -1, description: '', collectionName: ''); - List<Device> devices = []; List<EventType> eventTypes = []; + SensorLogin loginInformation = SensorLogin('', '', ''); Collection getCollectionFromName(String name) { for (var collection in collections) { @@ -149,6 +173,7 @@ abstract class ConfigurationStoreBase { devices = []; eventTypes = []; currentCollection = Collection(id: -1, description: '', collectionName: ''); + loginInformation = SensorLogin('', '', ''); } } diff --git a/lib/login.dart b/lib/login.dart index c3c9588..ad4ec37 100644 --- a/lib/login.dart +++ b/lib/login.dart @@ -1,5 +1,46 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'datamodel.dart'; +import 'dart:convert'; +import 'package:http/http.dart' as http; + +Future<int> login() async { + // Get Access to local configuration store. Token must be stored there! + ConfigurationStoreInstance configuration = ConfigurationStoreInstance(); + + String url = 'https://sandbox.sensor.awi.de/rest/sensors/contacts/login'; + debugPrint("Start login to : " + url); + + final String body = jsonEncode(configuration.loginInformation); + debugPrint(body); + + final response = await http.post(Uri.parse(url), + body: body, + headers: { + 'Accept' : 'application/json', + 'Content-Type' : 'application/x-www-form-urlencoded' + }, + encoding: Encoding.getByName("utf-8") + ); + + + if (response.statusCode == 200) { + debugPrint('Login success'); + //TODO store token + + } else { + debugPrint('Header: ' + response.headers.toString()); + debugPrint('Body: ' + response.body.toString()); + debugPrint('StatusCode: ' + response.statusCode.toString()); + throw Exception('Failed to login'); + + + } + + return 0; +} + + class LoginPage extends StatefulWidget{ static String tag = 'login-page'; @@ -13,38 +54,46 @@ class _LoginPageState extends State<LoginPage> { @override Widget build(BuildContext context){ - const logo = Hero( - tag: 'blabla', - child: CircleAvatar( - backgroundColor: Colors.transparent, - radius: 48.0, - child: Text('LOGIN'), - ) - ); + final ConfigurationStoreInstance configuration = ConfigurationStoreInstance(); - final email = TextFormField( - keyboardType: TextInputType.emailAddress, - autofocus: false, - initialValue: '', - decoration: InputDecoration( - hintText: 'sensor e-mail address', - contentPadding: const EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(32.0) + var logo = Hero( + tag: 'blabla', + child: CircleAvatar( + backgroundColor: Colors.transparent, + radius: 48.0, + child: Image.asset('assets/awi_logo.png'), ) - ) ); - final password = TextFormField( + final email = TextFormField( + keyboardType: TextInputType.emailAddress, autofocus: false, - initialValue: '', + initialValue: configuration.loginInformation.mail, decoration: InputDecoration( - hintText: 'sensor password', + hintText: 'sensor e-mail address', contentPadding: const EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0), border: OutlineInputBorder( borderRadius: BorderRadius.circular(32.0) ) - ) + ), + onChanged: (value) { + configuration.loginInformation.mail = value; + }, + ); + + final password = TextFormField( + autofocus: false, + initialValue: configuration.loginInformation.password, + decoration: InputDecoration( + hintText: 'sensor password', + contentPadding: const EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(32.0) + ) + ), + onChanged: (value){ + configuration.loginInformation.password = value; + }, ); @@ -54,19 +103,23 @@ class _LoginPageState extends State<LoginPage> { borderRadius: BorderRadius.circular(30.0), shadowColor: Colors.lightBlueAccent.shade100, elevation: 5.0, - child: MaterialButton( - minWidth: 200.0, - height: 42.0, - onPressed: (){ - - }, - color: Colors.lightBlueAccent, - child: const Text('Log In', style: TextStyle(color: Colors.white)), - ), + child: MaterialButton( + minWidth: 200.0, + height: 42.0, + onPressed: (){ + login(); + //Navigator.pop(context); // Go back to previous widget + + //Return to previous widget if successfully logged in. Store x-auth-token. + //Display login error if login not possible. + }, + color: Colors.lightBlueAccent, + child: const Text('Log In', style: TextStyle(color: Colors.white)), + ), ), ); - final forgotLabel = FlatButton( + final forgotLabel = TextButton( onPressed: () { }, child: const Text('Forgot password?', style: TextStyle(color: Colors.black54), @@ -74,25 +127,25 @@ class _LoginPageState extends State<LoginPage> { ); return Scaffold( - backgroundColor: Colors.white, - body: Center( - child: ListView( - shrinkWrap: true, - padding: const EdgeInsets.only(left: 24.0, right: 24.0), - children: <Widget>[ - logo, - const SizedBox(height: 48.0), - email, - const SizedBox(height: 8.0), - password, - const SizedBox(height: 24.0), - loginButton, - forgotLabel - - - ], + backgroundColor: Colors.white, + body: Center( + child: ListView( + shrinkWrap: true, + padding: const EdgeInsets.only(left: 24.0, right: 24.0), + children: <Widget>[ + logo, + const SizedBox(height: 48.0), + email, + const SizedBox(height: 8.0), + password, + const SizedBox(height: 24.0), + loginButton, + forgotLabel //TODO: launch https://data.awi.de/auth/ + + + ], + ) ) - ) ); } } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 48eacfe..74c9d15 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -17,7 +17,8 @@ void main() { events.reset(); configuration.reset(); - + configuration.loginInformation.mail = 'admin'; // Sandbox.sensor.de admin account + configuration.loginInformation.password ='adminadmin'; // Add some dummy devices // TODO: load from shared preferences. diff --git a/lib/viewevents.dart b/lib/viewevents.dart index b9435c9..2e1988f 100644 --- a/lib/viewevents.dart +++ b/lib/viewevents.dart @@ -160,7 +160,7 @@ class ViewEvents extends StatelessWidget { icon: null, label: const Text('Upload'), onPressed: () { - // Provide + // Login }, ), ], diff --git a/pubspec.yaml b/pubspec.yaml index 6fcb55b..75a049d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -62,7 +62,8 @@ flutter: uses-material-design: true # To add assets to your application, add an assets section, like this: - # assets: + assets: + - assets/awi_logo.png # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg -- GitLab