This commit is contained in:
Sven committed 2024-03-26 13:35:20 +01:00
1 parent 880cdd65ff
commit 8586a23bfa
19 files changed
+179 -220

No files matched your search

+9 -15
View File
@@ -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<ApproachAreaPage> {
late Ranking? _ranking;
//late Ranking? _ranking;
late bool _initCompleted = false;
@@ -53,7 +47,7 @@ class _ApproachAreaPageState extends State<ApproachAreaPage> {
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<ApproachAreaPage> {
List<Widget> _fillColumns() {
List<Widget> 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<ApproachAreaPage> {
),
));
}
}
}*/
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<ApproachAreaPage> {
}
MqttCore.instance.publishPayloadMessage("rank", zipMessage.toJson());
}
}*/
_initMessages() {
MessageService().subscribe<RankingUpdated>(Constants.messageTopicRankingUpdated, this, (rankingUpdateMessage) async {
/*MessageService().subscribe<RankingUpdated>(Constants.messageTopicRankingUpdated, this, (rankingUpdateMessage) async {
_ranking = await MyApp.isarInstance.rankings.where().findFirst();
setState(() {});
});
});*/
}
}
+8 -10
View File
@@ -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<AssignedJobsPage> {
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<AssignedJobsPage> {
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<AssignedJobsPage> {
setState(() {});
}
void _initMessages() {}
}
+7 -13
View File
@@ -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<MainPage> {
_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<MainPage> {
_refreshBadges();
});
MessageService().subscribe<UpdateBadgesMessage>(Constants.messageTopicUpdateBadges, this, (UpdateBadgesMessage message) {
MessageService().subscribe<RefreshBadgesMessage>(Constants.messageTopicRefreshBadges, this, (RefreshBadgesMessage message) {
_refreshBadges();
});
}
@@ -380,10 +374,10 @@ class _MainPageState extends State<MainPage> {
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()));
-2
View File
@@ -109,8 +109,6 @@ class _MessagesPageState extends State<MessagesPage> {
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(
+10 -11
View File
@@ -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<TaskListPage> {
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<TaskListPage> {
Future<List<TaskInfo>> _fetchTaskList() async {
List<TaskInfo> 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<TaskListPage> {
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<TaskListPage> {
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<TaskListPage> {
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 = [];
+2 -4
View File
@@ -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<void> main() async {
JobSchema,
TaskInfoSchema,
MessageSchema,
RankingSchema,
EnqueuedMessageSchema,
LogEntrySchema
], directory: dir.path);
@@ -434,7 +432,7 @@ class _MainState extends State<Main> 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());
});
}
}
+1 -1
View File
@@ -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')
+13 -90
View File
@@ -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<P>(
) ??
[]) 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<Job, Job, QFilterCondition> {
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verEqualTo(
String value, {
bool caseSensitive = true,
}) {
QueryBuilder<Job, Job, QAfterFilterCondition> verEqualTo(int value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'ver',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> 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<Job, Job, QAfterFilterCondition> 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<Job, Job, QAfterFilterCondition> 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<Job, Job, QFilterCondition> {
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'ver',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'ver',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verContains(String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'ver',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verMatches(String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'ver',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'ver',
value: '',
));
});
}
QueryBuilder<Job, Job, QAfterFilterCondition> verIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'ver',
value: '',
));
});
}
@@ -1368,9 +1291,9 @@ extension JobQueryWhereDistinct on QueryBuilder<Job, Job, QDistinct> {
});
}
QueryBuilder<Job, Job, QDistinct> distinctByVer({bool caseSensitive = true}) {
QueryBuilder<Job, Job, QDistinct> 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<Job, Job, QQueryProperty> {
});
}
QueryBuilder<Job, String, QQueryOperations> verProperty() {
QueryBuilder<Job, int, QQueryOperations> verProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'ver');
});
@@ -1460,7 +1383,7 @@ Map<String, dynamic> _$JobsPayloadToJson(JobsPayload instance) =>
Job _$JobFromJson(Map<String, dynamic> 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
+25 -27
View File
@@ -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<void> showAcceptJobsPopup(BuildContext context, List<Job> jobs) async {
Future<void> showAcceptJobsPopup(BuildContext context, List<Job> jobs, Function() onFinished) async {
var jobsSet = jobs.toSet();
await showDialog<void>(
@@ -18,8 +24,8 @@ Future<void> showAcceptJobsPopup(BuildContext context, List<Job> 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<void> showAcceptJobsPopup(BuildContext context, List<Job> 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<JobDeletedMessage>(Constants.messageTopicJobDeleted, jobsMap, (jobDeletedMessage) async {
jobsMap.removeWhere((key, value) => key == jobDeletedMessage.jobId);
MessageService().subscribe<JobDeletedMessage>(Constants.messageTopicJobDeleted, jobsSet, (jobDeletedMessage) async {
jobsSet.removeWhere((value) => value.id == jobDeletedMessage.id);
if (context.mounted) {
setState(() {});
}
});
MessageService().subscribe<JobReceivedMessage>(Constants.messageTopicJobReceived, jobsMap, (jobdMessage) async {
if (jobsMap.containsKey(jobdMessage.job.id)) {
jobsMap.removeWhere((key, value) => key == jobdMessage.job.id);
}
MessageService().subscribe<JobReceivedMessage>(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<void> showAcceptJobsPopup(BuildContext context, List<Job> 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<void> showAcceptJobsPopup(BuildContext context, List<Job> jobs) async {
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(remarkString),
child: Text(job.rem),
),
),
],
@@ -175,7 +173,7 @@ Future<void> showAcceptJobsPopup(BuildContext context, List<Job> 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<void> showAcceptJobsPopup(BuildContext context, List<Job> 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()));
@@ -1,4 +1,3 @@
import 'package:isar/isar.dart';
import 'package:json_annotation/json_annotation.dart';
part 'acknowledge_job.g.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';
+16 -1
View File
@@ -8,12 +8,27 @@ part of 'logout_message.dart';
LogoutMessage _$LogoutMessageFromJson(Map<String, dynamic> json) =>
LogoutMessage()
..logout = json['logout'] as bool
..pos = json['pos'] == null
? null
: LogoutMessagePosition.fromJson(json['pos'] as Map<String, dynamic>);
Map<String, dynamic> _$LogoutMessageToJson(LogoutMessage instance) =>
<String, dynamic>{
'logout': instance.logout,
'pos': instance.pos,
};
LogoutMessagePosition _$LogoutMessagePositionFromJson(
Map<String, dynamic> 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<String, dynamic> _$LogoutMessageToJson(LogoutMessage instance) =>
Map<String, dynamic> _$LogoutMessagePositionToJson(
LogoutMessagePosition instance) =>
<String, dynamic>{
'time': instance.time,
'lat': instance.lat,
@@ -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';
+1 -1
View File
@@ -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";
@@ -1,4 +0,0 @@
class UpdateBadgesMessage {
UpdateBadgesMessage();
}
+43 -35
View File
@@ -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<dynamic> payloadData) async {
Map<String, dynamic> rankingMap = {};
/*Map<String, dynamic> rankingMap = {};
rankingMap["ranks"] = payloadData;
var ranking = Ranking.fromJson(rankingMap);
@@ -277,7 +275,7 @@ class MqttCore {
await MyApp.isarInstance.rankings.put(ranking);
});
MessageService().publish<RankingUpdated>(Constants.messageTopicRankingUpdated, arguments: RankingUpdated());
MessageService().publish<RankingUpdated>(Constants.messageTopicRankingUpdated, arguments: RankingUpdated());*/
}
void _jobMessageReceived(payloadData) async {
@@ -306,17 +304,14 @@ class MqttCore {
}
}
void _jobDeleteReceived(List<dynamic> payloadData) async {
Map<String, dynamic> 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<JobDeletedMessage>(Constants.messageTopicJobDeleted, arguments: JobDeletedMessage(id: jobDelMessage.id));
MessageService().publish<JobDeletedMessage>(Constants.messageTopicJobDeleted, arguments: JobDeletedMessage(id: jobId));
}
}
void _syncRequestReceived(payloadData) async {
@@ -325,7 +320,7 @@ class MqttCore {
_sendSyncMessage();
}
void _messageMessageReceived(payloadData) async {
void _messageMessageReceived(Map<String, dynamic> payloadData) async {
var newMessage = await Message.mergeFromJson(payloadData);
await MyApp.isarInstance.writeTxn(() async {
@@ -337,6 +332,22 @@ class MqttCore {
MessageService().publish<MessageReceivedMessage>(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() {
+1 -1
View File
@@ -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';
+40
View File
@@ -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:
+3 -1
View File
@@ -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: