From f1ad1398320dc91ddd63162e08177ba520d41699 Mon Sep 17 00:00:00 2001 From: chteufleur Date: Wed, 3 Oct 2018 15:59:38 +0200 Subject: [PATCH] Add object location received on XMPP. --- .../mytrackingdog/MainActivity.java | 29 +++-- .../xmpp/commands/ObjectGeolocCommand.java | 119 ++++++++++++++++++ .../xmpp/commands/TrailGeolocCommand.java | 9 +- .../mytrackingdog/services/ServiceGps.java | 8 +- .../mytrackingdog/services/ServiceXmpp.java | 24 +++- 5 files changed, 169 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/fr/chteufleur/mytrackingdog/models/xmpp/commands/ObjectGeolocCommand.java diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java b/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java index 8938ac0..9f6af4e 100644 --- a/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java +++ b/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java @@ -182,7 +182,11 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu @Override public void onClick(View view) { if (serviceGps.isTraceurActivated()) { - addMarker(); + WayPointLocation loc = serviceGps.addPointObjectTrail(); + if (loc != null) { + GeoPoint gp = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude()); + addMarker(gp, loc.isFound()); + } } else if (serviceGps.isDogActivated()) { markAsFound(); } @@ -248,13 +252,6 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu } } - - private void addMarker() { - WayPointLocation loc = serviceGps.addPointObjectTrail(); - GeoPoint gp = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude()); - addMarker(gp, loc.isFound()); - } - private void addMarker(GeoPoint gp, boolean isFound) { Marker marker = new Marker(map); marker.setIcon(getResources().getDrawable(isFound ? R.drawable.ic_marker_blue : R.drawable.ic_marker_red)); @@ -620,7 +617,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu public void updateServiceGps(Object o) { if (o instanceof String && o.equals(ServiceGps.NOTIF_NEW_LOCATION)) { MyLocation loc = serviceGps.getCurrentLocation(); - onNewGeoloc(loc); + onNewLocation(loc); } } @@ -631,7 +628,17 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu @Override public void run() { MyLocation loc = serviceXmpp.getCurrentLocation(); - onNewGeoloc(loc); + onNewLocation(loc); + } + }); + } else if (o.equals(ServiceXmpp.NOTIF_NEW_OBJECT)){ + runOnUiThread(new Runnable() { + @Override + public void run() { + MyLocation locObj = serviceXmpp.getLastObjectXmppLocation(); + WayPointLocation loc = serviceGps.addPointObjectTrail(locObj); + GeoPoint gp = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude()); + addMarker(gp, loc.isFound()); } }); } else if (o.equals(ServiceXmpp.NOTIF_START_TRAIL)){ @@ -652,7 +659,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu } } - private void onNewGeoloc(MyLocation loc) { + private void onNewLocation(MyLocation loc) { if (loc != null) { serviceGps.addPoint(loc); GeoPoint currentPoint = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude()); diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/models/xmpp/commands/ObjectGeolocCommand.java b/app/src/main/java/fr/chteufleur/mytrackingdog/models/xmpp/commands/ObjectGeolocCommand.java new file mode 100644 index 0000000..b33a4b8 --- /dev/null +++ b/app/src/main/java/fr/chteufleur/mytrackingdog/models/xmpp/commands/ObjectGeolocCommand.java @@ -0,0 +1,119 @@ +package fr.chteufleur.mytrackingdog.models.xmpp.commands; + +import org.jivesoftware.smack.SmackException; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smackx.commands.AdHocCommandNote; +import org.jivesoftware.smackx.commands.LocalCommand; +import org.jivesoftware.smackx.xdata.Form; +import org.jivesoftware.smackx.xdata.FormField; +import org.jivesoftware.smackx.xdata.packet.DataForm; +import org.jxmpp.jid.Jid; + +import java.util.List; + +import fr.chteufleur.mytrackingdog.services.ServiceXmpp; + +public class ObjectGeolocCommand extends LocalCommand { + + public static final String TAG = ObjectGeolocCommand.class.getName(); + + public static final String FIELD_PARAM_LATITUDE = "latitude"; + public static final String FIELD_PARAM_LONGITUDE = "longitude"; + public static final String FIELD_PARAM_TIME = "time"; + + private final ServiceXmpp serviceXmpp; + + public ObjectGeolocCommand(ServiceXmpp serviceXmpp) { + this.serviceXmpp = serviceXmpp; + } + + @Override + public boolean isLastStage() { + return getCurrentStage() == 1; + } + + @Override + public boolean hasPermission(Jid jid) { + return true; + } + + @Override + public void execute() throws SmackException.NoResponseException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException { + Form result = new Form(DataForm.Type.form); + setExecuteAction(Action.next); + + FormField resultFieldLatitude = new FormField(FIELD_PARAM_LATITUDE); + resultFieldLatitude.setLabel(FIELD_PARAM_LATITUDE); + resultFieldLatitude.setType(FormField.Type.text_single); + result.addField(resultFieldLatitude); + + FormField resultFieldLongitude = new FormField(FIELD_PARAM_LONGITUDE); + resultFieldLongitude.setLabel(FIELD_PARAM_LONGITUDE); + resultFieldLongitude.setType(FormField.Type.text_single); + result.addField(resultFieldLongitude); + + FormField resultFieldTime = new FormField(FIELD_PARAM_TIME); + resultFieldTime.setLabel(FIELD_PARAM_TIME); + resultFieldTime.setType(FormField.Type.text_single); + result.addField(resultFieldTime); + + this.addActionAvailable(Action.next); + setForm(result); + } + + @Override + public void next(Form response) throws SmackException.NoResponseException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException { + FormField formLatitude = response.getField(FIELD_PARAM_LATITUDE); + FormField formLongitude = response.getField(FIELD_PARAM_LONGITUDE); + FormField formTime = response.getField(FIELD_PARAM_TIME); + + if (formLatitude != null && formLongitude != null && formTime != null) { + List latitudeStrs = formLatitude.getValues(); + List longitudeStrs = response.getField(FIELD_PARAM_LONGITUDE).getValues(); + List timeStrs = response.getField(FIELD_PARAM_TIME).getValues(); + + double latitude = 0, longitude = 0; + int time = 0; + for (String latitudeStr : latitudeStrs) { + try { + latitude = Double.parseDouble(latitudeStr); + break; + } catch (NumberFormatException ex) { + } + } + for (String longitudeStr : longitudeStrs) { + try { + longitude = Double.parseDouble(longitudeStr); + break; + } catch (NumberFormatException ex) { + } + } + for (String timeStr : timeStrs) { + try { + time = Integer.parseInt(timeStr); + break; + } catch (NumberFormatException ex) { + } + } + + if (serviceXmpp != null && latitude != 0 && longitude != 0 && time != 0) { + serviceXmpp.addObjectGeoloc(latitude, longitude, time); + } + this.addNote(new AdHocCommandNote(AdHocCommandNote.Type.info, "SUCCESS")); + } else { + this.addNote((new AdHocCommandNote(AdHocCommandNote.Type.error, "FAIL"))); + } + } + + @Override + public void complete(Form response) throws SmackException.NoResponseException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException { + } + + @Override + public void prev() throws SmackException.NoResponseException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException { + } + + @Override + public void cancel() throws SmackException.NoResponseException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException { + } +} diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/models/xmpp/commands/TrailGeolocCommand.java b/app/src/main/java/fr/chteufleur/mytrackingdog/models/xmpp/commands/TrailGeolocCommand.java index 1533a78..776e3cd 100644 --- a/app/src/main/java/fr/chteufleur/mytrackingdog/models/xmpp/commands/TrailGeolocCommand.java +++ b/app/src/main/java/fr/chteufleur/mytrackingdog/models/xmpp/commands/TrailGeolocCommand.java @@ -1,8 +1,5 @@ package fr.chteufleur.mytrackingdog.models.xmpp.commands; -import android.app.Service; -import android.util.Log; - import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smackx.commands.AdHocCommandNote; @@ -75,18 +72,18 @@ public class TrailGeolocCommand extends LocalCommand { List longitudeStrs = response.getField(FIELD_PARAM_LONGITUDE).getValues(); List timeStrs = response.getField(FIELD_PARAM_TIME).getValues(); - long latitude = 0, longitude = 0; + double latitude = 0, longitude = 0; int time = 0; for (String latitudeStr : latitudeStrs) { try { - latitude = Long.parseLong(latitudeStr); + latitude = Double.parseDouble(latitudeStr); break; } catch (NumberFormatException ex) { } } for (String longitudeStr : longitudeStrs) { try { - longitude = Long.parseLong(longitudeStr); + longitude = Double.parseDouble(longitudeStr); break; } catch (NumberFormatException ex) { } diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceGps.java b/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceGps.java index 965522d..82f7d05 100644 --- a/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceGps.java +++ b/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceGps.java @@ -205,9 +205,13 @@ public class ServiceGps extends Observable implements IServiceGps, LocationListe } public WayPointLocation addPointObjectTrail() { + return addPointObjectTrail(currentLocation); + } + + public WayPointLocation addPointObjectTrail(MyLocation location) { WayPointLocation wpl = null; - if (currentLocation != null) { - wpl = new WayPointLocation(currentLocation); + if (location != null) { + wpl = new WayPointLocation(location); traces.addPointObjectTrail(wpl); } return wpl; 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 e96213a..5b574e8 100644 --- a/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceXmpp.java +++ b/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceXmpp.java @@ -31,6 +31,7 @@ import java.util.Observable; import fr.chteufleur.mytrackingdog.QRCodeGeneratorActivity; import fr.chteufleur.mytrackingdog.models.beans.MyLocation; +import fr.chteufleur.mytrackingdog.models.xmpp.commands.ObjectGeolocCommand; import fr.chteufleur.mytrackingdog.models.xmpp.commands.StartTrailGeolocCommand; import fr.chteufleur.mytrackingdog.models.xmpp.commands.StopTrailGeolocCommand; import fr.chteufleur.mytrackingdog.models.xmpp.commands.TrailGeolocCommand; @@ -40,10 +41,12 @@ public class ServiceXmpp extends Observable implements PresenceEventListener { public static final String TAG = ServiceXmpp.class.getName(); public static final String NOTIF_NEW_LOCATION = ServiceXmpp.class.getName()+".newlocation"; + public static final String NOTIF_NEW_OBJECT = ServiceXmpp.class.getName()+".newobject"; public static final String NOTIF_START_TRAIL = ServiceXmpp.class.getName()+".starttrail"; public static final String NOTIF_STOP_TRAIL = ServiceXmpp.class.getName()+".stoptrail"; private static final String XMPP_NODE_TRAIL_GEOLOC = "trail_geoloc"; + private static final String XMPP_NODE_OBJECT_GEOLOC = "object_geoloc"; private static final String XMPP_NODE_START_TRAIL_GEOLOC = "start_trail_geoloc"; private static final String XMPP_NODE_STOP_TRAIL_GEOLOC = "stop_trail_geoloc"; @@ -92,6 +95,12 @@ public class ServiceXmpp extends Observable implements PresenceEventListener { return new TrailGeolocCommand(thsi); } }); + commandManager.registerCommand(XMPP_NODE_OBJECT_GEOLOC, XMPP_NODE_OBJECT_GEOLOC, new LocalCommandFactory() { + @Override + public LocalCommand getInstance() throws InstantiationException, IllegalAccessException { + return new ObjectGeolocCommand(thsi); + } + }); commandManager.registerCommand(XMPP_NODE_START_TRAIL_GEOLOC, XMPP_NODE_START_TRAIL_GEOLOC, new LocalCommandFactory() { @Override public LocalCommand getInstance() throws InstantiationException, IllegalAccessException { @@ -201,22 +210,35 @@ public class ServiceXmpp extends Observable implements PresenceEventListener { // private MyLocation currentXmppLocation = null; + private MyLocation lastObjectXmppLocation = null; public void startTrailGeoloc() { + Log.i(TAG, "Start trail"); setChanged(); notifyObservers(NOTIF_START_TRAIL); } public void stopTrailGeoloc() { + Log.i(TAG, "Stop trail"); setChanged(); notifyObservers(NOTIF_STOP_TRAIL); } - public void addTrailGeoloc(long lat, long lon, int time) { + public void addTrailGeoloc(double lat, double lon, int time) { + Log.i(TAG, "Add location"); currentXmppLocation = new MyLocation(lat, lon, time); setChanged(); notifyObservers(NOTIF_NEW_LOCATION); } + public void addObjectGeoloc(double lat, double lon, int time) { + Log.i(TAG, "Add object"); + lastObjectXmppLocation = new MyLocation(lat, lon, time); + setChanged(); + notifyObservers(NOTIF_NEW_OBJECT); + } public MyLocation getCurrentLocation() { return currentXmppLocation; } + public MyLocation getLastObjectXmppLocation() { + return lastObjectXmppLocation; + } // public void setOtherJid(String otherJid) {