From 137f024117535f0a64f15c1ffe4634d5b3756ea1 Mon Sep 17 00:00:00 2001 From: chteufleur Date: Sat, 6 Oct 2018 11:29:04 +0200 Subject: [PATCH] Add send trail over XMPP (Should work with q serveur proxy). --- .../mytrackingdog/MainActivity.java | 34 +++++++ .../services/ServiceTrackingDog.java | 8 ++ .../mytrackingdog/services/ServiceXmpp.java | 94 ++++++++++++++++++- app/src/main/res/menu/menu_main.xml | 5 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 141 insertions(+), 1 deletion(-) 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