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
@@ -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) {
@@ -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);
+ }
}
@@ -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");
+ }
+}
@@ -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");
+ }
+}