From 8586a23bfaaef8c7fa9eb2220d6fda4902f0c19f Mon Sep 17 00:00:00 2001 From: Sven Carstensen Date: Tue, 26 Mar 2024 13:35:20 +0100 Subject: [PATCH] Merge --- lib/content_views/approach_area_page.dart | 24 ++-- lib/content_views/assigned_jobs_page.dart | 18 ++- lib/content_views/main_page.dart | 20 ++-- lib/content_views/messages_page.dart | 2 - lib/content_views/task_list_page.dart | 21 ++-- lib/main.dart | 6 +- lib/model/job.dart | 2 +- lib/model/job.g.dart | 103 +++--------------- lib/popups/accept_jobs_popup.dart | 52 +++++---- lib/protocoll_messages/acknowledge_job.dart | 1 - .../bootstrap_response_payload.dart | 1 - lib/protocoll_messages/logout_message.g.dart | 17 ++- .../start_session_message.dart | 2 - lib/tools/constants.dart | 2 +- lib/tools/messages/update_badges_message.dart | 4 - lib/tools/mqtt_core.dart | 78 +++++++------ lib/tools/util.dart | 2 +- pubspec.lock | 40 +++++++ pubspec.yaml | 4 +- 19 files changed, 179 insertions(+), 220 deletions(-) delete mode 100644 lib/tools/messages/update_badges_message.dart diff --git a/lib/content_views/approach_area_page.dart b/lib/content_views/approach_area_page.dart index 40251fb..0b37d80 100644 --- a/lib/content_views/approach_area_page.dart +++ b/lib/content_views/approach_area_page.dart @@ -1,16 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:isar/isar.dart'; import 'package:stadtbote/content_views/utils/content_view_widget.dart'; import 'package:stadtbote/content_views/utils/header_info.dart'; -import 'package:stadtbote/model/ranking.dart'; -import 'package:stadtbote/popups/tasks_popups/zip_popup.dart'; -import 'package:stadtbote/protocoll_messages/zip_message.dart'; +//import 'package:stadtbote/model/ranking.dart'; import 'package:stadtbote/tools/constants.dart'; import 'package:stadtbote/tools/message_service.dart'; -import 'package:stadtbote/tools/messages/ranking_updated.dart'; -import 'package:stadtbote/tools/mqtt_core.dart'; -import '../main.dart'; import '../tools/util.dart'; enum ModeEnum { @@ -44,7 +38,7 @@ class ApproachAreaPage extends ContentViewWidget { } class _ApproachAreaPageState extends State { - late Ranking? _ranking; + //late Ranking? _ranking; late bool _initCompleted = false; @@ -53,7 +47,7 @@ class _ApproachAreaPageState extends State { super.initState(); Future.delayed(const Duration(seconds: 0), () async { - _ranking = await MyApp.isarInstance.rankings.where().findFirst(); + //_ranking = await MyApp.isarInstance.rankings.where().findFirst(); _initCompleted = true; @@ -94,7 +88,7 @@ class _ApproachAreaPageState extends State { List _fillColumns() { List columns = []; - if (_ranking != null) { + /*if (_ranking != null) { for (int i = 0; i < _ranking!.ranks.length; i++) { var rank = _ranking!.ranks[i]; @@ -171,12 +165,12 @@ class _ApproachAreaPageState extends State { ), )); } - } + }*/ return columns; } - _sendZip(Rank rank, String zip, ModeEnum mode) { + /*_sendZip(Rank rank, String zip, ModeEnum mode) { var zipMessage = ZipMessage(); if (mode == ModeEnum.set) { @@ -200,13 +194,13 @@ class _ApproachAreaPageState extends State { } MqttCore.instance.publishPayloadMessage("rank", zipMessage.toJson()); - } + }*/ _initMessages() { - MessageService().subscribe(Constants.messageTopicRankingUpdated, this, (rankingUpdateMessage) async { + /*MessageService().subscribe(Constants.messageTopicRankingUpdated, this, (rankingUpdateMessage) async { _ranking = await MyApp.isarInstance.rankings.where().findFirst(); setState(() {}); - }); + });*/ } } \ No newline at end of file diff --git a/lib/content_views/assigned_jobs_page.dart b/lib/content_views/assigned_jobs_page.dart index 3a54cd3..f197438 100644 --- a/lib/content_views/assigned_jobs_page.dart +++ b/lib/content_views/assigned_jobs_page.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:expandable/expandable.dart'; import 'package:flutter/material.dart'; import 'package:isar/isar.dart'; @@ -8,7 +10,7 @@ import 'package:badges/badges.dart' as badges; import 'package:stadtbote/protocoll_messages/accept_job_message.dart'; import 'package:stadtbote/protocoll_messages/fin_task_message.dart'; import 'package:stadtbote/tools/message_service.dart'; -import 'package:stadtbote/tools/messages/job_deleted_message.dart'; +import 'package:stadtbote/tools/messages/refresh_badges_message.dart'; import 'package:stadtbote/tools/mqtt_core.dart'; import '../main.dart'; @@ -86,12 +88,6 @@ class _AssignedJobsPageState extends State { var jobs = await MyApp.isarInstance.jobs.filter().stateEqualTo(Constants.stateAssigned).findAll(); for (var job in jobs) { - String remarkString = ''; - for (var remark in job.rem) { - remarkString += '$remark\n'; - } - remarkString = remarkString.trim(); - entries.add(ExpandableNotifier( child: ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), @@ -200,9 +196,9 @@ class _AssignedJobsPageState extends State { message.track = Track(); message.track.time = DateTime.now().toUtc().toIso8601String(); message.track.pos = FinTaskPos(); - message.track.pos.lat = currentPosition != null ? currentPosition.latitude : 0.0; - message.track.pos.long = currentPosition != null ? currentPosition.longitude : 0.0; - message.track.pos.acc = currentPosition != null ? currentPosition.accuracy.toInt() : 0; + message.track.pos!.lat = currentPosition != null ? currentPosition.latitude : 0.0; + message.track.pos!.long = currentPosition != null ? currentPosition.longitude : 0.0; + message.track.pos!.acc = currentPosition != null ? currentPosition.accuracy.toInt() : 0; MqttCore.instance.publishText("reaction", jsonEncode(message.toJson())); @@ -216,4 +212,6 @@ class _AssignedJobsPageState extends State { setState(() {}); } + + void _initMessages() {} } diff --git a/lib/content_views/main_page.dart b/lib/content_views/main_page.dart index 14b0a3a..27564f1 100644 --- a/lib/content_views/main_page.dart +++ b/lib/content_views/main_page.dart @@ -11,12 +11,10 @@ import 'package:stadtbote/content_views/messages_page.dart'; import 'package:stadtbote/content_views/utils/content_view_widget.dart'; import 'package:stadtbote/content_views/utils/header_info.dart'; import 'package:stadtbote/model/job.dart'; -import 'package:stadtbote/model/log_entry.dart'; import 'package:stadtbote/model/message.dart'; import 'package:stadtbote/model/session_status.dart'; import 'package:stadtbote/model/status.dart'; import 'package:stadtbote/popups/infos_popup.dart'; -import 'package:stadtbote/protocoll_messages/device_log_response.dart'; import 'package:stadtbote/protocoll_messages/logout_message.dart'; import 'package:stadtbote/tools/message_service.dart'; import 'package:stadtbote/tools/messages/job_deleted_message.dart'; @@ -25,7 +23,7 @@ import 'package:stadtbote/tools/messages/message_message.dart'; import 'package:stadtbote/tools/messages/session_info_update.dart'; import 'package:badges/badges.dart' as badges; import 'package:stadtbote/tools/messages/status_info_update.dart'; -import 'package:stadtbote/tools/messages/update_badges_message.dart'; +import 'package:stadtbote/tools/messages/refresh_badges_message.dart'; import 'package:stadtbote/tools/mqtt_core.dart'; import '../main.dart'; @@ -237,11 +235,7 @@ class _MainPageState extends State { _loggedOut ? 'Anmelden' : 'Abmelden', image: Image.asset(_loggedOut ? 'assets/anmelden.png' : 'assets/abmelden.png', width: 30, height: 30), () async { - if (!kDebugMode) { - _logout(context); - } else { - _test(); - } + _logout(context); }), Expanded( child: Container( @@ -287,7 +281,7 @@ class _MainPageState extends State { _refreshBadges(); }); - MessageService().subscribe(Constants.messageTopicUpdateBadges, this, (UpdateBadgesMessage message) { + MessageService().subscribe(Constants.messageTopicRefreshBadges, this, (RefreshBadgesMessage message) { _refreshBadges(); }); } @@ -380,10 +374,10 @@ class _MainPageState extends State { var logoutMessage = LogoutMessage(); if (position != null) { - logoutMessage.time = position.timestamp.toIso8601String(); - logoutMessage.lat = position.latitude; - logoutMessage.long = position.longitude; - logoutMessage.acc = position.accuracy.toInt(); + logoutMessage.pos!.time = position.timestamp.toIso8601String(); + logoutMessage.pos!.lat = position.latitude; + logoutMessage.pos!.long = position.longitude; + logoutMessage.pos!.acc = position.accuracy.toInt(); } MqttCore.instance.publishText("session", jsonEncode(logoutMessage.toJson())); diff --git a/lib/content_views/messages_page.dart b/lib/content_views/messages_page.dart index 44861e4..55ee6ea 100644 --- a/lib/content_views/messages_page.dart +++ b/lib/content_views/messages_page.dart @@ -109,8 +109,6 @@ class _MessagesPageState extends State { await MyApp.isarInstance.messages.put(message.mssg); }); - var json = jsonEncode(message.toJson()); - MqttCore.instance.publishText('set_location', jsonEncode(message.toJson())); _messages.insert(0, types.TextMessage( diff --git a/lib/content_views/task_list_page.dart b/lib/content_views/task_list_page.dart index b20ef00..62298c3 100644 --- a/lib/content_views/task_list_page.dart +++ b/lib/content_views/task_list_page.dart @@ -20,7 +20,6 @@ import 'package:stadtbote/popups/tasks_popups/take_photos_popup.dart'; import 'package:stadtbote/protocoll_messages/accept_job_message.dart'; import 'package:stadtbote/protocoll_messages/fin_task_message.dart'; import 'package:stadtbote/protocoll_messages/fin_tour_message.dart'; -import 'package:stadtbote/protocoll_messages/pic_message.dart'; import 'package:stadtbote/tools/constants.dart'; import 'package:stadtbote/tools/message_service.dart'; import 'package:stadtbote/tools/mqtt_core.dart'; @@ -145,7 +144,7 @@ class _TaskListPageState extends State { left: 16.5, top: i == 0 ? 40 : 40, child: Container( - height: i == widget.tour.tasks.length - 1 ? 0 : 20, + height: i == widget.tour.tasks!.length - 1 ? 0 : 20, width: 6, color: isTaskActive(i) ? Constants.colorPrimary : Constants.colorPrimaryOpaque, ), @@ -211,7 +210,7 @@ class _TaskListPageState extends State { Future> _fetchTaskList() async { List taskList = []; - for(var task in widget.tour.tasks) { + for(var task in widget.tour.tasks!) { var taskInfo = await MyApp.isarInstance.taskInfos.filter().sIdEqualTo(task.sId).findFirst(); if (taskInfo == null) { taskInfo = TaskInfo(); @@ -445,7 +444,7 @@ class _TaskListPageState extends State { message.task.pos!.long = position.longitude; } - MqttCore.instance.publishPayloadMessage("job", finTaskMessage.toJson()); + MqttCore.instance.publishText("job", jsonEncode(message.toJson())); } FinTourTask _createAnswerHeader(TaskInfo taskInfo) { @@ -456,9 +455,9 @@ class _TaskListPageState extends State { finTourTask.time = DateTime.now().toIso8601String(); finTourTask.pos = FinTaskPos(); if (position != null) { - finTourTask.pos.lat = position.latitude; - finTourTask.pos.long = position.longitude; - finTourTask.pos.acc = position.accuracy.toInt(); + finTourTask.pos!.lat = position.latitude; + finTourTask.pos!.long = position.longitude; + finTourTask.pos!.acc = position.accuracy.toInt(); } return finTourTask; @@ -472,10 +471,10 @@ class _TaskListPageState extends State { var position = MyApp.currentPosition; if (position != null) { message.track = Track(); - message.track.time = DateTime.now().toIso8601String(); - message.track.pos = FinTaskPos(); - message.track.pos.lat = position.latitude; - message.track.pos.long = position.longitude; + message.track!.time = DateTime.now().toIso8601String(); + message.track!.pos = FinTaskPos(); + message.track!.pos!.lat = position.latitude; + message.track!.pos!.long = position.longitude; } message.tasks = []; diff --git a/lib/main.dart b/lib/main.dart index e255d3f..f094503 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,7 +8,6 @@ import 'package:stadtbote/messages/pop_content_view_message.dart'; import 'package:stadtbote/model/enqueued_message.dart'; import 'package:stadtbote/model/log_entry.dart'; import 'package:stadtbote/model/message.dart'; -import 'package:stadtbote/model/ranking.dart'; import 'package:stadtbote/model/status.dart'; import 'package:stadtbote/model/task_info.dart'; import 'package:stadtbote/popups/accept_jobs_popup.dart'; @@ -17,7 +16,7 @@ import 'package:stadtbote/model/session_status.dart'; import 'package:stadtbote/tools/connection_status.dart'; import 'package:stadtbote/tools/message_service.dart'; import 'package:stadtbote/tools/messages/job_received_message.dart'; -import 'package:stadtbote/tools/messages/update_badges_message.dart'; +import 'package:stadtbote/tools/messages/refresh_badges_message.dart'; import 'package:stadtbote/tools/mqtt_core.dart'; import 'content_views/main_page.dart'; @@ -37,7 +36,6 @@ Future main() async { JobSchema, TaskInfoSchema, MessageSchema, - RankingSchema, EnqueuedMessageSchema, LogEntrySchema ], directory: dir.path); @@ -434,7 +432,7 @@ class _MainState extends State
with SingleTickerProviderStateMixin { await showAcceptJobsPopup(context, await MyApp.isarInstance.jobs.filter().stateEqualTo(0).findAll(), () { _dialogOpened = false; - MessageService().publish(Constants.messageTopicUpdateBadges, arguments: UpdateBadgesMessage()); + MessageService().publish(Constants.messageTopicRefreshBadges, arguments: RefreshBadgesMessage()); }); } } diff --git a/lib/model/job.dart b/lib/model/job.dart index 511f5c4..f5fa7b5 100644 --- a/lib/model/job.dart +++ b/lib/model/job.dart @@ -22,7 +22,7 @@ class JobsPayload { class Job { late Id id; @JsonKey(name: 'ver') - late String ver; + late int ver; @JsonKey(name: 'state') late int state; @JsonKey(name: 'cr_filter') diff --git a/lib/model/job.g.dart b/lib/model/job.g.dart index 9f6d1e7..0279c0e 100644 --- a/lib/model/job.g.dart +++ b/lib/model/job.g.dart @@ -56,7 +56,7 @@ const JobSchema = CollectionSchema( r'ver': PropertySchema( id: 7, name: r'ver', - type: IsarType.string, + type: IsarType.long, ), r'vhtId': PropertySchema( id: 8, @@ -105,7 +105,6 @@ int _jobEstimateSize( bytesCount += JobTourSchema.estimateSize(value, offsets, allOffsets); } } - bytesCount += 3 + object.ver.length * 3; return bytesCount; } @@ -127,7 +126,7 @@ void _jobSerialize( JobTourSchema.serialize, object.tours, ); - writer.writeString(offsets[7], object.ver); + writer.writeLong(offsets[7], object.ver); writer.writeLong(offsets[8], object.vhtId); } @@ -152,7 +151,7 @@ Job _jobDeserialize( JobTour(), ) ?? []; - object.ver = reader.readString(offsets[7]); + object.ver = reader.readLong(offsets[7]); object.vhtId = reader.readLong(offsets[8]); return object; } @@ -185,7 +184,7 @@ P _jobDeserializeProp

( ) ?? []) as P; case 7: - return (reader.readString(offset)) as P; + return (reader.readLong(offset)) as P; case 8: return (reader.readLong(offset)) as P; default: @@ -929,55 +928,46 @@ extension JobQueryFilter on QueryBuilder { }); } - QueryBuilder verEqualTo( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder verEqualTo(int value) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( property: r'ver', value: value, - caseSensitive: caseSensitive, )); }); } QueryBuilder verGreaterThan( - String value, { + int value, { bool include = false, - bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.greaterThan( include: include, property: r'ver', value: value, - caseSensitive: caseSensitive, )); }); } QueryBuilder verLessThan( - String value, { + int value, { bool include = false, - bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.lessThan( include: include, property: r'ver', value: value, - caseSensitive: caseSensitive, )); }); } QueryBuilder verBetween( - String lower, - String upper, { + int lower, + int upper, { bool includeLower = true, bool includeUpper = true, - bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.between( @@ -986,73 +976,6 @@ extension JobQueryFilter on QueryBuilder { includeLower: includeLower, upper: upper, includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder verStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'ver', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder verEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'ver', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder verContains(String value, - {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'ver', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder verMatches(String pattern, - {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'ver', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder verIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'ver', - value: '', - )); - }); - } - - QueryBuilder verIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'ver', - value: '', )); }); } @@ -1368,9 +1291,9 @@ extension JobQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByVer({bool caseSensitive = true}) { + QueryBuilder distinctByVer() { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'ver', caseSensitive: caseSensitive); + return query.addDistinctBy(r'ver'); }); } @@ -1430,7 +1353,7 @@ extension JobQueryProperty on QueryBuilder { }); } - QueryBuilder verProperty() { + QueryBuilder verProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'ver'); }); @@ -1460,7 +1383,7 @@ Map _$JobsPayloadToJson(JobsPayload instance) => Job _$JobFromJson(Map json) => Job() ..id = json['id'] as int - ..ver = json['ver'] as String + ..ver = json['ver'] as int ..state = json['state'] as int ..crFilter = json['cr_filter'] as String? ..ordertime = json['ordertime'] as String diff --git a/lib/popups/accept_jobs_popup.dart b/lib/popups/accept_jobs_popup.dart index 20b9454..019830f 100644 --- a/lib/popups/accept_jobs_popup.dart +++ b/lib/popups/accept_jobs_popup.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:expandable/expandable.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -6,11 +8,15 @@ import 'package:stadtbote/protocoll_messages/accept_job_message.dart'; import 'package:stadtbote/model/job.dart'; import 'package:stadtbote/protocoll_messages/fin_task_message.dart'; import 'package:stadtbote/tools/constants.dart'; +import 'package:stadtbote/tools/message_service.dart'; +import 'package:stadtbote/tools/messages/job_deleted_message.dart'; +import 'package:stadtbote/tools/messages/job_received_message.dart'; +import 'package:stadtbote/tools/messages/refresh_badges_message.dart'; import 'package:stadtbote/tools/mqtt_core.dart'; import 'package:stadtbote/tools/util.dart'; import 'package:badges/badges.dart' as badges; -Future showAcceptJobsPopup(BuildContext context, List jobs) async { +Future showAcceptJobsPopup(BuildContext context, List jobs, Function() onFinished) async { var jobsSet = jobs.toSet(); await showDialog( @@ -18,8 +24,8 @@ Future showAcceptJobsPopup(BuildContext context, List jobs) async { builder: (BuildContext context) { return WillPopScope( onWillPop: () async { - MessageService().unsubscribe(Constants.messageTopicJobDeleted, jobsMap); - MessageService().unsubscribe(Constants.messageTopicJobReceived, jobsMap); + MessageService().unsubscribe(Constants.messageTopicJobDeleted, jobsSet); + MessageService().unsubscribe(Constants.messageTopicJobReceived, jobsSet); Navigator.of(context).pop(); @@ -32,29 +38,27 @@ Future showAcceptJobsPopup(BuildContext context, List jobs) async { shadowColor: Colors.transparent, backgroundColor: Colors.white, content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) { - if (jobsMap.isEmpty) { + if (jobsSet.isEmpty) { Navigator.of(context).pop(); onFinished(); } - MessageService().unsubscribe(Constants.messageTopicJobDeleted, jobsMap); - MessageService().unsubscribe(Constants.messageTopicJobReceived, jobsMap); + MessageService().unsubscribe(Constants.messageTopicJobDeleted, jobsSet); + MessageService().unsubscribe(Constants.messageTopicJobReceived, jobsSet); - MessageService().subscribe(Constants.messageTopicJobDeleted, jobsMap, (jobDeletedMessage) async { - jobsMap.removeWhere((key, value) => key == jobDeletedMessage.jobId); + MessageService().subscribe(Constants.messageTopicJobDeleted, jobsSet, (jobDeletedMessage) async { + jobsSet.removeWhere((value) => value.id == jobDeletedMessage.id); if (context.mounted) { setState(() {}); } }); - MessageService().subscribe(Constants.messageTopicJobReceived, jobsMap, (jobdMessage) async { - if (jobsMap.containsKey(jobdMessage.job.id)) { - jobsMap.removeWhere((key, value) => key == jobdMessage.job.id); - } + MessageService().subscribe(Constants.messageTopicJobReceived, jobsSet, (jobdMessage) async { + jobsSet.removeWhere((value) => value.id == jobdMessage.job.id); - jobsMap[jobdMessage.job.id] = jobdMessage.job; + jobsSet.add(jobdMessage.job); if (context.mounted) { setState(() {}); @@ -69,15 +73,9 @@ Future showAcceptJobsPopup(BuildContext context, List jobs) async { height: 100, padding: const EdgeInsets.all(5), child: ListView.builder( - itemCount: jobsMap.length, + itemCount: jobsSet.length, itemBuilder: (_, i) { - var job = jobsMap.values.toList()[i]; - - String remarkString = ''; - for (var remark in job.rem) { - remarkString += '$remark\n'; - } - remarkString = remarkString.trim(); + var job = jobsSet.toList()[i]; return ExpandableNotifier( child: ListTile( @@ -161,7 +159,7 @@ Future showAcceptJobsPopup(BuildContext context, List jobs) async { ), child: Padding( padding: const EdgeInsets.all(8.0), - child: Text(remarkString), + child: Text(job.rem), ), ), ], @@ -175,7 +173,7 @@ Future showAcceptJobsPopup(BuildContext context, List jobs) async { () { _sendAnswer(job, !job.global ? 2 : 3); - jobsMap.removeWhere((key, value) => key == job.id); + jobsSet.removeWhere((value) => value.id == job.id); setState(() {}); }), @@ -185,7 +183,7 @@ Future showAcceptJobsPopup(BuildContext context, List jobs) async { child: getDefaultButton('Annehmen', () { _sendAnswer(job, 1); - jobsMap.removeWhere((key, value) => key == job.id); + jobsSet.removeWhere((value) => value.id == job.id); setState(() {}); }), @@ -215,9 +213,9 @@ _sendAnswer(Job job, int item) { message.track = Track(); message.track.time = DateTime.now().toUtc().toIso8601String(); message.track.pos = FinTaskPos(); - message.track.pos.lat = currentPosition != null ? currentPosition.latitude : 0.0; - message.track.pos.long = currentPosition != null ? currentPosition.longitude : 0.0; - message.track.pos.acc = currentPosition != null ? currentPosition.accuracy.toInt() : 0; + message.track.pos!.lat = currentPosition != null ? currentPosition.latitude : 0.0; + message.track.pos!.long = currentPosition != null ? currentPosition.longitude : 0.0; + message.track.pos!.acc = currentPosition != null ? currentPosition.accuracy.toInt() : 0; MqttCore.instance.publishText("reaction", jsonEncode(message.toJson())); diff --git a/lib/protocoll_messages/acknowledge_job.dart b/lib/protocoll_messages/acknowledge_job.dart index 6fb92e2..a1502f3 100644 --- a/lib/protocoll_messages/acknowledge_job.dart +++ b/lib/protocoll_messages/acknowledge_job.dart @@ -1,4 +1,3 @@ -import 'package:isar/isar.dart'; import 'package:json_annotation/json_annotation.dart'; part 'acknowledge_job.g.dart'; diff --git a/lib/protocoll_messages/bootstrap_response_payload.dart b/lib/protocoll_messages/bootstrap_response_payload.dart index 41281e6..3cf8dba 100644 --- a/lib/protocoll_messages/bootstrap_response_payload.dart +++ b/lib/protocoll_messages/bootstrap_response_payload.dart @@ -1,5 +1,4 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:stadtbote/protocoll_messages/bootstrap_response_config.dart'; part 'bootstrap_response_payload.g.dart'; diff --git a/lib/protocoll_messages/logout_message.g.dart b/lib/protocoll_messages/logout_message.g.dart index ffbfb87..e9401e2 100644 --- a/lib/protocoll_messages/logout_message.g.dart +++ b/lib/protocoll_messages/logout_message.g.dart @@ -8,12 +8,27 @@ part of 'logout_message.dart'; LogoutMessage _$LogoutMessageFromJson(Map json) => LogoutMessage() + ..logout = json['logout'] as bool + ..pos = json['pos'] == null + ? null + : LogoutMessagePosition.fromJson(json['pos'] as Map); + +Map _$LogoutMessageToJson(LogoutMessage instance) => + { + 'logout': instance.logout, + 'pos': instance.pos, + }; + +LogoutMessagePosition _$LogoutMessagePositionFromJson( + Map json) => + LogoutMessagePosition() ..time = json['time'] as String ..lat = (json['lat'] as num).toDouble() ..long = (json['long'] as num).toDouble() ..acc = json['acc'] as int; -Map _$LogoutMessageToJson(LogoutMessage instance) => +Map _$LogoutMessagePositionToJson( + LogoutMessagePosition instance) => { 'time': instance.time, 'lat': instance.lat, diff --git a/lib/protocoll_messages/start_session_message.dart b/lib/protocoll_messages/start_session_message.dart index da279d5..8d2f6a9 100644 --- a/lib/protocoll_messages/start_session_message.dart +++ b/lib/protocoll_messages/start_session_message.dart @@ -1,6 +1,4 @@ -import 'package:isar/isar.dart'; import 'package:json_annotation/json_annotation.dart'; -import 'package:stadtbote/tools/util.dart'; part 'start_session_message.g.dart'; diff --git a/lib/tools/constants.dart b/lib/tools/constants.dart index 2f7d228..775341a 100644 --- a/lib/tools/constants.dart +++ b/lib/tools/constants.dart @@ -11,7 +11,7 @@ class Constants { static const String messageTopicRankingUpdated = "ranking_updated"; static const String messageTopicJobReceived = "job_received"; static const String messageTopicJobDeleted = "job_deleted"; - static const String messageTopicUpdateBadges = "update_badges"; + static const String messageTopicRefreshBadges = "refresh_badges"; static const String messageTopicMessageReceived = "message_received"; static const String messageTopicPushContentView = "push_content_view"; static const String messageTopicPopContentView = "pop_content_view"; diff --git a/lib/tools/messages/update_badges_message.dart b/lib/tools/messages/update_badges_message.dart deleted file mode 100644 index c6041d7..0000000 --- a/lib/tools/messages/update_badges_message.dart +++ /dev/null @@ -1,4 +0,0 @@ - -class UpdateBadgesMessage { - UpdateBadgesMessage(); -} \ No newline at end of file diff --git a/lib/tools/mqtt_core.dart b/lib/tools/mqtt_core.dart index 6fb3b1a..8fd8357 100644 --- a/lib/tools/mqtt_core.dart +++ b/lib/tools/mqtt_core.dart @@ -9,7 +9,6 @@ import 'package:mqtt_client/mqtt_client.dart'; import 'package:mqtt_client/mqtt_server_client.dart'; import 'package:stadtbote/model/enqueued_message.dart'; import 'package:stadtbote/model/log_entry.dart'; -import 'package:stadtbote/model/ranking.dart'; import 'package:stadtbote/model/status.dart'; import 'package:stadtbote/protocoll_messages/acknowledge_job.dart'; import 'package:stadtbote/protocoll_messages/bootstrap_request.dart'; @@ -28,7 +27,6 @@ import 'package:stadtbote/tools/message_service.dart'; import 'package:stadtbote/tools/messages/job_deleted_message.dart'; import 'package:stadtbote/tools/messages/job_received_message.dart'; import 'package:stadtbote/tools/messages/message_message.dart'; -import 'package:stadtbote/tools/messages/ranking_updated.dart'; import 'package:stadtbote/tools/messages/session_info_update.dart'; import 'package:stadtbote/tools/messages/status_info_update.dart'; // ignore: depend_on_referenced_packages @@ -269,7 +267,7 @@ class MqttCore { } void _rankingMessageReceived(List payloadData) async { - Map rankingMap = {}; + /*Map rankingMap = {}; rankingMap["ranks"] = payloadData; var ranking = Ranking.fromJson(rankingMap); @@ -277,7 +275,7 @@ class MqttCore { await MyApp.isarInstance.rankings.put(ranking); }); - MessageService().publish(Constants.messageTopicRankingUpdated, arguments: RankingUpdated()); + MessageService().publish(Constants.messageTopicRankingUpdated, arguments: RankingUpdated());*/ } void _jobMessageReceived(payloadData) async { @@ -306,17 +304,14 @@ class MqttCore { } } - void _jobDeleteReceived(List payloadData) async { - Map map = {}; - map["jobDel"] = payloadData; - var jobDelMessage = JobDelMessage.fromJson(map); - - for(var jobId in jobDelMessage.jobDel) { + void _jobDeleteReceived(payloadData) async { + for(var jobId in payloadData) { await MyApp.isarInstance.writeTxn(() async { await MyApp.isarInstance.jobs.delete(jobId); }); - MessageService().publish(Constants.messageTopicJobDeleted, arguments: JobDeletedMessage(id: jobDelMessage.id)); + MessageService().publish(Constants.messageTopicJobDeleted, arguments: JobDeletedMessage(id: jobId)); + } } void _syncRequestReceived(payloadData) async { @@ -325,7 +320,7 @@ class MqttCore { _sendSyncMessage(); } - void _messageMessageReceived(payloadData) async { + void _messageMessageReceived(Map payloadData) async { var newMessage = await Message.mergeFromJson(payloadData); await MyApp.isarInstance.writeTxn(() async { @@ -337,6 +332,22 @@ class MqttCore { MessageService().publish(Constants.messageTopicMessageReceived, arguments: MessageReceivedMessage(message: newMessage)); } + void _messageUploadDeviceLogReceived(payloadData) async { + var deviceLogRequest = DeviceLogRequest.fromJson(payloadData); + + var logEintries = await MyApp.isarInstance.logEntrys.filter().timeGreaterThan(deviceLogRequest.startDateTime).findAll(); + + var deviceLog = DeviceLogResponse(); + deviceLog.entries = logEintries; + + var json = jsonEncode(deviceLog.toJson()); + var stringBytes = utf8.encode(json); + var gzipBytes = GZipEncoder().encode(stringBytes); + + var topic = "/log/${_toServerTopic.replaceAll("/app/", "").replaceAll("/to_server", "")}"; + publishBinary(topic, gzipBytes!); + } + void _startReconnectTimer() { connectionState = ConnectionStateEnum.notConnected; @@ -390,24 +401,21 @@ class MqttCore { handshakeMessage.deviceObject = deviceObject; handshakeMessage.ver = await Util.getAppVersion(); - //var jsonMap = handshakeMessage.toJson(); - //var json = jsonEncode(jsonMap); - var uri = "http://test-app-server.dns.army:8080/bootstrap"; + var jsonMap = handshakeMessage.toJson(); + var json = jsonEncode(jsonMap); + var uri = "https://init-x.assecutor.de/bootstrap?get_mqtt_broker=$json"; Util.logInfo("Bootstrap request: $uri"); var response = await http.get(Uri.parse(uri)); - responseText = response.body; + var responseText = response.body; - Util.logInfo("Bootstrap response: $responseText"); + var bootstrapResponsePayload = BootstrapResponse.fromJson(jsonDecode(responseText)["payload"]); - var bootstrapResponse = BootstrapResponse.fromJson(jsonDecode(responseText)); - - var brokerUriAndPortArray = bootstrapResponse.broker.replaceFirst("mqtt://", "").split(":"); + var brokerUriAndPortArray = bootstrapResponsePayload.broker.replaceFirst("mqtt://", "").split(":"); _brokerUri = brokerUriAndPortArray[0]; _brokerPort = int.parse(brokerUriAndPortArray[1]); - _clientId = bootstrapResponse.id; - _fromServerTopic = bootstrapResponse.fromServer; - _toServerTopic = bootstrapResponse.toServer; + _fromServerTopic = bootstrapResponsePayload.fromServer; + _toServerTopic = bootstrapResponsePayload.toServer; _connectToBroker(); } catch (ex) { @@ -438,23 +446,23 @@ class MqttCore { answer.sync.jobs.add(syncJob); } - MqttCore.instance.publishText("sync", jsonEncode(answer.toJson())); + MqttCore.instance.publishPayloadMessage("server", answer.toJson()); } void _startTrackTimer() { _trackTimer ??= Timer.periodic(const Duration(seconds: 60), (Timer t) { - var answer = MyApp.currentPosition; - if (answer != null) { - var trackMessage = TrackMessage(); - trackMessage.pos = TrackPosition(); - trackMessage.pos!.time = position.timestamp.toIso8601String(); - trackMessage.pos!.lat = position.latitude; - trackMessage.pos!.long = position.longitude; - trackMessage.pos!.acc = position.accuracy.toInt(); + var position = MyApp.currentPosition; + if (position != null) { + var trackMessage = TrackMessage(); + trackMessage.pos = TrackPosition(); + trackMessage.pos!.time = position.timestamp.toIso8601String(); + trackMessage.pos!.lat = position.latitude; + trackMessage.pos!.long = position.longitude; + trackMessage.pos!.acc = position.accuracy.toInt(); - publishPayloadMessage("track", trackMessage.toJson()); - } - }); + publishPayloadMessage("track", trackMessage.toJson()); + } + }); } void _cancelTrackTimer() { diff --git a/lib/tools/util.dart b/lib/tools/util.dart index 20b3652..bbc8881 100644 --- a/lib/tools/util.dart +++ b/lib/tools/util.dart @@ -4,7 +4,7 @@ import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:image_picker/image_picker.dart'; -import 'package:package_info/package_info.dart'; +import 'package:package_info_plus/package_info_plus.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:stadtbote/main.dart'; import 'package:stadtbote/model/job.dart'; diff --git a/pubspec.lock b/pubspec.lock index 249c53a..052d3e7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -305,6 +305,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: "77f757b789ff68e4eaf9c56d1752309bd9f7ad557cb105b938a7f8eb89e59110" + url: "https://pub.dev" + source: hosted + version: "9.1.2" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 + url: "https://pub.dev" + source: hosted + version: "7.0.0" diffutil_dart: dependency: transitive description: @@ -912,6 +928,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "88bc797f44a94814f2213db1c9bd5badebafdfb8290ca9f78d4b9ee2a3db4d79" + url: "https://pub.dev" + source: hosted + version: "5.0.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.dev" + source: hosted + version: "2.0.1" path: dependency: transitive description: @@ -1469,6 +1501,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.2.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "41fd8a189940d8696b1b810efb9abcf60827b6cbfab90b0c43e8439e3a39d85a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" wkt_parser: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 44d9f98..a84e975 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 5.0.0+1 +version: 300.0.0+300 environment: sdk: '>=2.19.6 <3.0.0' @@ -68,6 +68,8 @@ dependencies: url_launcher: ^6.2.4 audioplayers: ^5.2.1 flutter_launcher_icons: ^0.13.1 + package_info_plus: ^5.0.1 + device_info_plus: ^9.1.2 dev_dependencies: flutter_test: