diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java b/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java
index 6723f0e..8fc0606 100644
--- a/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java
+++ b/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java
@@ -356,6 +356,19 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
}
return true;
+ } else if (id == R.id.action_send_gpx_trail_by_xmpp) {
+ File trailFile = serviceTrackingDog.getLastExportedTrailFile();
+ if (trailFile != null) {
+ try {
+ serviceTrackingDog.sendXmppFile(trailFile);
+ } catch (XmppStringprepException | SmackException e) {
+ Toast.makeText(ctx, "Echec de l'envoye de la trace.", Toast.LENGTH_LONG).show();
+ }
+ } else {
+ Toast.makeText(ctx, "Aucune trace enregistré.", Toast.LENGTH_LONG).show();
+ }
+ return true;
+
} else if (id == R.id.action_active_vibration_object) {
boolean checked = item.isChecked();
item.setChecked(!checked);
@@ -669,6 +682,27 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
changeStatusTrace();
}
});
+ } else if (notification.isAction(ServiceXmpp.NOTIF_RECEIVING_FILE)) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(ctx, "Réception d'un fichier en cours", Toast.LENGTH_SHORT).show();
+ }
+ });
+ } else if (notification.isAction(ServiceXmpp.NOTIF_RECEIVING_FILE_COMPLETTED)) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(ctx, "Le fichier a était réceptionné", Toast.LENGTH_SHORT).show();
+ }
+ });
+ } else if (notification.isAction(ServiceXmpp.NOTIF_RECEIVING_FILE_FAIL)) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(ctx, "Echec dans la reception du fichier", Toast.LENGTH_LONG).show();
+ }
+ });
}
}
diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceTrackingDog.java b/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceTrackingDog.java
index 60e9152..7bc4e05 100644
--- a/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceTrackingDog.java
+++ b/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceTrackingDog.java
@@ -79,6 +79,9 @@ public class ServiceTrackingDog implements Observer {
public void setAppName(String appName) {
this.appName = appName;
+ if (serviceXmpp != null) {
+ serviceXmpp.setAppName(appName);
+ }
}
public void addObserver(Observer observer, String name) {
@@ -360,6 +363,11 @@ public class ServiceTrackingDog implements Observer {
serviceXmpp.sendPresenceAvailable();
}
}
+ public void sendXmppFile(File file) throws XmppStringprepException, SmackException {
+ if (serviceXmpp != null) {
+ serviceXmpp.sendFile(file);
+ }
+ }
//
public void sendXmppCommandStartTrail() throws XmppStringprepException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException {
if (serviceXmpp != null) {
diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceXmpp.java b/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceXmpp.java
index 7cfa597..ad0f871 100644
--- a/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceXmpp.java
+++ b/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceXmpp.java
@@ -1,6 +1,7 @@
package fr.chteufleur.mytrackingdog.services;
import android.content.res.Resources;
+import android.os.Environment;
import android.os.StrictMode;
import android.util.Log;
@@ -19,6 +20,12 @@ import org.jivesoftware.smackx.commands.AdHocCommandManager;
import org.jivesoftware.smackx.commands.LocalCommand;
import org.jivesoftware.smackx.commands.LocalCommandFactory;
import org.jivesoftware.smackx.commands.RemoteCommand;
+import org.jivesoftware.smackx.filetransfer.FileTransfer;
+import org.jivesoftware.smackx.filetransfer.FileTransferListener;
+import org.jivesoftware.smackx.filetransfer.FileTransferManager;
+import org.jivesoftware.smackx.filetransfer.FileTransferRequest;
+import org.jivesoftware.smackx.filetransfer.IncomingFileTransfer;
+import org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer;
import org.jivesoftware.smackx.xdata.Form;
import org.jxmpp.jid.BareJid;
import org.jxmpp.jid.FullJid;
@@ -26,6 +33,7 @@ import org.jxmpp.jid.Jid;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.stringprep.XmppStringprepException;
+import java.io.File;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.UnknownHostException;
@@ -39,7 +47,7 @@ import fr.chteufleur.mytrackingdog.models.xmpp.commands.StartTrailGeolocCommand;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.StopTrailGeolocCommand;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.TrailGeolocCommand;
-public class ServiceXmpp extends Observable implements PresenceEventListener {
+public class ServiceXmpp extends Observable implements PresenceEventListener, FileTransferListener {
public static final String TAG = ServiceXmpp.class.getName();
@@ -48,6 +56,10 @@ public class ServiceXmpp extends Observable implements PresenceEventListener {
public static final String NOTIF_START_TRAIL = ServiceXmpp.class.getName()+".starttrail";
public static final String NOTIF_STOP_TRAIL = ServiceXmpp.class.getName()+".stoptrail";
public static final String NOTIF_NEW_PRESENCE_RECEIVED = ServiceXmpp.class.getName()+".newpresencereceived";
+ public static final String NOTIF_RECEIVING_FILE = ServiceXmpp.class.getName()+".receivingfile";
+ public static final String NOTIF_RECEIVING_FILE_COMPLETTED = NOTIF_RECEIVING_FILE+".completed";
+ public static final String NOTIF_RECEIVING_FILE_FAIL = NOTIF_RECEIVING_FILE+".receivingfile";
+
public static final String NOTIF_NEW_OBJECT_VALUE_LOCATION = NOTIF_NEW_OBJECT+".value.location";
public static final String NOTIF_NEW_LOCATION_VALUE_LOCATION = NOTIF_NEW_LOCATION+".value.location";
public static final String NOTIF_NEW_PRESENCE_RECEIVED_VALUE_JID = NOTIF_NEW_PRESENCE_RECEIVED+".value.jid";
@@ -61,9 +73,12 @@ public class ServiceXmpp extends Observable implements PresenceEventListener {
private static final String XMPP_DOMAIN_SERVER = "anon.xmpp.kingpenguin.tk";
private static final int XMPP_PORT = 5222;
+ private String appName = "";
+
private final Resources resources;
private final XMPPTCPConnectionConfiguration configuration;
private AdHocCommandManager commandManager;
+ private FileTransferManager fileManager;
private AbstractXMPPConnection connection;
private String jid;
private String otherJid;
@@ -85,6 +100,10 @@ public class ServiceXmpp extends Observable implements PresenceEventListener {
this.thsi = this;
}
+ public void setAppName(String appName) {
+ this.appName = appName;
+ }
+
public boolean connect() throws InterruptedException, XMPPException, SmackException, IOException {
if (!isEnable) {
return false;
@@ -95,10 +114,12 @@ public class ServiceXmpp extends Observable implements PresenceEventListener {
boolean isConnected;
connection = new XMPPTCPConnection(configuration);
commandManager = AdHocCommandManager.getAddHocCommandsManager(connection);
+ fileManager = FileTransferManager.getInstanceFor(connection);
connection.connect();
connection.login();
registerCommands();
+ fileManager.addFileTransferListener(this);
Roster roster = Roster.getInstanceFor(connection);
roster.addPresenceEventListener(this);
@@ -106,6 +127,7 @@ public class ServiceXmpp extends Observable implements PresenceEventListener {
if (isConnected) {
jid = connection.getUser().asFullJidIfPossible().toString();
Log.i(TAG, "JID: "+jid);
+ setPresenceAvailable();
}
Runnable r = new Runnable() {
@Override
@@ -171,6 +193,14 @@ public class ServiceXmpp extends Observable implements PresenceEventListener {
}
}
+ private void setPresenceAvailable() throws SmackException.NotConnectedException, InterruptedException {
+ if (connection != null) {
+ Presence presence = new Presence(Presence.Type.available);
+ presence.setStatus("");
+ connection.sendStanza(presence);
+ }
+ }
+
@Override
public void presenceAvailable(FullJid address, Presence presence) {
String fullJid = address.asFullJidIfPossible().toString();
@@ -317,6 +347,68 @@ public class ServiceXmpp extends Observable implements PresenceEventListener {
}
//
+
+ //
+ // Example: https://github.com/igniterealtime/Smack/blob/master/documentation/extensions/filetransfer.md
+ public void sendFile(File file) throws XmppStringprepException, SmackException {
+ if (isOtherJidSet()) {
+ // Create the outgoing file transfer
+ OutgoingFileTransfer transfer = fileManager.createOutgoingFileTransfer(JidCreate.entityFullFrom(otherJid));
+ // Send the file
+ transfer.sendFile(file, file.getName());
+ }
+ }
+
+ @Override
+ public void fileTransferRequest(FileTransferRequest request) {
+ // Check to see if the request should be accepted
+ String fullJid = request.getRequestor().asFullJidIfPossible().toString();
+ if (otherJid != null && fullJid.equals(otherJid)) {
+ // Accept it
+ IncomingFileTransfer transfer = request.accept();
+ File destFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + appName + "/" + request.getFileName());
+ try {
+ transfer.recieveFile(destFile);
+ setChanged();
+ notifyObservers(new Notification(NOTIF_RECEIVING_FILE));
+ while(!transfer.isDone()) {
+ if (transfer.getStatus().equals(FileTransfer.Status.error)) {
+ Log.i(TAG, "File transfert error");
+ setChanged();
+ notifyObservers(new Notification(NOTIF_RECEIVING_FILE_FAIL));
+ } else {
+ Log.i(TAG, "File transfert ("+transfer.getStatus()+"): "+(transfer.getProgress() * 100) + " %");
+ }
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ if (transfer.getStatus().equals(FileTransfer.Status.error)) {
+ Log.e(TAG, "File transfert error");
+ destFile.delete();
+ } else {
+ Log.i(TAG, "File transfert done (" + transfer.getStatus() + ")");
+ setChanged();
+ notifyObservers(new Notification(NOTIF_RECEIVING_FILE_COMPLETTED));
+ }
+ } catch (SmackException | IOException e) {
+ e.printStackTrace();
+ setChanged();
+ notifyObservers(new Notification(NOTIF_RECEIVING_FILE_FAIL));
+ }
+ } else {
+ // Reject it
+ try {
+ request.reject();
+ } catch (SmackException.NotConnectedException | InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ //
+
public void setOtherJid(String otherJid) {
this.otherJid = otherJid;
}
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index c047005..79be239 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -12,6 +12,11 @@
android:orderInCategory="100"
android:title="@string/action_send_gpx_trail"
app:showAsAction="never" />
+
- Import GPX
Envoyer trace du traceur
+ Envoyer trace du traceur par XMPP
Envoyer par
Active vibration objets
Affiche identifiant