diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7334098..425d1d6 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -20,6 +20,8 @@
+
+
diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/FilePicker.java b/app/src/main/java/fr/chteufleur/mytrackingdog/FilePicker.java
new file mode 100644
index 0000000..3ad7e96
--- /dev/null
+++ b/app/src/main/java/fr/chteufleur/mytrackingdog/FilePicker.java
@@ -0,0 +1,213 @@
+package fr.chteufleur.mytrackingdog;
+
+import android.app.ListActivity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import fr.chteufleur.mytrackingdog.R;
+
+public class FilePicker extends ListActivity {
+
+ public final static String EXTRA_FILE_PATH = "file_path";
+ public final static String EXTRA_SHOW_HIDDEN_FILES = "show_hidden_files";
+ public final static String EXTRA_ACCEPTED_FILE_EXTENSIONS = "accepted_file_extensions";
+ private final static String DEFAULT_INITIAL_DIRECTORY = "/";
+
+ protected File Directory;
+ protected ArrayList Files;
+ protected FilePickerListAdapter Adapter;
+ protected boolean ShowHiddenFiles = false;
+ protected String[] acceptedFileExtensions;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ LayoutInflater inflator = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ View emptyView = inflator.inflate(R.layout.empty_view, null);
+ ((ViewGroup) getListView().getParent()).addView(emptyView);
+ getListView().setEmptyView(emptyView);
+
+ // Set initial directory
+ Directory = new File(DEFAULT_INITIAL_DIRECTORY);
+
+ // Initialize the ArrayList
+ Files = new ArrayList();
+
+ // Set the ListAdapter
+ Adapter = new FilePickerListAdapter(this, Files);
+ setListAdapter(Adapter);
+
+ // Initialize the extensions array to allow any file extensions
+ acceptedFileExtensions = new String[] {};
+
+ // Get intent extras
+ if (getIntent().hasExtra(EXTRA_FILE_PATH)) {
+ Directory = new File(getIntent().getStringExtra(EXTRA_FILE_PATH));
+ }
+
+ if (getIntent().hasExtra(EXTRA_SHOW_HIDDEN_FILES)) {
+ ShowHiddenFiles = getIntent().getBooleanExtra(EXTRA_SHOW_HIDDEN_FILES, false);
+ }
+
+ if (getIntent().hasExtra(EXTRA_ACCEPTED_FILE_EXTENSIONS)) {
+ ArrayList collection = getIntent().getStringArrayListExtra(EXTRA_ACCEPTED_FILE_EXTENSIONS);
+ acceptedFileExtensions = collection.toArray(new String[collection.size()]);
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ refreshFilesList();
+ super.onResume();
+ }
+
+ protected void refreshFilesList() {
+ Files.clear();
+ ExtensionFilenameFilter filter = new ExtensionFilenameFilter(acceptedFileExtensions);
+
+ File[] files = Directory.listFiles(filter);
+ if (files != null && files.length > 0) {
+ for (File f: files) {
+ if (f.isHidden() && !ShowHiddenFiles) {
+ continue;
+ }
+ Files.add(f);
+ }
+ Collections.sort(Files, new FileComparator());
+ }
+ Adapter.notifyDataSetChanged();
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (Directory.getParentFile() != null) {
+ Directory = Directory.getParentFile();
+ refreshFilesList();
+ return;
+ }
+ super.onBackPressed();
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+ File newFile = (File)l.getItemAtPosition(position);
+ if (newFile.isFile()) {
+ Intent extra = new Intent();
+ extra.putExtra(EXTRA_FILE_PATH, newFile.getAbsolutePath());
+ setResult(RESULT_OK, extra);
+ finish();
+ } else {
+ Directory = newFile;
+ refreshFilesList();
+ }
+ super.onListItemClick(l, v, position, id);
+ }
+
+ private class FilePickerListAdapter extends ArrayAdapter {
+ private List mObjects;
+
+ public FilePickerListAdapter(Context context, List objects) {
+ super(context, R.layout.list_item, android.R.id.text1, objects);
+ mObjects = objects;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View row = null;
+
+ if (convertView == null) {
+ LayoutInflater inflater = (LayoutInflater)
+ getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ row = inflater.inflate(R.layout.list_item, parent, false);
+ } else {
+ row = convertView;
+ }
+
+ File object = mObjects.get(position);
+
+ ImageView imageView = row.findViewById(R.id.file_picker_image);
+ TextView textView = row.findViewById(R.id.file_picker_text);
+ textView.setSingleLine(true);
+ textView.setText(object.getName());
+
+ if (object.isFile()) {
+ imageView.setImageResource(R.drawable.ic_file);
+ } else {
+ imageView.setImageResource(R.drawable.ic_folder);
+ }
+
+ return row;
+ }
+ }
+
+ private class FileComparator implements Comparator {
+
+ public int compare(File f1, File f2) {
+
+ if (f1 == f2) {
+ return 0;
+ }
+
+ if (f1.isDirectory() && f2.isFile()) {
+ // Show directories above files
+ return -1;
+ }
+
+ if (f1.isFile() && f2.isDirectory()) {
+ // Show files below directories
+ return 1;
+ }
+
+ // Sort the directories alphabetically
+ return f1.getName().compareToIgnoreCase(f2.getName());
+ }
+ }
+
+ private class ExtensionFilenameFilter implements FilenameFilter {
+
+ private String[] Extensions;
+
+ public ExtensionFilenameFilter(String[] extensions) {
+ super();
+ Extensions = extensions;
+ }
+
+ public boolean accept(File dir, String filename) {
+
+ if (new File(dir, filename).isDirectory()) {
+ // Accept all directory names
+ return true;
+ }
+
+ if (Extensions != null && Extensions.length > 0) {
+ for (int i = 0; i < Extensions.length; i++) {
+ if (filename.endsWith(Extensions[i])) {
+ // The filename ends with the extension
+ return true;
+ }
+ }
+ // The filename did not match any of the extensions
+ return false;
+ }
+ // No extensions has been set. Accept all file extensions.
+ return true;
+ }
+ }
+}
diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java b/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java
index 3b1b5eb..fd622b7 100644
--- a/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java
+++ b/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java
@@ -2,26 +2,26 @@ package fr.chteufleur.mytrackingdog;
import android.Manifest;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.hardware.GeomagneticField;
-import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
+import android.os.Environment;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
-import android.util.Log;
+import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Surface;
import android.view.View;
import android.view.WindowManager;
-import android.widget.ImageButton;
import android.widget.Toast;
import org.osmdroid.api.IMapController;
@@ -31,7 +31,6 @@ import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.Marker;
import org.osmdroid.views.overlay.Polyline;
-import org.osmdroid.views.overlay.compass.CompassOverlay;
import org.osmdroid.views.overlay.compass.IOrientationConsumer;
import org.osmdroid.views.overlay.compass.IOrientationProvider;
import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider;
@@ -39,11 +38,13 @@ import org.osmdroid.views.overlay.infowindow.BasicInfoWindow;
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider;
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;
+import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
+import fr.chteufleur.mytrackingdog.models.Gpx;
import fr.chteufleur.mytrackingdog.models.beans.MyLocation;
import fr.chteufleur.mytrackingdog.services.ServiceGps;
@@ -54,13 +55,11 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
public static String appName = "";
private MyLocationNewOverlay mLocationOverlay;
- private CompassOverlay mCompassOverlay;
private IOrientationProvider compass = null;
private ServiceGps serviceGps = null;
private Context ctx = null;
private MapView map = null;
- private ImageButton btFollowMe;
private int deviceOrientation = 0;
private boolean zoomed = false;
@@ -99,6 +98,9 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
// Keep screen ON
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ Toolbar toolbar = findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+
map = findViewById(R.id.map);
map.setTileSource(TileSourceFactory.MAPNIK);
@@ -112,11 +114,6 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
GeoPoint startPoint = new GeoPoint(45.0000, 5.0000);
mapController.setCenter(startPoint);
- // Compass
- this.mCompassOverlay = new CompassOverlay(ctx, new InternalCompassOrientationProvider(ctx), map);
- map.getOverlays().add(this.mCompassOverlay);
- this.mCompassOverlay.enableCompass();
-
// Current position on the map
this.mLocationOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(ctx), map);
map.getOverlays().add(this.mLocationOverlay);
@@ -124,20 +121,6 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
mLocationOverlay.enableFollowLocation();
mLocationOverlay.setOptionsMenuEnabled(true);
- // Follow me
- btFollowMe = findViewById(R.id.ic_follow_me);
- btFollowMe.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (!mLocationOverlay.isFollowLocationEnabled()) {
- mLocationOverlay.enableFollowLocation();
- btFollowMe.setImageResource(R.drawable.osm_ic_follow_me_on);
- } else {
- mLocationOverlay.disableFollowLocation();
- btFollowMe.setImageResource(R.drawable.osm_ic_follow_me);
- }
- }
- });
start_stop_trace = findViewById(R.id.start_stop_trace);
start_stop_trace.setOnClickListener(new View.OnClickListener() {
@@ -198,6 +181,10 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
private void addMarker() {
MyLocation loc = serviceGps.addPointObject();
GeoPoint gp = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude());
+ addMarker(gp);
+ }
+
+ private void addMarker(GeoPoint gp) {
Marker marker = new Marker(map);
marker.setPosition(gp);
marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
@@ -262,9 +249,6 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
}
private void pause() {
- if (mCompassOverlay != null) {
- mCompassOverlay.disableCompass();
- }
if (compass != null) {
compass.stopOrientationProvider();
compass.destroy();
@@ -308,13 +292,34 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
int id = item.getItemId();
//noinspection SimplifiableIfStatement
- if (id == R.id.action_settings) {
+ if (id == R.id.action_import_gpx) {
+ Intent intent = new Intent(this, FilePicker.class);
+ intent.putExtra(FilePicker.EXTRA_FILE_PATH, Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+appName);
+ startActivityForResult(intent, REQUEST_PICK_FILE);
return true;
}
return super.onOptionsItemSelected(item);
}
+ private static final int REQUEST_PICK_FILE = 1;
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode == RESULT_OK) {
+ switch (requestCode) {
+ case REQUEST_PICK_FILE:
+ if (data.hasExtra(FilePicker.EXTRA_FILE_PATH)) {
+ serviceGps.importGpxTrace(new File(data.getStringExtra(FilePicker.EXTRA_FILE_PATH)));
+ updateDogTrace();
+ updateTrailTrace();
+ for (MyLocation loc: serviceGps.getListGeoPointObjects()) {
+ addMarker(new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude()));
+ }
+ }
+ break;
+ }
+ }
+ }
@Override
@@ -376,40 +381,44 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
}
}
+ private void updateDogTrace() {
+ Polyline line = new Polyline(map);
+ line.setTitle(Gpx.DOG_TRACE_NAME);
+ line.setColor(Color.BLUE);
+ line.setPoints(convertListLocation(serviceGps.getListGeoPointDog()));
+ line.setWidth(LINE_WIDTH_BIG);
+ line.setGeodesic(true);
+ line.setInfoWindow(new BasicInfoWindow(R.layout.bonuspack_bubble, map));
+ map.getOverlayManager().add(line);
+ map.invalidate();
+ }
+
+ private void updateTrailTrace() {
+ Polyline line = new Polyline(map);
+ line.setTitle(Gpx.TRAIL_TRACE_NAME);
+ line.setColor(Color.RED);
+ line.setPoints(convertListLocation(serviceGps.getListGeoPointTraceur()));
+ line.setWidth(LINE_WIDTH_BIG);
+ line.setGeodesic(true);
+ line.setInfoWindow(new BasicInfoWindow(R.layout.bonuspack_bubble, map));
+ map.getOverlayManager().add(line);
+ map.invalidate();
+ }
@Override
public void update(Observable observable, Object o) {
if (observable == serviceGps) {
if (o instanceof String && o.equals(ServiceGps.NOTIF_NEW_LOCATION)) {
- Location loc = serviceGps.getCurrentLocation();
+ MyLocation loc = serviceGps.getCurrentLocation();
if (loc != null) {
GeoPoint currentPoint = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude());
- Polyline line = null;
+ map.getController().setCenter(currentPoint);
if (serviceGps.isTraceurActivated()) {
- map.getController().setCenter(currentPoint);
-
- line = new Polyline(map);
- line.setTitle("Trail");
- line.setColor(Color.RED);
- line.setPoints(convertListLocation(serviceGps.getListGeoPointTraceur()));
-
+ updateTrailTrace();
} else if (serviceGps.isDogActivated()) {
- map.getController().setCenter(currentPoint);
-
- line = new Polyline(map);
- line.setTitle("Dog");
- line.setColor(Color.BLUE);
- line.setPoints(convertListLocation(serviceGps.getListGeoPointDog()));
+ updateDogTrace();
}
- if (line != null) {
- line.setSubDescription(Polyline.class.getCanonicalName());
- line.setWidth(LINE_WIDTH_BIG);
- line.setGeodesic(true);
- line.setInfoWindow(new BasicInfoWindow(R.layout.bonuspack_bubble, map));
- map.getOverlayManager().add(line);
- map.invalidate();
- }
float orientation = serviceGps.getOrientation(deviceOrientation);
if (orientation >= 0) {
map.setMapOrientation(orientation);
diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/models/Gpx.java b/app/src/main/java/fr/chteufleur/mytrackingdog/models/Gpx.java
index eeedcbc..17d37ce 100644
--- a/app/src/main/java/fr/chteufleur/mytrackingdog/models/Gpx.java
+++ b/app/src/main/java/fr/chteufleur/mytrackingdog/models/Gpx.java
@@ -4,6 +4,9 @@ import java.io.File;
public class Gpx {
+ public static final String DOG_TRACE_NAME = "dog";
+ public static final String TRAIL_TRACE_NAME = "trail";
+
protected final File filePath;
public Gpx(File filePath) {
diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/models/ImportGpx.java b/app/src/main/java/fr/chteufleur/mytrackingdog/models/ImportGpx.java
new file mode 100644
index 0000000..055a867
--- /dev/null
+++ b/app/src/main/java/fr/chteufleur/mytrackingdog/models/ImportGpx.java
@@ -0,0 +1,219 @@
+package fr.chteufleur.mytrackingdog.models;
+
+import android.util.Log;
+import android.util.Xml;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import fr.chteufleur.mytrackingdog.models.beans.MyLocation;
+import fr.chteufleur.mytrackingdog.models.beans.TraceLocation;
+import fr.chteufleur.mytrackingdog.models.beans.WayPointLocation;
+
+public class ImportGpx extends Gpx {
+
+ private static final String TAG = Traces.class.getName();
+
+ private String traceName = "";
+
+
+ public ImportGpx(File filePath) {
+ super(filePath);
+ }
+
+ public String getTraceName() {
+ return this.traceName;
+ }
+
+ public List parse() throws XmlPullParserException, IOException {
+ InputStream in = new FileInputStream(filePath);
+ try {
+
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
+ parser.setInput(in, null);
+ parser.nextTag();
+ return readGpx(parser);
+ } finally {
+ in.close();
+ }
+ }
+
+
+ private List readGpx(XmlPullParser parser) throws XmlPullParserException, IOException {
+ List entries = new ArrayList();
+
+ parser.require(XmlPullParser.START_TAG, null, "gpx");
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ String name = parser.getName();
+ if (name.equals("wpt")) {
+ entries.add(readWaypoint(parser));
+ } else if (name.equals("trk")) {
+ entries.addAll(readTrk(parser));
+ } else {
+ skip(parser);
+ }
+ }
+ return entries;
+ }
+
+ private List readTrk(XmlPullParser parser) throws XmlPullParserException, IOException {
+ List entries = new ArrayList();
+
+ parser.require(XmlPullParser.START_TAG, null, "trk");
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ String name = parser.getName();
+ if (name.equals("trkseg")) {
+ entries = readTrkseq(parser);
+ } else {
+ skip(parser);
+ }
+ }
+ return entries;
+ }
+
+ private List readTrkseq(XmlPullParser parser) throws XmlPullParserException, IOException {
+ List entries = new ArrayList();
+
+ parser.require(XmlPullParser.START_TAG, null, "trkseg");
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ String name = parser.getName();
+ if (name.equals("trkpt")) {
+ entries.add(readTrkpt(parser));
+ } else if (name.equals("name")) {
+ traceName = readName(parser);
+ } else {
+ skip(parser);
+ }
+ }
+ return entries;
+ }
+
+
+ private MyLocation readTrkpt(XmlPullParser parser) throws XmlPullParserException, IOException {
+ parser.require(XmlPullParser.START_TAG, null, "trkpt");
+
+ String latStr = parser.getAttributeValue(null, "lat");
+ String lonStr = parser.getAttributeValue(null, "lon");
+ double lat = Double.parseDouble(latStr);
+ double lon = Double.parseDouble(lonStr);
+ long time = -1;
+
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ String name = parser.getName();
+ if (name.equals("time")) {
+ time = readTime(parser);
+ } else {
+ skip(parser);
+ }
+ }
+ return new TraceLocation(lat, lon, time);
+ }
+
+
+ private MyLocation readWaypoint(XmlPullParser parser) throws XmlPullParserException, IOException {
+ parser.require(XmlPullParser.START_TAG, null, "wpt");
+
+ String latStr = parser.getAttributeValue(null, "lat");
+ String lonStr = parser.getAttributeValue(null, "lon");
+ double lat = Double.parseDouble(latStr);
+ double lon = Double.parseDouble(lonStr);
+ long time = -1;
+
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ String name = parser.getName();
+ if (name.equals("time")) {
+ time = readTime(parser);
+ } else {
+ skip(parser);
+ }
+ }
+ return new WayPointLocation(lat, lon, time);
+ }
+
+
+ private long readTime(XmlPullParser parser) throws XmlPullParserException, IOException {
+ long ret = 0;
+ parser.require(XmlPullParser.START_TAG, null, "time");
+ String timeStr = readText(parser);
+
+ SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ Pattern pattern = Pattern.compile("([0-9]{4}-[0-9]{2}-[0-9]{2})T([0-9]{2}:[0-9]{2}:[0-9]{2})Z");
+ Matcher matcher = pattern.matcher(timeStr);
+
+ while (matcher.find()) {
+ if (matcher.groupCount() == 2) {
+ try {
+ Date date = formater.parse(matcher.group(1) + " " + matcher.group(2));
+ ret = date.getTime();
+ } catch (ParseException ex) {
+ Log.e(TAG, "Failed to parse time", ex);
+ }
+ }
+ }
+ parser.require(XmlPullParser.END_TAG, null, "time");
+ return ret;
+ }
+
+
+ private String readName(XmlPullParser parser) throws XmlPullParserException, IOException {
+ String ret;
+ parser.require(XmlPullParser.START_TAG, null, "name");
+ ret = readText(parser);
+ parser.require(XmlPullParser.END_TAG, null, "name");
+ return ret;
+ }
+
+ private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
+ String result = "";
+ if (parser.next() == XmlPullParser.TEXT) {
+ result = parser.getText();
+ parser.nextTag();
+ }
+ return result;
+ }
+
+ private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ throw new IllegalStateException();
+ }
+ int depth = 1;
+ while (depth != 0) {
+ switch (parser.next()) {
+ case XmlPullParser.END_TAG:
+ depth--;
+ break;
+ case XmlPullParser.START_TAG:
+ depth++;
+ break;
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/models/beans/MyLocation.java b/app/src/main/java/fr/chteufleur/mytrackingdog/models/beans/MyLocation.java
index fe07ad6..4f01b1e 100644
--- a/app/src/main/java/fr/chteufleur/mytrackingdog/models/beans/MyLocation.java
+++ b/app/src/main/java/fr/chteufleur/mytrackingdog/models/beans/MyLocation.java
@@ -2,28 +2,88 @@ package fr.chteufleur.mytrackingdog.models.beans;
import android.location.Location;
-public class MyLocation extends Location {
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class MyLocation {
+
+ private final double longitude;
+ private final double latitude;
+ private final long time;
+
+ private final double altitude;
+ private final float speed;
+ private final float bearing;
public MyLocation(Location l) {
- super(l);
+ if (l == null) {
+ throw new NullPointerException();
+ }
+ this.latitude = l.getLatitude();
+ this.longitude = l.getLongitude();
+ this.time = l.getTime();
+ this.altitude = l.getAltitude();
+ this.speed = l.getSpeed();
+ this.bearing = l.getBearing();
+ }
+
+ public MyLocation(double lat, double lon, long time) {
+ this.latitude = lat;
+ this.longitude = lon;
+ this.time = time;
+ this.altitude = 0;
+ this.speed = 0;
+ this.bearing = 0;
+ }
+
+
+ public double getLatitude() {
+ return this.latitude;
+ }
+
+ public double getLongitude() {
+ return this.longitude;
+ }
+
+ public long getTime() {
+ return this.time;
+ }
+
+ public String getDate() {
+ Date date = new Date(this.time);
+ SimpleDateFormat formaterDate = new SimpleDateFormat("yyyy-MM-dd");
+ SimpleDateFormat formaterTime = new SimpleDateFormat("HH:mm:ss");
+ return formaterDate.format(date)+"T"+formaterTime.format(date)+"Z";
+ }
+
+ public double getAltitude() {
+ return this.altitude;
+ }
+
+ public float getSpeed() {
+ return this.speed;
+ }
+
+ public float getBearing() {
+ return this.bearing;
}
public String toWayPoint() {
String ret = "";
- ret += "";
+ ret += "";
ret += "";
return ret;
}
public String toTracePoint() {
String ret = "";
- ret += "";
+ ret += "";
ret += "";
return ret;
}
@Override
public String toString() {
- return String.format("lat=%,4f ; lon=%,4f ; time=%d", getLatitude(), getLongitude(), getTime());
+ return String.format("lat=%,4f ; lon=%,4f ; time=%s", getLatitude(), getLongitude(), getDate());
}
}
diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/models/beans/TraceLocation.java b/app/src/main/java/fr/chteufleur/mytrackingdog/models/beans/TraceLocation.java
new file mode 100644
index 0000000..264a836
--- /dev/null
+++ b/app/src/main/java/fr/chteufleur/mytrackingdog/models/beans/TraceLocation.java
@@ -0,0 +1,13 @@
+package fr.chteufleur.mytrackingdog.models.beans;
+
+import android.location.Location;
+
+public class TraceLocation extends MyLocation {
+ public TraceLocation(Location l) {
+ super(l);
+ }
+
+ public TraceLocation(double lat, double lon, long time) {
+ super(lat, lon, time);
+ }
+}
diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/models/beans/WayPointLocation.java b/app/src/main/java/fr/chteufleur/mytrackingdog/models/beans/WayPointLocation.java
new file mode 100644
index 0000000..f707d91
--- /dev/null
+++ b/app/src/main/java/fr/chteufleur/mytrackingdog/models/beans/WayPointLocation.java
@@ -0,0 +1,14 @@
+package fr.chteufleur.mytrackingdog.models.beans;
+
+import android.location.Location;
+
+
+public class WayPointLocation extends MyLocation {
+ public WayPointLocation(Location l) {
+ super(l);
+ }
+
+ public WayPointLocation(double lat, double lon, long time) {
+ super(lat, lon, time);
+ }
+}
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 775c14f..e36e116 100644
--- a/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceGps.java
+++ b/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceGps.java
@@ -7,15 +7,22 @@ import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.File;
+import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Observable;
import fr.chteufleur.mytrackingdog.models.ExportGpx;
+import fr.chteufleur.mytrackingdog.models.Gpx;
+import fr.chteufleur.mytrackingdog.models.ImportGpx;
import fr.chteufleur.mytrackingdog.models.Traces;
import fr.chteufleur.mytrackingdog.models.beans.MyLocation;
+import fr.chteufleur.mytrackingdog.models.beans.TraceLocation;
+import fr.chteufleur.mytrackingdog.models.beans.WayPointLocation;
public class ServiceGps extends Observable implements IServiceGps, LocationListener {
@@ -142,19 +149,41 @@ public class ServiceGps extends Observable implements IServiceGps, LocationListe
}
public boolean exportDogTraceToGpx() {
- File file = new File(getFileName("dog"));
- ExportGpx exportGpx = new ExportGpx(file, "dog");
+ File file = new File(getFileName(Gpx.DOG_TRACE_NAME));
+ ExportGpx exportGpx = new ExportGpx(file, Gpx.DOG_TRACE_NAME);
exportGpx.setTrace(traces.getListPointDog());
return exportGpx.export();
}
public boolean exportTrailTraceToGpx() {
- SimpleDateFormat formater = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
- String date = formater.format(new Date());
- File file = new File(getFileName("trail"));
- ExportGpx exportGpx = new ExportGpx(file, "trail");
+ File file = new File(getFileName(Gpx.TRAIL_TRACE_NAME));
+ ExportGpx exportGpx = new ExportGpx(file, Gpx.TRAIL_TRACE_NAME);
exportGpx.setObjects(traces.getListPointObjects());
exportGpx.setTrace(traces.getListPointTraceur());
return exportGpx.export();
}
+
+ public void importGpxTrace(File file) {
+ ImportGpx importGpx = new ImportGpx(file);
+ try {
+ List list = importGpx.parse();
+ String traceName = importGpx.getTraceName();
+ for (int i=0; i
+
diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml
new file mode 100644
index 0000000..b4e509d
--- /dev/null
+++ b/app/src/main/res/layout/list_item.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/main.xml b/app/src/main/res/layout/main.xml
index adeab10..8f885e1 100644
--- a/app/src/main/res/layout/main.xml
+++ b/app/src/main/res/layout/main.xml
@@ -1,4 +1,5 @@
+
+
+
+
+
+
+
+
-
-
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index dcda8dc..e3fc7ca 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,5 +1,4 @@
MyTrackingDog
- Settings
- Follow me
+ Import GPX