Send XMPP command on separated thread.

This commit is contained in:
Chteufleur 2018-10-08 22:18:33 +02:00
parent 4499278583
commit 41ab3818fe
10 changed files with 256 additions and 52 deletions

View File

@ -189,7 +189,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
} else { } else {
serviceTrackingDog.sendXmppCommandStopTrail(); serviceTrackingDog.sendXmppCommandStopTrail();
} }
} catch (XmppStringprepException | XMPPException.XMPPErrorException | SmackException.NotConnectedException | InterruptedException | SmackException.NoResponseException e) { } catch (XmppStringprepException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }

View File

@ -0,0 +1,19 @@
package fr.chteufleur.mytrackingdog.models.xmpp.commands.send;
import org.jivesoftware.smackx.commands.AdHocCommandManager;
import org.jxmpp.jid.FullJid;
public abstract class SendCommand {
public static final String TAG = SendCommand.class.getName();
protected final FullJid to;
protected final AdHocCommandManager commandManager;
public SendCommand(AdHocCommandManager commandManager, FullJid to) {
this.commandManager = commandManager;
this.to = to;
}
public abstract void executeCommand() throws Exception;
}

View File

@ -0,0 +1,18 @@
package fr.chteufleur.mytrackingdog.models.xmpp.commands.send;
import org.jivesoftware.smackx.commands.AdHocCommandManager;
import org.jxmpp.jid.FullJid;
public abstract class SendLocationCommand extends SendCommand {
protected final double latitude;
protected final double longitude;
protected final long time;
public SendLocationCommand(AdHocCommandManager commandManager, FullJid to, double lat, double lon, long time) {
super(commandManager, to);
this.latitude = lat;
this.longitude = lon;
this.time = time;
}
}

View File

@ -0,0 +1,33 @@
package fr.chteufleur.mytrackingdog.models.xmpp.commands.send;
import android.util.Log;
import org.jivesoftware.smackx.commands.AdHocCommandManager;
import org.jivesoftware.smackx.commands.RemoteCommand;
import org.jivesoftware.smackx.xdata.Form;
import org.jxmpp.jid.FullJid;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.ObjectGeolocCommand;
import fr.chteufleur.mytrackingdog.services.ServiceXmpp;
public class SendObjectLocationCommand extends SendLocationCommand {
public SendObjectLocationCommand(AdHocCommandManager commandManager, FullJid to, double lat, double lon, long time) {
super(commandManager, to, lat, lon, time);
}
@Override
public void executeCommand() throws Exception {
Log.i(TAG, "Send command object");
RemoteCommand command = commandManager.getRemoteCommand(to, ServiceXmpp.XMPP_NODE_OBJECT_GEOLOC);
command.execute();
if (command.getForm() == null) {
throw new Exception("Didn't get form back");
}
Form form = command.getForm().createAnswerForm();
form.setAnswer(ObjectGeolocCommand.FIELD_PARAM_LATITUDE, latitude);
form.setAnswer(ObjectGeolocCommand.FIELD_PARAM_LONGITUDE, longitude);
form.setAnswer(ObjectGeolocCommand.FIELD_PARAM_TIME, time);
command.next(form);
}
}

View File

@ -0,0 +1,34 @@
package fr.chteufleur.mytrackingdog.models.xmpp.commands.send;
import android.util.Log;
import org.jivesoftware.smackx.commands.AdHocCommandManager;
import org.jivesoftware.smackx.commands.RemoteCommand;
import org.jivesoftware.smackx.xdata.Form;
import org.jxmpp.jid.FullJid;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.RealTimeModeCommand;
import fr.chteufleur.mytrackingdog.services.ServiceXmpp;
public class SendRealTimeModeCommand extends SendCommand {
private final boolean isRealTimeMode;
public SendRealTimeModeCommand(AdHocCommandManager commandManager, FullJid to, boolean isRealTimeMode) {
super(commandManager, to);
this.isRealTimeMode = isRealTimeMode;
}
@Override
public void executeCommand() throws Exception {
Log.i(TAG, "Send commande real time mode");
RemoteCommand command = commandManager.getRemoteCommand(to, ServiceXmpp.XMPP_NODE_REAL_TIME_MODE);
command.execute();
if (command.getForm() == null) {
throw new Exception("Didn't get form back");
}
Form form = command.getForm().createAnswerForm();
form.setAnswer(RealTimeModeCommand.FIELD_PARAM_IS_ACTIVE, isRealTimeMode);
command.next(form);
}
}

