diff --git a/lib/apis/user_api.dart b/lib/apis/user_api.dart index 625e566..b603eec 100644 --- a/lib/apis/user_api.dart +++ b/lib/apis/user_api.dart @@ -1,13 +1,9 @@ import 'dart:convert'; import 'package:contacts_plus_plus/clients/api_client.dart'; -import 'package:contacts_plus_plus/models/users/friend.dart'; import 'package:contacts_plus_plus/models/personal_profile.dart'; import 'package:contacts_plus_plus/models/users/user.dart'; -import 'package:contacts_plus_plus/models/users/user_profile.dart'; -import 'package:contacts_plus_plus/models/users/friend_status.dart'; import 'package:contacts_plus_plus/models/users/user_status.dart'; -import 'package:package_info_plus/package_info_plus.dart'; class UserApi { static Future> searchUsers(ApiClient client, {required String needle}) async { @@ -37,18 +33,6 @@ class UserApi { client.checkResponse(response); } - static Future setStatus(ApiClient client, {required UserStatus status}) async { - return; - final pkginfo = await PackageInfo.fromPlatform(); - status = status.copyWith( - neosVersion: "${pkginfo.version} of ${pkginfo.appName}", - isMobile: true, - ); - final body = jsonEncode(status.toMap(shallow: true)); - final response = await client.put("/users/${client.userId}/status", body: body); - client.checkResponse(response); - } - static Future getPersonalProfile(ApiClient client) async { final response = await client.get("/users/${client.userId}"); client.checkResponse(response); diff --git a/lib/clients/messaging_client.dart b/lib/clients/messaging_client.dart index 82a2f1a..e0cd167 100644 --- a/lib/clients/messaging_client.dart +++ b/lib/clients/messaging_client.dart @@ -13,6 +13,7 @@ import 'package:contacts_plus_plus/clients/notification_client.dart'; import 'package:contacts_plus_plus/models/users/friend.dart'; import 'package:contacts_plus_plus/clients/api_client.dart'; import 'package:contacts_plus_plus/models/message.dart'; +import 'package:package_info_plus/package_info_plus.dart'; enum EventType { undefined, @@ -74,7 +75,7 @@ class MessagingClient extends ChangeNotifier { _notifyOnlineTimer = Timer.periodic(const Duration(seconds: 60), (timer) async { // We should probably let the MessagingClient handle the entire state of USerStatus instead of mirroring like this // but I don't feel like implementing that right now. - UserApi.setStatus(apiClient, status: await UserApi.getUserStatus(apiClient, userId: apiClient.userId)); + setUserStatus(await UserApi.getUserStatus(apiClient, userId: apiClient.userId)); }); } @@ -142,6 +143,23 @@ class MessagingClient extends ChangeNotifier { clearUnreadsForUser(batch.senderId); } + Future setUserStatus(UserStatus status) async { + final pkginfo = await PackageInfo.fromPlatform(); + + status = status.copyWith( + appVersion: "${pkginfo.version} of ${pkginfo.appName}", + isMobile: true, + ); + + _hubManager.send("BroadcastStatus", arguments: [ + status.toMap(), + { + "group": 0, + "targetIds": [], + } + ]); + } + void addUnread(Message message) { var messages = _unreads[message.senderId]; if (messages == null) { diff --git a/lib/main.dart b/lib/main.dart index 842c7f7..9c825db 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,7 +14,6 @@ import 'package:contacts_plus_plus/widgets/update_notifier.dart'; import 'package:dynamic_color/dynamic_color.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_downloader/flutter_downloader.dart'; import 'package:flutter_phoenix/flutter_phoenix.dart'; import 'package:hive_flutter/hive_flutter.dart'; diff --git a/lib/models/authentication_data.dart b/lib/models/authentication_data.dart index fc37e76..76ca47d 100644 --- a/lib/models/authentication_data.dart +++ b/lib/models/authentication_data.dart @@ -1,6 +1,3 @@ -import 'package:contacts_plus_plus/config.dart'; -import 'package:uuid/uuid.dart'; - class AuthenticationData { static const _unauthenticated = AuthenticationData( userId: "", diff --git a/lib/models/inventory/resonite_directory.dart b/lib/models/inventory/resonite_directory.dart index 299f1ee..e6b4095 100644 --- a/lib/models/inventory/resonite_directory.dart +++ b/lib/models/inventory/resonite_directory.dart @@ -1,5 +1,4 @@ import 'package:collection/collection.dart'; -import 'package:contacts_plus_plus/stack.dart'; import 'package:contacts_plus_plus/models/records/record.dart'; class ResoniteDirectory { diff --git a/lib/models/records/record.dart b/lib/models/records/record.dart index 24182f9..d81d987 100644 --- a/lib/models/records/record.dart +++ b/lib/models/records/record.dart @@ -4,7 +4,6 @@ import 'package:contacts_plus_plus/models/records/asset_digest.dart'; import 'package:contacts_plus_plus/models/records/resonite_db_asset.dart'; import 'package:contacts_plus_plus/string_formatter.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:uuid/uuid.dart'; enum RecordType { diff --git a/lib/models/session.dart b/lib/models/session.dart index dce8611..61d9c03 100644 --- a/lib/models/session.dart +++ b/lib/models/session.dart @@ -1,4 +1,3 @@ -import 'package:contacts_plus_plus/config.dart'; import 'package:contacts_plus_plus/string_formatter.dart'; class Session { diff --git a/lib/models/users/friend.dart b/lib/models/users/friend.dart index 614131f..4c0f184 100644 --- a/lib/models/users/friend.dart +++ b/lib/models/users/friend.dart @@ -3,7 +3,6 @@ import 'package:contacts_plus_plus/models/users/user_profile.dart'; import 'package:contacts_plus_plus/models/users/friend_status.dart'; import 'package:contacts_plus_plus/models/users/online_status.dart'; import 'package:contacts_plus_plus/models/users/user_status.dart'; -import 'package:flutter/foundation.dart'; class Friend implements Comparable { static const _emptyId = "-1"; @@ -58,14 +57,14 @@ class Friend implements Comparable { Friend copyWith({ String? id, String? username, String? ownerId, UserStatus? userStatus, UserProfile? userProfile, - FriendStatus? friendStatus, DateTime? latestMessageTime}) { + FriendStatus? contactStatus, DateTime? latestMessageTime}) { return Friend( id: id ?? this.id, username: username ?? this.username, ownerId: ownerId ?? this.ownerId, userStatus: userStatus ?? this.userStatus, userProfile: userProfile ?? this.userProfile, - contactStatus: friendStatus ?? this.contactStatus, + contactStatus: contactStatus ?? this.contactStatus, latestMessageTime: latestMessageTime ?? this.latestMessageTime, ); } diff --git a/lib/models/users/user_status.dart b/lib/models/users/user_status.dart index ccba0d7..697480a 100644 --- a/lib/models/users/user_status.dart +++ b/lib/models/users/user_status.dart @@ -89,7 +89,7 @@ class UserStatus { bool? currentHosting, Session? currentSession, List? activeSessions, - String? neosVersion, + String? appVersion, String? outputDevice, bool? isMobile, String? compatibilityHash, @@ -102,7 +102,7 @@ class UserStatus { currentHosting: currentHosting ?? this.currentHosting, currentSession: currentSession ?? this.currentSession, activeSessions: activeSessions ?? this.activeSessions, - appVersion: neosVersion ?? this.appVersion, + appVersion: appVersion ?? this.appVersion, outputDevice: outputDevice ?? this.outputDevice, isMobile: isMobile ?? this.isMobile, compatibilityHash: compatibilityHash ?? this.compatibilityHash, diff --git a/lib/widgets/friends/friends_list_app_bar.dart b/lib/widgets/friends/friends_list_app_bar.dart index a5bb246..ef60632 100644 --- a/lib/widgets/friends/friends_list_app_bar.dart +++ b/lib/widgets/friends/friends_list_app_bar.dart @@ -33,12 +33,13 @@ class _FriendsListAppBarState extends State with AutomaticKee void _refreshUserStatus() { final apiClient = _clientHolder!.apiClient; + final messagingClient = Provider.of(context, listen: false); _userStatusFuture ??= UserApi.getUserStatus(apiClient, userId: apiClient.userId).then((value) async { if (value.onlineStatus == OnlineStatus.offline) { final newStatus = value.copyWith( onlineStatus: OnlineStatus.values[_clientHolder!.settingsClient.currentSettings.lastOnlineStatus.valueOrDefault]); - await UserApi.setStatus(apiClient, status: newStatus); + await messagingClient.setUserStatus(newStatus); return newStatus; } return value; @@ -75,18 +76,21 @@ class _FriendsListAppBarState extends State with AutomaticKee ), onSelected: (OnlineStatus onlineStatus) async { try { + final messagingClient = Provider.of(context, listen: false); final newStatus = userStatus.copyWith(onlineStatus: onlineStatus); setState(() { _userStatusFuture = Future.value(newStatus.copyWith(lastStatusChange: DateTime.now())); }); final settingsClient = _clientHolder!.settingsClient; - await UserApi.setStatus(_clientHolder!.apiClient, status: newStatus); + await messagingClient.setUserStatus(newStatus); await settingsClient.changeSettings( settingsClient.currentSettings.copyWith(lastOnlineStatus: onlineStatus.index)); } catch (e, s) { FlutterError.reportError(FlutterErrorDetails(exception: e, stack: s)); - ScaffoldMessenger.of(context) + if (context.mounted) { + ScaffoldMessenger.of(context) .showSnackBar(const SnackBar(content: Text("Failed to set online-status."))); + } setState(() { _userStatusFuture = Future.value(userStatus); }); diff --git a/lib/widgets/friends/user_list_tile.dart b/lib/widgets/friends/user_list_tile.dart index b7fa218..13ba5a1 100644 --- a/lib/widgets/friends/user_list_tile.dart +++ b/lib/widgets/friends/user_list_tile.dart @@ -70,7 +70,8 @@ class _UserListTileState extends State { widget.onChanged?.call(); } catch (e, s) { FlutterError.reportError(FlutterErrorDetails(exception: e, stack: s)); - ScaffoldMessenger.of(context).showSnackBar( + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( SnackBar( duration: const Duration(seconds: 5), content: Text( @@ -80,6 +81,7 @@ class _UserListTileState extends State { ), ), ); + } setState(() { _loading = false; }); diff --git a/lib/widgets/messages/message_input_bar.dart b/lib/widgets/messages/message_input_bar.dart index 1eae33c..25af751 100644 --- a/lib/widgets/messages/message_input_bar.dart +++ b/lib/widgets/messages/message_input_bar.dart @@ -216,7 +216,7 @@ class _MessageInputBarState extends State { color: Theme .of(context) .colorScheme - .background, + .surfaceVariant, ), padding: const EdgeInsets.symmetric(horizontal: 4), child: Column( diff --git a/lib/widgets/messages/messages_list.dart b/lib/widgets/messages/messages_list.dart index b8deda8..24df0af 100644 --- a/lib/widgets/messages/messages_list.dart +++ b/lib/widgets/messages/messages_list.dart @@ -58,12 +58,8 @@ class _MessagesListState extends State with SingleTickerProviderSt final friend = mClient.selectedFriend ?? Friend.empty(); final cache = mClient.getUserMessageCache(friend.id); final sessions = friend.userStatus.activeSessions; - return Scaffold( appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle( - systemNavigationBarColor: Theme.of(context).colorScheme.background, - ), title: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ diff --git a/lib/widgets/sessions/session_filter_dialog.dart b/lib/widgets/sessions/session_filter_dialog.dart index 926e44a..9fa3ba6 100644 --- a/lib/widgets/sessions/session_filter_dialog.dart +++ b/lib/widgets/sessions/session_filter_dialog.dart @@ -2,7 +2,6 @@ import 'dart:math'; import 'package:contacts_plus_plus/client_holder.dart'; import 'package:contacts_plus_plus/clients/session_client.dart'; -import 'package:contacts_plus_plus/clients/settings_client.dart'; import 'package:contacts_plus_plus/models/session.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/sessions/session_list_app_bar.dart b/lib/widgets/sessions/session_list_app_bar.dart index ecd636c..1fb80c6 100644 --- a/lib/widgets/sessions/session_list_app_bar.dart +++ b/lib/widgets/sessions/session_list_app_bar.dart @@ -1,6 +1,4 @@ -import 'package:contacts_plus_plus/client_holder.dart'; import 'package:contacts_plus_plus/clients/session_client.dart'; -import 'package:contacts_plus_plus/clients/settings_client.dart'; import 'package:contacts_plus_plus/widgets/sessions/session_filter_dialog.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart';