implement some fixes
git-svn-id: https://osmand.googlecode.com/svn/trunk@364 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
25c8c96c08
commit
fb49f25a33
6 changed files with 87 additions and 40 deletions
|
@ -24,11 +24,18 @@ public class ToDoConstants {
|
||||||
// Improvement : download with wget
|
// Improvement : download with wget
|
||||||
// Improvement : cloudmade as map?
|
// Improvement : cloudmade as map?
|
||||||
// Yandex traffic : http://jgo.maps.yandex.net/tiles?l=trf
|
// Yandex traffic : http://jgo.maps.yandex.net/tiles?l=trf
|
||||||
|
// Improvement : show route info after route is calculated and/or calculate route from context menu
|
||||||
|
// (continue follow previous route)
|
||||||
|
// Improvement : show route info (directly after route is calc & do not show if it is not calc)
|
||||||
|
|
||||||
|
|
||||||
// FIXME
|
// FIXME
|
||||||
// 1. Bug with duplicated turns
|
// 2. Bug with network location while routing (?) - fixed ?
|
||||||
// 2. Bug with network location while routing (?)
|
|
||||||
// 3. TODO options : using trackball as an option
|
// 3. TODO options : using trackball as an option
|
||||||
|
// 4. Add last turn as go straight (+)
|
||||||
|
// 5. After return if there was previous route (countinue follow)
|
||||||
|
// 6. Bug 13.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Not clear if it is really needed
|
// Not clear if it is really needed
|
||||||
|
@ -56,18 +63,7 @@ public class ToDoConstants {
|
||||||
// BUGS Swing
|
// BUGS Swing
|
||||||
|
|
||||||
// DONE ANDROID :
|
// DONE ANDROID :
|
||||||
// 43. Enable poi filter by name (find lake by name or shop) - case sensitive search DB - make only search filter (on UI)!
|
|
||||||
// 45. Get clear <Use internet> settings. Move that setting on top settings screen.
|
|
||||||
// That setting should rule all activities that use internet. It should ask whenever internet is used
|
|
||||||
// (would you like to use internet for that operation - if using internet is not checked).
|
|
||||||
// Internet using now for : edit POI osm, show osm bugs layer, download tiles - not needed.
|
|
||||||
// 58. Upload/Download zip-index from site & unzip them on phone
|
|
||||||
// 69. Multitouch zoom, animated zoom, animate map shift (when select some point to see)!
|
|
||||||
// 60. Audio guidance for routing !
|
|
||||||
// 61. Provide route information for YOURS (calclate turns/angle/expected time)
|
|
||||||
// Fix some missing turns in CloudMade (for secondary roads wo name). Add them (if dist to prev/next turn > 150m) [dacha] !
|
|
||||||
// 33. Build transport locations. Create transport index (transport-stops) (investigate)
|
|
||||||
// Not implemented : show key/transit stops on map, follow mode (show next stop)
|
|
||||||
|
|
||||||
|
|
||||||
// DONE SWING
|
// DONE SWING
|
||||||
|
|
|
@ -8,9 +8,11 @@ import android.location.LocationListener;
|
||||||
import android.location.LocationManager;
|
import android.location.LocationManager;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.osmand.activities.RoutingHelper;
|
||||||
import com.osmand.activities.SavingTrackHelper;
|
import com.osmand.activities.SavingTrackHelper;
|
||||||
|
|
||||||
public class NavigationService extends Service implements LocationListener {
|
public class NavigationService extends Service implements LocationListener {
|
||||||
|
@ -22,6 +24,9 @@ public class NavigationService extends Service implements LocationListener {
|
||||||
private int serviceOffInterval;
|
private int serviceOffInterval;
|
||||||
private String serviceOffProvider;
|
private String serviceOffProvider;
|
||||||
private SavingTrackHelper savingTrackHelper;
|
private SavingTrackHelper savingTrackHelper;
|
||||||
|
private Handler handler;
|
||||||
|
private int serviceError;
|
||||||
|
private RoutingHelper routingHelper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBinder onBind(Intent intent) {
|
public IBinder onBind(Intent intent) {
|
||||||
|
@ -30,16 +35,38 @@ public class NavigationService extends Service implements LocationListener {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void delayedAction(final boolean register, long delay){
|
||||||
|
handler.postDelayed(new Runnable(){
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
|
||||||
|
if(register){
|
||||||
|
locationManager.requestLocationUpdates(serviceOffProvider, serviceOffInterval, 0, NavigationService.this);
|
||||||
|
delayedAction(false, serviceError);
|
||||||
|
} else {
|
||||||
|
locationManager.removeUpdates(NavigationService.this);
|
||||||
|
delayedAction(true, serviceOffInterval);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}, serviceError);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
setForeground(true);
|
setForeground(true);
|
||||||
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
|
handler = new Handler();
|
||||||
|
|
||||||
serviceOffInterval = OsmandSettings.getServiceOffInterval(this);
|
serviceOffInterval = OsmandSettings.getServiceOffInterval(this);
|
||||||
serviceOffProvider = OsmandSettings.getServiceOffProvider(this);
|
serviceOffProvider = OsmandSettings.getServiceOffProvider(this);
|
||||||
locationManager.requestLocationUpdates(serviceOffProvider, serviceOffInterval, 0, this);
|
serviceError = OsmandSettings.getServiceOffErrorInterval(this);
|
||||||
savingTrackHelper = new SavingTrackHelper(this);
|
savingTrackHelper = new SavingTrackHelper(this);
|
||||||
|
delayedAction(true, 500);
|
||||||
|
routingHelper = RoutingHelper.getInstance(this);
|
||||||
OsmandSettings.setServiceOffEnabled(this, true);
|
OsmandSettings.setServiceOffEnabled(this, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,9 +84,11 @@ public class NavigationService extends Service implements LocationListener {
|
||||||
@Override
|
@Override
|
||||||
public void onLocationChanged(Location location) {
|
public void onLocationChanged(Location location) {
|
||||||
if(location != null && !OsmandSettings.getMapActivityEnabled(this)){
|
if(location != null && !OsmandSettings.getMapActivityEnabled(this)){
|
||||||
// TODO update voice navigation
|
|
||||||
savingTrackHelper.insertData(location.getLatitude(), location.getLongitude(), location.getAltitude(),
|
savingTrackHelper.insertData(location.getLatitude(), location.getLongitude(), location.getAltitude(),
|
||||||
location.getSpeed(), location.getTime());
|
location.getSpeed(), location.getTime());
|
||||||
|
if(routingHelper.isFollowingMode()){
|
||||||
|
routingHelper.setCurrentLocation(location);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@ public class ResourceManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
// it is not good investigated but no more than 64 (satellite images)
|
// it is not good investigated but no more than 64 (satellite images)
|
||||||
// Only 8 MB (from 16 Mb whole mem) available for images : image 64K * 128 = 8 MB (8 bit), 64 - 16 bit, 32 - 128 bit
|
// Only 8 MB (from 16 Mb whole mem) available for images : image 64K * 128 = 8 MB (8 bit), 64 - 16 bit, 32 - 32 bit
|
||||||
protected final int maxImgCacheSize = 48;
|
protected final int maxImgCacheSize = 48;
|
||||||
|
|
||||||
protected Map<String, Bitmap> cacheOfImages = new LinkedHashMap<String, Bitmap>();
|
protected Map<String, Bitmap> cacheOfImages = new LinkedHashMap<String, Bitmap>();
|
||||||
|
@ -444,7 +444,7 @@ public class ResourceManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected void clearTiles(){
|
protected synchronized void clearTiles(){
|
||||||
log.info("Cleaning tiles - size = " + cacheOfImages.size()); //$NON-NLS-1$
|
log.info("Cleaning tiles - size = " + cacheOfImages.size()); //$NON-NLS-1$
|
||||||
ArrayList<String> list = new ArrayList<String>(cacheOfImages.keySet());
|
ArrayList<String> list = new ArrayList<String>(cacheOfImages.keySet());
|
||||||
// remove first images (as we think they are older)
|
// remove first images (as we think they are older)
|
||||||
|
|
|
@ -473,18 +473,28 @@ public class MapActivity extends Activity implements IMapLocationListener, Senso
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean useOnlyGPS(){
|
||||||
|
return (routingHelper != null && routingHelper.isFollowingMode()) || isRunningOnEmulator();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Working with location listeners
|
// Working with location listeners
|
||||||
private LocationListener networkListener = new LocationListener(){
|
private LocationListener networkListener = new LocationListener(){
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLocationChanged(Location location) {
|
public void onLocationChanged(Location location) {
|
||||||
setLocation(location);
|
// double check about use only gps
|
||||||
|
if(!useOnlyGPS()){
|
||||||
|
setLocation(location);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onProviderDisabled(String provider) {
|
public void onProviderDisabled(String provider) {
|
||||||
setLocation(null);
|
if(!useOnlyGPS()){
|
||||||
|
setLocation(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -493,7 +503,7 @@ public class MapActivity extends Activity implements IMapLocationListener, Senso
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStatusChanged(String provider, int status, Bundle extras) {
|
public void onStatusChanged(String provider, int status, Bundle extras) {
|
||||||
if(LocationProvider.OUT_OF_SERVICE == status){
|
if(LocationProvider.OUT_OF_SERVICE == status && !useOnlyGPS()){
|
||||||
setLocation(null);
|
setLocation(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -523,7 +533,7 @@ public class MapActivity extends Activity implements IMapLocationListener, Senso
|
||||||
setLocation(null);
|
setLocation(null);
|
||||||
}
|
}
|
||||||
// do not use it in routing
|
// do not use it in routing
|
||||||
if (!isRunningOnEmulator() && !routingHelper.isFollowingMode() &&
|
if (!useOnlyGPS() &&
|
||||||
service.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
|
service.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
|
||||||
if (!Algoritms.objectEquals(currentLocationProvider, LocationManager.NETWORK_PROVIDER)) {
|
if (!Algoritms.objectEquals(currentLocationProvider, LocationManager.NETWORK_PROVIDER)) {
|
||||||
currentLocationProvider = LocationManager.NETWORK_PROVIDER;
|
currentLocationProvider = LocationManager.NETWORK_PROVIDER;
|
||||||
|
@ -623,7 +633,7 @@ public class MapActivity extends Activity implements IMapLocationListener, Senso
|
||||||
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
|
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
|
||||||
service.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, gpsListener);
|
service.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, gpsListener);
|
||||||
currentLocationProvider = LocationManager.GPS_PROVIDER;
|
currentLocationProvider = LocationManager.GPS_PROVIDER;
|
||||||
if(!isRunningOnEmulator()){
|
if(!useOnlyGPS()){
|
||||||
// try to always ask for network provide : it is faster way to find location
|
// try to always ask for network provide : it is faster way to find location
|
||||||
service.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, networkListener);
|
service.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, networkListener);
|
||||||
currentLocationProvider = LocationManager.NETWORK_PROVIDER;
|
currentLocationProvider = LocationManager.NETWORK_PROVIDER;
|
||||||
|
|
|
@ -306,6 +306,17 @@ public class RouteProvider {
|
||||||
previousInfo.expectedTime = (int) (previousInfo.distance / speed);
|
previousInfo.expectedTime = (int) (previousInfo.distance / speed);
|
||||||
previousInfo.descriptionRoute += " " + MapUtils.getFormattedDistance(previousInfo.distance); //$NON-NLS-1$
|
previousInfo.descriptionRoute += " " + MapUtils.getFormattedDistance(previousInfo.distance); //$NON-NLS-1$
|
||||||
|
|
||||||
|
// add last direction go straight (to show arrow in screen after all turns)
|
||||||
|
if(previousInfo.distance > 350){
|
||||||
|
RouteDirectionInfo info = new RouteDirectionInfo();
|
||||||
|
info.expectedTime = 0;
|
||||||
|
info.distance = 0;
|
||||||
|
info.descriptionRoute = ""; //$NON-NLS-1$
|
||||||
|
info.turnType = TurnType.valueOf(TurnType.C);
|
||||||
|
info.routePointOffset = locations.size() - 1;
|
||||||
|
directions.add(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(res.directions == null || res.directions.isEmpty()){
|
if(res.directions == null || res.directions.isEmpty()){
|
||||||
|
|
|
@ -5,6 +5,7 @@ import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
import android.util.FloatMath;
|
import android.util.FloatMath;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
@ -23,7 +24,7 @@ public class RoutingHelper {
|
||||||
private static final org.apache.commons.logging.Log log = LogUtil.getLog(RoutingHelper.class);
|
private static final org.apache.commons.logging.Log log = LogUtil.getLog(RoutingHelper.class);
|
||||||
|
|
||||||
// activity to show messages & refresh map when route is calculated
|
// activity to show messages & refresh map when route is calculated
|
||||||
private Activity activity;
|
private Context context;
|
||||||
|
|
||||||
private boolean isFollowingMode = false;
|
private boolean isFollowingMode = false;
|
||||||
|
|
||||||
|
@ -71,8 +72,8 @@ public class RoutingHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static RoutingHelper INSTANCE = new RoutingHelper();
|
private static RoutingHelper INSTANCE = new RoutingHelper();
|
||||||
public static RoutingHelper getInstance(Activity ctx){
|
public static RoutingHelper getInstance(Context ctx){
|
||||||
INSTANCE.activity = ctx;
|
INSTANCE.context = ctx;
|
||||||
INSTANCE.voiceRouter.init(ctx);
|
INSTANCE.voiceRouter.init(ctx);
|
||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
|
@ -128,7 +129,7 @@ public class RoutingHelper {
|
||||||
Location lastPoint = routeNodes.get(routeNodes.size() - 1);
|
Location lastPoint = routeNodes.get(routeNodes.size() - 1);
|
||||||
if(currentRoute > routeNodes.size() - 3 && currentLocation.distanceTo(lastPoint) < 60){
|
if(currentRoute > routeNodes.size() - 3 && currentLocation.distanceTo(lastPoint) < 60){
|
||||||
if(lastFixedLocation != null && lastFixedLocation.distanceTo(lastPoint) < 60){
|
if(lastFixedLocation != null && lastFixedLocation.distanceTo(lastPoint) < 60){
|
||||||
showMessage(activity.getString(R.string.arrived_at_destination));
|
showMessage(context.getString(R.string.arrived_at_destination));
|
||||||
voiceRouter.arrivedDestinationPoint();
|
voiceRouter.arrivedDestinationPoint();
|
||||||
updateCurrentRoute(routeNodes.size() - 1);
|
updateCurrentRoute(routeNodes.size() - 1);
|
||||||
// clear final location to prevent all time showing message
|
// clear final location to prevent all time showing message
|
||||||
|
@ -388,7 +389,7 @@ public class RoutingHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void calculateRoute(final Location start, final LatLon end){
|
public void calculateRoute(final Location start, final LatLon end){
|
||||||
final RouteService service = OsmandSettings.getRouterService(activity);
|
final RouteService service = OsmandSettings.getRouterService(context);
|
||||||
if(currentRunningJob == null){
|
if(currentRunningJob == null){
|
||||||
// do not evaluate very often
|
// do not evaluate very often
|
||||||
if (System.currentTimeMillis() - lastTimeEvaluatedRoute > evalWaitInterval) {
|
if (System.currentTimeMillis() - lastTimeEvaluatedRoute > evalWaitInterval) {
|
||||||
|
@ -396,7 +397,7 @@ public class RoutingHelper {
|
||||||
currentRunningJob = new Thread(new Runnable() {
|
currentRunningJob = new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
RouteCalculationResult res = provider.calculateRouteImpl(start, end, mode, service, activity);
|
RouteCalculationResult res = provider.calculateRouteImpl(start, end, mode, service, context);
|
||||||
synchronized (RoutingHelper.this) {
|
synchronized (RoutingHelper.this) {
|
||||||
if (res.isCalculated()) {
|
if (res.isCalculated()) {
|
||||||
setNewRoute(res);
|
setNewRoute(res);
|
||||||
|
@ -414,18 +415,18 @@ public class RoutingHelper {
|
||||||
if (res.isCalculated()) {
|
if (res.isCalculated()) {
|
||||||
int[] dist = res.getListDistance();
|
int[] dist = res.getListDistance();
|
||||||
int l = dist != null && dist.length > 0 ? dist[0] : 0;
|
int l = dist != null && dist.length > 0 ? dist[0] : 0;
|
||||||
showMessage(activity.getString(R.string.new_route_calculated_dist) +" : "+ MapUtils.getFormattedDistance(l)); //$NON-NLS-1$
|
showMessage(context.getString(R.string.new_route_calculated_dist) +" : "+ MapUtils.getFormattedDistance(l)); //$NON-NLS-1$
|
||||||
if (activity instanceof MapActivity) {
|
if (context instanceof MapActivity) {
|
||||||
// be aware that is non ui thread
|
// be aware that is non ui thread
|
||||||
((MapActivity) activity).getMapView().refreshMap();
|
((MapActivity) context).getMapView().refreshMap();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (res.getErrorMessage() != null) {
|
if (res.getErrorMessage() != null) {
|
||||||
showMessage(activity.getString(R.string.error_calculating_route)+" : " + res.getErrorMessage()); //$NON-NLS-1$
|
showMessage(context.getString(R.string.error_calculating_route)+" : " + res.getErrorMessage()); //$NON-NLS-1$
|
||||||
} else if (res.getLocations() == null) {
|
} else if (res.getLocations() == null) {
|
||||||
showMessage(activity.getString(R.string.error_calculating_route_occured));
|
showMessage(context.getString(R.string.error_calculating_route_occured));
|
||||||
} else {
|
} else {
|
||||||
showMessage(activity.getString(R.string.empty_route_calculated));
|
showMessage(context.getString(R.string.empty_route_calculated));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lastTimeEvaluatedRoute = System.currentTimeMillis();
|
lastTimeEvaluatedRoute = System.currentTimeMillis();
|
||||||
|
@ -438,11 +439,11 @@ public class RoutingHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showMessage(final String msg){
|
private void showMessage(final String msg){
|
||||||
if (activity != null) {
|
if (context instanceof Activity) {
|
||||||
activity.runOnUiThread(new Runnable() {
|
((Activity)context).runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show();
|
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue