package me.guillaumin.android.osmtracker.db.model; import java.text.DateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import me.guillaumin.android.osmtracker.R; import me.guillaumin.android.osmtracker.db.TrackContentProvider; import me.guillaumin.android.osmtracker.db.TrackContentProvider.Schema; import android.content.ContentResolver; import android.database.Cursor; /** * Represents a Track * @author Nicolas Guillaumin * */ public class Track { private static final DateFormat DATE_FORMAT = DateFormat.getDateTimeInstance(); public enum OSMVisibility { Private(0, R.string.osm_visibility_private), Public(1, R.string.osm_visibility_public), Trackable(2, R.string.osm_visibility_trackable), Identifiable(3, R.string.osm_visibility_identifiable); public final int position; public final int resId; private OSMVisibility(int position, int resId) { this.position = position; this.resId = resId; } public static OSMVisibility fromPosition(int position) { for (OSMVisibility v: values()) { if (v.position == position) { return v; } } throw new IllegalArgumentException(); } } private String name; private String description; private OSMVisibility visibility; private List<String> tags = new ArrayList<String>(); private int tpCount, wpCount; private long trackDate; private long trackId; private Long startDate=null, endDate=null; private Float startLat=null, startLong=null, endLat=null, endLong=null; private boolean extraInformationRead = false; private ContentResolver cr; /** * build a track object with the given cursor * * @param trackId id of the track that will be built * @param tc cursor that is used to build the track * @param cr the content resolver to use * @param withExtraInformation if additional informations (startDate, endDate, first and last track point will be loaded from the database * @return Track */ public static Track build(final long trackId, Cursor tc, ContentResolver cr, boolean withExtraInformation) { Track out = new Track(); out.trackId = trackId; out.cr = cr; out.trackDate = tc.getLong(tc.getColumnIndex(Schema.COL_START_DATE)); out.name = tc.getString(tc.getColumnIndex(Schema.COL_NAME)); out.description = tc.getString(tc.getColumnIndex(Schema.COL_DESCRIPTION)); String tags = tc.getString(tc.getColumnIndex(Schema.COL_TAGS)); if (tags != null && ! "".equals(tags)) { out.tags.addAll(Arrays.asList(tags.split(","))); } out.visibility = OSMVisibility.valueOf(tc.getString(tc.getColumnIndex(Schema.COL_OSM_VISIBILITY))); out.tpCount = tc.getInt(tc.getColumnIndex(Schema.COL_TRACKPOINT_COUNT)); out.wpCount = tc.getInt(tc.getColumnIndex(Schema.COL_WAYPOINT_COUNT)); if(withExtraInformation){ out.readExtraInformation(); } return out; } private void readExtraInformation(){ if(!extraInformationRead){ Cursor startCursor = cr.query(TrackContentProvider.trackStartUri(trackId), null, null, null, null); if(startCursor.moveToFirst()){ startDate = startCursor.getLong(startCursor.getColumnIndex(Schema.COL_TIMESTAMP)); startLat = startCursor.getFloat(startCursor.getColumnIndex(Schema.COL_LATITUDE)); startLong = startCursor.getFloat(startCursor.getColumnIndex(Schema.COL_LONGITUDE)); } startCursor.close(); Cursor endCursor = cr.query(TrackContentProvider.trackEndUri(trackId), null, null, null, null); if(endCursor.moveToFirst()){ endDate = endCursor.getLong(endCursor.getColumnIndex(Schema.COL_TIMESTAMP)); endLat = endCursor.getFloat(endCursor.getColumnIndex(Schema.COL_LATITUDE)); endLong = endCursor.getFloat(endCursor.getColumnIndex(Schema.COL_LONGITUDE)); } endCursor.close(); extraInformationRead = true; } } public void setName(String name) { this.name = name; } public void setDescription(String description) { this.description = description; } public void setTpCount(int tpCount) { this.tpCount = tpCount; } public void setWpCount(int wpCount) { this.wpCount = wpCount; } public void setTracktDate(long tracktDate) { this.trackDate = tracktDate; } public void setEndDate(long endDate) { this.endDate = endDate; } public void setStartLat(float startLat) { this.startLat = startLat; } public void setTrackDate(long trackDate) { this.trackDate = trackDate; } public void setStartDate(long startDate) { this.startDate = startDate; } public void setStartLong(float startLong) { this.startLong = startLong; } public void setEndLat(float endLat) { this.endLat = endLat; } public void setEndLong(float endLong) { this.endLong = endLong; } public Integer getWpCount() { return wpCount; } public Integer getTpCount() { return tpCount; } public String getName() { if (name != null && name.length() > 0) { return name; } else { // Use start date as name return DATE_FORMAT.format(new Date(trackDate)); } } public String getDescription() { return description; } public List<String> getTags() { return tags; } public OSMVisibility getVisibility() { return visibility; } public String getCommaSeparatedTags() { StringBuilder sb = new StringBuilder(); for (int i=0; i<tags.size(); i++) { sb.append(tags.get(i)); if (i+1 < tags.size()) { sb.append(","); } } return sb.toString(); } public String getStartDateAsString() { readExtraInformation(); if (startDate != null) { return DATE_FORMAT.format(new Date(startDate)); } else { return ""; } } public String getEndDateAsString() { readExtraInformation(); if (endDate != null) { return DATE_FORMAT.format(new Date(endDate)); } else { return ""; } } public Float getStartLat() { readExtraInformation(); return startLat; } public Float getStartLong() { readExtraInformation(); return startLong; } public Float getEndLat() { readExtraInformation(); return endLat; } public Float getEndLong() { readExtraInformation(); return endLong; } }