Add:Android:Add fast provider until slow provider is ready, fix from #670|Thanks tgc
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Tue, 14 Dec 2010 08:35:44 +0000 (08:35 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Tue, 14 Dec 2010 08:35:44 +0000 (08:35 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@3783 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/android/src/org/navitproject/navit/NavitVehicle.java

index 9f56549..754a8d1 100644 (file)
@@ -31,34 +31,76 @@ import android.location.*;
 public class NavitVehicle {
        private LocationManager locationManager;
        private int vehicle_callbackid;
+       private String preciseProvider;
+       private String fastProvider;
        public native void VehicleCallback(int id, Location location);
 
        NavitVehicle (Context context, int callbackid) {
                locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
 
-               Criteria criteria = new Criteria();
-               criteria.setAccuracy(Criteria.ACCURACY_FINE);
-               criteria.setAltitudeRequired(true);
-               criteria.setBearingRequired(true);
-               criteria.setCostAllowed(true);
-               criteria.setPowerRequirement(Criteria.POWER_HIGH);
+               /* Use 2 LocationProviders, one precise (usually GPS), and one
+                  not so precise, but possible faster. The fast provider is 
+                  disabled when the precise provider gets its first fix. */
+               
+               // Selection criterias for the precise provider
+               Criteria highCriteria = new Criteria();
+               highCriteria.setAccuracy(Criteria.ACCURACY_FINE);
+               highCriteria.setAltitudeRequired(true);
+               highCriteria.setBearingRequired(true);
+               highCriteria.setCostAllowed(true);
+               highCriteria.setPowerRequirement(Criteria.POWER_HIGH);
 
+               // Selection criterias for the fast provider
+               Criteria lowCriteria = new Criteria();
+               lowCriteria.setAccuracy(Criteria.ACCURACY_COARSE);
+               lowCriteria.setAltitudeRequired(false);
+               lowCriteria.setBearingRequired(false);
+               lowCriteria.setCostAllowed(true);
+               lowCriteria.setPowerRequirement(Criteria.POWER_HIGH);
                
                Log.e("NavitVehicle", "Providers "+locationManager.getAllProviders());
-               String provider = locationManager.getBestProvider(criteria, false);
-               Log.e("NavitVehicle", "Provider "+provider);
-               Location location = locationManager.getLastKnownLocation(provider);
+               
+               preciseProvider = locationManager.getBestProvider(highCriteria, false);
+               Log.e("NavitVehicle", "Precise Provider " + preciseProvider);
+               fastProvider = locationManager.getBestProvider(lowCriteria, false);
+               Log.e("NavitVehicle", "Fast Provider " + fastProvider);
                vehicle_callbackid=callbackid;
-               locationManager.requestLocationUpdates(provider, 0, 0, locationListener);
+               
+               locationManager.requestLocationUpdates(preciseProvider, 0, 0, preciseLocationListener);
+               
+               // If the 2 providers is the same, only activate one listener
+               if (fastProvider == null || preciseProvider.compareTo(fastProvider) == 0) {
+                       fastProvider = null;
+               } else {
+                       locationManager.requestLocationUpdates(fastProvider, 0, 0, fastLocationListener);
+               }
        }
-       private final LocationListener locationListener = new LocationListener() {
+       private final LocationListener preciseLocationListener = new LocationListener() {
+               public void onLocationChanged(Location location) {
+                       
+                       // Disable the fast provider if still active
+                       if (fastProvider != null) {
+                               locationManager.removeUpdates(fastLocationListener);
+                               fastProvider = null;
+                       }
+                       
+                       // Log.e("NavitVehicle", "LocationChanged Accuracy " + location.getAccuracy() + " Altitude " + location.getAltitude() + " Bearing " + location.getBearing() + " Speed " + location.getSpeed() + " Latitude " + location.getLatitude() + " Longitude " + location.getLongitude());
+                       VehicleCallback(vehicle_callbackid, location);
+               }
+               public void onProviderDisabled(String provider){}
+               public void onProviderEnabled(String provider) {}
+               public void onStatusChanged(String provider, int status, Bundle extras) {}
+       };
+
+       private final LocationListener fastLocationListener = new LocationListener() {
                public void onLocationChanged(Location location) {
                        
                        // Log.e("NavitVehicle", "LocationChanged Accuracy " + location.getAccuracy() + " Altitude " + location.getAltitude() + " Bearing " + location.getBearing() + " Speed " + location.getSpeed() + " Latitude " + location.getLatitude() + " Longitude " + location.getLongitude());
-                       VehicleCallback(vehicle_callbackid, location);  
+                       VehicleCallback(vehicle_callbackid, location);
                }
                public void onProviderDisabled(String provider){}
                public void onProviderEnabled(String provider) {}
                public void onStatusChanged(String provider, int status, Bundle extras) {}
        };
+
 }