summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlex Clayton <alex.clayton@isode.com>2016-03-11 09:38:40 (GMT)
committerAlex Clayton <alex.clayton@isode.com>2016-03-14 14:59:53 (GMT)
commitc77facbc3036590cfa347f38859f9f536f082d6b (patch)
tree6ea804994bac2bc8fe76736b61075deeb02b6932 /src
parentecec6f30d6d91ea17b8ed9f6a31dc4702e759585 (diff)
downloadstroke-c77facbc3036590cfa347f38859f9f536f082d6b.zip
stroke-c77facbc3036590cfa347f38859f9f536f082d6b.tar.bz2
Add roster to PresenceOracle.
As per patch 'Mark removed contacts as unavailable in Swift' (9e6ee0f262e7dc663f4c706b16a346a268f425aa) added an XMPPRoster to the member variables and constructor arguments for PresenceOracle. Test-information: Unit tests pass. Change-Id: I062d256c088a968e061d864fbd1386f850b614a7
Diffstat (limited to 'src')
-rw-r--r--src/com/isode/stroke/client/Client.java4
-rw-r--r--src/com/isode/stroke/presence/PresenceOracle.java58
2 files changed, 45 insertions, 17 deletions
diff --git a/src/com/isode/stroke/client/Client.java b/src/com/isode/stroke/client/Client.java
index 07ac885..88022e3 100644
--- a/src/com/isode/stroke/client/Client.java
+++ b/src/com/isode/stroke/client/Client.java
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2010-2015, Isode Limited, London, England. 2 * Copyright (c) 2010-2016, Isode Limited, London, England.
3 * All rights reserved. 3 * All rights reserved.
4 */ 4 */
5package com.isode.stroke.client; 5package com.isode.stroke.client;
@@ -101,7 +101,7 @@ public class Client extends CoreClient {
101 101
102 subscriptionManager = new SubscriptionManager(getStanzaChannel()); 102 subscriptionManager = new SubscriptionManager(getStanzaChannel());
103 103
104 presenceOracle = new PresenceOracle(getStanzaChannel()); 104 presenceOracle = new PresenceOracle(getStanzaChannel(),roster);
105 presenceOracle.onPresenceChange.connect(onPresenceChange); 105 presenceOracle.onPresenceChange.connect(onPresenceChange);
106 106
107 stanzaChannelPresenceSender = new StanzaChannelPresenceSender(getStanzaChannel()); 107 stanzaChannelPresenceSender = new StanzaChannelPresenceSender(getStanzaChannel());
diff --git a/src/com/isode/stroke/presence/PresenceOracle.java b/src/com/isode/stroke/presence/PresenceOracle.java
index e3e68cb..7ac5b9d 100644
--- a/src/com/isode/stroke/presence/PresenceOracle.java
+++ b/src/com/isode/stroke/presence/PresenceOracle.java
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2010-2015, Isode Limited, London, England. 2 * Copyright (c) 2010-2016, Isode Limited, London, England.
3 * All rights reserved. 3 * All rights reserved.
4 */ 4 */
5package com.isode.stroke.presence; 5package com.isode.stroke.presence;
@@ -13,6 +13,7 @@ import com.isode.stroke.client.StanzaChannel;
13import com.isode.stroke.elements.Presence; 13import com.isode.stroke.elements.Presence;
14import com.isode.stroke.elements.StatusShow; 14import com.isode.stroke.elements.StatusShow;
15import com.isode.stroke.jid.JID; 15import com.isode.stroke.jid.JID;
16import com.isode.stroke.roster.XMPPRoster;
16import com.isode.stroke.signals.Signal1; 17import com.isode.stroke.signals.Signal1;
17import com.isode.stroke.signals.SignalConnection; 18import com.isode.stroke.signals.SignalConnection;
18import com.isode.stroke.signals.Slot1; 19import com.isode.stroke.signals.Slot1;
@@ -22,29 +23,41 @@ public class PresenceOracle {
22 private final StanzaChannel stanzaChannel_; 23 private final StanzaChannel stanzaChannel_;
23 private final SignalConnection onPresenceReceivedSignal; 24 private final SignalConnection onPresenceReceivedSignal;
24 private final SignalConnection onAvailableChangedSignal; 25 private final SignalConnection onAvailableChangedSignal;
26 private final XMPPRoster xmppRoster_;
25 27
26 28
27 public final Signal1<Presence> onPresenceChange = new Signal1<Presence>(); 29 public final Signal1<Presence> onPresenceChange = new Signal1<Presence>();
30 private final SignalConnection onJIDRemovedConnection;
28 31
29 public PresenceOracle(StanzaChannel stanzaChannel) { 32 public PresenceOracle(StanzaChannel stanzaChannel, XMPPRoster xmppRoster) {
30 stanzaChannel_ = stanzaChannel; 33 stanzaChannel_ = stanzaChannel;
31 onPresenceReceivedSignal = stanzaChannel_.onPresenceReceived.connect(new Slot1<Presence>() { 34 xmppRoster_ = xmppRoster;
32 @Override 35 onPresenceReceivedSignal = stanzaChannel_.onPresenceReceived.connect(new Slot1<Presence>() {
33 public void call(Presence p1) { 36 @Override
34 handleIncomingPresence(p1); 37 public void call(Presence p1) {
35 } 38 handleIncomingPresence(p1);
36 }); 39 }
37 onAvailableChangedSignal = stanzaChannel_.onAvailableChanged.connect(new Slot1<Boolean>() { 40 });
38 @Override 41 onAvailableChangedSignal = stanzaChannel_.onAvailableChanged.connect(new Slot1<Boolean>() {
39 public void call(Boolean p1) { 42 @Override
40 handleStanzaChannelAvailableChanged(p1); 43 public void call(Boolean p1) {
41 } 44 handleStanzaChannelAvailableChanged(p1);
42 }); 45 }
46 });
47 onJIDRemovedConnection = xmppRoster_.onJIDRemoved.connect(new Slot1<JID>() {
48
49 @Override
50 public void call(JID removedJID) {
51 handleJIDRemoved(removedJID);
52 }
53
54 });
43 } 55 }
44 56
45 void delete() { 57 void delete() {
46 onPresenceReceivedSignal.disconnect(); 58 onPresenceReceivedSignal.disconnect();
47 onAvailableChangedSignal.disconnect(); 59 onAvailableChangedSignal.disconnect();
60 onJIDRemovedConnection.disconnect();
48 } 61 }
49 62
50 void handleStanzaChannelAvailableChanged(boolean available) { 63 void handleStanzaChannelAvailableChanged(boolean available) {
@@ -85,6 +98,21 @@ public class PresenceOracle {
85 onPresenceChange.emit(passedPresence); 98 onPresenceChange.emit(passedPresence);
86 } 99 }
87 } 100 }
101
102 private void handleJIDRemoved(JID removedJID) {
103 // 3921bis says that we don't follow up with an unavailable, so simulate this ourselves
104 Presence unavailablePresence = new Presence();
105 unavailablePresence.setType(Presence.Type.Unavailable);
106 unavailablePresence.setFrom(removedJID);
107
108 if (entries_.containsKey(removedJID.toBare())) {
109 Map<JID,Presence> presenceMap = entries_.get(removedJID.toBare());
110 presenceMap.clear();
111 presenceMap.put(removedJID, unavailablePresence);
112 }
113
114 onPresenceChange.emit(unavailablePresence);
115 }
88 116
89 public Presence getLastPresence(final JID jid) { 117 public Presence getLastPresence(final JID jid) {
90 Map<JID,Presence> presenceMap = entries_.get(jid.toBare()); 118 Map<JID,Presence> presenceMap = entries_.get(jid.toBare());