Project: Alerte-voirie-android
/**
 * This file is part of the Alerte Voirie project. 
 *  
 * Copyright (C) 2010-2011 C4M PROD 
 *  
 * Alerte Voirie is free software: you can redistribute it and/or modify 
 * it under the terms of the GNU Lesser General Public License as published by 
 * the Free Software Foundation, either version 3 of the License, or 
 * (at your option) any later version. 
 *  
 * Alerte Voirie is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 * GNU Lesser General Public License for more details. 
 *  
 * You should have received a copy of the GNU Lesser General Public License 
 * along with Alerte Voirie.  If not, see <http://www.gnu.org/licenses/>. 
 * 
 */
package com.fabernovel.alertevoirie.utils; 
 
import android.location.Location; 
 
import com.google.android.maps.GeoPoint; 
 
public class LocationHelper { 
    private static final int TWO_MINUTES = 1000 * 60 * 2
 
    /** Determines whether one Location reading is better than the current Location fix
      * @param location  The new Location that you want to evaluate 
      * @param currentBestLocation  The current Location fix, to which you want to compare the new one 
      */
 
    public static boolean isBetterLocation(Location location, Location currentBestLocation) { 
        if (currentBestLocation == null) { 
            // A new location is always better than no location 
            return true
        } 
 
        // Check whether the new location fix is newer or older 
        long timeDelta = location.getTime() - currentBestLocation.getTime(); 
        boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; 
        boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; 
        boolean isNewer = timeDelta > 0
 
        // If it's been more than two minutes since the current location, use the new location 
        // because the user has likely moved 
        if (isSignificantlyNewer) { 
            return true
        // If the new location is more than two minutes older, it must be worse 
        } else if (isSignificantlyOlder) { 
            return false
        } 
 
        // Check whether the new location fix is more or less accurate 
        int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy()); 
        boolean isLessAccurate = accuracyDelta > 0
        boolean isMoreAccurate = accuracyDelta < 0
        boolean isSignificantlyLessAccurate = accuracyDelta > 200
 
        // Check if the old and new location are from the same provider 
        boolean isFromSameProvider = isSameProvider(location.getProvider(), 
                currentBestLocation.getProvider()); 
 
        // Determine location quality using a combination of timeliness and accuracy 
        if (isMoreAccurate) { 
            return true
        } else if (isNewer && !isLessAccurate) { 
            return true
        } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { 
            return true
        } 
        return false
    } 
 
    /** Checks whether two providers are the same */ 
    private static boolean isSameProvider(String provider1, String provider2) { 
        if (provider1 == null) { 
          return provider2 == null
        } 
        return provider1.equals(provider2); 
    } 
     
    public static GeoPoint geoFromLocation(Location l) throws NullPointerException{ 
        return new GeoPoint((int)(l.getLatitude()*1E6), (int)(l.getLongitude()*1E6)); 
    } 
}