Add gpx track download

This commit is contained in:
Victor Shcherb 2014-06-01 14:03:57 +02:00
parent fec6744d41
commit 1cb6b367c4
7 changed files with 140 additions and 21 deletions

View file

@ -44,7 +44,7 @@ public class DownloadFileHelper {
return e != null && e.getMessage().equals("Interrupted"); return e != null && e.getMessage().equals("Interrupted");
} }
private InputStream getInputStreamToDownload(final URL url, final boolean forceWifi) throws IOException { public InputStream getInputStreamToDownload(final URL url, final boolean forceWifi) throws IOException {
InputStream cis = new InputStream() { InputStream cis = new InputStream() {
byte[] buffer = new byte[BUFFER_SIZE]; byte[] buffer = new byte[BUFFER_SIZE];
int bufLen = 0; int bufLen = 0;

View file

@ -23,9 +23,12 @@ public class OsMoControlDevice implements OsMoReactor {
private OsMoService service; private OsMoService service;
private OsmandApplication app; private OsmandApplication app;
private OsMoTracker tracker; private OsMoTracker tracker;
private OsMoPlugin plugin;
public OsMoControlDevice(OsmandApplication app, OsMoService service, OsMoTracker tracker) { public OsMoControlDevice(OsmandApplication app, OsMoPlugin plugin,
OsMoService service, OsMoTracker tracker) {
this.app = app; this.app = app;
this.plugin = plugin;
this.service = service; this.service = service;
this.tracker = tracker; this.tracker = tracker;
service.registerReactor(this); service.registerReactor(this);
@ -96,6 +99,8 @@ public class OsMoControlDevice implements OsMoReactor {
} }
} }
return true; return true;
} else if(command.equals("GPX_GET")) {
plugin.getDownloadGpxTask().execute(obj);
} }
return false; return false;
} }

View file

