From 905206f242a80450419b14405d594daf2d8f8590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Tue, 11 Mar 2025 16:22:02 +0100 Subject: [PATCH 01/23] added missing implementation of "note to self", disabled breakers in debug environments --- lib/api/marianumcloud/talk/room/getRoomResponse.dart | 1 + lib/api/marianumcloud/talk/room/getRoomResponse.g.dart | 1 + lib/api/marianumcloud/talk/talkApi.dart | 8 +++----- lib/model/breakers/BreakerProps.dart | 3 +++ pubspec.yaml | 2 +- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/api/marianumcloud/talk/room/getRoomResponse.dart b/lib/api/marianumcloud/talk/room/getRoomResponse.dart index e8b9e27..10ae342 100644 --- a/lib/api/marianumcloud/talk/room/getRoomResponse.dart +++ b/lib/api/marianumcloud/talk/room/getRoomResponse.dart @@ -110,6 +110,7 @@ enum GetRoomResponseObjectConversationType { @JsonValue(3) public, @JsonValue(4) changelog, @JsonValue(5) deleted, + @JsonValue(6) noteToSelf, } enum GetRoomResponseObjectParticipantNotificationLevel { diff --git a/lib/api/marianumcloud/talk/room/getRoomResponse.g.dart b/lib/api/marianumcloud/talk/room/getRoomResponse.g.dart index f937b3b..738fc95 100644 --- a/lib/api/marianumcloud/talk/room/getRoomResponse.g.dart +++ b/lib/api/marianumcloud/talk/room/getRoomResponse.g.dart @@ -102,6 +102,7 @@ const _$GetRoomResponseObjectConversationTypeEnumMap = { GetRoomResponseObjectConversationType.public: 3, GetRoomResponseObjectConversationType.changelog: 4, GetRoomResponseObjectConversationType.deleted: 5, + GetRoomResponseObjectConversationType.noteToSelf: 6, }; const _$GetRoomResponseObjectParticipantNotificationLevelEnumMap = { diff --git a/lib/api/marianumcloud/talk/talkApi.dart b/lib/api/marianumcloud/talk/talkApi.dart index b90af22..e79340f 100644 --- a/lib/api/marianumcloud/talk/talkApi.dart +++ b/lib/api/marianumcloud/talk/talkApi.dart @@ -58,11 +58,9 @@ abstract class TalkApi extends ApiRequest { assembled?.headers = data.headers; return assembled; } catch (e) { - // TODO report error - log('Error assembling Talk API ${T.toString()} message: ${e.toString()} response on ${endpoint.path} with request body: $body and request headers: ${headers.toString()}'); + var message = 'Error assembling Talk API ${T.toString()} message: ${e.toString()} response with request body: $body and request headers: ${headers.toString()}'; + log(message); + throw Exception(message); } - - throw Exception('Error assembling Talk API response'); } - } diff --git a/lib/model/breakers/BreakerProps.dart b/lib/model/breakers/BreakerProps.dart index ec55ada..4386c2f 100644 --- a/lib/model/breakers/BreakerProps.dart +++ b/lib/model/breakers/BreakerProps.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:package_info_plus/package_info_plus.dart'; import '../../api/apiResponse.dart'; @@ -12,6 +13,8 @@ class BreakerProps extends DataHolder { PackageInfo? packageInfo; String? isBlocked(BreakerArea? type) { + if(kDebugMode) return null; + if(packageInfo == null) { PackageInfo.fromPlatform().then((value) => packageInfo = value); return null; diff --git a/pubspec.yaml b/pubspec.yaml index 7ad1cea..26cf04e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,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: 0.1.1+39 +version: 0.1.2+40 environment: sdk: '>3.0.0' From f0009dad8838df1c42d115e0167486a6c86d2097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Wed, 16 Apr 2025 13:15:31 +0200 Subject: [PATCH 02/23] renamed files back to localized string --- lib/state/app/modules/app_modules.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/state/app/modules/app_modules.dart b/lib/state/app/modules/app_modules.dart index 2af4ebc..ecda3a1 100644 --- a/lib/state/app/modules/app_modules.dart +++ b/lib/state/app/modules/app_modules.dart @@ -62,7 +62,7 @@ class AppModule { ), Modules.files: AppModule( Modules.files, - name: 'Files', + name: 'Dateien', icon: () => Icon(Icons.folder), breakerArea: BreakerArea.files, create: Files.new, From 9d0cf8e3134ebc175872fa334722f23c1d1fa360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Wed, 16 Apr 2025 13:16:49 +0200 Subject: [PATCH 03/23] bumped version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 26cf04e..fe83157 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,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: 0.1.2+40 +version: 0.1.3+41 environment: sdk: '>3.0.0' From c44b0464a48cd65b7dd4536df76fe19baa991ba9 Mon Sep 17 00:00:00 2001 From: lars Date: Tue, 10 Jun 2025 20:19:44 +0200 Subject: [PATCH 04/23] sorted participants list alphabetically --- .../participants/participantsListView.dart | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/view/pages/talk/chatDetails/participants/participantsListView.dart b/lib/view/pages/talk/chatDetails/participants/participantsListView.dart index 2bc863b..3741cc3 100644 --- a/lib/view/pages/talk/chatDetails/participants/participantsListView.dart +++ b/lib/view/pages/talk/chatDetails/participants/participantsListView.dart @@ -13,16 +13,23 @@ class ParticipantsListView extends StatefulWidget { class _ParticipantsListViewState extends State { @override - Widget build(BuildContext context) => Scaffold( + Widget build(BuildContext context) { + final participants = widget.participantsResponse.data.map((participant) => ListTile( + leading: UserAvatar(id: participant.actorId), + title: Text(participant.displayName), + subtitle: participant.statusMessage != null ? Text(participant.statusMessage!) : null, + )).toList(); + + lastname(participant) => participant.title.toString().split(' ').last; + participants.sort((a, b) => lastname(a).compareTo(lastname(b))); + + return Scaffold( appBar: AppBar( title: const Text('Teilnehmende'), ), body: ListView( - children: widget.participantsResponse.data.map((participant) => ListTile( - leading: UserAvatar(id: participant.actorId), - title: Text(participant.displayName), - subtitle: participant.statusMessage != null ? Text(participant.statusMessage!) : null, - )).toList(), + children: participants, ), ); + } } From da772f17cc306d3e2187a251b5931bf562b13d56 Mon Sep 17 00:00:00 2001 From: lars Date: Tue, 10 Jun 2025 21:35:12 +0200 Subject: [PATCH 05/23] changed file messages to show their text or their file name --- .../pages/talk/components/chatMessage.dart | 57 +++++++++++-------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/lib/view/pages/talk/components/chatMessage.dart b/lib/view/pages/talk/components/chatMessage.dart index 626d011..b60039a 100644 --- a/lib/view/pages/talk/components/chatMessage.dart +++ b/lib/view/pages/talk/components/chatMessage.dart @@ -21,39 +21,46 @@ class ChatMessage { ChatMessage({required this.originalMessage, this.originalData}) { if(originalData?.containsKey('file') ?? false) { file = originalData?['file']; - content = file?.name ?? 'Datei'; - } else { - content = RichObjectStringProcessor.parseToString(originalMessage, originalData); } + content = RichObjectStringProcessor.parseToString(originalMessage, originalData); } Widget getWidget() { - if(file == null) { - return Linkify( - text: content, - onOpen: onOpen, - ); - } + var contentWidget = Linkify( + text: content, + onOpen: onOpen, + ); - return Padding(padding: const EdgeInsets.only(top: 5), child: CachedNetworkImage( - errorWidget: (context, url, error) => Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, + if(file == null) return contentWidget; + + return Padding( + padding: const EdgeInsets.only(top: 5), + child: Column( children: [ - const Icon(Icons.file_open_outlined, size: 35), - const SizedBox(width: 10), - Flexible(child: Text(file!.name, maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.bold))), - const SizedBox(width: 10), + CachedNetworkImage( + errorWidget: (context, url, error) => Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Icon(Icons.file_open_outlined, size: 35), + const SizedBox(width: 10), + Flexible(child: Text(file!.name, maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.bold))), + const SizedBox(width: 10), + ], + ), + alignment: Alignment.center, + placeholder: (context, url) => const Padding(padding: EdgeInsets.all(15), child: SizedBox(width: 50, child: LinearProgressIndicator())), + fadeInDuration: Duration.zero, + fadeOutDuration: Duration.zero, + errorListener: (value) {}, + imageUrl: 'https://${AccountData().buildHttpAuthString()}@${EndpointData().nextcloud().full()}/index.php/core/preview?fileId=${file!.id}&x=100&y=-1&a=1', + ), + SizedBox(height: 5), + contentWidget ], - ), - alignment: Alignment.center, - placeholder: (context, url) => const Padding(padding: EdgeInsets.all(15), child: SizedBox(width: 50, child: LinearProgressIndicator())), - fadeInDuration: Duration.zero, - fadeOutDuration: Duration.zero, - errorListener: (value) {}, - imageUrl: 'https://${AccountData().buildHttpAuthString()}@${EndpointData().nextcloud().full()}/index.php/core/preview?fileId=${file!.id}&x=100&y=-1&a=1', - )); + ) + ); } Future onOpen(LinkableElement link) async { From 8000475c1fa1060ebc83d407726f1247dc82b0bb Mon Sep 17 00:00:00 2001 From: lars Date: Mon, 16 Jun 2025 16:07:04 +0200 Subject: [PATCH 06/23] aligned text to the left --- lib/view/pages/talk/components/chatMessage.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/view/pages/talk/components/chatMessage.dart b/lib/view/pages/talk/components/chatMessage.dart index b60039a..5f9b397 100644 --- a/lib/view/pages/talk/components/chatMessage.dart +++ b/lib/view/pages/talk/components/chatMessage.dart @@ -37,6 +37,7 @@ class ChatMessage { return Padding( padding: const EdgeInsets.only(top: 5), child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ CachedNetworkImage( errorWidget: (context, url, error) => Row( From 5938c6b3c3de953ff0bf57a118ea12793b347c1d Mon Sep 17 00:00:00 2001 From: lars Date: Mon, 23 Jun 2025 11:16:39 +0200 Subject: [PATCH 07/23] fixed chat search --- lib/api/marianumcloud/autocomplete/autocompleteApi.dart | 2 ++ lib/api/marianumcloud/autocomplete/autocompleteResponse.dart | 2 +- lib/api/marianumcloud/autocomplete/autocompleteResponse.g.dart | 2 +- lib/view/pages/talk/joinChat.dart | 3 +++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/api/marianumcloud/autocomplete/autocompleteApi.dart b/lib/api/marianumcloud/autocomplete/autocompleteApi.dart index f11b91c..ed58cc1 100644 --- a/lib/api/marianumcloud/autocomplete/autocompleteApi.dart +++ b/lib/api/marianumcloud/autocomplete/autocompleteApi.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:developer'; import 'dart:io'; import 'package:http/http.dart' as http; @@ -26,6 +27,7 @@ class AutocompleteApi { var response = await http.get(endpoint, headers: headers); if(response.statusCode != HttpStatus.ok) throw Exception('Api call failed with ${response.statusCode}: ${response.body}'); var result = response.body; + log(response.body); return AutocompleteResponse.fromJson(jsonDecode(result)['ocs']); } diff --git a/lib/api/marianumcloud/autocomplete/autocompleteResponse.dart b/lib/api/marianumcloud/autocomplete/autocompleteResponse.dart index 15e1ffc..8e72772 100644 --- a/lib/api/marianumcloud/autocomplete/autocompleteResponse.dart +++ b/lib/api/marianumcloud/autocomplete/autocompleteResponse.dart @@ -18,7 +18,7 @@ class AutocompleteResponseObject { String label; String? icon; String? source; - List? status; + String? status; String? subline; String? shareWithDisplayNameUniqe; diff --git a/lib/api/marianumcloud/autocomplete/autocompleteResponse.g.dart b/lib/api/marianumcloud/autocomplete/autocompleteResponse.g.dart index e029e0e..094f0b7 100644 --- a/lib/api/marianumcloud/autocomplete/autocompleteResponse.g.dart +++ b/lib/api/marianumcloud/autocomplete/autocompleteResponse.g.dart @@ -28,7 +28,7 @@ AutocompleteResponseObject _$AutocompleteResponseObjectFromJson( json['label'] as String, json['icon'] as String?, json['source'] as String?, - (json['status'] as List?)?.map((e) => e as String).toList(), + json['status'] as String?, json['subline'] as String?, json['shareWithDisplayNameUniqe'] as String?, ); diff --git a/lib/view/pages/talk/joinChat.dart b/lib/view/pages/talk/joinChat.dart index e51815a..5a9ea7b 100644 --- a/lib/view/pages/talk/joinChat.dart +++ b/lib/view/pages/talk/joinChat.dart @@ -1,4 +1,6 @@ +import 'dart:developer'; + import 'package:async/async.dart'; import 'package:flutter/material.dart'; @@ -76,6 +78,7 @@ class JoinChat extends SearchDelegate { } ); } else if(snapshot.hasError) { + log(snapshot.error.toString()); return const PlaceholderView(icon: Icons.search_off, text: 'Ein fehler ist aufgetreten. Bist du mit dem Internet verbunden?'); } From c702b610c576d69a7f154cab6f073a759b5c5ee6 Mon Sep 17 00:00:00 2001 From: lars Date: Mon, 23 Jun 2025 11:17:59 +0200 Subject: [PATCH 08/23] removed logging --- lib/api/marianumcloud/autocomplete/autocompleteApi.dart | 2 -- lib/view/pages/talk/joinChat.dart | 3 --- 2 files changed, 5 deletions(-) diff --git a/lib/api/marianumcloud/autocomplete/autocompleteApi.dart b/lib/api/marianumcloud/autocomplete/autocompleteApi.dart index ed58cc1..f11b91c 100644 --- a/lib/api/marianumcloud/autocomplete/autocompleteApi.dart +++ b/lib/api/marianumcloud/autocomplete/autocompleteApi.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'dart:developer'; import 'dart:io'; import 'package:http/http.dart' as http; @@ -27,7 +26,6 @@ class AutocompleteApi { var response = await http.get(endpoint, headers: headers); if(response.statusCode != HttpStatus.ok) throw Exception('Api call failed with ${response.statusCode}: ${response.body}'); var result = response.body; - log(response.body); return AutocompleteResponse.fromJson(jsonDecode(result)['ocs']); } diff --git a/lib/view/pages/talk/joinChat.dart b/lib/view/pages/talk/joinChat.dart index 5a9ea7b..e51815a 100644 --- a/lib/view/pages/talk/joinChat.dart +++ b/lib/view/pages/talk/joinChat.dart @@ -1,6 +1,4 @@ -import 'dart:developer'; - import 'package:async/async.dart'; import 'package:flutter/material.dart'; @@ -78,7 +76,6 @@ class JoinChat extends SearchDelegate { } ); } else if(snapshot.hasError) { - log(snapshot.error.toString()); return const PlaceholderView(icon: Icons.search_off, text: 'Ein fehler ist aufgetreten. Bist du mit dem Internet verbunden?'); } From 0c676dc3d6e7ba696d634d1a19f7a2b87e1171bc Mon Sep 17 00:00:00 2001 From: lars Date: Mon, 23 Jun 2025 17:54:12 +0200 Subject: [PATCH 09/23] made perticipants list stateless --- .../chatDetails/participants/participantsListView.dart | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/view/pages/talk/chatDetails/participants/participantsListView.dart b/lib/view/pages/talk/chatDetails/participants/participantsListView.dart index 3741cc3..fd6013a 100644 --- a/lib/view/pages/talk/chatDetails/participants/participantsListView.dart +++ b/lib/view/pages/talk/chatDetails/participants/participantsListView.dart @@ -3,18 +3,13 @@ import 'package:flutter/material.dart'; import '../../../../../api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart'; import '../../../../../widget/userAvatar.dart'; -class ParticipantsListView extends StatefulWidget { +class ParticipantsListView extends StatelessWidget { final GetParticipantsResponse participantsResponse; const ParticipantsListView(this.participantsResponse, {super.key}); - @override - State createState() => _ParticipantsListViewState(); -} - -class _ParticipantsListViewState extends State { @override Widget build(BuildContext context) { - final participants = widget.participantsResponse.data.map((participant) => ListTile( + final participants = participantsResponse.data.map((participant) => ListTile( leading: UserAvatar(id: participant.actorId), title: Text(participant.displayName), subtitle: participant.statusMessage != null ? Text(participant.statusMessage!) : null, From 421ee9179ded9b40e30205c125c2e636593c2aa3 Mon Sep 17 00:00:00 2001 From: lars Date: Tue, 24 Jun 2025 14:18:14 +0200 Subject: [PATCH 10/23] grouped the participants list --- .../getParticipantsResponse.dart | 15 ++++--- .../participants/participantsListView.dart | 40 ++++++++++++++----- pubspec.yaml | 1 + 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart b/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart index 1be47ce..0a8468c 100644 --- a/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart +++ b/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart @@ -55,12 +55,15 @@ class GetParticipantsResponseObject { } enum GetParticipantsResponseObjectParticipantType { - @JsonValue(1) owner, - @JsonValue(2) moderator, - @JsonValue(3) user, - @JsonValue(4) guest, - @JsonValue(5) userFollowingPublicLink, - @JsonValue(6) guestWithModeratorPermissions + @JsonValue(1) owner('Besitzer'), + @JsonValue(2) moderator('Moderator'), + @JsonValue(3) user('Benutzer'), + @JsonValue(4) guest('Gast'), + @JsonValue(5) userFollowingPublicLink('Link Nutzer'), + @JsonValue(6) guestWithModeratorPermissions('Gast Moderator'); + + const GetParticipantsResponseObjectParticipantType(this.prettyName); + final String prettyName; } enum GetParticipantsResponseObjectParticipantsInCallFlags { diff --git a/lib/view/pages/talk/chatDetails/participants/participantsListView.dart b/lib/view/pages/talk/chatDetails/participants/participantsListView.dart index fd6013a..01f49ee 100644 --- a/lib/view/pages/talk/chatDetails/participants/participantsListView.dart +++ b/lib/view/pages/talk/chatDetails/participants/participantsListView.dart @@ -1,3 +1,4 @@ +import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import '../../../../../api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart'; @@ -9,22 +10,43 @@ class ParticipantsListView extends StatelessWidget { @override Widget build(BuildContext context) { - final participants = participantsResponse.data.map((participant) => ListTile( - leading: UserAvatar(id: participant.actorId), - title: Text(participant.displayName), - subtitle: participant.statusMessage != null ? Text(participant.statusMessage!) : null, - )).toList(); + // final participants = participantsResponse.data.map((participant) => ListTile( + // leading: UserAvatar(id: participant.actorId), + // title: Text(participant.displayName), + // subtitle: participant.statusMessage != null ? Text(participant.statusMessage!) : null, + // )).toList(); - lastname(participant) => participant.title.toString().split(' ').last; - participants.sort((a, b) => lastname(a).compareTo(lastname(b))); + lastname(participant) => participant.displayName.toString().split(' ').last; + + final participants = participantsResponse.data + .sorted((a, b) => lastname(a).compareTo(lastname(b))) + .sorted((a, b) => a.participantType.index.compareTo(b.participantType.index)); + var groupedParticipants = participants.groupListsBy((participant) => participant.participantType); + + // Map> return Scaffold( appBar: AppBar( title: const Text('Teilnehmende'), ), body: ListView( - children: participants, - ), + children: [ + ...groupedParticipants.entries.map((entry) => Column( + children: [ + ListTile( + title: Text(entry.key.prettyName), + titleTextStyle: TextStyle(fontWeight: FontWeight.bold), + ), + ...entry.value.map((participant) => ListTile( + leading: UserAvatar(id: participant.actorId), + title: Text(participant.displayName), + subtitle: participant.statusMessage != null ? Text(participant.statusMessage!) : null, + )), + Divider(), + ], + )) + ], + ) ); } } diff --git a/pubspec.yaml b/pubspec.yaml index fe83157..842dcb8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -101,6 +101,7 @@ dependencies: time_range_picker: ^2.3.0 url_launcher: ^6.3.1 uuid: ^4.5.1 + collection: ^1.19.0 dev_dependencies: flutter_test: From f3de0bc165912eb9381b83477a74b996c92fd5d9 Mon Sep 17 00:00:00 2001 From: lars Date: Tue, 24 Jun 2025 15:09:37 +0200 Subject: [PATCH 11/23] centered file preview, made text copyable --- .../pages/talk/components/chatBubble.dart | 2 +- .../pages/talk/components/chatMessage.dart | 40 +++++++++++-------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/lib/view/pages/talk/components/chatBubble.dart b/lib/view/pages/talk/components/chatBubble.dart index 6e72b52..c4f5b56 100644 --- a/lib/view/pages/talk/components/chatBubble.dart +++ b/lib/view/pages/talk/components/chatBubble.dart @@ -206,7 +206,7 @@ class _ChatBubbleState extends State with SingleTickerProviderStateM ), ), Visibility( - visible: !message.containsFile, + visible: widget.bubbleData.message != '{file}', child: ListTile( leading: const Icon(Icons.copy), title: const Text('Nachricht kopieren'), diff --git a/lib/view/pages/talk/components/chatMessage.dart b/lib/view/pages/talk/components/chatMessage.dart index 5f9b397..c5bc379 100644 --- a/lib/view/pages/talk/components/chatMessage.dart +++ b/lib/view/pages/talk/components/chatMessage.dart @@ -39,23 +39,29 @@ class ChatMessage { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - CachedNetworkImage( - errorWidget: (context, url, error) => Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const Icon(Icons.file_open_outlined, size: 35), - const SizedBox(width: 10), - Flexible(child: Text(file!.name, maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.bold))), - const SizedBox(width: 10), - ], - ), - alignment: Alignment.center, - placeholder: (context, url) => const Padding(padding: EdgeInsets.all(15), child: SizedBox(width: 50, child: LinearProgressIndicator())), - fadeInDuration: Duration.zero, - fadeOutDuration: Duration.zero, - errorListener: (value) {}, - imageUrl: 'https://${AccountData().buildHttpAuthString()}@${EndpointData().nextcloud().full()}/index.php/core/preview?fileId=${file!.id}&x=100&y=-1&a=1', + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CachedNetworkImage( + errorWidget: (context, url, error) => Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Icon(Icons.file_open_outlined, size: 35), + const SizedBox(width: 10), + Flexible(child: Text(file!.name, maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.bold))), + const SizedBox(width: 10), + ], + ), + alignment: Alignment.center, + placeholder: (context, url) => const Padding(padding: EdgeInsets.all(15), child: SizedBox(width: 50, child: LinearProgressIndicator())), + fadeInDuration: Duration.zero, + fadeOutDuration: Duration.zero, + errorListener: (value) {}, + imageUrl: 'https://${AccountData().buildHttpAuthString()}@${EndpointData().nextcloud().full()}/index.php/core/preview?fileId=${file!.id}&x=100&y=-1&a=1', + ) + ], ), SizedBox(height: 5), contentWidget From 85f99884534d9df399216b07252c35a05d11ed92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 6 Sep 2025 14:12:13 +0200 Subject: [PATCH 12/23] renamed timetable in ui --- lib/state/app/modules/app_modules.dart | 2 +- lib/view/settings/defaultSettings.dart | 2 +- lib/view/settings/settings.dart | 2 +- pubspec.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/state/app/modules/app_modules.dart b/lib/state/app/modules/app_modules.dart index ecda3a1..744feef 100644 --- a/lib/state/app/modules/app_modules.dart +++ b/lib/state/app/modules/app_modules.dart @@ -31,7 +31,7 @@ class AppModule { var available = { Modules.timetable: AppModule( Modules.timetable, - name: 'Vertretung', + name: 'Stundenplan', icon: () => Icon(Icons.calendar_month), breakerArea: BreakerArea.timetable, create: Timetable.new, diff --git a/lib/view/settings/defaultSettings.dart b/lib/view/settings/defaultSettings.dart index 36b2289..7b99b25 100644 --- a/lib/view/settings/defaultSettings.dart +++ b/lib/view/settings/defaultSettings.dart @@ -32,7 +32,7 @@ class DefaultSettings { hiddenModules: [], ), timetableSettings: TimetableSettings( - connectDoubleLessons: false, + connectDoubleLessons: true, timetableNameMode: TimetableNameMode.name ), talkSettings: TalkSettings( diff --git a/lib/view/settings/settings.dart b/lib/view/settings/settings.dart index 9784a29..0d3f58d 100644 --- a/lib/view/settings/settings.dart +++ b/lib/view/settings/settings.dart @@ -246,7 +246,7 @@ class _SettingsState extends State { ListTile( leading: const CenteredLeading(Icon(Icons.date_range_outlined)), title: const Text('Infos zu Web-/ Untis'), - subtitle: const Text('Für den Vertretungsplan'), + subtitle: const Text('Für den Stundenplan'), trailing: const Icon(Icons.arrow_right), onTap: () => PrivacyInfo(providerText: 'Untis', imprintUrl: 'https://www.untis.at/impressum', privacyUrl: 'https://www.untis.at/datenschutz-wu-apps').showPopup(context) ), diff --git a/pubspec.yaml b/pubspec.yaml index fe83157..565e3e7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,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: 0.1.3+41 +version: 0.1.4+42 environment: sdk: '>3.0.0' From f330ef3f56c323003d8c62f20c6c8f610fb01cef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 6 Sep 2025 14:47:08 +0200 Subject: [PATCH 13/23] updated project dependencies and sdk. Comptaible with Flutter 3.35.3 --- android/app/build.gradle | 8 +++---- android/settings.gradle | 2 +- lib/view/pages/files/fileElement.dart | 2 +- .../pages/talk/components/chatBubble.dart | 2 +- lib/widget/fileViewer.dart | 4 ++-- pubspec.yaml | 22 +++++++++---------- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 53332cf..b62e5c5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -28,13 +28,13 @@ android { ndkVersion "27.0.12077973" compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { - jvmTarget = '1.8' + jvmTarget = '17' } sourceSets { @@ -65,5 +65,5 @@ flutter { dependencies { implementation 'com.android.support:multidex:2.0.1' - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4' } diff --git a/android/settings.gradle b/android/settings.gradle index 67bf08a..35491da 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -20,7 +20,7 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "com.android.application" version '8.7.3' apply false - id "org.jetbrains.kotlin.android" version "1.8.10" apply false + id "org.jetbrains.kotlin.android" version "2.1.10" apply false } include ":app" diff --git a/lib/view/pages/files/fileElement.dart b/lib/view/pages/files/fileElement.dart index 96aa306..cd8b772 100644 --- a/lib/view/pages/files/fileElement.dart +++ b/lib/view/pages/files/fileElement.dart @@ -1,11 +1,11 @@ import 'dart:io'; -import 'package:better_open_file/better_open_file.dart'; import 'package:filesize/filesize.dart'; import 'package:flowder/flowder.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:jiffy/jiffy.dart'; +import 'package:open_filex/open_filex.dart'; import '../../../widget/infoDialog.dart'; import 'package:nextcloud/nextcloud.dart'; import 'package:path_provider/path_provider.dart'; diff --git a/lib/view/pages/talk/components/chatBubble.dart b/lib/view/pages/talk/components/chatBubble.dart index 6e72b52..71bc520 100644 --- a/lib/view/pages/talk/components/chatBubble.dart +++ b/lib/view/pages/talk/components/chatBubble.dart @@ -1,4 +1,3 @@ -import 'package:better_open_file/better_open_file.dart'; import 'package:bubble/bubble.dart'; import 'package:emoji_picker_flutter/emoji_picker_flutter.dart' as emojis; import 'package:flowder/flowder.dart'; @@ -6,6 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:jiffy/jiffy.dart'; +import 'package:open_filex/open_filex.dart'; import '../../../../extensions/text.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widget/fileViewer.dart b/lib/widget/fileViewer.dart index 8eb01e1..085caf4 100644 --- a/lib/widget/fileViewer.dart +++ b/lib/widget/fileViewer.dart @@ -1,8 +1,8 @@ import 'dart:io'; import 'dart:math'; -import 'package:better_open_file/better_open_file.dart'; import 'package:flutter/material.dart'; +import 'package:open_filex/open_filex.dart'; import 'package:photo_view/photo_view.dart'; import 'package:provider/provider.dart'; import 'package:share_plus/share_plus.dart'; @@ -93,7 +93,7 @@ class _FileViewerState extends State { ); default: - OpenFile.open(widget.path).then((result) { + OpenFilex.open(widget.path).then((result) { Navigator.of(context).pop(); if(result.type != ResultType.done) { showDialog(context: context, builder: (context) => AlertDialog( diff --git a/pubspec.yaml b/pubspec.yaml index 565e3e7..fd1762a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,7 +42,6 @@ dependencies: animated_digit: ^3.2.3 async: ^2.11.0 badges: ^3.1.2 - better_open_file: ^3.6.5 bloc: ^9.0.0 bottom_sheet: ^4.0.4 bubble: ^1.2.1 @@ -55,11 +54,11 @@ dependencies: easy_debounce: ^2.0.3 emoji_picker_flutter: ^4.3.0 fast_rsa: ^3.7.1 - file_picker: ^8.1.7 + file_picker: ^10.3.2 filesize: ^2.0.1 - firebase_core: ^3.10.1 - firebase_in_app_messaging: ^0.8.1+1 - firebase_messaging: ^15.2.1 + firebase_core: ^4.1.0 + firebase_in_app_messaging: ^0.9.0+1 + firebase_messaging: ^16.0.1 flowder: git: url: https://github.com/Harsh223/flowder.git @@ -67,11 +66,11 @@ dependencies: flutter_bloc: ^9.0.0 flutter_launcher_icons: ^0.14.3 flutter_linkify: ^6.0.0 - flutter_local_notifications: ^18.0.1 + flutter_local_notifications: ^19.4.1 flutter_login: ^5.0.0 flutter_native_splash: ^2.4.4 flutter_split_view: ^0.1.2 - freezed_annotation: ^2.4.4 + freezed_annotation: ^3.1.0 http: ^1.3.0 hydrated_bloc: ^10.0.0 image_picker: ^1.1.2 @@ -87,20 +86,21 @@ dependencies: url: https://github.com/provokateurin/nextcloud-neon package_info_plus: ^8.1.3 path_provider: ^2.1.5 - persistent_bottom_nav_bar_v2: ^5.3.1 + persistent_bottom_nav_bar_v2: ^6.1.0 photo_view: ^0.15.0 pretty_json: ^2.0.0 provider: ^6.1.2 qr_flutter: ^4.1.0 rrule: ^0.2.17 rrule_generator: ^0.9.0 - share_plus: ^10.1.4 + share_plus: ^11.1.0 shared_preferences: ^2.3.5 - syncfusion_flutter_calendar: ^28.1.41 - syncfusion_flutter_pdfviewer: ^28.1.41 + syncfusion_flutter_calendar: ^29.1.38 + syncfusion_flutter_pdfviewer: ^29.1.38 time_range_picker: ^2.3.0 url_launcher: ^6.3.1 uuid: ^4.5.1 + open_filex: ^4.7.0 dev_dependencies: flutter_test: From 46971a8d4673e92bf17d5f693255f1b5f43122f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 6 Sep 2025 14:51:14 +0200 Subject: [PATCH 14/23] upgraded syncfusion dependencies --- pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index fd1762a..4238ab5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -95,8 +95,8 @@ dependencies: rrule_generator: ^0.9.0 share_plus: ^11.1.0 shared_preferences: ^2.3.5 - syncfusion_flutter_calendar: ^29.1.38 - syncfusion_flutter_pdfviewer: ^29.1.38 + syncfusion_flutter_calendar: ^31.1.17 + syncfusion_flutter_pdfviewer: ^31.1.17 time_range_picker: ^2.3.0 url_launcher: ^6.3.1 uuid: ^4.5.1 From 9177c30d6ed674f3f82d37395b7f4aba5957c769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 6 Sep 2025 15:33:14 +0200 Subject: [PATCH 15/23] fixed display dimensions of messages with files --- .../pages/talk/components/chatMessage.dart | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/lib/view/pages/talk/components/chatMessage.dart b/lib/view/pages/talk/components/chatMessage.dart index c5bc379..90abb14 100644 --- a/lib/view/pages/talk/components/chatMessage.dart +++ b/lib/view/pages/talk/components/chatMessage.dart @@ -39,32 +39,28 @@ class ChatMessage { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CachedNetworkImage( - errorWidget: (context, url, error) => Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const Icon(Icons.file_open_outlined, size: 35), - const SizedBox(width: 10), - Flexible(child: Text(file!.name, maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.bold))), - const SizedBox(width: 10), - ], - ), - alignment: Alignment.center, - placeholder: (context, url) => const Padding(padding: EdgeInsets.all(15), child: SizedBox(width: 50, child: LinearProgressIndicator())), - fadeInDuration: Duration.zero, - fadeOutDuration: Duration.zero, - errorListener: (value) {}, - imageUrl: 'https://${AccountData().buildHttpAuthString()}@${EndpointData().nextcloud().full()}/index.php/core/preview?fileId=${file!.id}&x=100&y=-1&a=1', - ) - ], + CachedNetworkImage( + errorWidget: (context, url, error) => Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Icon(Icons.file_open_outlined, size: 35), + const SizedBox(width: 10), + Flexible(child: Text(file!.name, maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.bold))), + const SizedBox(width: 10), + ], + ), + alignment: Alignment.center, + placeholder: (context, url) => const Padding(padding: EdgeInsets.all(15), child: SizedBox(width: 50, child: LinearProgressIndicator())), + fadeInDuration: Duration.zero, + fadeOutDuration: Duration.zero, + errorListener: (value) {}, + imageUrl: 'https://${AccountData().buildHttpAuthString()}@${EndpointData().nextcloud().full()}/index.php/core/preview?fileId=${file!.id}&x=130&y=-1&a=1', ), - SizedBox(height: 5), - contentWidget + if(originalMessage != '{file}') ...[ + SizedBox(height: 5), + contentWidget + ] ], ) ); From e4582eaac55628863be4ec9010531916d1ef4c3c Mon Sep 17 00:00:00 2001 From: lars Date: Sat, 6 Sep 2025 15:46:55 +0200 Subject: [PATCH 16/23] removed commented code --- .../chatDetails/participants/participantsListView.dart | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/view/pages/talk/chatDetails/participants/participantsListView.dart b/lib/view/pages/talk/chatDetails/participants/participantsListView.dart index 01f49ee..4b10ce2 100644 --- a/lib/view/pages/talk/chatDetails/participants/participantsListView.dart +++ b/lib/view/pages/talk/chatDetails/participants/participantsListView.dart @@ -10,12 +10,6 @@ class ParticipantsListView extends StatelessWidget { @override Widget build(BuildContext context) { - // final participants = participantsResponse.data.map((participant) => ListTile( - // leading: UserAvatar(id: participant.actorId), - // title: Text(participant.displayName), - // subtitle: participant.statusMessage != null ? Text(participant.statusMessage!) : null, - // )).toList(); - lastname(participant) => participant.displayName.toString().split(' ').last; final participants = participantsResponse.data @@ -23,8 +17,6 @@ class ParticipantsListView extends StatelessWidget { .sorted((a, b) => a.participantType.index.compareTo(b.participantType.index)); var groupedParticipants = participants.groupListsBy((participant) => participant.participantType); - // Map> - return Scaffold( appBar: AppBar( title: const Text('Teilnehmende'), From a6c16e41c2152c370aa795ed076075a0301ecc8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 6 Sep 2025 15:56:28 +0200 Subject: [PATCH 17/23] fixed missing no reaction text fixed loading indicator being delayed on file download --- lib/view/pages/talk/components/chatBubble.dart | 8 ++++++-- lib/view/pages/talk/messageReactions.dart | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/view/pages/talk/components/chatBubble.dart b/lib/view/pages/talk/components/chatBubble.dart index 1095be0..0489318 100644 --- a/lib/view/pages/talk/components/chatBubble.dart +++ b/lib/view/pages/talk/components/chatBubble.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:bubble/bubble.dart'; import 'package:emoji_picker_flutter/emoji_picker_flutter.dart' as emojis; import 'package:flowder/flowder.dart'; @@ -323,7 +325,9 @@ class _ChatBubbleState extends State with SingleTickerProviderStateM return; } - downloadProgress = 1; + setState(() { + downloadProgress = 1; + }); downloadCore = FileElement.download(context, message.file!.path!, message.file!.name, (progress) { if(progress > 1) { setState(() { @@ -408,7 +412,7 @@ class _ChatBubbleState extends State with SingleTickerProviderStateM bottom: 0, right: 0, left: 0, - child: LinearProgressIndicator(value: downloadProgress/100), + child: LinearProgressIndicator(value: downloadProgress == 1 ? null : downloadProgress/100), ), ), ], diff --git a/lib/view/pages/talk/messageReactions.dart b/lib/view/pages/talk/messageReactions.dart index 1ab77ca..1f84a4b 100644 --- a/lib/view/pages/talk/messageReactions.dart +++ b/lib/view/pages/talk/messageReactions.dart @@ -1,4 +1,6 @@ +import 'dart:developer'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -38,7 +40,7 @@ class _MessageReactionsState extends State { future: data, builder: (context, snapshot) { if(snapshot.connectionState == ConnectionState.waiting) return const LoadingSpinner(); - if(snapshot.data == null) return const PlaceholderView(icon: Icons.search_off_outlined, text: 'Keine Reaktionen gefunden!'); + if(snapshot.data!.data.isEmpty) return const PlaceholderView(icon: Icons.search_off_outlined, text: 'Keine Reaktionen gefunden!'); return ListView( children: [ ...snapshot.data!.data.entries.map((entry) => ExpansionTile( From 9b58412ca7a6b70442245d3ea16e15339ea4a301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 6 Sep 2025 15:56:28 +0200 Subject: [PATCH 18/23] fixed missing no reaction text fixed loading indicator being delayed on file download --- lib/view/pages/talk/components/chatBubble.dart | 6 ++++-- lib/view/pages/talk/messageReactions.dart | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/view/pages/talk/components/chatBubble.dart b/lib/view/pages/talk/components/chatBubble.dart index 1095be0..fdf5239 100644 --- a/lib/view/pages/talk/components/chatBubble.dart +++ b/lib/view/pages/talk/components/chatBubble.dart @@ -323,7 +323,9 @@ class _ChatBubbleState extends State with SingleTickerProviderStateM return; } - downloadProgress = 1; + setState(() { + downloadProgress = 1; + }); downloadCore = FileElement.download(context, message.file!.path!, message.file!.name, (progress) { if(progress > 1) { setState(() { @@ -408,7 +410,7 @@ class _ChatBubbleState extends State with SingleTickerProviderStateM bottom: 0, right: 0, left: 0, - child: LinearProgressIndicator(value: downloadProgress/100), + child: LinearProgressIndicator(value: downloadProgress == 1 ? null : downloadProgress/100), ), ), ], diff --git a/lib/view/pages/talk/messageReactions.dart b/lib/view/pages/talk/messageReactions.dart index 1ab77ca..d06e33b 100644 --- a/lib/view/pages/talk/messageReactions.dart +++ b/lib/view/pages/talk/messageReactions.dart @@ -38,7 +38,7 @@ class _MessageReactionsState extends State { future: data, builder: (context, snapshot) { if(snapshot.connectionState == ConnectionState.waiting) return const LoadingSpinner(); - if(snapshot.data == null) return const PlaceholderView(icon: Icons.search_off_outlined, text: 'Keine Reaktionen gefunden!'); + if(snapshot.data!.data.isEmpty) return const PlaceholderView(icon: Icons.search_off_outlined, text: 'Keine Reaktionen gefunden!'); return ListView( children: [ ...snapshot.data!.data.entries.map((entry) => ExpansionTile( From 22d3d18a170db777295b038ab0f11570df9fb287 Mon Sep 17 00:00:00 2001 From: lars Date: Sat, 6 Sep 2025 16:09:47 +0200 Subject: [PATCH 19/23] changed naming for participants --- .../talk/getParticipants/getParticipantsResponse.dart | 4 ++-- lib/view/pages/talk/chatDetails/chatInfo.dart | 2 +- .../talk/chatDetails/participants/participantsListView.dart | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart b/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart index 0a8468c..3d0e9ff 100644 --- a/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart +++ b/lib/api/marianumcloud/talk/getParticipants/getParticipantsResponse.dart @@ -57,9 +57,9 @@ class GetParticipantsResponseObject { enum GetParticipantsResponseObjectParticipantType { @JsonValue(1) owner('Besitzer'), @JsonValue(2) moderator('Moderator'), - @JsonValue(3) user('Benutzer'), + @JsonValue(3) user('Teilnehmer'), @JsonValue(4) guest('Gast'), - @JsonValue(5) userFollowingPublicLink('Link Nutzer'), + @JsonValue(5) userFollowingPublicLink('Teilnehmer über Link'), @JsonValue(6) guestWithModeratorPermissions('Gast Moderator'); const GetParticipantsResponseObjectParticipantType(this.prettyName); diff --git a/lib/view/pages/talk/chatDetails/chatInfo.dart b/lib/view/pages/talk/chatDetails/chatInfo.dart index 2460704..81ca7a3 100644 --- a/lib/view/pages/talk/chatDetails/chatInfo.dart +++ b/lib/view/pages/talk/chatDetails/chatInfo.dart @@ -66,7 +66,7 @@ class _ChatInfoState extends State { if(participants != null) ...[ ListTile( leading: const Icon(Icons.supervised_user_circle), - title: Text('${participants!.data.length} Teilnehmer'), + title: Text('${participants!.data.length} Mitglieder'), trailing: const Icon(Icons.arrow_right), onTap: () => TalkNavigator.pushSplitView(context, ParticipantsListView(participants!)), ), diff --git a/lib/view/pages/talk/chatDetails/participants/participantsListView.dart b/lib/view/pages/talk/chatDetails/participants/participantsListView.dart index 4b10ce2..db25cb7 100644 --- a/lib/view/pages/talk/chatDetails/participants/participantsListView.dart +++ b/lib/view/pages/talk/chatDetails/participants/participantsListView.dart @@ -19,7 +19,7 @@ class ParticipantsListView extends StatelessWidget { return Scaffold( appBar: AppBar( - title: const Text('Teilnehmende'), + title: const Text('Mitglieder'), ), body: ListView( children: [ From 7dbd6038f3e4b0908454dbc75d864ed7018fa916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 6 Sep 2025 16:47:47 +0200 Subject: [PATCH 20/23] prevent common "change" tiles in timetable, more robust parsing --- lib/view/pages/timetable/timetable.dart | 26 +++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/lib/view/pages/timetable/timetable.dart b/lib/view/pages/timetable/timetable.dart index 9c939be..5f3385d 100644 --- a/lib/view/pages/timetable/timetable.dart +++ b/lib/view/pages/timetable/timetable.dart @@ -1,6 +1,6 @@ - import 'dart:async'; +import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import '../../../extensions/dateTime.dart'; import 'package:provider/provider.dart'; @@ -302,23 +302,25 @@ class _TimetableState extends State { var startTime = _parseWebuntisTimestamp(element.date, element.startTime); var endTime = _parseWebuntisTimestamp(element.date, element.endTime); - var subject = subjects.result.firstWhere((subject) => subject.id == element.su[0].id); - var subjectName = { - TimetableNameMode.name: subject.name, - TimetableNameMode.longName: subject.longName, - TimetableNameMode.alternateName: subject.alternateName, - }[settings.val().timetableSettings.timetableNameMode]; - + var subject = subjects.result.firstWhereOrNull((subject) => subject.id == element.su.first.id); + var subjectName = 'Unbekannt'; + if(subject != null) { + subjectName = { + TimetableNameMode.name: subject.name, + TimetableNameMode.longName: subject.longName, + TimetableNameMode.alternateName: subject.alternateName, + }[settings.val().timetableSettings.timetableNameMode]!; + } return Appointment( id: ArbitraryAppointment(webuntis: element), startTime: startTime, endTime: endTime, - subject: subjectName!, + subject: subjectName, location: '' - '${rooms.result.firstWhere((room) => room.id == element.ro[0].id).name}' + '${rooms.result.firstWhereOrNull((room) => room.id == element.ro.firstOrNull?.id)?.name ?? 'Unbekannt'}' '\n' - '${element.te.first.longname}', + '${element.te.firstOrNull?.longname ?? 'Unbekannt'}', notes: element.activityType, color: _getEventColor(element, startTime, endTime), ); @@ -331,7 +333,7 @@ class _TimetableState extends State { subject: 'Änderung', notes: element.info, location: 'Unbekannt', - color: endTime.isBefore(DateTime.now()) ? Theme.of(context).primaryColor.withAlpha(100) : Theme.of(context).primaryColor, + color: const Color(0xff404040).withAlpha(endTime.isBefore(DateTime.now()) ? 100 : 255), startTimeZone: '', endTimeZone: '', ); From f29c84d05c51b3e39110081c5ef779a8d86fe7c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 6 Sep 2025 17:03:01 +0200 Subject: [PATCH 21/23] fixed timetable subject name requirement --- lib/view/pages/timetable/timetable.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/view/pages/timetable/timetable.dart b/lib/view/pages/timetable/timetable.dart index 5f3385d..715ede1 100644 --- a/lib/view/pages/timetable/timetable.dart +++ b/lib/view/pages/timetable/timetable.dart @@ -302,7 +302,7 @@ class _TimetableState extends State { var startTime = _parseWebuntisTimestamp(element.date, element.startTime); var endTime = _parseWebuntisTimestamp(element.date, element.endTime); - var subject = subjects.result.firstWhereOrNull((subject) => subject.id == element.su.first.id); + var subject = subjects.result.firstWhereOrNull((subject) => subject.id == element.su.firstOrNull?.id); var subjectName = 'Unbekannt'; if(subject != null) { subjectName = { From bd1101c3486c09930923b958206a4c998c987eaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 6 Sep 2025 17:35:41 +0200 Subject: [PATCH 22/23] Upgraded Gradle and Android Gradle Plugin Upgraded Gradle from 8.9 to 8.13 and the Android Gradle Plugin from 8.7.3 to 8.13.0. --- android/gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 09523c0..37f853b 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/android/settings.gradle b/android/settings.gradle index 35491da..12dc724 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -19,7 +19,7 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.7.3' apply false + id "com.android.application" version '8.13.0' apply false id "org.jetbrains.kotlin.android" version "2.1.10" apply false } From 859b85ab2cbd048c2be33dc1e72672222932e7e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 6 Sep 2025 18:51:00 +0200 Subject: [PATCH 23/23] Revert "Upgraded Gradle and Android Gradle Plugin" This reverts commit bd1101c3486c09930923b958206a4c998c987eaf. --- android/gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 37f853b..09523c0 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/android/settings.gradle b/android/settings.gradle index 12dc724..35491da 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -19,7 +19,7 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.13.0' apply false + id "com.android.application" version '8.7.3' apply false id "org.jetbrains.kotlin.android" version "2.1.10" apply false }