summaryrefslogtreecommitdiffstats
blob: 470e4b901ef0e4e388523160eabb09de24ffe537 (plain)
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();
			}
		}
	}

}