View File

@ -0,0 +1,23 @@
package fr.chteufleur.mytrackingdog.models.xmpp.commands.send;
import android.util.Log;
import org.jivesoftware.smackx.commands.AdHocCommandManager;
import org.jivesoftware.smackx.commands.RemoteCommand;
import org.jxmpp.jid.FullJid;
import fr.chteufleur.mytrackingdog.services.ServiceXmpp;
public class SendStartTrailCommand extends SendCommand {
public SendStartTrailCommand(AdHocCommandManager commandManager, FullJid to) {
super(commandManager, to);
}
@Override
public void executeCommand() throws Exception {
Log.i(TAG, "Send command start");
RemoteCommand command = commandManager.getRemoteCommand(to, ServiceXmpp.XMPP_NODE_START_TRAIL_GEOLOC);
command.execute();
}
}

View File

@ -0,0 +1,23 @@
package fr.chteufleur.mytrackingdog.models.xmpp.commands.send;
import android.util.Log;
import org.jivesoftware.smackx.commands.AdHocCommandManager;
import org.jivesoftware.smackx.commands.RemoteCommand;
import org.jxmpp.jid.FullJid;
import fr.chteufleur.mytrackingdog.services.ServiceXmpp;
public class SendStopTrailCommand extends SendCommand {
public SendStopTrailCommand(AdHocCommandManager commandManager, FullJid to) {
super(commandManager, to);
}
@Override
public void executeCommand() throws Exception {
Log.i(TAG, "Send command stop");
RemoteCommand command = commandManager.getRemoteCommand(to, ServiceXmpp.XMPP_NODE_STOP_TRAIL_GEOLOC);
command.execute();
}
}

View File

@ -0,0 +1,34 @@
package fr.chteufleur.mytrackingdog.models.xmpp.commands.send;
import android.util.Log;
import org.jivesoftware.smackx.commands.AdHocCommandManager;
import org.jivesoftware.smackx.commands.RemoteCommand;
import org.jivesoftware.smackx.xdata.Form;
import org.jxmpp.jid.FullJid;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.ObjectGeolocCommand;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.TrailGeolocCommand;
import fr.chteufleur.mytrackingdog.services.ServiceXmpp;
public class SendTrailLocationCommand extends SendLocationCommand {
public SendTrailLocationCommand(AdHocCommandManager commandManager, FullJid to, double lat, double lon, long time) {
super(commandManager, to, lat, lon, time);
}
@Override
public void executeCommand() throws Exception {
Log.i(TAG, "Send command location");
RemoteCommand command = commandManager.getRemoteCommand(to, ServiceXmpp.XMPP_NODE_TRAIL_GEOLOC);
command.execute();
if (command.getForm() == null) {
throw new Exception("Didn't get form back");
}
Form form = command.getForm().createAnswerForm();
form.setAnswer(TrailGeolocCommand.FIELD_PARAM_LATITUDE, latitude);
form.setAnswer(TrailGeolocCommand.FIELD_PARAM_LONGITUDE, longitude);
form.setAnswer(TrailGeolocCommand.FIELD_PARAM_TIME, time);
command.next(form);
}
}

View File

