diff --git a/build/app/outputs/apk/release/app-release.apk b/build/app/outputs/apk/release/app-release.apk deleted file mode 100644 index f60ebaf06c9162e4533458b5ffccadeacc25abd3..0000000000000000000000000000000000000000 Binary files a/build/app/outputs/apk/release/app-release.apk and /dev/null differ diff --git a/build/app/outputs/apk/release/output-metadata.json b/build/app/outputs/apk/release/output-metadata.json deleted file mode 100644 index 3446ddc614a49dc6c77209acc3c7f5afe9635fc7..0000000000000000000000000000000000000000 --- a/build/app/outputs/apk/release/output-metadata.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": 2, - "artifactType": { - "type": "APK", - "kind": "Directory" - }, - "applicationId": "awi.de.mobileeventlog", - "variantName": "processReleaseResources", - "elements": [ - { - "type": "SINGLE", - "filters": [], - "versionCode": 1, - "versionName": "1.0.0", - "outputFile": "app-release.apk" - } - ] -} \ No newline at end of file diff --git a/lib/addevent.dart b/lib/addevent.dart index a850abe421983673232e834e195cc80c05d19c73..d42acfe596d0a099d58a58862cf4cdceaa05147b 100644 --- a/lib/addevent.dart +++ b/lib/addevent.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'datamodel.dart'; import 'dart:async'; import 'package:geolocator/geolocator.dart'; @@ -20,6 +21,7 @@ class _AddEventPageState extends State<AddEvent> { late String alt = ""; late double accuracy = 0.0; late StreamSubscription<Position> streamHandler; //For canceling GNSS stream on dispose + final prefs = SharedPreferences.getInstance(); // Is async Future startGNSS() async { debugPrint("Check Location Permission"); @@ -163,7 +165,8 @@ class _AddEventPageState extends State<AddEvent> { eventsStore.currentEvent.status = "PENDING"; eventsStore.events.add( Event( - id: eventsStore.currentEvent.id, + id: 0, + urnId: eventsStore.currentEvent.urnId, urn: eventsStore.currentEvent.urn, label: eventsStore.currentEvent.label, type: eventsStore.currentEvent.type, @@ -274,7 +277,7 @@ class _AddEventPageState extends State<AddEvent> { }).toList(), onChanged: (value) { eventsStore.currentEvent.urn = value.toString(); - eventsStore.currentEvent.id = + eventsStore.currentEvent.urnId = configuration.getDeviceIdFromUrn(value.toString()); } ), diff --git a/lib/databaseconnector.dart b/lib/databaseconnector.dart new file mode 100644 index 0000000000000000000000000000000000000000..199b0c0e1d444d917960b3d57b5a6a07388afe93 --- /dev/null +++ b/lib/databaseconnector.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; +import 'package:sqflite/sqflite.dart'; +import 'package:path/path.dart'; +import 'dart:async'; +import 'datamodel.dart'; + +class DatabaseConnector{ + static const String eventDatabase = 'sensor_events.db'; + static const String eventTable = 'events'; + dynamic database; + + Future<void> connect() async { + database = openDatabase( + + join(await getDatabasesPath(), eventDatabase), + + // When the database is first created, create a table to store the events. + onCreate: (db, version) { + // Run the CREATE TABLE statement on the database. + return db.execute( + 'CREATE TABLE $eventTable(id INTEGER PRIMARY KEY, urnId INTEGER,urn TEXT, label TEXT, type TEXT, typeId INTEGER, description TEXT, status TEXT, startDate TEXT, endDate TEXT, latitude REAL, longitude REAL, elevation REAL)', + ); + }, + // Set the version. This executes the onCreate function and provides a + // path to perform database upgrades and downgrades. + version: 1, + ); + } + + + Future<void> insertEvent(Event event) async { + final db = await database; + await db.insert( + eventTable, + event.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace, + ); + } + + // A method that retrieves all the dogs from the dogs table. + Future<List<Event>> getEvents() async { + // Get a reference to the database. + final db = await database; + + final List<Map<String, dynamic>> maps = await db.query(eventTable); + + // Convert the List<Map<String, dynamic> into a List<Event>. + return List.generate(maps.length, (i) { + return Event( + id: maps[i]['id'], + urnId: maps[i]['urnId'], + urn: maps[i]['urn'], + label: maps[i]['label'], + type: maps[i]['type'], + typeId: maps[i]['typeId'], + description: maps[i]['description'], + status: maps[i]['status'], + startDate: maps[i]['startDate'], + endDate: maps[i]['endDate'], + latitude: maps[i]['latitude'], + longitude: maps[i]['longitude'], + elevation: maps[i]['elevation'], + ); + }); + } + +} + + + + + + +/* +* int id; // Device URN id + String urn; + String label; + String type; // Event type name TODO: this should be an EventType variable + int typeId; + String description; + String status; + String startDate; + String endDate; + String latitude; + String longitude; + String elevation; +* +* +* */ \ No newline at end of file diff --git a/lib/datamodel.dart b/lib/datamodel.dart index ce0135607ccfc3090926e9f9aa880d5d4c4eb340..5561e462d1b485e19092efbe952e1a4f64b60d6f 100644 --- a/lib/datamodel.dart +++ b/lib/datamodel.dart @@ -2,6 +2,8 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; + class Collection { int id; String description; @@ -57,7 +59,8 @@ class Device{ class Event{ - int id; // Device URN id + int id; + int urnId; // Device URN id String urn; String label; String type; // Event type name TODO: this should be an EventType variable @@ -72,6 +75,7 @@ class Event{ Event({ required this.id, + required this.urnId, required this.urn, required this.label, required this.type, @@ -88,6 +92,7 @@ class Event{ factory Event.fromJson(Map<String, dynamic> json){ return Event( id: json['id'], + urnId: json['urnId'], urn: json['urn'], label: json['label'], type: json['type'], @@ -102,8 +107,27 @@ class Event{ ); } + Map<String, dynamic> toMap() { + return { + 'id' : id, + 'urnId': urnId, + 'urn': urn, + 'label': label, + 'type' : type, + 'typeId' : typeId, + 'description' : description, + 'status' : status, + 'startDate' : startDate, + 'endDate' : endDate, + 'latitude' : latitude, + 'longitude' : longitude, + 'elevation' : elevation + }; + } + Map<String, dynamic> toJson() => { - 'id': id, + 'id' : id, + 'urnId': urnId, 'urn': urn, 'label': label, 'type' : type, @@ -119,7 +143,7 @@ class Event{ Map<String, dynamic> toSensorJson() { return { - "\"itemID\"":"\"$id\"", + "\"itemID\"":"\"$urnId\"", "\"inheritToAllChildren\"":"\"false\"", "\"inheritToChildren\"":[], "\"event\"":{ @@ -138,7 +162,9 @@ class Event{ @override String toString(){ - return '{ ${this.id}, ' + return '{ ' + '${this.id}, ' + '${this.urnId}, ' '${this.urn}, ' '${this.label}, ' '${this.type}, ' @@ -270,7 +296,8 @@ class ConfigurationStoreInstance extends ConfigurationStoreBase { abstract class EventStoreBase{ List<Event> events = []; Event currentEvent = Event( - id:-1, + id: 0, + urnId:-1, urn:'urn0', label:'', type:'', @@ -307,10 +334,8 @@ abstract class EventStoreBase{ fromEventDump(dump){ events = []; - print(dump); - List<dynamic> data = jsonDecode(dump); - for (var entry in data) { - print(entry); + for (var entry in dump) { + debugPrint('Added Event from Storage: ' + entry.toString()); events.add(Event.fromJson(entry)); } } @@ -327,7 +352,8 @@ class EventStoreInstance extends EventStoreBase { EventStoreInstance._internal() { events = []; currentEvent = Event( - id:-1, + id:0, + urnId:-1, urn:'urn0', label:'', type:'', @@ -345,7 +371,8 @@ class EventStoreInstance extends EventStoreBase { void reset(){ events = []; currentEvent = Event( - id:-1, + id:0, + urnId:-1, urn:'urn0', label:'', type:'', diff --git a/lib/main.dart b/lib/main.dart index 339437b872bca9c1c7a954340df79b29210d9555..b6dbf74a8a130808780bf9f1012c537902dbf815 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,32 +2,48 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'datamodel.dart'; import 'addevent.dart'; import 'viewevents.dart'; import 'overview.dart'; import 'configuration.dart'; -Future<void> pathstuff() async { +Future<void> pathStuff() async { //Directory downloadsDirectory = await DownloadsPathProvider.downloadsDirectory; //Directory appDocDir = await getApplicationDocumentsDirectory(); + //debugPrint(appDocDir.path.toString()); + WidgetsFlutterBinding.ensureInitialized(); + + final prefs = await SharedPreferences.getInstance(); + //prefs.setString('events', 'blabla'); + final String? events = prefs.getString('events'); + print('Shared Preferences: ' + events!); + + //const storage = FlutterSecureStorage(); + //Map<String, String> allValues = await storage.readAll(); + //print('Secure Storage: ' + allValues.toString()); - //debugPrint(appDocDir.path.toString()); -} -void main() { - //pathstuff(); +} + +void main() { + + + pathStuff(); + EventStoreInstance events = EventStoreInstance(); @@ -47,6 +63,19 @@ void main() { //configuration.currentCollection = Collection.fromJson({"id":1,"description":"","collectionName":"FRAM"}); //configuration.initialized = true; +events.fromEventDump( + [ + {"id":102,"urn":"mooring:f9-12","label":"hggg","type":"Calibration", + "typeId":15,"description":"ggggg","status":"PENDING", + "startDate":"2022-03-28T07:00:02.712112Z", + "endDate":"2022-03-28T07:00:02.712112Z","latitude":"53.5440109", + "longitude":"8.58033187","elevation":"48.7139892578125"}, + {"id":102,"urn":"mooring:f9-12","label":"hggg","type":"Calibration", + "typeId":15,"description":"ggggg","status":"PENDING", + "startDate":"2022-03-28T07:00:03.828190Z", + "endDate":"2022-03-28T07:00:03.828190Z","latitude":"53.54401033", + "longitude":"8.58032778","elevation":"48.720947265625"}, + ]); //events.fromEventDump([{"id":102,"urn":"mooring:f9-12","label":"cf","type":"Calibration","typeId":15,"description":"fd","status":"PENDING","startDate":"2022-03-25T12:47:30.659436Z","endDate":"2022-03-25T12:47:30.659436Z","latitude":"","longitude":"","elevation":""},{"id":102,"urn":"mooring:f9-12","label":"cf","type":"Calibration","typeId":15,"description":"fd","status":"PENDING","startDate":"2022-03-25T12:47:32.136009Z","endDate":"2022-03-25T12:47:32.136009Z","latitude":"","longitude":"","elevation":""}]); @@ -57,7 +86,7 @@ void main() { ), initialRoute: '/', routes: { - '/': (context) => Overview(), + '/': (context) => const Overview(), '/second': (context) => const AddEvent(), '/third': (context) => const ViewEvents(), '/forth': (context) => const Configuration(), diff --git a/lib/overview.dart b/lib/overview.dart index 837fa28be4a12b963f4bff0201f1890c65d623f7..4fc1235329baea29807336a90c73ff64a9003496 100644 --- a/lib/overview.dart +++ b/lib/overview.dart @@ -14,6 +14,8 @@ class Overview extends StatelessWidget { children: const <Widget>[ Icon( Icons.copyright_outlined), Text('Alfred Wegener Institute'), + Text('Data-Logistics-Support'), + SizedBox(height: 10), Text('Maximilian Betz'), SizedBox(height: 30), Text('o2a-support@awi.de'), diff --git a/pubspec.lock b/pubspec.lock index fadac3d03197cf0d3f9eeecaef3f4dbe021ff69a..63af8e52cd561015927e2586a0aab8099c37622f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -118,6 +118,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.1.0" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.2" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" flutter_signin_button: dependency: transitive description: @@ -399,6 +441,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.1" + sqflite: + dependency: "direct main" + description: + name: sqflite + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" stack_trace: dependency: transitive description: @@ -420,6 +476,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.0" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0+2" term_glyph: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 19f099d225985f4859fd2bde24e9fe9438056ccc..cc6f67b67b17aa02e6450882b7d5a6a7c68d2c95 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,6 +31,8 @@ dependencies: sdk: flutter shared_preferences: ^2.0.12 + flutter_secure_storage: ^5.0.2 + sqflite: ^2.0.2 path_provider: ^2.0.9 http: ^0.13.4 geolocator: ^8.1.1