diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml
index 2b8f9a964a..defcb02438 100644
--- a/OsmAnd/res/values-ru/strings.xml
+++ b/OsmAnd/res/values-ru/strings.xml
@@ -1297,7 +1297,7 @@
Доступно %1$d файлов для скачивания
осталось %1$d файлов
- Пожалуйста, подождите, пока завершится текущий трек
+ Пожалуйста, подождите, пока завершится текущая операция
Открыть существующий GPX
Начать новый подтрек
Имя файла GPX
diff --git a/OsmAnd/src/net/osmand/plus/OsmAndConstants.java b/OsmAnd/src/net/osmand/plus/OsmAndConstants.java
index 21ca887c6f..4e808ac947 100644
--- a/OsmAnd/src/net/osmand/plus/OsmAndConstants.java
+++ b/OsmAnd/src/net/osmand/plus/OsmAndConstants.java
@@ -3,14 +3,14 @@ package net.osmand.plus;
public interface OsmAndConstants {
- public int UI_HANDLER_MAP_VIEW = 300;
+ public int UI_HANDLER_MAP_VIEW = 3000;
- public int UI_HANDLER_MAP_CONTROLS = 400;
+ public int UI_HANDLER_MAP_CONTROLS = 4000;
- public int UI_HANDLER_LOCATION_SERVICE = 500;
+ public int UI_HANDLER_LOCATION_SERVICE = 5000;
- public int UI_HANDLER_PROGRESS = 600;
+ public int UI_HANDLER_PROGRESS = 6000;
- public int UI_HANDLER_SEARCH = 700;
+ public int UI_HANDLER_SEARCH = 7000;
}
diff --git a/OsmAnd/src/net/osmand/plus/osmo/OsMoGroups.java b/OsmAnd/src/net/osmand/plus/osmo/OsMoGroups.java
index 8292165e63..cb13b308b7 100644
--- a/OsmAnd/src/net/osmand/plus/osmo/OsMoGroups.java
+++ b/OsmAnd/src/net/osmand/plus/osmo/OsMoGroups.java
@@ -38,6 +38,8 @@ public class OsMoGroups implements OsMoReactor, OsmoTrackerListener {
public interface OsMoGroupsUIListener {
public void groupsListChange(String operation, OsMoGroup group);
+
+ public void deviceLocationChanged(OsMoDevice device);
}
public OsMoGroups(OsMoService service, OsMoTracker tracker, OsmandSettings settings) {
@@ -132,8 +134,11 @@ public class OsMoGroups implements OsMoReactor, OsmoTrackerListener {
@Override
public void locationChange(String trackerId, Location location) {
- for(OsMoGroup g: getGroups()) {
- g.updateLastLocation(trackerId, location);
+ for (OsMoGroup g : getGroups()) {
+ OsMoDevice d = g.updateLastLocation(trackerId, location);
+ if (d != null && uiListener != null) {
+ uiListener.deviceLocationChanged(d);
+ }
}
}
diff --git a/OsmAnd/src/net/osmand/plus/osmo/OsMoGroupsActivity.java b/OsmAnd/src/net/osmand/plus/osmo/OsMoGroupsActivity.java
index 4fe840365f..cdc41e9913 100644
--- a/OsmAnd/src/net/osmand/plus/osmo/OsMoGroupsActivity.java
+++ b/OsmAnd/src/net/osmand/plus/osmo/OsMoGroupsActivity.java
@@ -36,7 +36,6 @@ import net.osmand.plus.osmo.OsMoGroups.OsMoGroupsUIListener;
import net.osmand.plus.osmo.OsMoGroupsStorage.OsMoDevice;
import net.osmand.plus.osmo.OsMoGroupsStorage.OsMoGroup;
import net.osmand.plus.osmo.OsMoService.SessionInfo;
-import net.osmand.plus.osmo.OsMoTracker.OsmoTrackerListener;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
@@ -89,7 +88,7 @@ import com.actionbarsherlock.view.Window;
*
*/
public class OsMoGroupsActivity extends OsmandExpandableListActivity implements OsmAndCompassListener,
- OsmAndLocationListener, OsmoTrackerListener, OsMoGroupsUIListener {
+ OsmAndLocationListener, OsMoGroupsUIListener {
public static final int CONNECT_TO = 1;
protected static final int DELETE_ACTION_ID = 2;
@@ -303,7 +302,6 @@ public class OsMoGroupsActivity extends OsmandExpandableListActivity implements
app.getLocationProvider().registerOrUnregisterCompassListener(true);
app.getLocationProvider().addLocationListener(this);
app.getLocationProvider().resumeAllUpdates();
- osMoPlugin.getTracker().setUITrackerListener(this);
osMoPlugin.getGroups().setUiListener(this);
adapter.synchronizeGroups();
}
@@ -314,7 +312,6 @@ public class OsMoGroupsActivity extends OsmandExpandableListActivity implements
app.getLocationProvider().pauseAllUpdates();
app.getLocationProvider().removeCompassListener(this);
app.getLocationProvider().removeLocationListener(this);
- osMoPlugin.getTracker().setUITrackerListener(null);
osMoPlugin.getGroups().setUiListener(null);
}
@@ -339,9 +336,6 @@ public class OsMoGroupsActivity extends OsmandExpandableListActivity implements
if(device != null && device.getLastLocation() != null) {
createMenuItem(menu, SHOW_ON_MAP_ID, R.string.show_poi_on_map, R.drawable.ic_action_marker_light, R.drawable.ic_action_marker_dark,
MenuItem.SHOW_AS_ACTION_IF_ROOM);
- } else if(group != null) {
- createMenuItem(menu, SHOW_ON_MAP_ID, R.string.show_poi_on_map, R.drawable.ic_action_marker_light, R.drawable.ic_action_marker_dark,
- MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
createMenuItem(menu, SHARE_ID, R.string.share_fav, R.drawable.ic_action_gshare_light, R.drawable.ic_action_gshare_dark,
MenuItem.SHOW_AS_ACTION_IF_ROOM);
@@ -354,8 +348,11 @@ public class OsMoGroupsActivity extends OsmandExpandableListActivity implements
createMenuItem(menu, GROUP_INFO, R.string.osmo_group_info, R.drawable.ic_action_info_light, R.drawable.ic_action_info_dark,
MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
- createMenuItem(menu, DELETE_ACTION_ID, R.string.default_buttons_delete, R.drawable.ic_action_delete_light, R.drawable.ic_action_delete_dark,
- MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ if (device == null || device.getGroup().isMainGroup()) {
+ createMenuItem(menu, DELETE_ACTION_ID, R.string.default_buttons_delete,
+ R.drawable.ic_action_delete_light, R.drawable.ic_action_delete_dark,
+ MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ }
if (mi != null) {
@@ -417,7 +414,8 @@ public class OsMoGroupsActivity extends OsmandExpandableListActivity implements
if(device != null) {
Location location = device.getLastLocation();
app.getSettings().setMapLocationToShow(location.getLatitude(), location.getLongitude(), app.getSettings().getMapZoomToShow(),
- null, device.getVisibleName(), device);
+ null, device.getVisibleName(), device);
+ osMoPlugin.setMapFollowTrackerId(device);
MapActivity.launchMapActivityMoveToTop(OsMoGroupsActivity.this);
}
} else if(item.getItemId() == ON_OFF_ACTION_ID) {
@@ -1003,7 +1001,7 @@ public class OsMoGroupsActivity extends OsmandExpandableListActivity implements
}
@Override
- public void locationChange(String trackerId, Location loc) {
+ public void deviceLocationChanged(OsMoDevice device) {
refreshList();
}
public static String colorToString(int color) {
@@ -1169,5 +1167,6 @@ public class OsMoGroupsActivity extends OsmandExpandableListActivity implements
}
+
}
diff --git a/OsmAnd/src/net/osmand/plus/osmo/OsMoGroupsStorage.java b/OsmAnd/src/net/osmand/plus/osmo/OsMoGroupsStorage.java
index af76b7de08..a66f688023 100644
--- a/OsmAnd/src/net/osmand/plus/osmo/OsMoGroupsStorage.java
+++ b/OsmAnd/src/net/osmand/plus/osmo/OsMoGroupsStorage.java
@@ -270,7 +270,7 @@ public class OsMoGroupsStorage {
return name;
}
- public void updateLastLocation(String trackerId, Location location) {
+ public OsMoDevice updateLastLocation(String trackerId, Location location) {
OsMoDevice d = users.get(trackerId);
if(d != null) {
d.setLastLocation(location);
@@ -278,6 +278,7 @@ public class OsMoGroupsStorage {
d.setLastOnline(location.getTime());
}
}
+ return d;
}
}
diff --git a/OsmAnd/src/net/osmand/plus/osmo/OsMoPlugin.java b/OsmAnd/src/net/osmand/plus/osmo/OsMoPlugin.java
index 752e41766e..c10f03392a 100644
--- a/OsmAnd/src/net/osmand/plus/osmo/OsMoPlugin.java
+++ b/OsmAnd/src/net/osmand/plus/osmo/OsMoPlugin.java
@@ -11,8 +11,8 @@ import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.SettingsActivity;
+import net.osmand.plus.osmo.OsMoGroupsStorage.OsMoDevice;
import net.osmand.plus.osmo.OsMoService.SessionInfo;
-import net.osmand.plus.osmo.OsMoTracker.OsmoTrackerListener;
import net.osmand.plus.views.MapInfoLayer;
import net.osmand.plus.views.MonitoringInfoControl;
import net.osmand.plus.views.MonitoringInfoControl.MonitoringInfoControlServices;
@@ -38,10 +38,10 @@ public class OsMoPlugin extends OsmandPlugin implements MonitoringInfoControlSer
private OsMoGroups groups;
private BaseMapWidget osmoControl;
private OsMoPositionLayer olayer;
+ private Object followTrackerId;
// 2014-05-27 23:11:40
public static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- private OsmandMapTileView mv;
public OsMoPlugin(final OsmandApplication app) {
service = new OsMoService(app);
@@ -109,23 +109,14 @@ public class OsMoPlugin extends OsmandPlugin implements MonitoringInfoControlSer
@Override
public void mapActivityPause(MapActivity activity) {
- mv = null;
- tracker.setUITrackerListener(new OsmoTrackerListener() {
-
- @Override
- public void locationChange(String trackerId, Location location) {
- if(mv != null) {
- mv.refreshMap();
- }
- }
- });
+ groups.setUiListener(null);
}
@Override
public void mapActivityResume(MapActivity activity) {
- mv = activity.getMapView();
- tracker.setUITrackerListener(null);
-
+ if(olayer != null) {
+ groups.setUiListener(olayer);
+ }
}
/**
@@ -249,6 +240,15 @@ public class OsMoPlugin extends OsmandPlugin implements MonitoringInfoControlSer
}).reg();
}
+ public Object getFollowTrackerId() {
+ return followTrackerId;
+ }
+
+ public void setMapFollowTrackerId(OsMoDevice d) {
+ if(olayer != null) {
+ olayer.setFollowTrackerId(d);
+ }
+ }
@Override
public String getId() {
@@ -267,4 +267,6 @@ public class OsMoPlugin extends OsmandPlugin implements MonitoringInfoControlSer
return service;
}
+
+
}
diff --git a/OsmAnd/src/net/osmand/plus/osmo/OsMoPositionLayer.java b/OsmAnd/src/net/osmand/plus/osmo/OsMoPositionLayer.java
index a9ba676e11..d3f60e1bbe 100644
--- a/OsmAnd/src/net/osmand/plus/osmo/OsMoPositionLayer.java
+++ b/OsmAnd/src/net/osmand/plus/osmo/OsMoPositionLayer.java
@@ -8,18 +8,23 @@ import net.osmand.Location;
import net.osmand.access.AccessibleToast;
import net.osmand.data.LatLon;
import net.osmand.data.RotatedTileBox;
+import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
+import net.osmand.plus.osmo.OsMoGroups.OsMoGroupsUIListener;
import net.osmand.plus.osmo.OsMoGroupsStorage.OsMoDevice;
+import net.osmand.plus.osmo.OsMoGroupsStorage.OsMoGroup;
import net.osmand.plus.views.ContextMenuLayer;
import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView;
+import net.osmand.util.Algorithms;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.PointF;
+import android.os.Handler;
import android.util.DisplayMetrics;
import android.view.WindowManager;
import android.widget.Toast;
@@ -28,7 +33,7 @@ import android.widget.Toast;
* Class represents a layer for osmo positions
*
*/
-public class OsMoPositionLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider {
+public class OsMoPositionLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider, OsMoGroupsUIListener {
private DisplayMetrics dm;
private final MapActivity map;
@@ -37,6 +42,7 @@ public class OsMoPositionLayer extends OsmandMapLayer implements ContextMenuLaye
private Paint point;
private OsMoPlugin plugin;
private final static float startZoom = 7;
+ private Handler uiHandler;
public OsMoPositionLayer(MapActivity map, OsMoPlugin plugin) {
this.map = map;
@@ -46,6 +52,7 @@ public class OsMoPositionLayer extends OsmandMapLayer implements ContextMenuLaye
@Override
public void initLayer(OsmandMapTileView view) {
this.view = view;
+ uiHandler = new Handler();
dm = new DisplayMetrics();
WindowManager wmgr = (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE);
wmgr.getDefaultDisplay().getMetrics(dm);
@@ -140,14 +147,22 @@ public class OsMoPositionLayer extends OsmandMapLayer implements ContextMenuLaye
@Override
public String getObjectDescription(Object o) {
if (o instanceof OsMoDevice) {
- return map.getString(R.string.osmo_user_name) + " " + ((OsMoDevice) o).getVisibleName();
+ String d = map.getString(R.string.osmo_user_name) + " " + ((OsMoDevice) o).getVisibleName();
+ final Location l = ((OsMoDevice) o).getLastLocation();
+ if(l != null && l.hasSpeed()) {
+ d += "\n"+ OsmAndFormatter.getFormattedSpeed(l.getSpeed(), map.getMyApplication());
+ }
+ return d;
}
return null;
}
@Override
public String getObjectName(Object o) {
- return ((OsMoDevice) o).getVisibleName();
+ if(o instanceof OsMoDevice) {
+ return map.getString(R.string.osmo_user_name) + " " + ((OsMoDevice) o).getVisibleName();
+ }
+ return null;
}
public void refresh() {
@@ -180,6 +195,70 @@ public class OsMoPositionLayer extends OsmandMapLayer implements ContextMenuLaye
}
}
}
+
+ @Override
+ public void groupsListChange(String operation, OsMoGroup group) {
+ }
+
+ private volatile boolean schedule = false;
+ // store between rotations
+ private static String followTrackerId;
+ private static LatLon followMapLocation;
+
+ public void setFollowTrackerId(OsMoDevice d) {
+ if(d != null) {
+ followTrackerId = d.trackerId;
+ Location l = d.getLastLocation();
+ if(l != null) {
+ followMapLocation = new LatLon(l.getLatitude(), l.getLongitude());
+ }
+ } else {
+ followTrackerId = null;
+ }
+
+ }
+
+ @Override
+ public void deviceLocationChanged(final OsMoDevice device) {
+ boolean sameId = Algorithms.objectEquals(followTrackerId, device.trackerId);
+ Location l = device.getLastLocation();
+ if(sameId && !schedule && l != null) {
+ schedule = true;
+ ContextMenuLayer cl = map.getMapLayers().getContextMenuLayer();
+ final boolean sameObject = Algorithms.objectEquals(device, cl.getFirstSelectedObject());
+ LatLon mapLoc = new LatLon(map.getMapView().getLatitude(), map.getMapView().getLongitude());
+ final boolean centered = Algorithms.objectEquals(followMapLocation, mapLoc);
+ if(sameObject || centered) {
+ if(centered ) {
+ followMapLocation = new LatLon(l.getLatitude(), l.getLongitude());
+ } else if(!map.getMapView().getAnimatedDraggingThread().isAnimating()) {
+ // disable tracking
+ followMapLocation = null;
+ }
+ uiHandler.postDelayed(new Runnable() {
+
+ @Override
+ public void run() {
+ schedule = false;
+ if (sameObject) {
+ ContextMenuLayer cl = map.getMapLayers().getContextMenuLayer();
+ Location l = device.getLastLocation();
+ cl.setLocation(new LatLon(l.getLatitude(), l.getLongitude()), getObjectDescription(device));
+ cl.setSelectedObject(device);
+ }
+ if (centered) {
+ map.getMapView().setLatLon(followMapLocation.getLatitude(),
+ followMapLocation.getLongitude());
+ }
+ map.getMapView().refreshMap();
+ }
+
+ }, 150);
+ } else {
+ followTrackerId = null;
+ }
+ }
+ }
}
diff --git a/OsmAnd/src/net/osmand/plus/osmo/OsMoTracker.java b/OsmAnd/src/net/osmand/plus/osmo/OsMoTracker.java
index 9040a54c29..be16437712 100644
--- a/OsmAnd/src/net/osmand/plus/osmo/OsMoTracker.java
+++ b/OsmAnd/src/net/osmand/plus/osmo/OsMoTracker.java
@@ -16,7 +16,6 @@ public class OsMoTracker implements OsMoReactor {
private boolean startSendingLocations;
private OsMoService service;
private int locationsSent = 0;
- private OsmoTrackerListener uiTrackerListener = null;
private OsmoTrackerListener trackerListener = null;
private Location lastSendLocation;
private Location lastBufferLocation;
@@ -29,6 +28,7 @@ public class OsMoTracker implements OsMoReactor {
public void locationChange(String trackerId, Location location);
}
+
public OsMoTracker(OsMoService service, OsmandPreference interval,
OsmandPreference autoStart) {
@@ -112,8 +112,10 @@ public class OsMoTracker implements OsMoReactor {
if (location.getTime() - ltime > pref.get()) {
if(lastBufferLocation != null && (!lastBufferLocation.hasSpeed() || lastBufferLocation.getSpeed() < 1) &&
lastBufferLocation.distanceTo(location) < 20){
- // ignores
- return;
+ if(lastBufferLocation != null && location.getTime() - ltime < 60000) {
+ // ignores
+ return;
+ }
}
lastBufferLocation = location;
bufferOfLocations.add(location);
@@ -187,9 +189,6 @@ public class OsMoTracker implements OsMoReactor {
if(trackerListener != null) {
trackerListener.locationChange(tid, loc);
}
- if(uiTrackerListener != null){
- uiTrackerListener.locationChange(tid, loc);
- }
}
return true;
}
@@ -204,13 +203,6 @@ public class OsMoTracker implements OsMoReactor {
return trackerListener;
}
- public OsmoTrackerListener getUITrackerListener() {
- return uiTrackerListener;
- }
-
- public void setUITrackerListener(OsmoTrackerListener trackerListener) {
- this.uiTrackerListener = trackerListener;
- }
public Collection getTrackingDevices() {
return trackingDevices.values();
diff --git a/OsmAnd/src/net/osmand/plus/views/ContextMenuLayer.java b/OsmAnd/src/net/osmand/plus/views/ContextMenuLayer.java
index 7ba9f792e1..553a0e6157 100644
--- a/OsmAnd/src/net/osmand/plus/views/ContextMenuLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/ContextMenuLayer.java
@@ -6,6 +6,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
import net.osmand.data.LatLon;
import net.osmand.data.RotatedTileBox;
@@ -46,7 +47,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
private static final String KEY_SELECTED_OBJECTS = "context_menu_selected_objects";
private LatLon latLon;
private String description;
- private Map