@ -29,11 +29,13 @@ public class OsMoGroups implements OsMoReactor, OsmoTrackerListener {
private static final String DELETED = "deleted"; private static final String DELETED = "deleted";
private static final String GROUP_TRACKER_ID = "group_tracker_id"; private static final String GROUP_TRACKER_ID = "group_tracker_id";
private static final String LAST_ONLINE = "last_online"; private static final String LAST_ONLINE = "last_online";
private static final String TRACK = "track";
private OsMoTracker tracker; private OsMoTracker tracker;
private OsMoService service; private OsMoService service;
private OsMoGroupsStorage storage; private OsMoGroupsStorage storage;
private OsMoGroupsUIListener uiListener; private OsMoGroupsUIListener uiListener;
private OsMoPlugin plugin;
public interface OsMoGroupsUIListener { public interface OsMoGroupsUIListener {
@ -42,7 +44,8 @@ public class OsMoGroups implements OsMoReactor, OsmoTrackerListener {
public void deviceLocationChanged(OsMoDevice device); public void deviceLocationChanged(OsMoDevice device);
} }
public OsMoGroups(OsMoService service, OsMoTracker tracker, OsmandSettings settings) { public OsMoGroups(OsMoPlugin plugin, OsMoService service, OsMoTracker tracker, OsmandSettings settings) {
this.plugin = plugin;
this.service = service; this.service = service;
this.tracker = tracker; this.tracker = tracker;
service.registerReactor(this); service.registerReactor(this);
@ -282,6 +285,9 @@ public class OsMoGroups implements OsMoReactor, OsmoTrackerListener {
delta.add(device); delta.add(device);
} }
} }
if(obj.has(TRACK)){
plugin.getDownloadGpxTask().execute(obj.getJSONObject(TRACK));
}
if(deleteUsers) { if(deleteUsers) {
for(OsMoDevice s : toDelete.values()) { for(OsMoDevice s : toDelete.values()) {
s.deleted = System.currentTimeMillis(); s.deleted = System.currentTimeMillis();

View file

@ -1,18 +1,27 @@
package net.osmand.plus.osmo; package net.osmand.plus.osmo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import net.osmand.IndexConstants;
import net.osmand.Location; import net.osmand.Location;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.plus.ApplicationMode; import net.osmand.plus.ApplicationMode;
import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuAdapter.OnContextMenuClick; import net.osmand.plus.ContextMenuAdapter.OnContextMenuClick;
import net.osmand.plus.GPXUtilities;
import net.osmand.plus.GPXUtilities.GPXFile;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.TargetPointsHelper; import net.osmand.plus.TargetPointsHelper;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.SettingsActivity; import net.osmand.plus.activities.SettingsActivity;
import net.osmand.plus.download.DownloadFileHelper;
import net.osmand.plus.osmo.OsMoGroupsStorage.OsMoDevice; import net.osmand.plus.osmo.OsMoGroupsStorage.OsMoDevice;
import net.osmand.plus.osmo.OsMoService.SessionInfo; import net.osmand.plus.osmo.OsMoService.SessionInfo;
import net.osmand.plus.views.MapInfoLayer; import net.osmand.plus.views.MapInfoLayer;
@ -22,10 +31,15 @@ import net.osmand.plus.views.OsmandMapLayer.DrawSettings;
import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.mapwidgets.BaseMapWidget; import net.osmand.plus.views.mapwidgets.BaseMapWidget;
import net.osmand.plus.views.mapwidgets.TextInfoWidget; import net.osmand.plus.views.mapwidgets.TextInfoWidget;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.preference.Preference; import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener; import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
@ -40,16 +54,17 @@ public class OsMoPlugin extends OsmandPlugin implements MonitoringInfoControlSer
private OsMoGroups groups; private OsMoGroups groups;
private BaseMapWidget osmoControl; private BaseMapWidget osmoControl;
private OsMoPositionLayer olayer; private OsMoPositionLayer olayer;
protected MapActivity mapActivity;
// 2014-05-27 23:11:40 // 2014-05-27 23:11:40
public static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public OsMoPlugin(final OsmandApplication app) { public OsMoPlugin(final OsmandApplication app) {
service = new OsMoService(app); service = new OsMoService(app, this);
tracker = new OsMoTracker(service, app.getSettings().OSMO_SAVE_TRACK_INTERVAL, tracker = new OsMoTracker(service, app.getSettings().OSMO_SAVE_TRACK_INTERVAL,
app.getSettings().OSMO_AUTO_SEND_LOCATIONS); app.getSettings().OSMO_AUTO_SEND_LOCATIONS);
new OsMoControlDevice(app, service, tracker); new OsMoControlDevice(app, this, service, tracker);
groups = new OsMoGroups(service, tracker, app.getSettings()); groups = new OsMoGroups(this, service, tracker, app.getSettings());
this.app = app; this.app = app;
ApplicationMode.regWidget("osmo_control", (ApplicationMode[])null); ApplicationMode.regWidget("osmo_control", (ApplicationMode[])null);
} }
@ -81,6 +96,8 @@ public class OsMoPlugin extends OsmandPlugin implements MonitoringInfoControlSer
return app.getString(R.string.osmo_plugin_name); return app.getString(R.string.osmo_plugin_name);
} }
@Override @Override
public void updateLayers(OsmandMapTileView mapView, MapActivity activity) { public void updateLayers(OsmandMapTileView mapView, MapActivity activity) {
// registerLayers(activity); // registerLayers(activity);
@ -157,13 +174,15 @@ public class OsMoPlugin extends OsmandPlugin implements MonitoringInfoControlSer
@Override @Override
public void mapActivityPause(MapActivity activity) { public void mapActivityPause(MapActivity activity) {
groups.setUiListener(null); groups.setUiListener(null);
mapActivity = activity;
} }
@Override @Override
public void mapActivityResume(MapActivity activity) { public void mapActivityResume(MapActivity activity) {
if(olayer != null) { if (olayer != null) {
groups.setUiListener(olayer); groups.setUiListener(olayer);
} }
mapActivity = null;
} }
/** /**
@ -305,6 +324,60 @@ public class OsMoPlugin extends OsmandPlugin implements MonitoringInfoControlSer
return service; return service;
} }
public AsyncTask<JSONObject, GPXFile, String> getDownloadGpxTask() {
return new AsyncTask<JSONObject, GPXFile, String> (){
@Override
protected String doInBackground(JSONObject... params) {
final File fl = app.getAppPath(IndexConstants.GPX_INDEX_DIR+"/osmo");
if(!fl.exists()) {
fl.mkdirs();
}
String errors = "";
for(JSONObject obj : params) {
try {
File f = new File(fl, obj.getString("name"));
long timestamp = obj.getLong("timestamp");
boolean visible = obj.has("visible");
if(!f.exists() || fl.lastModified() != timestamp) {
String url = obj.getString("url");
DownloadFileHelper df = new DownloadFileHelper(app);
InputStream is = df.getInputStreamToDownload(new URL(url), false);
FileOutputStream fout = new FileOutputStream(f);
byte[] buf = new byte[1024];
int k;
while((k = is.read(buf)) >= 0) {
fout.write(buf, 0, k);
}
fout.close();
is.close();
}
if(visible) {
GPXFile selectGPXFile = GPXUtilities.loadGPXFile(app, f);
app.setGpxFileToDisplay(selectGPXFile, app.getSettings().SHOW_CURRENT_GPX_TRACK.get());
}
} catch (JSONException e) {
e.printStackTrace();
errors += e.getMessage() +"\n";
} catch (IOException e) {
e.printStackTrace();
errors += e.getMessage() +"\n";
}
}
return errors;
}
@Override
protected void onPostExecute(String result) {
if(result.length() > 0) {
app.showToastMessage(app.getString(R.string.osmo_io_error)+ result);
}
}
};
}
} }

View file

@ -232,7 +232,6 @@ public class OsMoPositionLayer extends OsmandMapLayer implements ContextMenuLaye
@Override @Override
public void deviceLocationChanged(final OsMoDevice device) { public void deviceLocationChanged(final OsMoDevice device) {
boolean sameId = Algorithms.objectEquals(followTrackerId, device.trackerId);
boolean sameDestId = Algorithms.objectEquals(followDestinationId, device.trackerId); boolean sameDestId = Algorithms.objectEquals(followDestinationId, device.trackerId);
Location l = device.getLastLocation(); Location l = device.getLastLocation();
if(sameDestId && l != null) { if(sameDestId && l != null) {
@ -249,19 +248,30 @@ public class OsMoPositionLayer extends OsmandMapLayer implements ContextMenuLaye
targets.navigateToPoint(lt, true, -1); targets.navigateToPoint(lt, true, -1);
} }
} }
boolean sameId = Algorithms.objectEquals(followTrackerId, device.trackerId);
if(sameId && !schedule && l != null) { if(sameId && !schedule && l != null) {
schedule = true;
ContextMenuLayer cl = map.getMapLayers().getContextMenuLayer(); ContextMenuLayer cl = map.getMapLayers().getContextMenuLayer();
final boolean sameObject = Algorithms.objectEquals(device, cl.getFirstSelectedObject()) && cl.isVisible(); final boolean sameObject;
if(cl.getFirstSelectedObject() instanceof OsMoDevice && cl.isVisible()) {
sameObject = Algorithms.objectEquals(device.trackerId, ((OsMoDevice) cl.getFirstSelectedObject()).trackerId) ;
} else{
sameObject = false;
}
LatLon mapLoc = new LatLon(map.getMapView().getLatitude(), map.getMapView().getLongitude()); LatLon mapLoc = new LatLon(map.getMapView().getLatitude(), map.getMapView().getLongitude());
final boolean centered = Algorithms.objectEquals(followMapLocation, mapLoc); final boolean centered = Algorithms.objectEquals(followMapLocation, mapLoc);
if(sameObject || centered) { if(sameObject || centered) {
final LatLon loc;
if(centered ) { if(centered ) {
followMapLocation = new LatLon(l.getLatitude(), l.getLongitude()); loc = new LatLon(l.getLatitude(), l.getLongitude());
} else if(!map.getMapView().getAnimatedDraggingThread().isAnimating()) { } else if(!map.getMapView().getAnimatedDraggingThread().isAnimating()) {
// disable tracking // disable tracking
followMapLocation = null; loc = null;
} else {
loc = followMapLocation;
} }
followMapLocation = loc;
schedule = true;
uiHandler.postDelayed(new Runnable() { uiHandler.postDelayed(new Runnable() {
@Override @Override
@ -274,8 +284,8 @@ public class OsMoPositionLayer extends OsmandMapLayer implements ContextMenuLaye
cl.setSelectedObject(device); cl.setSelectedObject(device);
} }
if (centered) { if (centered) {
map.getMapView().setLatLon(followMapLocation.getLatitude(), map.getMapView().setLatLon(loc.getLatitude(),
followMapLocation.getLongitude()); loc.getLongitude());
} }
map.getMapView().refreshMap(); map.getMapView().refreshMap();
} }

View file

@ -10,6 +10,7 @@ import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.plus.GPXUtilities.GPXFile;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.Version; import net.osmand.plus.Version;
@ -27,6 +28,7 @@ import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
import android.provider.Settings.Secure; import android.provider.Settings.Secure;
@ -42,11 +44,13 @@ public class OsMoService implements OsMoReactor {
public static final String SHARE_GROUP_URL = "http://z.osmo.mobi/join?id="; public static final String SHARE_GROUP_URL = "http://z.osmo.mobi/join?id=";
public static final String TRACK_URL = "http://test1342.osmo.mobi/u/"; public static final String TRACK_URL = "http://test1342.osmo.mobi/u/";
private String lastRegistrationError = null; private String lastRegistrationError = null;
private OsMoPlugin plugin;
public OsMoService(OsmandApplication app) { public OsMoService(OsmandApplication app, OsMoPlugin plugin) {
this.app = app; this.app = app;
this.plugin = plugin;
listReactors.add(this); listReactors.add(this);
} }
@ -269,13 +273,27 @@ public class OsMoService implements OsMoReactor {
si.motd = data; si.motd = data;
} }
return true; return true;
} else if(command.equals("GET_MY_TRACKS")) {
try {
JSONArray ar = new JSONArray(data);
AsyncTask<JSONObject, GPXFile, String> task = plugin.getDownloadGpxTask();
JSONObject[] a = new JSONObject[ar.length()];
for(int i = 0; i < a.length; i++) {
a[i] = (JSONObject) ar.get(i);
}
task.execute(a);
} catch (JSONException e) {
e.printStackTrace();
showErrorMessage(e.getMessage());
}
} }
return false; return false;
} }
@Override @Override
public void reconnect() { public void reconnect() {
pushCommand("GET_MY_TRACKS");
} }
public void reconnectToServer() { public void reconnectToServer() {

View file

@ -276,7 +276,11 @@ public class OsMoThread {
if(obj != null && obj.has("error")) { if(obj != null && obj.has("error")) {
error = true; error = true;
try { try {
service.showErrorMessage(obj.getString("error")); String s = obj.getString("error");
if(obj.has("error_description")) {
s += " " +obj.getString("error_description");
}
service.showErrorMessage(s);
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -395,6 +399,9 @@ public class OsMoThread {
private void cmd(String cmd, boolean send) { private void cmd(String cmd, boolean send) {
log.info("OsMO" + (send ? "> " : ">> ") + cmd); log.info("OsMO" + (send ? "> " : ">> ") + cmd);
last100Commands.add((send ? "> " : ">> ") + df.format(new Date()) + " " + cmd); last100Commands.add((send ? "> " : ">> ") + df.format(new Date()) + " " + cmd);
while(last100Commands.size() > 100) {
last100Commands.poll();
}
} }
public SessionInfo getSessionInfo() { public SessionInfo getSessionInfo() {