src/main/java/de/unixwork/im/App.java

Thu, 26 Dec 2024 17:19:15 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 26 Dec 2024 17:19:15 +0100
changeset 3
25a32e2dfde5
parent 2
94c6a715fa44
permissions
-rw-r--r--

update status in contact list and conversations

0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 package de.unixwork.im;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 import javax.swing.*;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 import java.util.HashMap;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 import java.util.List;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 import java.util.Map;
2
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
7 import org.jivesoftware.smack.packet.Presence;
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 import org.jivesoftware.smack.roster.RosterEntry;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 import org.jxmpp.jid.Jid;
2
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
10 import org.jxmpp.jid.parts.Resourcepart;
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 public class App {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 private static App instance;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 private final ContactListFrame contactListFrame;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 private final Map<String, ConversationFrame> conversations;
2
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
18 private final Map<String, PresenceInfo> presence = new HashMap<>(32);
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 private final Xmpp xmpp;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 public App(Xmpp xmpp) throws Exception {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 if(instance != null) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 throw new Exception("App already initilized");
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 App.instance = this;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 conversations = new HashMap<>();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28 this.xmpp = xmpp;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 // Create the contact list window
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 contactListFrame = new ContactListFrame();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 contactListFrame.setContactClickListener(contact -> {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 openConversation(contact.getJid().asUnescapedString());
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 });
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 contactListFrame.setVisible(true);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 public static App getInstance() {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 return instance;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 public Xmpp getXmpp() {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 return xmpp;
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 // Method to open a conversation window
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 public void openConversation(String xid) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 SwingUtilities.invokeLater(() -> {
3
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
49 ConversationFrame conversationFrame = conversations.get(xid);
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
50 if (conversationFrame == null) {
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
51 conversationFrame = new ConversationFrame(xid);
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 conversations.put(xid, conversationFrame);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 conversationFrame.setVisible(true);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 } else {
3
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
55 conversationFrame.setVisible(true);
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
56 conversationFrame.toFront();
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 });
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 public void dispatchMessage(Jid from, String msg, boolean secure) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 SwingUtilities.invokeLater(() -> {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 // add message to the correct conversation
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 // if no conversation exists yet, create a new window
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 String xid = from.asBareJid().toString();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 //String resource = from.getResourceOrNull();
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 ConversationFrame conversation = conversations.get(xid);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 if(conversation == null) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 conversation = new ConversationFrame(xid);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 conversations.put(xid, conversation);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 conversation.addToLog(msg, true, false);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 conversation.setVisible(true);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 });
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 public void setContacts(List<RosterEntry> contacts) {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 SwingUtilities.invokeLater(() -> {
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 contactListFrame.setContacts(contacts);
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 });
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 }
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84
3
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
85 public PresenceInfo getPresenceForXID(String xid) {
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
86 return presence.get(xid);
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 }
3
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
88
2
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
89 public String getStatusForXID(String xid) {
3
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
90 PresenceInfo ps = getPresenceForXID(xid);
2
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
91 if(ps == null) {
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
92 return "<offline> ";
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
93 }
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
94 return ps.getOnlineStatus();
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
95 }
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
96
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
97 void handlePresence(Jid from, Presence.Type type) {
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
98 System.out.println("presence from: " + from.toString() + " type: " + type.toString());
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
99
3
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
100 SwingUtilities.invokeLater(() -> {
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
101 String xid = from.asBareJid().toString();
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
102 PresenceInfo ps = presence.get(xid);
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
103 if(ps == null) {
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
104 ps = new PresenceInfo();
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
105 presence.put(xid, ps);
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
106 }
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
107
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
108 // update presence
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
109 Resourcepart resource = from.getResourceOrNull();
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
110 if(resource != null) {
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
111 ps.setStatus(resource.toString(), type);
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
112 } else {
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
113 // TODO
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
114 }
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
115
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
116 contactListFrame.reload();
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
117 ConversationFrame conversation = conversations.get(xid);
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
118 if(conversation != null) {
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
119 conversation.updatePresence(ps);
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
120 }
25a32e2dfde5 update status in contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 2
diff changeset
121 });
2
94c6a715fa44 handle presence messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
122 }
0
f3095cda599e add initial code with minimal working contact list and conversations
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 }

mercurial