@ -395,12 +395,12 @@ public class ServiceTrackingDog implements Observer {
return ret; return ret;
} }
//<editor-fold defaultstate="collapsed" desc="Commands"> //<editor-fold defaultstate="collapsed" desc="Commands">
public void sendXmppCommandStartTrail() throws XmppStringprepException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException { public void sendXmppCommandStartTrail() throws XmppStringprepException {
if (serviceXmpp != null) { if (serviceXmpp != null) {
serviceXmpp.sendCommandStartTrail(); serviceXmpp.sendCommandStartTrail();
} }
} }
public void sendXmppCommandStopTrail() throws XmppStringprepException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException { public void sendXmppCommandStopTrail() throws XmppStringprepException {
if (serviceXmpp != null) { if (serviceXmpp != null) {
serviceXmpp.sendCommandStopTrail(); serviceXmpp.sendCommandStopTrail();
} }

View File

@ -19,14 +19,12 @@ import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jivesoftware.smackx.commands.AdHocCommandManager; import org.jivesoftware.smackx.commands.AdHocCommandManager;
import org.jivesoftware.smackx.commands.LocalCommand; import org.jivesoftware.smackx.commands.LocalCommand;
import org.jivesoftware.smackx.commands.LocalCommandFactory; import org.jivesoftware.smackx.commands.LocalCommandFactory;
import org.jivesoftware.smackx.commands.RemoteCommand;
import org.jivesoftware.smackx.filetransfer.FileTransfer; import org.jivesoftware.smackx.filetransfer.FileTransfer;
import org.jivesoftware.smackx.filetransfer.FileTransferListener; import org.jivesoftware.smackx.filetransfer.FileTransferListener;
import org.jivesoftware.smackx.filetransfer.FileTransferManager; import org.jivesoftware.smackx.filetransfer.FileTransferManager;
import org.jivesoftware.smackx.filetransfer.FileTransferRequest; import org.jivesoftware.smackx.filetransfer.FileTransferRequest;
import org.jivesoftware.smackx.filetransfer.IncomingFileTransfer; import org.jivesoftware.smackx.filetransfer.IncomingFileTransfer;
import org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer; import org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer;
import org.jivesoftware.smackx.xdata.Form;
import org.jxmpp.jid.BareJid; import org.jxmpp.jid.BareJid;
import org.jxmpp.jid.FullJid; import org.jxmpp.jid.FullJid;
import org.jxmpp.jid.Jid; import org.jxmpp.jid.Jid;
@ -37,6 +35,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.Inet4Address; import java.net.Inet4Address;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.LinkedList;
import java.util.Observable; import java.util.Observable;
import fr.chteufleur.mytrackingdog.QRCodeGeneratorActivity; import fr.chteufleur.mytrackingdog.QRCodeGeneratorActivity;
@ -47,8 +46,14 @@ import fr.chteufleur.mytrackingdog.models.xmpp.commands.RealTimeModeCommand;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.StartTrailGeolocCommand; import fr.chteufleur.mytrackingdog.models.xmpp.commands.StartTrailGeolocCommand;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.StopTrailGeolocCommand; import fr.chteufleur.mytrackingdog.models.xmpp.commands.StopTrailGeolocCommand;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.TrailGeolocCommand; import fr.chteufleur.mytrackingdog.models.xmpp.commands.TrailGeolocCommand;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.send.SendCommand;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.send.SendObjectLocationCommand;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.send.SendRealTimeModeCommand;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.send.SendStartTrailCommand;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.send.SendStopTrailCommand;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.send.SendTrailLocationCommand;
public class ServiceXmpp extends Observable implements PresenceEventListener, FileTransferListener { public class ServiceXmpp extends Observable implements Runnable, PresenceEventListener, FileTransferListener {
public static final String TAG = ServiceXmpp.class.getName(); public static final String TAG = ServiceXmpp.class.getName();
@ -67,11 +72,11 @@ public class ServiceXmpp extends Observable implements PresenceEventListener, Fi
public static final String NOTIF_NEW_PRESENCE_RECEIVED_VALUE_JID = NOTIF_NEW_PRESENCE_RECEIVED+".value.jid"; public static final String NOTIF_NEW_PRESENCE_RECEIVED_VALUE_JID = NOTIF_NEW_PRESENCE_RECEIVED+".value.jid";
public static final String NOTIF_NEW_REAL_TIME_MODE_VALUE = NOTIF_NEW_REAL_TIME_MODE+".value"; public static final String NOTIF_NEW_REAL_TIME_MODE_VALUE = NOTIF_NEW_REAL_TIME_MODE+".value";
private static final String XMPP_NODE_TRAIL_GEOLOC = "trail_geoloc"; public static final String XMPP_NODE_TRAIL_GEOLOC = "trail_geoloc";
private static final String XMPP_NODE_OBJECT_GEOLOC = "object_geoloc"; public static final String XMPP_NODE_OBJECT_GEOLOC = "object_geoloc";
private static final String XMPP_NODE_START_TRAIL_GEOLOC = "start_trail_geoloc"; public static final String XMPP_NODE_START_TRAIL_GEOLOC = "start_trail_geoloc";
private static final String XMPP_NODE_STOP_TRAIL_GEOLOC = "stop_trail_geoloc"; public static final String XMPP_NODE_STOP_TRAIL_GEOLOC = "stop_trail_geoloc";
private static final String XMPP_NODE_REAL_TIME_MODE = "real_time_mode"; public static final String XMPP_NODE_REAL_TIME_MODE = "real_time_mode";
private static final String XMPP_IP_SERVER = "51.254.205.203"; private static final String XMPP_IP_SERVER = "51.254.205.203";
private static final String XMPP_DOMAIN_SERVER = "anon.xmpp.kingpenguin.tk"; private static final String XMPP_DOMAIN_SERVER = "anon.xmpp.kingpenguin.tk";
@ -87,6 +92,7 @@ public class ServiceXmpp extends Observable implements PresenceEventListener, Fi
private String jid; private String jid;
private String otherJid; private String otherJid;
private final ServiceXmpp thsi; private final ServiceXmpp thsi;
private boolean run = false;
private boolean isEnable = false; private boolean isEnable = false;
private boolean isRealTimeMode = false; private boolean isRealTimeMode = false;
@ -103,6 +109,7 @@ public class ServiceXmpp extends Observable implements PresenceEventListener, Fi
.setKeystoreType(null) .setKeystoreType(null)
.build(); .build();
this.thsi = this; this.thsi = this;
new Thread(this).start();
} }
public void setAppName(String appName) { public void setAppName(String appName) {
@ -149,6 +156,11 @@ public class ServiceXmpp extends Observable implements PresenceEventListener, Fi
} }
public void close() { public void close() {
disconnect();
run = false;
}
private void disconnect() {
if (otherJid != null) { if (otherJid != null) {
try { try {
sendPresenceUnavailable(otherJid); sendPresenceUnavailable(otherJid);
@ -168,7 +180,29 @@ public class ServiceXmpp extends Observable implements PresenceEventListener, Fi
public void disable() { public void disable() {
this.isEnable = false; this.isEnable = false;
close(); disconnect();
}
@Override
public void run() {
run = true;
while (run) {
if (connection != null && connection.isAuthenticated()) {
SendCommand command = getNextCommand();
if (command != null) {
try {
command.executeCommand();
} catch (Exception e) {
e.printStackTrace();
}
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} }
public boolean isEnabled() { public boolean isEnabled() {
@ -258,6 +292,7 @@ public class ServiceXmpp extends Observable implements PresenceEventListener, Fi
//</editor-fold> //</editor-fold>
//<editor-fold defaultstate="collapsed" desc="Commands"> //<editor-fold defaultstate="collapsed" desc="Commands">
private final LinkedList<SendCommand> listSendCommand = new LinkedList<>();
private void registerCommands() { private void registerCommands() {
commandManager.registerCommand(XMPP_NODE_TRAIL_GEOLOC, XMPP_NODE_TRAIL_GEOLOC, new LocalCommandFactory() { commandManager.registerCommand(XMPP_NODE_TRAIL_GEOLOC, XMPP_NODE_TRAIL_GEOLOC, new LocalCommandFactory() {
@Override @Override
@ -324,69 +359,54 @@ public class ServiceXmpp extends Observable implements PresenceEventListener, Fi
notifyObservers(new Notification(NOTIF_NEW_REAL_TIME_MODE).addExtra(NOTIF_NEW_REAL_TIME_MODE_VALUE, isRealTimeMode)); notifyObservers(new Notification(NOTIF_NEW_REAL_TIME_MODE).addExtra(NOTIF_NEW_REAL_TIME_MODE_VALUE, isRealTimeMode));
} }
public void sendCommandStartTrail() throws XmppStringprepException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException { public void sendCommandStartTrail() throws XmppStringprepException {
if (isOtherJidSet() && isRealTimeMode) { if (isOtherJidSet() && isRealTimeMode) {
Log.i(TAG, "Send command start"); sendCommand(new SendStartTrailCommand(commandManager, JidCreate.fullFrom(otherJid)));
RemoteCommand command = commandManager.getRemoteCommand(JidCreate.fullFrom(otherJid), XMPP_NODE_START_TRAIL_GEOLOC);
command.execute();
} }
} }
public void sendCommandStopTrail() throws XmppStringprepException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException { public void sendCommandStopTrail() throws XmppStringprepException {
if (isOtherJidSet() && isRealTimeMode) { if (isOtherJidSet() && isRealTimeMode) {
Log.i(TAG, "Send command stop"); sendCommand(new SendStopTrailCommand(commandManager, JidCreate.fullFrom(otherJid)));
RemoteCommand command = commandManager.getRemoteCommand(JidCreate.fullFrom(otherJid), XMPP_NODE_STOP_TRAIL_GEOLOC);
command.execute();
} }
} }
public void sendCommandObjectTrail(double lat, double lon, long time) throws Exception { public void sendCommandObjectTrail(double lat, double lon, long time) throws Exception {
if (isOtherJidSet() && isRealTimeMode) { if (isOtherJidSet() && isRealTimeMode) {
Log.i(TAG, "Send command object"); sendCommand(new SendObjectLocationCommand(commandManager, JidCreate.fullFrom(otherJid), lat, lon, time));
RemoteCommand command = commandManager.getRemoteCommand(JidCreate.fullFrom(otherJid), XMPP_NODE_OBJECT_GEOLOC);
command.execute();
if (command.getForm() == null) {
throw new Exception("Didn't get form back");
}
Form form = command.getForm().createAnswerForm();
form.setAnswer(ObjectGeolocCommand.FIELD_PARAM_LATITUDE, lat);
form.setAnswer(ObjectGeolocCommand.FIELD_PARAM_LONGITUDE, lon);
form.setAnswer(ObjectGeolocCommand.FIELD_PARAM_TIME, time);
command.next(form);
} }
} }
public void sendCommandLocationTrail(double lat, double lon, long time) throws Exception { public void sendCommandLocationTrail(double lat, double lon, long time) throws Exception {
if (isOtherJidSet() && isRealTimeMode) { if (isOtherJidSet() && isRealTimeMode) {
Log.i(TAG, "Send command location"); sendCommand(new SendTrailLocationCommand(commandManager, JidCreate.fullFrom(otherJid), lat, lon, time));
RemoteCommand command = commandManager.getRemoteCommand(JidCreate.fullFrom(otherJid), XMPP_NODE_TRAIL_GEOLOC);
command.execute();
if (command.getForm() == null) {
throw new Exception("Didn't get form back");
}
Form form = command.getForm().createAnswerForm();
form.setAnswer(TrailGeolocCommand.FIELD_PARAM_LATITUDE, lat);
form.setAnswer(TrailGeolocCommand.FIELD_PARAM_LONGITUDE, lon);
form.setAnswer(TrailGeolocCommand.FIELD_PARAM_TIME, time);
command.next(form);
} }
} }
public void sendCommandeRealTimeMode() throws Exception { public void sendCommandeRealTimeMode() throws Exception {
if (isOtherJidSet()) { if (isOtherJidSet()) {
Log.i(TAG, "Send commande real time mode"); sendCommand(new SendRealTimeModeCommand(commandManager, JidCreate.fullFrom(otherJid), isRealTimeMode));
RemoteCommand command = commandManager.getRemoteCommand(JidCreate.fullFrom(otherJid), XMPP_NODE_REAL_TIME_MODE);
command.execute();
if (command.getForm() == null) {
throw new Exception("Didn't get form back");
}
Form form = command.getForm().createAnswerForm();
form.setAnswer(RealTimeModeCommand.FIELD_PARAM_IS_ACTIVE, isRealTimeMode);
command.next(form);
} }
} }
//</editor-fold>
private void sendCommand(SendCommand command) {
if (command != null) {
synchronized (listSendCommand) {
listSendCommand.addLast(command);
}
}
}
private SendCommand getNextCommand() {
SendCommand ret = null;
synchronized (listSendCommand) {
if (!listSendCommand.isEmpty()) {
ret = listSendCommand.removeFirst();
}
}
return ret;
}
//</editor-fold>
//<editor-fold defaultstate="collapsed" desc="File transfert"> //<editor-fold defaultstate="collapsed" desc="File transfert">
// Example: https://github.com/igniterealtime/Smack/blob/master/documentation/extensions/filetransfer.md // Example: https://github.com/igniterealtime/Smack/blob/master/documentation/extensions/filetransfer.md