From 31a292e8d021a047bed8ed33e5512bbeaac61c04 Mon Sep 17 00:00:00 2001 From: Sven Carstensen Date: Mon, 8 Apr 2024 10:22:12 +0200 Subject: [PATCH 1/3] Umbau MQTT --- assets/json/bootstrap_response.json | 6 + lib/model/rank.dart | 41 + lib/model/rank.g.dart | 1086 +++++++++++++++++ .../messages/refresh_badges_message.dart | 4 + lib/tools/mqtt_core.dart | 42 +- pubspec.yaml | 2 +- 6 files changed, 1160 insertions(+), 21 deletions(-) create mode 100644 assets/json/bootstrap_response.json create mode 100644 lib/model/rank.dart create mode 100644 lib/model/rank.g.dart create mode 100644 lib/tools/messages/refresh_badges_message.dart diff --git a/assets/json/bootstrap_response.json b/assets/json/bootstrap_response.json new file mode 100644 index 0000000..3209fdd --- /dev/null +++ b/assets/json/bootstrap_response.json @@ -0,0 +1,6 @@ +{ + "broker": "mqtt://18.156.72.225:1883", + "id": "100/1/104400", + "to_server": "/appserver/to_server/", + "from_server": "/appserver/from_server/" +} \ No newline at end of file diff --git a/lib/model/rank.dart b/lib/model/rank.dart new file mode 100644 index 0000000..a2f852d --- /dev/null +++ b/lib/model/rank.dart @@ -0,0 +1,41 @@ +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'rank.g.dart'; + +@collection +@JsonSerializable() +class Ranking { + late Id id; + + late String zip; + + late String area; + + late int time; + + late List vehicles; + + Ranking(); + + factory Ranking.fromJson(Map json) => _$RankingFromJson(json); + + Map toJson() => _$RankingToJson(this); +} + +@embedded +@JsonSerializable() +class Vehicle { + late int id; + + late int type; + + @JsonKey(name: 'self', defaultValue: false) + late bool? self; + + Vehicle(); + + factory Vehicle.fromJson(Map json) => _$VehicleFromJson(json); + + Map toJson() => _$VehicleToJson(this); +} diff --git a/lib/model/rank.g.dart b/lib/model/rank.g.dart new file mode 100644 index 0000000..a92b507 --- /dev/null +++ b/lib/model/rank.g.dart @@ -0,0 +1,1086 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'rank.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetRankingCollection on Isar { + IsarCollection get rankings => this.collection(); +} + +const RankingSchema = CollectionSchema( + name: r'Ranking', + id: 923686411839286896, + properties: { + r'area': PropertySchema( + id: 0, + name: r'area', + type: IsarType.string, + ), + r'time': PropertySchema( + id: 1, + name: r'time', + type: IsarType.long, + ), + r'vehicles': PropertySchema( + id: 2, + name: r'vehicles', + type: IsarType.objectList, + target: r'Vehicle', + ), + r'zip': PropertySchema( + id: 3, + name: r'zip', + type: IsarType.string, + ) + }, + estimateSize: _rankingEstimateSize, + serialize: _rankingSerialize, + deserialize: _rankingDeserialize, + deserializeProp: _rankingDeserializeProp, + idName: r'id', + indexes: {}, + links: {}, + embeddedSchemas: {r'Vehicle': VehicleSchema}, + getId: _rankingGetId, + getLinks: _rankingGetLinks, + attach: _rankingAttach, + version: '3.1.0+1', +); + +int _rankingEstimateSize( + Ranking object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + bytesCount += 3 + object.area.length * 3; + bytesCount += 3 + object.vehicles.length * 3; + { + final offsets = allOffsets[Vehicle]!; + for (var i = 0; i < object.vehicles.length; i++) { + final value = object.vehicles[i]; + bytesCount += VehicleSchema.estimateSize(value, offsets, allOffsets); + } + } + bytesCount += 3 + object.zip.length * 3; + return bytesCount; +} + +void _rankingSerialize( + Ranking object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.area); + writer.writeLong(offsets[1], object.time); + writer.writeObjectList( + offsets[2], + allOffsets, + VehicleSchema.serialize, + object.vehicles, + ); + writer.writeString(offsets[3], object.zip); +} + +Ranking _rankingDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = Ranking(); + object.area = reader.readString(offsets[0]); + object.id = id; + object.time = reader.readLong(offsets[1]); + object.vehicles = reader.readObjectList( + offsets[2], + VehicleSchema.deserialize, + allOffsets, + Vehicle(), + ) ?? + []; + object.zip = reader.readString(offsets[3]); + return object; +} + +P _rankingDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readString(offset)) as P; + case 1: + return (reader.readLong(offset)) as P; + case 2: + return (reader.readObjectList( + offset, + VehicleSchema.deserialize, + allOffsets, + Vehicle(), + ) ?? + []) as P; + case 3: + return (reader.readString(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _rankingGetId(Ranking object) { + return object.id; +} + +List> _rankingGetLinks(Ranking object) { + return []; +} + +void _rankingAttach(IsarCollection col, Id id, Ranking object) { + object.id = id; +} + +extension RankingQueryWhereSort on QueryBuilder { + QueryBuilder anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension RankingQueryWhere on QueryBuilder { + QueryBuilder idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder idNotEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ); + } + }); + } + + QueryBuilder idGreaterThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder idBetween( + Id lowerId, + Id upperId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + )); + }); + } +} + +extension RankingQueryFilter + on QueryBuilder { + QueryBuilder areaEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'area', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder areaGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'area', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder areaLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'area', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder areaBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'area', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder areaStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'area', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder areaEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'area', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder areaContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'area', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder areaMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'area', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder areaIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'area', + value: '', + )); + }); + } + + QueryBuilder areaIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'area', + value: '', + )); + }); + } + + QueryBuilder idEqualTo(Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder timeEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'time', + value: value, + )); + }); + } + + QueryBuilder timeGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'time', + value: value, + )); + }); + } + + QueryBuilder timeLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'time', + value: value, + )); + }); + } + + QueryBuilder timeBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'time', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder vehiclesLengthEqualTo( + int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'vehicles', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder vehiclesIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'vehicles', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder vehiclesIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'vehicles', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder vehiclesLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'vehicles', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder + vehiclesLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'vehicles', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder vehiclesLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'vehicles', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + + QueryBuilder zipEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'zip', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder zipGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'zip', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder zipLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'zip', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder zipBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'zip', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder zipStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'zip', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder zipEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'zip', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder zipContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'zip', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder zipMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'zip', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder zipIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'zip', + value: '', + )); + }); + } + + QueryBuilder zipIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'zip', + value: '', + )); + }); + } +} + +extension RankingQueryObject + on QueryBuilder { + QueryBuilder vehiclesElement( + FilterQuery q) { + return QueryBuilder.apply(this, (query) { + return query.object(q, r'vehicles'); + }); + } +} + +extension RankingQueryLinks + on QueryBuilder {} + +extension RankingQuerySortBy on QueryBuilder { + QueryBuilder sortByArea() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'area', Sort.asc); + }); + } + + QueryBuilder sortByAreaDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'area', Sort.desc); + }); + } + + QueryBuilder sortByTime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'time', Sort.asc); + }); + } + + QueryBuilder sortByTimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'time', Sort.desc); + }); + } + + QueryBuilder sortByZip() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'zip', Sort.asc); + }); + } + + QueryBuilder sortByZipDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'zip', Sort.desc); + }); + } +} + +extension RankingQuerySortThenBy + on QueryBuilder { + QueryBuilder thenByArea() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'area', Sort.asc); + }); + } + + QueryBuilder thenByAreaDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'area', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByTime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'time', Sort.asc); + }); + } + + QueryBuilder thenByTimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'time', Sort.desc); + }); + } + + QueryBuilder thenByZip() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'zip', Sort.asc); + }); + } + + QueryBuilder thenByZipDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'zip', Sort.desc); + }); + } +} + +extension RankingQueryWhereDistinct + on QueryBuilder { + QueryBuilder distinctByArea( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'area', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByTime() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'time'); + }); + } + + QueryBuilder distinctByZip( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'zip', caseSensitive: caseSensitive); + }); + } +} + +extension RankingQueryProperty + on QueryBuilder { + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder areaProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'area'); + }); + } + + QueryBuilder timeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'time'); + }); + } + + QueryBuilder, QQueryOperations> vehiclesProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'vehicles'); + }); + } + + QueryBuilder zipProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'zip'); + }); + } +} + +// ************************************************************************** +// IsarEmbeddedGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +const VehicleSchema = Schema( + name: r'Vehicle', + id: -21624847921258799, + properties: { + r'id': PropertySchema( + id: 0, + name: r'id', + type: IsarType.long, + ), + r'self': PropertySchema( + id: 1, + name: r'self', + type: IsarType.bool, + ), + r'type': PropertySchema( + id: 2, + name: r'type', + type: IsarType.long, + ) + }, + estimateSize: _vehicleEstimateSize, + serialize: _vehicleSerialize, + deserialize: _vehicleDeserialize, + deserializeProp: _vehicleDeserializeProp, +); + +int _vehicleEstimateSize( + Vehicle object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + return bytesCount; +} + +void _vehicleSerialize( + Vehicle object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeLong(offsets[0], object.id); + writer.writeBool(offsets[1], object.self); + writer.writeLong(offsets[2], object.type); +} + +Vehicle _vehicleDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = Vehicle(); + object.id = reader.readLong(offsets[0]); + object.self = reader.readBoolOrNull(offsets[1]); + object.type = reader.readLong(offsets[2]); + return object; +} + +P _vehicleDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readLong(offset)) as P; + case 1: + return (reader.readBoolOrNull(offset)) as P; + case 2: + return (reader.readLong(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +extension VehicleQueryFilter + on QueryBuilder { + QueryBuilder idEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder selfIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'self', + )); + }); + } + + QueryBuilder selfIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'self', + )); + }); + } + + QueryBuilder selfEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'self', + value: value, + )); + }); + } + + QueryBuilder typeEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'type', + value: value, + )); + }); + } + + QueryBuilder typeGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'type', + value: value, + )); + }); + } + + QueryBuilder typeLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'type', + value: value, + )); + }); + } + + QueryBuilder typeBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'type', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } +} + +extension VehicleQueryObject + on QueryBuilder {} + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Ranking _$RankingFromJson(Map json) => Ranking() + ..id = json['id'] as int + ..zip = json['zip'] as String + ..area = json['area'] as String + ..time = json['time'] as int + ..vehicles = (json['vehicles'] as List) + .map((e) => Vehicle.fromJson(e as Map)) + .toList(); + +Map _$RankingToJson(Ranking instance) => { + 'id': instance.id, + 'zip': instance.zip, + 'area': instance.area, + 'time': instance.time, + 'vehicles': instance.vehicles, + }; + +Vehicle _$VehicleFromJson(Map json) => Vehicle() + ..id = json['id'] as int + ..type = json['type'] as int + ..self = json['self'] as bool? ?? false; + +Map _$VehicleToJson(Vehicle instance) => { + 'id': instance.id, + 'type': instance.type, + 'self': instance.self, + }; diff --git a/lib/tools/messages/refresh_badges_message.dart b/lib/tools/messages/refresh_badges_message.dart new file mode 100644 index 0000000..fb61c3e --- /dev/null +++ b/lib/tools/messages/refresh_badges_message.dart @@ -0,0 +1,4 @@ + +class RefreshBadgesMessage { + RefreshBadgesMessage(); +} \ No newline at end of file diff --git a/lib/tools/mqtt_core.dart b/lib/tools/mqtt_core.dart index 8bc6b26..e2ba519 100644 --- a/lib/tools/mqtt_core.dart +++ b/lib/tools/mqtt_core.dart @@ -97,14 +97,14 @@ class MqttCore { _mqttClient = MqttServerClient.withPort(_brokerUri, clientId, _brokerPort); _mqttClient.logging(on: false); - _mqttClient.keepAlivePeriod = 20; - _mqttClient.autoReconnect = false; + _mqttClient.keepAlivePeriod = 5; + _mqttClient.disconnectOnNoResponsePeriod = 10; + _mqttClient.autoReconnect = true; _mqttClient.onDisconnected = _clientDisconnected; + _mqttClient.onAutoReconnect = _clientDisconnected; + _mqttClient.onAutoReconnected = _clientConnected; _mqttClient.connectionMessage = MqttConnectMessage() .withClientIdentifier(await Util.getAppUuid()) - .withWillQos(MqttQos.atMostOnce) - .withWillTopic('willTopic') - .withWillMessage('willMessage') .authenticateAs("app", "apppwd"); await _mqttClient.connect(); @@ -121,13 +121,9 @@ class MqttCore { Util.logInfo('Verbindung zum MQTT-Broker fehlgeschlagen!'); MessageService().publish(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected)); - - _startReconnectTimer(); } } catch (ex) { - _startReconnectTimer(); - Util.logInfo('Verbindung zum MQTT-Broker fehlgeschlagen!: $ex'); MessageService().publish(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected)); @@ -350,7 +346,7 @@ class MqttCore { publishBinary(topic, gzipBytes!); } - void _startReconnectTimer() { + void _startBootstrapReconnectTimer() { connectionState = ConnectionStateEnum.notConnected; if (!_disconnectInProgress) { @@ -371,17 +367,23 @@ class MqttCore { } void _clientDisconnected() { - connectionState = ConnectionStateEnum.notConnected; - - _cancelTrackTimer(); - Util.logInfo("_clientDisconnected called"); - MessageService().publish(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected)); + connectionState = ConnectionStateEnum.notConnected; - if (!_disconnectInProgress) { - _startReconnectTimer(); - } + _startTrackTimer(); + + MessageService().publish(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected)); + } + + void _clientConnected() { + Util.logInfo("_clientDisconnected called"); + + connectionState = ConnectionStateEnum.connected; + + _initSession(); + + MessageService().publish(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.connected)); } void _processBootstrap() async { @@ -405,7 +407,7 @@ class MqttCore { var jsonMap = handshakeMessage.toJson(); var json = jsonEncode(jsonMap); - var uri = "https://init-x.assecutor.de/bootstrap?get_mqtt_broker=$json"; + String uri = "https://init-x.assecutor.de/bootstrap?get_mqtt_broker=$json"; Util.logInfo("Bootstrap request: $uri"); var response = await http.get(Uri.parse(uri)); @@ -421,7 +423,7 @@ class MqttCore { _connectToBroker(); } catch (ex) { - _startReconnectTimer(); + _startBootstrapReconnectTimer(); } } diff --git a/pubspec.yaml b/pubspec.yaml index 8e6dba2..d021e06 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: 220.0.0+11 +version: 221.0.0+12 environment: sdk: '>=2.19.6 <3.0.0' From 32d3a8d5671c741f220616235a1e570bdd2e98ed Mon Sep 17 00:00:00 2001 From: Sven Carstensen Date: Tue, 9 Apr 2024 09:57:21 +0200 Subject: [PATCH 2/3] Job-Bemerkungen anzeigen --- integration_test/job_test.dart | 27 +++++++++++ lib/content_views/accepted_jobs_page.dart | 10 +++++ pubspec.lock | 55 +++++++++++++++++++++-- pubspec.yaml | 4 +- 4 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 integration_test/job_test.dart diff --git a/integration_test/job_test.dart b/integration_test/job_test.dart new file mode 100644 index 0000000..7d30f97 --- /dev/null +++ b/integration_test/job_test.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:stadtbote/main.dart'; + +void main() { + testWidgets('tap on the floating action button, verify counter', + (tester) async { + // Load app widget. + await tester.pumpWidget(MyApp()); + + // Verify the counter starts at 0. + expect(find.text('HH1091'), findsOneWidget); + + // Finds the floating action button to tap on. + //final fab = find.byKey(const Key('increment')); + + // Emulate a tap on the floating action button. + //await tester.tap(fab); + + // Trigger a frame. + //await tester.pumpAndSettle(); + + // Verify the counter increments by 1. + //expect(find.text('0'), findsNothing); + //expect(find.text('1'), findsOneWidget); + }); +} \ No newline at end of file diff --git a/lib/content_views/accepted_jobs_page.dart b/lib/content_views/accepted_jobs_page.dart index 6bb1b63..e74b149 100644 --- a/lib/content_views/accepted_jobs_page.dart +++ b/lib/content_views/accepted_jobs_page.dart @@ -77,6 +77,12 @@ class _AcceptedJobsPageState extends State { List jobWidgets = []; for (var job in _jobs) { + String remarkString = ''; + for (var remark in job.rem) { + remarkString += '$remark\n'; + } + remarkString = remarkString.trim(); + jobWidgets.add( ListTile( onTap: () { @@ -111,6 +117,10 @@ class _AcceptedJobsPageState extends State { ), ], ), + Text( + remarkString, + textAlign: TextAlign.left, + ), Text( job.id.toString(), textAlign: TextAlign.left, diff --git a/pubspec.lock b/pubspec.lock index f8bb3f9..4e2765f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -389,10 +389,10 @@ packages: dependency: transitive description: name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "6.1.4" file_selector_linux: dependency: transitive description: @@ -462,6 +462,11 @@ packages: url: "https://pub.dev" source: hosted version: "1.6.12" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_launcher_icons: dependency: "direct dev" description: @@ -568,6 +573,11 @@ packages: url: "https://pub.dev" source: hosted version: "3.2.0" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" geolocator: dependency: "direct main" description: @@ -744,6 +754,11 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1+1" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: "direct main" description: @@ -1052,10 +1067,10 @@ packages: dependency: transitive description: name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102 url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.2" plugin_platform_interface: dependency: transitive description: @@ -1088,6 +1103,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" + process: + dependency: transitive + description: + name: process + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" + source: hosted + version: "4.2.4" proj4dart: dependency: transitive description: @@ -1277,6 +1300,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + sync_http: + dependency: transitive + description: + name: sync_http + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" + source: hosted + version: "0.3.1" synchronized: dependency: transitive description: @@ -1453,6 +1484,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.0+2" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 + url: "https://pub.dev" + source: hosted + version: "11.10.0" watcher: dependency: transitive description: @@ -1477,6 +1516,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.0" + webdriver: + dependency: transitive + description: + name: webdriver + sha256: "3c923e918918feeb90c4c9fdf1fe39220fa4c0e8e2c0fffaded174498ef86c49" + url: "https://pub.dev" + source: hosted + version: "3.0.2" win32: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index d021e06..a74c416 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: 221.0.0+12 +version: 222.0.0+222 environment: sdk: '>=2.19.6 <3.0.0' @@ -86,6 +86,8 @@ dev_dependencies: # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^2.0.0 + integration_test: + sdk: flutter # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec From bca0ae78ebc539906814cd75b873a3df59156d51 Mon Sep 17 00:00:00 2001 From: Sven Carstensen Date: Tue, 9 Apr 2024 10:18:03 +0200 Subject: [PATCH 3/3] Warnings beim erstellen der APK behoben --- android/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 713d7f6..4dd6b12 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,12 +1,12 @@ buildscript { - ext.kotlin_version = '1.7.10' + ext.kotlin_version = '1.8.0' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.2.0' + classpath 'com.android.tools.build:gradle:7.2.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } }