1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
/*
* Copyright (c) 2010-2015, Isode Limited, London, England.
* All rights reserved.
*/
package com.isode.stroke.client;
import java.util.Collection;
import com.isode.stroke.elements.VCard;
import com.isode.stroke.jid.JID;
import com.isode.stroke.muc.MUCRegistry;
import com.isode.stroke.roster.XMPPRoster;
import com.isode.stroke.signals.Signal2;
import com.isode.stroke.signals.Slot1;
import com.isode.stroke.signals.Slot2;
import com.isode.stroke.signals.Slot3;
import com.isode.stroke.vcards.VCardManager;
// FIXME: The NickResolver currently relies on the vcard being requested by the client on login.
// The VCardManager should get an onConnected() signal (which is signalled when the stanzachannel is available(, and each time this is emitted,
// the nickresolver should request the vcard.
// FIXME: The ownJID functionality should probably be removed, and NickManager should be used directly.
public class NickResolver {
private JID ownJID_ = new JID();
private String ownNick_ = "";
private XMPPRoster xmppRoster_;
private MUCRegistry mucRegistry_;
private VCardManager vcardManager_;
public final Signal2<JID, String /*previousNick*/ > onNickChanged = new Signal2<JID, String>();
public NickResolver(final JID ownJID, XMPPRoster xmppRoster, VCardManager vcardManager, MUCRegistry mucRegistry) {
ownJID_ = ownJID;
xmppRoster_ = xmppRoster;
vcardManager_ = vcardManager;
if (vcardManager_ != null) {
vcardManager_.onVCardChanged.connect(new Slot2<JID, VCard>() {
@Override
public void call(JID p1, VCard p2) {
handleVCardReceived(p1, p2);
}
});
}
mucRegistry_ = mucRegistry;
xmppRoster_.onJIDUpdated.connect(new Slot3<JID, String, Collection<String>>() {
@Override
public void call(JID p1, String p2, Collection<String> p3) {
handleJIDUpdated(p1, p2, p3);
}
});
xmppRoster_.onJIDAdded.connect(new Slot1<JID>() {
@Override
public void call(JID p1) {
handleJIDAdded(p1);
}
});
}
void handleJIDUpdated(final JID jid, final String previousNick, final Collection<String> groups) {
onNickChanged.emit(jid, previousNick);
}
void handleJIDAdded(final JID jid) {
String oldNick = jidToNick(jid);
onNickChanged.emit(jid, oldNick);
}
public String jidToNick(final JID jid) {
if (jid.toBare().equals(ownJID_)) {
if (ownNick_ != null && !ownNick_.isEmpty()) {
return ownNick_;
}
}
String nick = "";
if (mucRegistry_ != null && mucRegistry_.isMUC(jid.toBare()) ) {
return jid.getResource().isEmpty() ? jid.toBare().toString() : jid.getResource();
}
if (xmppRoster_.containsJID(jid) && !xmppRoster_.getNameForJID(jid).isEmpty()) {
return xmppRoster_.getNameForJID(jid);
}
return jid.toBare().toString();
}
void handleVCardReceived(final JID jid, VCard ownVCard) {
if (jid.compare(ownJID_, JID.CompareType.WithoutResource) != 0) {
return;
}
String initialNick = ownNick_;
ownNick_ = ownJID_.toString();
if (ownVCard != null) {
if (!ownVCard.getNickname().isEmpty()) {
ownNick_ = ownVCard.getNickname();
} else if (!ownVCard.getGivenName().isEmpty()) {
ownNick_ = ownVCard.getGivenName();
} else if (!ownVCard.getFullName().isEmpty()) {
ownNick_ = ownVCard.getFullName();
}
}
}
}
|