added basic csi

iNPUTmice created

Change summary

src/eu/siacs/conversations/services/XmppConnectionService.java  | 48 +++
src/eu/siacs/conversations/xmpp/XmppConnection.java             | 18 +
src/eu/siacs/conversations/xmpp/stanzas/csi/ActivePacket.java   | 10 
src/eu/siacs/conversations/xmpp/stanzas/csi/InactivePacket.java | 10 
4 files changed, 86 insertions(+)

Detailed changes

src/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -911,6 +911,9 @@ public class XmppConnectionService extends Service {
 
 	public void setOnConversationListChangedListener(
 			OnConversationUpdate listener) {
+		if (checkListeners()) {
+			switchToForeground();
+		}
 		this.mOnConversationUpdate = listener;
 		this.convChangedListenerCount++;
 	}
@@ -919,10 +922,16 @@ public class XmppConnectionService extends Service {
 		this.convChangedListenerCount--;
 		if (this.convChangedListenerCount == 0) {
 			this.mOnConversationUpdate = null;
+			if (checkListeners()) {
+				switchToBackground();
+			}
 		}
 	}
 
 	public void setOnAccountListChangedListener(OnAccountUpdate listener) {
+		if (checkListeners()) {
+			switchToForeground();
+		}
 		this.mOnAccountUpdate = listener;
 		this.accountChangedListenerCount++;
 	}
@@ -931,15 +940,54 @@ public class XmppConnectionService extends Service {
 		this.accountChangedListenerCount--;
 		if (this.accountChangedListenerCount == 0) {
 			this.mOnAccountUpdate = null;
+			if (checkListeners()) {
+				switchToBackground();
+			}
 		}
 	}
 	
 	public void setOnRosterUpdateListener(OnRosterUpdate listener) {
+		if (checkListeners()) {
+			switchToForeground();
+		}
 		this.mOnRosterUpdate = listener;
 	}
 
 	public void removeOnRosterUpdateListener() {
 		this.mOnRosterUpdate = null;
+		if (checkListeners()) {
+			switchToBackground();
+		}
+	}
+	
+	private boolean checkListeners() {
+		return (this.mOnAccountUpdate == null && this.mOnConversationUpdate == null && this.mOnRosterUpdate == null);
+	}
+	
+	private void switchToForeground() {
+		Log.d(LOGTAG,"going into foreground");
+		for(Account account : getAccounts()) {
+			if (account.getStatus() == Account.STATUS_ONLINE) {
+				XmppConnection connection = account.getXmppConnection();
+				if (connection != null && connection.getFeatures().csi()) {
+					connection.sendActive();
+					Log.d(LOGTAG,account.getJid() + " sending csi//active");
+				}
+			}
+		}
+	}
+	
+	private void switchToBackground() {
+		Log.d(LOGTAG,"going into background");
+		for(Account account : getAccounts()) {
+			if (account.getStatus() == Account.STATUS_ONLINE) {
+				XmppConnection connection = account.getXmppConnection();
+				if (connection != null && connection.getFeatures().csi()) {
+					connection.sendInactive();
+					Log.d(LOGTAG,account.getJid() + " sending csi//inactive");
+				}
+			}
+		}
 	}
 
 	public void connectMultiModeConversations(Account account) {

src/eu/siacs/conversations/xmpp/XmppConnection.java 🔗

@@ -47,6 +47,8 @@ import eu.siacs.conversations.xmpp.stanzas.AbstractStanza;
 import eu.siacs.conversations.xmpp.stanzas.IqPacket;
 import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
 import eu.siacs.conversations.xmpp.stanzas.PresencePacket;
+import eu.siacs.conversations.xmpp.stanzas.csi.ActivePacket;
+import eu.siacs.conversations.xmpp.stanzas.csi.InactivePacket;
 import eu.siacs.conversations.xmpp.stanzas.streammgmt.AckPacket;
 import eu.siacs.conversations.xmpp.stanzas.streammgmt.EnablePacket;
 import eu.siacs.conversations.xmpp.stanzas.streammgmt.RequestPacket;
@@ -900,6 +902,14 @@ public class XmppConnection implements Runnable {
 			}
 		}
 		
+		public boolean csi() {
+			if (connection.streamFeatures == null) {
+				return false;
+			} else {
+				return connection.streamFeatures.hasChild("csi");
+			}
+		}
+		
 		public boolean pubsub() {
 			return hasDiscoFeature(account.getServer(), "http://jabber.org/protocol/pubsub#publish");
 		}
@@ -942,4 +952,12 @@ public class XmppConnection implements Runnable {
 	public long getLastPacketReceived() {
 		return this.lastPaketReceived;
 	}
+
+	public void sendActive() {
+		this.sendPacket(new ActivePacket(), null);
+	}
+	
+	public void sendInactive() {
+		this.sendPacket(new InactivePacket(), null);
+	}
 }

src/eu/siacs/conversations/xmpp/stanzas/csi/ActivePacket.java 🔗

@@ -0,0 +1,10 @@
+package eu.siacs.conversations.xmpp.stanzas.csi;
+
+import eu.siacs.conversations.xmpp.stanzas.AbstractStanza;
+
+public class ActivePacket extends AbstractStanza {
+	public ActivePacket() {
+		super("active");
+		setAttribute("xmlns", "urn:xmpp:csi");
+	}
+}

src/eu/siacs/conversations/xmpp/stanzas/csi/InactivePacket.java 🔗

@@ -0,0 +1,10 @@
+package eu.siacs.conversations.xmpp.stanzas.csi;
+
+import eu.siacs.conversations.xmpp.stanzas.AbstractStanza;
+
+public class InactivePacket extends AbstractStanza {
+	public InactivePacket() {
+		super("inactive");
+		setAttribute("xmlns", "urn:xmpp:csi");
+	}
+}