From 32da65f910207f08f50b57ba59af9474eaad75d8 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 12 Feb 2016 11:39:27 +0100 Subject: client side support for XEP-0357: Push Notifications --- .../services/PushManagementService.java | 78 ++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/playstore/java/eu/siacs/conversations/services/PushManagementService.java (limited to 'src/playstore/java/eu/siacs/conversations/services/PushManagementService.java') diff --git a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java new file mode 100644 index 00000000..d65170ee --- /dev/null +++ b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java @@ -0,0 +1,78 @@ +package eu.siacs.conversations.services; + +import android.provider.Settings; +import android.util.Log; + +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GoogleApiAvailability; +import com.google.android.gms.gcm.GoogleCloudMessaging; +import com.google.android.gms.iid.InstanceID; + +import java.io.IOException; + +import eu.siacs.conversations.Config; +import eu.siacs.conversations.R; +import eu.siacs.conversations.entities.Account; +import eu.siacs.conversations.xmpp.OnIqPacketReceived; +import eu.siacs.conversations.xmpp.jid.InvalidJidException; +import eu.siacs.conversations.xmpp.jid.Jid; +import eu.siacs.conversations.xmpp.stanzas.IqPacket; + +public class PushManagementService { + + private static final String APP_SERVER = "push.conversations.im"; + + protected final XmppConnectionService mXmppConnectionService; + + public PushManagementService(XmppConnectionService service) { + this.mXmppConnectionService = service; + } + + public void registerPushTokenOnServer(final Account account) { + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": has push support"); + retrieveGcmInstanceToken(new OnGcmInstanceTokenRetrieved() { + @Override + public void onGcmInstanceTokenRetrieved(String token) { + try { + final String deviceId = Settings.Secure.getString(mXmppConnectionService.getContentResolver(), Settings.Secure.ANDROID_ID); + IqPacket packet = mXmppConnectionService.getIqGenerator().pushTokenToAppServer(Jid.fromString(APP_SERVER), token, deviceId); + mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() { + @Override + public void onIqPacketReceived(Account account, IqPacket packet) { + Log.d(Config.LOGTAG, "push to app server result: " + packet.toString()); + } + }); + } catch (InvalidJidException ignored) { + + } + } + }); + } + + private void retrieveGcmInstanceToken(final OnGcmInstanceTokenRetrieved instanceTokenRetrieved) { + new Thread(new Runnable() { + @Override + public void run() { + InstanceID instanceID = InstanceID.getInstance(mXmppConnectionService); + try { + String token = instanceID.getToken(mXmppConnectionService.getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); + instanceTokenRetrieved.onGcmInstanceTokenRetrieved(token); + } catch (IOException e) { + } + } + }).start(); + + } + + public boolean available() { + return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(mXmppConnectionService) == ConnectionResult.SUCCESS; + } + + public boolean pushAvailable(Account account) { + return account.getXmppConnection().getFeatures().push() && available(); + } + + interface OnGcmInstanceTokenRetrieved { + void onGcmInstanceTokenRetrieved(String token); + } +} -- cgit v1.2.3 From c7a14092a818262b8479a5bfff45c45689f6e755 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 13 Feb 2016 00:03:57 +0100 Subject: fixed compile bug in free version --- .../siacs/conversations/services/PushManagementService.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'src/playstore/java/eu/siacs/conversations/services/PushManagementService.java') diff --git a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java index d65170ee..68e824cb 100644 --- a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java +++ b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java @@ -20,7 +20,7 @@ import eu.siacs.conversations.xmpp.stanzas.IqPacket; public class PushManagementService { - private static final String APP_SERVER = "push.conversations.im"; + private static final String APP_SERVER = "push.siacs.eu"; protected final XmppConnectionService mXmppConnectionService; @@ -64,12 +64,13 @@ public class PushManagementService { } - public boolean available() { - return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(mXmppConnectionService) == ConnectionResult.SUCCESS; + + public boolean available(Account account) { + return account.getXmppConnection().getFeatures().push() && playServicesAvailable(); } - public boolean pushAvailable(Account account) { - return account.getXmppConnection().getFeatures().push() && available(); + private boolean playServicesAvailable() { + return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(mXmppConnectionService) == ConnectionResult.SUCCESS; } interface OnGcmInstanceTokenRetrieved { -- cgit v1.2.3 From 6f9f87192867d676890fed0221fb4279ac9375ec Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 13 Feb 2016 14:20:07 +0100 Subject: send push enable to server. simplified logging --- .../services/PushManagementService.java | 36 +++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (limited to 'src/playstore/java/eu/siacs/conversations/services/PushManagementService.java') diff --git a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java index 68e824cb..f613fe5b 100644 --- a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java +++ b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java @@ -13,7 +13,9 @@ import java.io.IOException; import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; +import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xmpp.OnIqPacketReceived; +import eu.siacs.conversations.xmpp.forms.Data; import eu.siacs.conversations.xmpp.jid.InvalidJidException; import eu.siacs.conversations.xmpp.jid.Jid; import eu.siacs.conversations.xmpp.stanzas.IqPacket; @@ -39,7 +41,25 @@ public class PushManagementService { mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() { @Override public void onIqPacketReceived(Account account, IqPacket packet) { - Log.d(Config.LOGTAG, "push to app server result: " + packet.toString()); + Element command = packet.findChild("command","http://jabber.org/protocol/commands"); + if (packet.getType() == IqPacket.TYPE.RESULT && command != null) { + Element x = command.findChild("x","jabber:x:data"); + if (x != null) { + Data data = Data.parse(x); + try { + String node = data.getValue("node"); + String secret = data.getValue("secret"); + Jid jid = Jid.fromString(data.getValue("jid")); + if (node != null && secret != null) { + enablePushOnServer(account, jid, node, secret); + } + } catch (InvalidJidException e) { + e.printStackTrace(); + } + } + } else { + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": invalid response from app server"); + } } }); } catch (InvalidJidException ignored) { @@ -49,6 +69,20 @@ public class PushManagementService { }); } + private void enablePushOnServer(final Account account, final Jid jid, final String node, final String secret) { + IqPacket enable = mXmppConnectionService.getIqGenerator().enablePush(jid, node, secret); + mXmppConnectionService.sendIqPacket(account, enable, new OnIqPacketReceived() { + @Override + public void onIqPacketReceived(Account account, IqPacket packet) { + if (packet.getType() == IqPacket.TYPE.RESULT) { + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": successfully enabled push on server"); + } else if (packet.getType() == IqPacket.TYPE.ERROR) { + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": enabling push on server failed"); + } + } + }); + } + private void retrieveGcmInstanceToken(final OnGcmInstanceTokenRetrieved instanceTokenRetrieved) { new Thread(new Runnable() { @Override -- cgit v1.2.3 From 92a6e956fd90c71091c9d8348804e5f285382f32 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 14 Feb 2016 15:36:37 +0100 Subject: be more carefull when checking push availability --- .../java/eu/siacs/conversations/services/PushManagementService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/playstore/java/eu/siacs/conversations/services/PushManagementService.java') diff --git a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java index f613fe5b..fbd768cf 100644 --- a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java +++ b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java @@ -15,6 +15,7 @@ import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xmpp.OnIqPacketReceived; +import eu.siacs.conversations.xmpp.XmppConnection; import eu.siacs.conversations.xmpp.forms.Data; import eu.siacs.conversations.xmpp.jid.InvalidJidException; import eu.siacs.conversations.xmpp.jid.Jid; @@ -100,7 +101,8 @@ public class PushManagementService { public boolean available(Account account) { - return account.getXmppConnection().getFeatures().push() && playServicesAvailable(); + final XmppConnection connection = account.getXmppConnection(); + return connection != null && connection.getFeatures().push() && playServicesAvailable(); } private boolean playServicesAvailable() { -- cgit v1.2.3 From 356199978eaef303cef7faa90280dafb0425af71 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 14 Feb 2016 18:19:11 +0100 Subject: fixed server info push not showing up when unavailable --- .../eu/siacs/conversations/services/PushManagementService.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/playstore/java/eu/siacs/conversations/services/PushManagementService.java') diff --git a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java index fbd768cf..3fdaf832 100644 --- a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java +++ b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java @@ -76,9 +76,9 @@ public class PushManagementService { @Override public void onIqPacketReceived(Account account, IqPacket packet) { if (packet.getType() == IqPacket.TYPE.RESULT) { - Log.d(Config.LOGTAG,account.getJid().toBareJid()+": successfully enabled push on server"); + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": successfully enabled push on server"); } else if (packet.getType() == IqPacket.TYPE.ERROR) { - Log.d(Config.LOGTAG,account.getJid().toBareJid()+": enabling push on server failed"); + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": enabling push on server failed"); } } }); @@ -109,6 +109,10 @@ public class PushManagementService { return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(mXmppConnectionService) == ConnectionResult.SUCCESS; } + public boolean isStub() { + return false; + } + interface OnGcmInstanceTokenRetrieved { void onGcmInstanceTokenRetrieved(String token); } -- cgit v1.2.3