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