Add ServiceTrackingDog for better services management.

This commit is contained in:
chteufleur 2018-10-05 11:28:38 +02:00
parent 1361473eee
commit 83342b5be9
3 changed files with 288 additions and 113 deletions

View File

@ -58,6 +58,7 @@ import fr.chteufleur.mytrackingdog.models.beans.MyLocation;
import fr.chteufleur.mytrackingdog.models.beans.MyLocationArray; import fr.chteufleur.mytrackingdog.models.beans.MyLocationArray;
import fr.chteufleur.mytrackingdog.models.beans.WayPointLocation; import fr.chteufleur.mytrackingdog.models.beans.WayPointLocation;
import fr.chteufleur.mytrackingdog.services.ServiceGps; import fr.chteufleur.mytrackingdog.services.ServiceGps;
import fr.chteufleur.mytrackingdog.services.ServiceTrackingDog;
import fr.chteufleur.mytrackingdog.services.ServiceXmpp; import fr.chteufleur.mytrackingdog.services.ServiceXmpp;
public class MainActivity extends AppCompatActivity implements IOrientationConsumer, Observer { public class MainActivity extends AppCompatActivity implements IOrientationConsumer, Observer {
@ -72,8 +73,8 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
private MyLocationNewOverlay mLocationOverlay; private MyLocationNewOverlay mLocationOverlay;
private IOrientationProvider compass = null; private IOrientationProvider compass = null;
private ServiceGps serviceGps = null;
private ServiceXmpp serviceXmpp = null; private ServiceXmpp serviceXmpp = null;
private ServiceTrackingDog serviceTrackingDog = null;
private Context ctx = null; private Context ctx = null;
private MapView map = null; private MapView map = null;
@ -88,7 +89,6 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
private Button start_stop_trace; private Button start_stop_trace;
private Button start_stop_dog_trace; private Button start_stop_dog_trace;
private Button add_object; private Button add_object;
private Button center_button;
private TextView textViewCurrentLocation; private TextView textViewCurrentLocation;
private MyLocation lastLocation = null; private MyLocation lastLocation = null;
@ -141,7 +141,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
} }
}); });
center_button = findViewById(R.id.center_button); Button center_button = findViewById(R.id.center_button);
center_button.setOnClickListener(new View.OnClickListener() { center_button.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
@ -169,16 +169,12 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
public void onClick(View view) { public void onClick(View view) {
changeStatusTrace(); changeStatusTrace();
try { try {
if (serviceGps.isTraceurActivated()) { if (serviceTrackingDog.isTraceurActivated()) {
serviceXmpp.sendCommandStartTrail(); serviceXmpp.sendCommandStartTrail();
} else { } else {
serviceXmpp.sendCommandStopTrail(); serviceXmpp.sendCommandStopTrail();
} }
} catch (XmppStringprepException ex) { } catch (XmppStringprepException | InterruptedException | SmackException.NoResponseException | SmackException.NotConnectedException | XMPPException.XMPPErrorException ex) {
} catch (InterruptedException e) {
} catch (SmackException.NoResponseException e) {
} catch (SmackException.NotConnectedException e) {
} catch (XMPPException.XMPPErrorException e) {
} }
} }
}); });
@ -194,8 +190,8 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
add_object.setOnClickListener(new View.OnClickListener() { add_object.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (serviceGps.isTraceurActivated()) { if (serviceTrackingDog.isTraceurActivated()) {
WayPointLocation loc = serviceGps.addPointObjectTrail(); WayPointLocation loc = serviceTrackingDog.addPointObjectTrail();
if (loc != null) { if (loc != null) {
GeoPoint gp = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude()); GeoPoint gp = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude());
addMarker(gp, loc.isFound()); addMarker(gp, loc.isFound());
@ -204,7 +200,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
} catch (Exception e) { } catch (Exception e) {
} }
} }
} else if (serviceGps.isDogActivated()) { } else if (serviceTrackingDog.isDogActivated()) {
markAsFound(); markAsFound();
} }
} }
@ -213,12 +209,13 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
textViewCurrentLocation = findViewById(R.id.textViewCurrentLocation); textViewCurrentLocation = findViewById(R.id.textViewCurrentLocation);
textViewCurrentLocation.setVisibility(View.GONE); textViewCurrentLocation.setVisibility(View.GONE);
if (serviceGps == null) { if (serviceTrackingDog == null) {
serviceGps = new ServiceGps( serviceTrackingDog = new ServiceTrackingDog(
(Vibrator) getSystemService(Context.VIBRATOR_SERVICE), (Vibrator) getSystemService(Context.VIBRATOR_SERVICE),
PreferenceManager.getDefaultSharedPreferences(ctx) PreferenceManager.getDefaultSharedPreferences(ctx),
); getResources()
serviceGps.addObserver(this); );
serviceTrackingDog.addObserver(this, ServiceGps.class.getName());
} }
if (serviceXmpp == null) { if (serviceXmpp == null) {
@ -270,9 +267,9 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
setRequestedOrientation(orientation); setRequestedOrientation(orientation);
} }
serviceGps.setLocationManager((LocationManager) getSystemService(Context.LOCATION_SERVICE)); serviceTrackingDog.setLocationManager((LocationManager) getSystemService(Context.LOCATION_SERVICE));
serviceGps.setAppName(appName); serviceTrackingDog.setAppName(appName);
serviceGps.start(); serviceTrackingDog.startLocation();
mLocationOverlay.enableFollowLocation(); mLocationOverlay.enableFollowLocation();
mLocationOverlay.enableMyLocation(); mLocationOverlay.enableMyLocation();
@ -310,15 +307,15 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
@Override @Override
public void onBackPressed() { public void onBackPressed() {
if (serviceGps.isDogActivated() || serviceGps.isTraceurActivated()) { if (serviceTrackingDog.isDogActivated() || serviceTrackingDog.isTraceurActivated()) {
Toast.makeText(ctx, "Une trace est en cours d'enregistrement.", Toast.LENGTH_LONG).show(); Toast.makeText(ctx, "Une trace est en cours d'enregistrement.", Toast.LENGTH_LONG).show();
return ; return ;
} }
super.onBackPressed(); super.onBackPressed();
pause(); pause();
if (serviceGps != null) { if (serviceTrackingDog != null) {
serviceGps.stop(); serviceTrackingDog.close();
} }
if (serviceXmpp != null) { if (serviceXmpp != null) {
serviceXmpp.close(); serviceXmpp.close();
@ -334,7 +331,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
getMenuInflater().inflate(R.menu.menu_main, menu); getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem vibrationObjectMenuItem = menu.findItem(R.id.action_active_vibration_object); MenuItem vibrationObjectMenuItem = menu.findItem(R.id.action_active_vibration_object);
vibrationObjectMenuItem.setChecked(serviceGps.isVibrationNearObjectEnabled()); vibrationObjectMenuItem.setChecked(serviceTrackingDog.isVibrationNearObjectEnabled());
MenuItem xmppObjectMenuItem = menu.findItem(R.id.action_active_xmpp); MenuItem xmppObjectMenuItem = menu.findItem(R.id.action_active_xmpp);
xmppObjectMenuItem.setChecked(serviceXmpp.isEnabled()); xmppObjectMenuItem.setChecked(serviceXmpp.isEnabled());
@ -364,7 +361,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
startActivityForResult(intent, ACTIVITY_QR_CODE_READER); startActivityForResult(intent, ACTIVITY_QR_CODE_READER);
} else if (id == R.id.action_send_gpx_trail) { } else if (id == R.id.action_send_gpx_trail) {
File trailFile = serviceGps.getLastExportedTrailFile(); File trailFile = serviceTrackingDog.getLastExportedTrailFile();
if (trailFile != null) { if (trailFile != null) {
Intent shareIntent = new Intent(); Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND); shareIntent.setAction(Intent.ACTION_SEND);
@ -380,7 +377,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
} else if (id == R.id.action_active_vibration_object) { } else if (id == R.id.action_active_vibration_object) {
boolean checked = item.isChecked(); boolean checked = item.isChecked();
item.setChecked(!checked); item.setChecked(!checked);
serviceGps.setVibrationNearObjectEnabled(!checked); serviceTrackingDog.setVibrationNearObjectEnabled(!checked);
return true; return true;
} else if (id == R.id.action_active_xmpp) { } else if (id == R.id.action_active_xmpp) {
@ -413,23 +410,23 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
switch (requestCode) { switch (requestCode) {
case ACTIVITY_REQUEST_PICK_FILE: case ACTIVITY_REQUEST_PICK_FILE:
if (data.hasExtra(FilePicker.EXTRA_FILE_PATH)) { if (data.hasExtra(FilePicker.EXTRA_FILE_PATH)) {
serviceGps.importGpxTrace(new File(data.getStringExtra(FilePicker.EXTRA_FILE_PATH))); serviceTrackingDog.importGpxTrace(new File(data.getStringExtra(FilePicker.EXTRA_FILE_PATH)));
updateDogTrace(); updateDogTrace();
updateTrailTrace(); updateTrailTrace();
calculTrailDistance(); calculTrailDistance();
for (MyLocation loc: serviceGps.getListGeoPointObjectsTrail()) { for (MyLocation loc: serviceTrackingDog.getListGeoPointObjectsTrail()) {
addMarker(new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude()), false); addMarker(new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude()), false);
} }
for (MyLocation loc: serviceGps.getListGeoPointObjectsDog()) { for (MyLocation loc: serviceTrackingDog.getListGeoPointObjectsDog()) {
boolean isFound = false; boolean isFound = false;
if (loc instanceof WayPointLocation) { if (loc instanceof WayPointLocation) {
isFound = ((WayPointLocation) loc).isFound(); isFound = ((WayPointLocation) loc).isFound();
} }
addMarker(new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude()), isFound); addMarker(new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude()), isFound);
} }
if (!serviceGps.getListGeoPointTraceur().isEmpty()) { if (!serviceTrackingDog.getListGeoPointTraceur().isEmpty()) {
updateDistance(getTextTraceur()); updateDistance(getTextTraceur());
} else if (!serviceGps.getListGeoPointDog().isEmpty()) { } else if (!serviceTrackingDog.getListGeoPointDog().isEmpty()) {
updateDistance(getTextDog()); updateDistance(getTextDog());
} }
} }
@ -472,7 +469,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
@Override @Override
public void onOrientationChanged(float orientationToMagneticNorth, IOrientationProvider source) { public void onOrientationChanged(float orientationToMagneticNorth, IOrientationProvider source) {
//note, on devices without a compass this never fires... //note, on devices without a compass this never fires...
MyLocation location = serviceGps.getCurrentLocation(); MyLocation location = serviceTrackingDog.getCurrentLocation();
if (location == null) { if (location == null) {
return ; return ;
} }
@ -512,8 +509,8 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
//<editor-fold defaultstate="collapsed" desc="Map management"> //<editor-fold defaultstate="collapsed" desc="Map management">
private void changeStatusTrace() { private void changeStatusTrace() {
serviceGps.toggleTraceurActivation(); serviceTrackingDog.toggleTraceurActivation();
if (serviceGps.isTraceurActivated()) { if (serviceTrackingDog.isTraceurActivated()) {
this.start_stop_trace.setText(R.string.trail_stop); this.start_stop_trace.setText(R.string.trail_stop);
this.add_object.setVisibility(View.VISIBLE); this.add_object.setVisibility(View.VISIBLE);
this.add_object.setText(R.string.trail_object); this.add_object.setText(R.string.trail_object);
@ -527,8 +524,8 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
} }
private void changeStatusDogTrace() { private void changeStatusDogTrace() {
serviceGps.toggleDogActivation(); serviceTrackingDog.toggleDogActivation();
if (serviceGps.isDogActivated()) { if (serviceTrackingDog.isDogActivated()) {
this.start_stop_dog_trace.setText(R.string.dog_stop); this.start_stop_dog_trace.setText(R.string.dog_stop);
this.add_object.setVisibility(View.VISIBLE); this.add_object.setVisibility(View.VISIBLE);
this.add_object.setText(R.string.dog_object); this.add_object.setText(R.string.dog_object);
@ -552,9 +549,9 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
marker.setOnMarkerClickListener(new Marker.OnMarkerClickListener() { marker.setOnMarkerClickListener(new Marker.OnMarkerClickListener() {
@Override @Override
public boolean onMarkerClick(Marker marker, MapView mapView) { public boolean onMarkerClick(Marker marker, MapView mapView) {
if (serviceGps.isDogActivated()) { if (serviceTrackingDog.isDogActivated()) {
GeoPoint gp = marker.getPosition(); GeoPoint gp = marker.getPosition();
WayPointLocation wpl = serviceGps.getPointTrail(gp.getLatitude(), gp.getLongitude()); WayPointLocation wpl = serviceTrackingDog.getPointTrail(gp.getLatitude(), gp.getLongitude());
if (wpl != null) { if (wpl != null) {
wpl.setFound(); wpl.setFound();
marker.setIcon(getResources().getDrawable(R.drawable.ic_marker_blue)); marker.setIcon(getResources().getDrawable(R.drawable.ic_marker_blue));
@ -568,7 +565,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
} }
private void markAsFound() { private void markAsFound() {
List<WayPointLocation> wpls = serviceGps.foundNearObjects(); List<WayPointLocation> wpls = serviceTrackingDog.foundNearObjects();
boolean findMarker = false; boolean findMarker = false;
for (WayPointLocation wpl : wpls) { for (WayPointLocation wpl : wpls) {
if (wpl != null && !wpl.isFound()) { if (wpl != null && !wpl.isFound()) {
@ -584,21 +581,21 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
} }
} }
} }
serviceGps.addPointObjectDog(); serviceTrackingDog.addPointObjectDog();
findMarker = true; findMarker = true;
break; break;
} }
} }
if (wpls.isEmpty() || !findMarker) { if (wpls.isEmpty() || !findMarker) {
// if no object is near // if no object is near
WayPointLocation wpl = serviceGps.addPointObjectDog(); WayPointLocation wpl = serviceTrackingDog.addPointObjectDog();
GeoPoint gp = new GeoPoint(wpl.getLatitude(), wpl.getLongitude(), wpl.getAltitude()); GeoPoint gp = new GeoPoint(wpl.getLatitude(), wpl.getLongitude(), wpl.getAltitude());
addMarker(gp, true); addMarker(gp, true);
} }
} }
private void calculTrailDistance() { private void calculTrailDistance() {
List<MyLocation> listLoc = serviceGps.getListGeoPointTraceur(); List<MyLocation> listLoc = serviceTrackingDog.getListGeoPointTraceur();
MyLocation last = null; MyLocation last = null;
distance = 0; distance = 0;
for (MyLocation loc: listLoc) { for (MyLocation loc: listLoc) {
@ -613,7 +610,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
} }
private void updateDogTrace() { private void updateDogTrace() {
MyLocationArray listLoc = serviceGps.getListGeoPointDog(); MyLocationArray listLoc = serviceTrackingDog.getListGeoPointDog();
if (listLoc.isEmpty()) { if (listLoc.isEmpty()) {
return ; return ;
} }
@ -631,7 +628,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
} }
private void updateTrailTrace() { private void updateTrailTrace() {
MyLocationArray listLoc = serviceGps.getListGeoPointTraceur(); MyLocationArray listLoc = serviceTrackingDog.getListGeoPointTraceur();
if (listLoc.isEmpty()) { if (listLoc.isEmpty()) {
return ; return ;
} }
@ -662,7 +659,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
//<editor-fold defaultstate="collapsed" desc="Service callback"> //<editor-fold defaultstate="collapsed" desc="Service callback">
@Override @Override
public void update(Observable observable, Object o) { public void update(Observable observable, Object o) {
if (observable == serviceGps) { if (observable.getClass().getName().equals(ServiceGps.class.getName())) {
updateServiceGps(o); updateServiceGps(o);
} else if (observable == serviceXmpp) { } else if (observable == serviceXmpp) {
updateServiceXmpp(o); updateServiceXmpp(o);
@ -671,7 +668,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
public void updateServiceGps(Object o) { public void updateServiceGps(Object o) {
if (o instanceof String && o.equals(ServiceGps.NOTIF_NEW_LOCATION)) { if (o instanceof String && o.equals(ServiceGps.NOTIF_NEW_LOCATION)) {
MyLocation loc = serviceGps.getCurrentLocation(); MyLocation loc = serviceTrackingDog.getCurrentLocation();
onNewLocation(loc); onNewLocation(loc);
try { try {
serviceXmpp.sendCommandLocationTrail(loc.getLatitude(), loc.getLongitude(), loc.getTime()); serviceXmpp.sendCommandLocationTrail(loc.getLatitude(), loc.getLongitude(), loc.getTime());
@ -686,7 +683,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (serviceGps.isTraceurActivated()) { if (serviceTrackingDog.isTraceurActivated()) {
MyLocation loc = serviceXmpp.getCurrentLocation(); MyLocation loc = serviceXmpp.getCurrentLocation();
onNewLocation(loc); onNewLocation(loc);
} }
@ -696,9 +693,9 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (serviceGps.isTraceurActivated()) { if (serviceTrackingDog.isTraceurActivated()) {
MyLocation locObj = serviceXmpp.getLastObjectXmppLocation(); MyLocation locObj = serviceXmpp.getLastObjectXmppLocation();
WayPointLocation loc = serviceGps.addPointObjectTrail(locObj); WayPointLocation loc = serviceTrackingDog.addPointObjectTrail(locObj);
GeoPoint gp = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude()); GeoPoint gp = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude());
addMarker(gp, loc.isFound()); addMarker(gp, loc.isFound());
} }
@ -724,19 +721,19 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
private void onNewLocation(MyLocation loc) { private void onNewLocation(MyLocation loc) {
if (loc != null) { if (loc != null) {
serviceGps.addPoint(loc); //serviceGps.addPoint(loc);
GeoPoint currentPoint = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude()); GeoPoint currentPoint = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude());
if (mLocationOverlay.isFollowLocationEnabled()) { if (mLocationOverlay.isFollowLocationEnabled()) {
map.getController().setCenter(currentPoint); map.getController().setCenter(currentPoint);
} }
if (serviceGps.isTraceurActivated()) { if (serviceTrackingDog.isTraceurActivated()) {
updateTrailTrace(); updateTrailTrace();
if (lastLocation != null) { if (lastLocation != null) {
distance += loc.distanceTo(lastLocation); distance += loc.distanceTo(lastLocation);
updateDistance(); updateDistance();
} }
lastLocation = loc; lastLocation = loc;
} else if (serviceGps.isDogActivated()) { } else if (serviceTrackingDog.isDogActivated()) {
updateDogTrace(); updateDogTrace();
if (lastLocation != null) { if (lastLocation != null) {
distance += loc.distanceTo(lastLocation); distance += loc.distanceTo(lastLocation);
@ -745,7 +742,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
lastLocation = loc; lastLocation = loc;
} }
float orientation = serviceGps.getOrientation(deviceOrientation); float orientation = serviceTrackingDog.getOrientation(deviceOrientation);
if (orientation >= 0) { if (orientation >= 0) {
map.setMapOrientation(orientation); map.setMapOrientation(orientation);
} }
@ -762,22 +759,22 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
//<editor-fold defaultstate="collapsed" desc="Placeholder management"> //<editor-fold defaultstate="collapsed" desc="Placeholder management">
private void updateDistance() { private void updateDistance() {
String text = null; String text = null;
if (serviceGps.isTraceurActivated()) { if (serviceTrackingDog.isTraceurActivated()) {
text = getTextTraceur(); text = getTextTraceur();
} else if (serviceGps.isDogActivated()) { } else if (serviceTrackingDog.isDogActivated()) {
text = getTextDog(); text = getTextDog();
} }
updateDistance(text); updateDistance(text);
} }
private String getTextTraceur() { private String getTextTraceur() {
return String.format("Distance: %,dm\t\t\t\t\t\t\t\tObjets: %d", ((int) distance), serviceGps.getListGeoPointObjectsTrail().size()); return String.format("Distance: %,dm\t\t\t\t\t\t\t\tObjets: %d", ((int) distance), serviceTrackingDog.getListGeoPointObjectsTrail().size());
} }
private String getTextDog() { private String getTextDog() {
String text = ""; String text = "";
MyLocation firstLoc = serviceGps.getListGeoPointDog().getFirstLocation(); MyLocation firstLoc = serviceTrackingDog.getListGeoPointDog().getFirstLocation();
MyLocation lastLoc = serviceGps.getListGeoPointDog().getLastLocation(); MyLocation lastLoc = serviceTrackingDog.getListGeoPointDog().getLastLocation();
if (firstLoc != null) { if (firstLoc != null) {
long time = lastLoc.getTime() - firstLoc.getTime(); long time = lastLoc.getTime() - firstLoc.getTime();
time /= 1_000; time /= 1_000;
@ -789,12 +786,12 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
text = String.format("Time: %02d:%02d:%02d", h, m, s); text = String.format("Time: %02d:%02d:%02d", h, m, s);
int nbFoundObject = 0; int nbFoundObject = 0;
for (MyLocation loc: serviceGps.getListGeoPointObjectsDog()) { for (MyLocation loc: serviceTrackingDog.getListGeoPointObjectsDog()) {
if (loc instanceof WayPointLocation && ((WayPointLocation) loc).isFound()) { if (loc instanceof WayPointLocation && ((WayPointLocation) loc).isFound()) {
nbFoundObject++; nbFoundObject++;
} }
} }
text += "\t\t\t\t\t\t\t\tObjets: "+nbFoundObject+"/"+serviceGps.getListGeoPointObjectsTrail().size(); text += "\t\t\t\t\t\t\t\tObjets: "+nbFoundObject+"/"+serviceTrackingDog.getListGeoPointObjectsTrail().size();
} }
return text; return text;
} }

View File

@ -36,8 +36,6 @@ public class ServiceGps extends Observable implements LocationListener {
private static final String TAG = ServiceGps.class.getName(); private static final String TAG = ServiceGps.class.getName();
public static final String NOTIF_NEW_LOCATION = ServiceGps.class.getName()+".newlocation"; public static final String NOTIF_NEW_LOCATION = ServiceGps.class.getName()+".newlocation";
private static final String PREF_VIBRATION_NEAR_OBJECT_ENABLED = "PREF_VIBRATION_NEAR_OBJECT_ENABLED";
private File lastExportedTrailFile = null; private File lastExportedTrailFile = null;
private LocationManager locationManager; private LocationManager locationManager;
@ -45,15 +43,8 @@ public class ServiceGps extends Observable implements LocationListener {
private String appName = ""; private String appName = "";
private final Traces traces = new Traces(); private final Traces traces = new Traces();
private final SharedPreferences preferences;
public ServiceGps(Vibrator vibrator, SharedPreferences preferences) { public ServiceGps() {
this.vibrator = vibrator;
this.preferences = preferences;
if (preferences != null) {
this.vibrationNearObjectEnabled = preferences.getBoolean(PREF_VIBRATION_NEAR_OBJECT_ENABLED, false);
}
} }
public void setLocationManager(LocationManager locationManager) { public void setLocationManager(LocationManager locationManager) {
@ -104,35 +95,6 @@ public class ServiceGps extends Observable implements LocationListener {
return ret; return ret;
} }
//<editor-fold defaultstate="collapsed" desc="Vibration management">
private final Vibrator vibrator;
private boolean vibrationNearObjectEnabled = false;
private boolean nearObjectVibration = false;
public void setVibrationNearObjectEnabled(boolean b) {
this.vibrationNearObjectEnabled = b;
if (preferences != null) {
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(PREF_VIBRATION_NEAR_OBJECT_ENABLED, b);
editor.commit();
}
}
public boolean isVibrationNearObjectEnabled() {
return this.vibrationNearObjectEnabled;
}
private void vibrate(int timeVibrationMs) {
if (this.vibrator != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
this.vibrator.vibrate(VibrationEffect.createOneShot(timeVibrationMs, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
this.vibrator.vibrate(timeVibrationMs);
}
}
}
//</editor-fold>
//<editor-fold defaultstate="collapsed" desc="GPS Callback"> //<editor-fold defaultstate="collapsed" desc="GPS Callback">
@Override @Override
public void onLocationChanged(Location location) { public void onLocationChanged(Location location) {
@ -140,17 +102,6 @@ public class ServiceGps extends Observable implements LocationListener {
currentLocation = new MyLocation(location); currentLocation = new MyLocation(location);
setChanged(); setChanged();
notifyObservers(NOTIF_NEW_LOCATION); notifyObservers(NOTIF_NEW_LOCATION);
if (isDogActivated()) {
if (vibrationNearObjectEnabled && isNearObjects()) {
if (!nearObjectVibration) {
nearObjectVibration = true;
vibrate(1_000);
}
} else {
nearObjectVibration = false;
}
}
} }
@Override @Override
@ -159,9 +110,9 @@ public class ServiceGps extends Observable implements LocationListener {
if (s != null && s.equals(LocationManager.GPS_PROVIDER)) { if (s != null && s.equals(LocationManager.GPS_PROVIDER)) {
if (i == LocationProvider.AVAILABLE) { if (i == LocationProvider.AVAILABLE) {
start(); start();
} else if (i == LocationProvider.TEMPORARILY_UNAVAILABLE) {
} else if (i == LocationProvider.OUT_OF_SERVICE) { } else if (i == LocationProvider.OUT_OF_SERVICE) {
stop(); stop();
// } else if (i == LocationProvider.TEMPORARILY_UNAVAILABLE) {
} }
} }
} }
@ -236,7 +187,7 @@ public class ServiceGps extends Observable implements LocationListener {
return traces.getListPointObjectsDog(); return traces.getListPointObjectsDog();
} }
private List<WayPointLocation> foundNearObjects(int distance) { public List<WayPointLocation> foundNearObjects(int distance) {
List<WayPointLocation> ret = new ArrayList<>(); List<WayPointLocation> ret = new ArrayList<>();
MyLocation curLoc = currentLocation; MyLocation curLoc = currentLocation;
for (MyLocation ml: getListGeoPointObjectsTrail()) { for (MyLocation ml: getListGeoPointObjectsTrail()) {
@ -246,7 +197,7 @@ public class ServiceGps extends Observable implements LocationListener {
} }
return ret; return ret;
} }
private boolean isNearObjects() { public boolean isNearObjects() {
return !foundNearObjects(20).isEmpty(); return !foundNearObjects(20).isEmpty();
} }
public List<WayPointLocation> foundNearObjects() { public List<WayPointLocation> foundNearObjects() {

View File

@ -0,0 +1,227 @@
package fr.chteufleur.mytrackingdog.services;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.location.LocationManager;
import android.os.Build;
import android.os.VibrationEffect;
import android.os.Vibrator;
import org.jxmpp.stringprep.XmppStringprepException;
import java.io.File;
import java.net.UnknownHostException;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import fr.chteufleur.mytrackingdog.models.beans.MyLocation;
import fr.chteufleur.mytrackingdog.models.beans.MyLocationArray;
import fr.chteufleur.mytrackingdog.models.beans.WayPointLocation;
public class ServiceTrackingDog implements Observer {
//<editor-fold defaultstate="collapsed" desc="Preferences">
private final SharedPreferences preferences;
private static final String PREF_VIBRATION_NEAR_OBJECT_ENABLED = "PREF_VIBRATION_NEAR_OBJECT_ENABLED";
//</editor-fold>
private final ServiceGps serviceGps;
private final ServiceXmpp serviceXmpp;
private String appName = "";
public ServiceTrackingDog(Vibrator vibrator, SharedPreferences preferences, Resources resources) {
this.vibrator = vibrator;
this.preferences = preferences;
if (preferences != null) {
this.vibrationNearObjectEnabled = preferences.getBoolean(PREF_VIBRATION_NEAR_OBJECT_ENABLED, false);
}
this.serviceGps = new ServiceGps();
this.serviceGps.addObserver(this);
ServiceXmpp sx = null;
try {
sx = new ServiceXmpp(resources);
} catch (UnknownHostException | XmppStringprepException ex) {
sx = null;
}
this.serviceXmpp = sx;
}
public void setAppName(String appName) {
this.appName = appName;
serviceGps.setAppName(appName);
}
public void addObserver(Observer observer, String name) {
if (name != null) {
if (name.equals(ServiceGps.class.getName())) {
serviceGps.addObserver(observer);
}
}
}
public void close() {
serviceGps.stop();
if (serviceXmpp != null) {
serviceXmpp.close();
}
}
//<editor-fold defaultstate="collapsed" desc="Observer Callback">
@Override
public void update(Observable observable, Object o) {
if (observable == serviceGps) {
updateGps(o);
} else if (observable == serviceXmpp) {
updateXmpp(o);
}
}
public void updateGps(Object o) {
if (o != null && o instanceof String) {
String action = (String) o;
if (action.equals(ServiceGps.NOTIF_NEW_LOCATION)) {
onNewLocation();
shouldVibrate();
}
}
}
public void updateXmpp(Object o) {
}
public void onNewLocation() {
MyLocation loc = serviceGps.getCurrentLocation();
serviceGps.addPoint(loc);
}
//</editor-fold>
//<editor-fold defaultstate="collapsed" desc="Vibration management">
private static final int TIME_VIBRATION_NEAR_OBJECT_MS = 1_000;
private final Vibrator vibrator;
private boolean vibrationNearObjectEnabled = false;
private boolean nearObjectVibration = false;
public void setVibrationNearObjectEnabled(boolean b) {
this.vibrationNearObjectEnabled = b;
if (preferences != null) {
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(PREF_VIBRATION_NEAR_OBJECT_ENABLED, b);
editor.commit();
}
}
public boolean isVibrationNearObjectEnabled() {
return this.vibrationNearObjectEnabled;
}
private void vibrate(int timeVibrationMs) {
if (this.vibrator != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
this.vibrator.vibrate(VibrationEffect.createOneShot(timeVibrationMs, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
this.vibrator.vibrate(timeVibrationMs);
}
}
}
private void shouldVibrate() {
// Near object vibration check
if (serviceGps.isDogActivated()) {
if (vibrationNearObjectEnabled && serviceGps.isNearObjects()) {
if (!nearObjectVibration) {
nearObjectVibration = true;
vibrate(TIME_VIBRATION_NEAR_OBJECT_MS);
}
} else {
nearObjectVibration = false;
}
}
}
//</editor-fold>
//<editor-fold defaultstate="collapsed" desc="Service GPS delegation">
public void setLocationManager(LocationManager locationManager) {
serviceGps.setLocationManager(locationManager);
}
public void startLocation() {
serviceGps.start();
}
public File getLastExportedTrailFile() {
return serviceGps.getLastExportedTrailFile();
}
public MyLocation getCurrentLocation() {
return serviceGps.getCurrentLocation();
}
public void importGpxTrace(File file) {
serviceGps.importGpxTrace(file);
}
public float getOrientation(int deviceOrientation) {
return serviceGps.getOrientation(deviceOrientation);
}
//<editor-fold defaultstate="collapsed" desc="Trace activation">
public void toggleTraceurActivation() {
serviceGps.toggleTraceurActivation();
}
public boolean isTraceurActivated() {
return serviceGps.isTraceurActivated();
}
public void toggleDogActivation() {
serviceGps.toggleDogActivation();
}
public boolean isDogActivated() {
return serviceGps.isDogActivated();
}
//</editor-fold>
//<editor-fold defaultstate="collapsed" desc="Objects">
public WayPointLocation addPointObjectTrail() {
return serviceGps.addPointObjectTrail();
}
public WayPointLocation addPointObjectTrail(MyLocation location) {
return serviceGps.addPointObjectTrail(location);
}
public WayPointLocation addPointObjectDog() {
return serviceGps.addPointObjectDog();
}
public MyLocationArray getListGeoPointObjectsTrail() {
return serviceGps.getListGeoPointObjectsTrail();
}
public MyLocationArray getListGeoPointObjectsDog() {
return serviceGps.getListGeoPointObjectsDog();
}
private List<WayPointLocation> foundNearObjects(int distance) {
return serviceGps.foundNearObjects(distance);
}
public boolean isNearObjects() {
return serviceGps.isNearObjects();
}
public List<WayPointLocation> foundNearObjects() {
return serviceGps.foundNearObjects();
}
//</editor-fold>
//<editor-fold defaultstate="collapsed" desc="Traces">
public void addPoint(MyLocation location) {
serviceGps.addPoint(location);
}
public MyLocationArray getListGeoPointTraceur() {
return serviceGps.getListGeoPointTraceur();
}
public MyLocationArray getListGeoPointDog() {
return serviceGps.getListGeoPointDog();
}
public WayPointLocation getPointTrail(double lat, double lon) {
return serviceGps.getPointTrail(lat, lon);
}
public WayPointLocation getPointDog(double lat, double lon) {
return serviceGps.getPointDog(lat, lon);
}
//</editor-fold>
//</editor-fold>
}