Skip to content

Commit 459afe6

Browse files
Wahid NasriWahid Nasri
Wahid Nasri
authored and
Wahid Nasri
committed
listen to app lifecycle and send presence
1 parent 303cac2 commit 459afe6

File tree

4 files changed

+54
-2
lines changed

4 files changed

+54
-2
lines changed

lib/MqttImpl/MqttChatEventsSender.dart

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import 'package:flutter_mqtt/abstraction/ChatEventsSender.dart';
33
import 'package:flutter_mqtt/abstraction/ClientHandler.dart';
44
import 'package:flutter_mqtt/abstraction/models/ChatMarkerMessage.dart';
55
import 'package:flutter_mqtt/abstraction/models/InvitationMessage.dart';
6+
import 'package:flutter_mqtt/abstraction/models/PresenceMesssage.dart';
67
import 'package:flutter_mqtt/abstraction/models/enums/ChatMarker.dart';
78
import 'package:flutter_mqtt/abstraction/models/enums/InvitationMessageType.dart';
89
import 'package:flutter_mqtt/abstraction/models/enums/MessageType.dart';
910
import 'package:flutter_mqtt/abstraction/models/TypingMessage.dart';
11+
import 'package:flutter_mqtt/abstraction/models/enums/PresenceType.dart';
1012
import 'package:uuid/uuid.dart';
1113

1214
class MqttChatEventsSender extends ChatEventsSender {
@@ -59,7 +61,13 @@ class MqttChatEventsSender extends ChatEventsSender {
5961
sendTime: DateTime.now().millisecondsSinceEpoch);
6062

6163
String topic = "invitations/" + username;
62-
var js = message.toJson();
6364
clientHandler.sendPayload(message.toJson().toString(), topic);
6465
}
66+
67+
@override
68+
void sendPresence(PresenceType presenceType, String myId) {
69+
PresenceMessage presenceMessage = PresenceMessage(id: Uuid().v4(), type: presenceType, fromId: myId);
70+
String payload = presenceMessage.toJson();
71+
clientHandler.sendPayload(payload, "presence/" + myId);
72+
}
6573
}

lib/abstraction/ChatEventsSender.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import 'package:flutter_mqtt/abstraction/models/PresenceMesssage.dart';
2+
import 'package:flutter_mqtt/abstraction/models/enums/PresenceType.dart';
3+
14
import 'models/enums/ChatMarker.dart';
25
import 'models/ChatMessage.dart';
36

@@ -11,4 +14,5 @@ abstract class ChatEventsSender {
1114

1215
void sendInvitation(String username, String? invitationId);
1316
void respondToInvitation(String invitationId, String senderId, bool accept);
17+
void sendPresence(PresenceType presenceType, String myId);
1418
}

lib/db/appdata/AppData.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter_mqtt/abstraction/models/enums/ChatMarker.dart';
22
import 'package:flutter_mqtt/abstraction/models/enums/InvitationMessageType.dart';
33
import 'package:flutter_mqtt/abstraction/models/enums/MessageType.dart';
4+
import 'package:flutter_mqtt/abstraction/models/enums/PresenceType.dart';
45
import 'package:flutter_mqtt/db/appdata/ContactsHandler.dart';
56
import 'package:flutter_mqtt/db/appdata/InvitationsHandler.dart';
67
import 'package:flutter_mqtt/db/appdata/MessageHandler.dart';
@@ -112,6 +113,10 @@ class AppData {
112113
ChatApp.instance()!.clientHandler.leaveRoom(contact.roomId);
113114
ChatApp.instance()!.clientHandler.leaveContactEvents(contact.id);
114115
}
116+
if(user != null) {
117+
ChatApp.instance()!.eventsSender.sendPresence(
118+
PresenceType.Unavailable, user!.id);
119+
}
115120
ChatApp.instance()!.disconnect();
116121
await deleteAll();
117122
}

lib/main.dart

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,48 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_mqtt/abstraction/models/enums/PresenceType.dart';
3+
import 'package:flutter_mqtt/db/appdata/AppData.dart';
4+
import 'package:flutter_mqtt/db/database.dart';
5+
import 'package:flutter_mqtt/global/ChatApp.dart';
26
import 'package:flutter_mqtt/ui/screens/startup_page.dart';
37

8+
import 'abstraction/models/User.dart';
9+
410
void main() {
511
runApp(MyApp());
612
}
713

8-
class MyApp extends StatelessWidget {
14+
class MyApp extends StatefulWidget {
915
// This widget is the root of your application.
1016
@override
17+
_MyAppState createState() => _MyAppState();
18+
}
19+
20+
class _MyAppState extends State<MyApp> with WidgetsBindingObserver{
21+
@override
22+
void initState() {
23+
WidgetsBinding.instance!.addObserver(this);
24+
super.initState();
25+
}
26+
@override
27+
void dispose() {
28+
WidgetsBinding.instance!.removeObserver(this);
29+
super.dispose();
30+
}
31+
@override
32+
void didChangeAppLifecycleState(AppLifecycleState state) {
33+
print('App State = $state');
34+
35+
DbUser? user = AppData.instance()!.user;
36+
if(user != null){
37+
if(state == AppLifecycleState.inactive || state == AppLifecycleState.paused){
38+
ChatApp.instance()!.eventsSender.sendPresence(PresenceType.Away, user.id);
39+
}
40+
else if(state == AppLifecycleState.resumed){
41+
ChatApp.instance()!.eventsSender.sendPresence(PresenceType.Available, user.id);
42+
}
43+
}
44+
}
45+
@override
1146
Widget build(BuildContext context) {
1247
return MaterialApp(
1348
debugShowCheckedModeBanner: false,

0 commit comments

Comments
 (0)