Add gpx track download
This commit is contained in:
parent
fec6744d41
commit
1cb6b367c4
7 changed files with 140 additions and 21 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
Loading…
Reference in a new issue