19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.location; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 222eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pellyimport android.os.SystemClock; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport android.util.TimeUtils; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.text.DecimalFormat; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.StringTokenizer; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 304e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * A data class representing a geographic location. 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 324e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>A location can consist of a latitude, longitude, timestamp, 334e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * and other information such as bearing, altitude and velocity. 344e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 354e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>All locations generated by the {@link LocationManager} are 364e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * guaranteed to have a valid latitude, longitude, and timestamp 374e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * (both UTC time and elapsed real-time since boot), all other 384e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * parameters are optional. 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Location implements Parcelable { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constant used to specify formatting of a latitude or longitude 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the form "[+-]DDD.DDDDD where D indicates degrees. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FORMAT_DEGREES = 0; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constant used to specify formatting of a latitude or longitude 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the form "[+-]DDD:MM.MMMMM" where D indicates degrees and 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * M indicates minutes of arc (1 minute = 1/60th of a degree). 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FORMAT_MINUTES = 1; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constant used to specify formatting of a latitude or longitude 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the form "DDD:MM:SS.SSSSS" where D indicates degrees, M 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indicates minutes of arc, and S indicates seconds of arc (1 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * minute = 1/60th of a degree, 1 second = 1/3600th of a degree). 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FORMAT_SECONDS = 2; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6209016ab4dd056a16809419d612cb865a14980880Victoria Lease /** 63779b77455fc51382ecafa210b8a805d2a616da55Victoria Lease * Bundle key for a version of the location that has been fed through 64779b77455fc51382ecafa210b8a805d2a616da55Victoria Lease * LocationFudger. Allows location providers to flag locations as being 65779b77455fc51382ecafa210b8a805d2a616da55Victoria Lease * safe for use with ACCESS_COARSE_LOCATION permission. 66779b77455fc51382ecafa210b8a805d2a616da55Victoria Lease * 6709016ab4dd056a16809419d612cb865a14980880Victoria Lease * @hide 6809016ab4dd056a16809419d612cb865a14980880Victoria Lease */ 6909016ab4dd056a16809419d612cb865a14980880Victoria Lease public static final String EXTRA_COARSE_LOCATION = "coarseLocation"; 7009016ab4dd056a16809419d612cb865a14980880Victoria Lease 7109016ab4dd056a16809419d612cb865a14980880Victoria Lease /** 72779b77455fc51382ecafa210b8a805d2a616da55Victoria Lease * Bundle key for a version of the location containing no GPS data. 73779b77455fc51382ecafa210b8a805d2a616da55Victoria Lease * Allows location providers to flag locations as being safe to 74779b77455fc51382ecafa210b8a805d2a616da55Victoria Lease * feed to LocationFudger. 75779b77455fc51382ecafa210b8a805d2a616da55Victoria Lease * 7609016ab4dd056a16809419d612cb865a14980880Victoria Lease * @hide 7709016ab4dd056a16809419d612cb865a14980880Victoria Lease */ 7809016ab4dd056a16809419d612cb865a14980880Victoria Lease public static final String EXTRA_NO_GPS_LOCATION = "noGPSLocation"; 7909016ab4dd056a16809419d612cb865a14980880Victoria Lease 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mProvider; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mTime = 0; 824118012da9a22694b3353040a485f8cdc27e2f17Philip Milne private long mElapsedRealtimeNanos = 0; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mLatitude = 0.0; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mLongitude = 0.0; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasAltitude = false; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mAltitude = 0.0f; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasSpeed = false; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mSpeed = 0.0f; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasBearing = false; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mBearing = 0.0f; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasAccuracy = false; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mAccuracy = 0.0f; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Bundle mExtras = null; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Cache the inputs and outputs of computeDistanceAndBearing 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so calls to distanceTo() and bearingTo() can share work 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mLat1 = 0.0; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mLon1 = 0.0; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mLat2 = 0.0; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mLon2 = 0.0; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mDistance = 0.0f; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mInitialBearing = 0.0f; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Scratchpad 1048a624ef0fe5e86031f15f4120205c869e34f6637Romain Guy private final float[] mResults = new float[2]; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1074e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Construct a new Location with a named provider. 1084e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1094e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>By default time, latitude and longitude are 0, and the location 1104e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * has no bearing, altitude, speed, accuracy or extras. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1124e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param provider the name of the provider that generated this location 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Location(String provider) { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProvider = provider; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1194e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Construct a new Location object that is copied from an existing one. 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Location(Location l) { 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project set(l); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the contents of the location to the values from the given location. 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(Location l) { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProvider = l.mProvider; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTime = l.mTime; 1314118012da9a22694b3353040a485f8cdc27e2f17Philip Milne mElapsedRealtimeNanos = l.mElapsedRealtimeNanos; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLatitude = l.mLatitude; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLongitude = l.mLongitude; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAltitude = l.mHasAltitude; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAltitude = l.mAltitude; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasSpeed = l.mHasSpeed; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpeed = l.mSpeed; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasBearing = l.mHasBearing; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBearing = l.mBearing; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAccuracy = l.mHasAccuracy; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAccuracy = l.mAccuracy; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExtras = (l.mExtras == null) ? null : new Bundle(l.mExtras); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clears the contents of the location. 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reset() { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProvider = null; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTime = 0; 1514118012da9a22694b3353040a485f8cdc27e2f17Philip Milne mElapsedRealtimeNanos = 0; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLatitude = 0; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLongitude = 0; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAltitude = false; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAltitude = 0; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasSpeed = false; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpeed = 0; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasBearing = false; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBearing = 0; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAccuracy = false; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAccuracy = 0; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExtras = null; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts a coordinate to a String representation. The outputType 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may be one of FORMAT_DEGREES, FORMAT_MINUTES, or FORMAT_SECONDS. 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The coordinate must be a valid double between -180.0 and 180.0. 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalArgumentException if coordinate is less than 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * -180.0, greater than 180.0, or is not a number. 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalArgumentException if outputType is not one of 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FORMAT_DEGREES, FORMAT_MINUTES, or FORMAT_SECONDS. 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static String convert(double coordinate, int outputType) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (coordinate < -180.0 || coordinate > 180.0 || 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Double.isNaN(coordinate)) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("coordinate=" + coordinate); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outputType != FORMAT_DEGREES) && 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (outputType != FORMAT_MINUTES) && 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (outputType != FORMAT_SECONDS)) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("outputType=" + outputType); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Handle negative values 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (coordinate < 0) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append('-'); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate = -coordinate; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DecimalFormat df = new DecimalFormat("###.#####"); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outputType == FORMAT_MINUTES || outputType == FORMAT_SECONDS) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int degrees = (int) Math.floor(coordinate); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(degrees); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(':'); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate -= degrees; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate *= 60.0; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outputType == FORMAT_SECONDS) { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int minutes = (int) Math.floor(coordinate); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(minutes); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(':'); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate -= minutes; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate *= 60.0; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(df.format(coordinate)); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts a String in one of the formats described by 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FORMAT_DEGREES, FORMAT_MINUTES, or FORMAT_SECONDS into a 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * double. 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NullPointerException if coordinate is null 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalArgumentException if the coordinate is not 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in one of the valid formats. 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static double convert(String coordinate) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IllegalArgumentException if bad syntax 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (coordinate == null) { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("coordinate"); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean negative = false; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (coordinate.charAt(0) == '-') { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate = coordinate.substring(1); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project negative = true; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringTokenizer st = new StringTokenizer(coordinate, ":"); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tokens = st.countTokens(); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokens < 1) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("coordinate=" + coordinate); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String degrees = st.nextToken(); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double val; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokens == 1) { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = Double.parseDouble(degrees); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return negative ? -val : val; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String minutes = st.nextToken(); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int deg = Integer.parseInt(degrees); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double min; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sec = 0.0; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (st.hasMoreTokens()) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project min = Integer.parseInt(minutes); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String seconds = st.nextToken(); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sec = Double.parseDouble(seconds); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project min = Double.parseDouble(minutes); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isNegative180 = negative && (deg == 180) && 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (min == 0) && (sec == 0); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // deg must be in [0, 179] except for the case of -180 degrees 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((deg < 0.0) || (deg > 179 && !isNegative180)) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("coordinate=" + coordinate); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (min < 0 || min > 59) { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("coordinate=" + 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sec < 0 || sec > 59) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("coordinate=" + 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = deg*3600.0 + min*60.0 + sec; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val /= 3600.0; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return negative ? -val : val; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NumberFormatException nfe) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("coordinate=" + coordinate); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void computeDistanceAndBearing(double lat1, double lon1, 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double lat2, double lon2, float[] results) { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // using the "Inverse Formula" (section 4) 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int MAXITERS = 20; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convert lat/long to radians 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lat1 *= Math.PI / 180.0; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lat2 *= Math.PI / 180.0; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lon1 *= Math.PI / 180.0; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lon2 *= Math.PI / 180.0; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double a = 6378137.0; // WGS84 major axis 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double b = 6356752.3142; // WGS84 semi-major axis 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double f = (a - b) / a; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double aSqMinusBSqOverBSq = (a * a - b * b) / (b * b); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double L = lon2 - lon1; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double A = 0.0; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double U1 = Math.atan((1.0 - f) * Math.tan(lat1)); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double U2 = Math.atan((1.0 - f) * Math.tan(lat2)); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cosU1 = Math.cos(U1); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cosU2 = Math.cos(U2); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinU1 = Math.sin(U1); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinU2 = Math.sin(U2); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cosU1cosU2 = cosU1 * cosU2; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinU1sinU2 = sinU1 * sinU2; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sigma = 0.0; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double deltaSigma = 0.0; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cosSqAlpha = 0.0; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cos2SM = 0.0; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cosSigma = 0.0; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinSigma = 0.0; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cosLambda = 0.0; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinLambda = 0.0; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double lambda = L; // initial guess 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iter = 0; iter < MAXITERS; iter++) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double lambdaOrig = lambda; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosLambda = Math.cos(lambda); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sinLambda = Math.sin(lambda); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double t1 = cosU2 * sinLambda; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double t2 = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinSqSigma = t1 * t1 + t2 * t2; // (14) 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sinSigma = Math.sqrt(sinSqSigma); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosSigma = sinU1sinU2 + cosU1cosU2 * cosLambda; // (15) 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sigma = Math.atan2(sinSigma, cosSigma); // (16) 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinAlpha = (sinSigma == 0) ? 0.0 : 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosU1cosU2 * sinLambda / sinSigma; // (17) 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosSqAlpha = 1.0 - sinAlpha * sinAlpha; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cos2SM = (cosSqAlpha == 0) ? 0.0 : 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosSigma - 2.0 * sinU1sinU2 / cosSqAlpha; // (18) 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double uSquared = cosSqAlpha * aSqMinusBSqOverBSq; // defn 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project A = 1 + (uSquared / 16384.0) * // (3) 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (4096.0 + uSquared * 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (-768 + uSquared * (320.0 - 175.0 * uSquared))); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double B = (uSquared / 1024.0) * // (4) 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (256.0 + uSquared * 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (-128.0 + uSquared * (74.0 - 47.0 * uSquared))); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double C = (f / 16.0) * 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosSqAlpha * 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (4.0 + f * (4.0 - 3.0 * cosSqAlpha)); // (10) 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cos2SMSq = cos2SM * cos2SM; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deltaSigma = B * sinSigma * // (6) 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (cos2SM + (B / 4.0) * 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (cosSigma * (-1.0 + 2.0 * cos2SMSq) - 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (B / 6.0) * cos2SM * 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (-3.0 + 4.0 * sinSigma * sinSigma) * 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (-3.0 + 4.0 * cos2SMSq))); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lambda = L + 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (1.0 - C) * f * sinAlpha * 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (sigma + C * sinSigma * 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (cos2SM + C * cosSigma * 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (-1.0 + 2.0 * cos2SM * cos2SM))); // (11) 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double delta = (lambda - lambdaOrig) / lambda; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Math.abs(delta) < 1.0e-12) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float distance = (float) (b * A * (sigma - deltaSigma)); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results[0] = distance; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results.length > 1) { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float initialBearing = (float) Math.atan2(cosU2 * sinLambda, 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosU1 * sinU2 - sinU1 * cosU2 * cosLambda); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initialBearing *= 180.0 / Math.PI; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results[1] = initialBearing; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results.length > 2) { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float finalBearing = (float) Math.atan2(cosU1 * sinLambda, 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -sinU1 * cosU2 + cosU1 * sinU2 * cosLambda); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finalBearing *= 180.0 / Math.PI; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results[2] = finalBearing; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Computes the approximate distance in meters between two 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * locations, and optionally the initial and final bearings of the 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * shortest path between them. Distance and bearing are defined using the 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WGS84 ellipsoid. 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> The computed distance is stored in results[0]. If results has length 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2 or greater, the initial bearing is stored in results[1]. If results has 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * length 3 or greater, the final bearing is stored in results[2]. 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startLatitude the starting latitude 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startLongitude the starting longitude 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param endLatitude the ending latitude 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param endLongitude the ending longitude 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param results an array of floats to hold the results 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalArgumentException if results is null or has length < 1 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void distanceBetween(double startLatitude, double startLongitude, 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double endLatitude, double endLongitude, float[] results) { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results == null || results.length < 1) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("results is null or has length < 1"); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeDistanceAndBearing(startLatitude, startLongitude, 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project endLatitude, endLongitude, results); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the approximate distance in meters between this 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * location and the given location. Distance is defined using 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the WGS84 ellipsoid. 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dest the destination location 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the approximate distance in meters 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float distanceTo(Location dest) { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // See if we already have the result 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mResults) { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLatitude != mLat1 || mLongitude != mLon1 || 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.mLatitude != mLat2 || dest.mLongitude != mLon2) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeDistanceAndBearing(mLatitude, mLongitude, 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.mLatitude, dest.mLongitude, mResults); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLat1 = mLatitude; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLon1 = mLongitude; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLat2 = dest.mLatitude; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLon2 = dest.mLongitude; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDistance = mResults[0]; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInitialBearing = mResults[1]; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDistance; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the approximate initial bearing in degrees East of true 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * North when traveling along the shortest path between this 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * location and the given location. The shortest path is defined 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using the WGS84 ellipsoid. Locations that are (nearly) 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * antipodal may produce meaningless results. 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dest the destination location 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the initial bearing in degrees 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float bearingTo(Location dest) { 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mResults) { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // See if we already have the result 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLatitude != mLat1 || mLongitude != mLon1 || 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.mLatitude != mLat2 || dest.mLongitude != mLon2) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeDistanceAndBearing(mLatitude, mLongitude, 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.mLatitude, dest.mLongitude, mResults); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLat1 = mLatitude; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLon1 = mLongitude; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLat2 = dest.mLatitude; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLon2 = dest.mLongitude; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDistance = mResults[0]; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInitialBearing = mResults[1]; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInitialBearing; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4674e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Returns the name of the provider that generated this fix. 4684e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4694e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the provider, or null if it has not been set 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getProvider() { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProvider; 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the name of the provider that generated this fix. 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setProvider(String provider) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProvider = provider; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4834e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Return the UTC time of this fix, in milliseconds since January 1, 1970. 4844e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4852eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * <p>Note that the UTC time on a device is not monotonic: it 4862eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * can jump forwards or backwards unpredictably. So always use 4874118012da9a22694b3353040a485f8cdc27e2f17Philip Milne * {@link #getElapsedRealtimeNanos} when calculating time deltas. 4884e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4894e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>On the other hand, {@link #getTime} is useful for presenting 4902eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * a human readable time to the user, or for carefully comparing 4912eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * location fixes across reboot or across devices. 4924e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4934e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>All locations generated by the {@link LocationManager} 4944e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * are guaranteed to have a valid UTC time, however remember that 4954e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * the system time may have changed since the location was generated. 4962eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * 4972eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * @return time of fix, in milliseconds since January 1, 1970. 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTime() { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTime; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5042eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * Set the UTC time of this fix, in milliseconds since January 1, 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1970. 5062eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * 5072eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * @param time UTC time of this fix, in milliseconds since January 1, 1970 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTime(long time) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTime = time; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5142eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * Return the time of this fix, in elapsed real-time since system boot. 5154e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 5162eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * <p>This value can be reliably compared to 5174118012da9a22694b3353040a485f8cdc27e2f17Philip Milne * {@link android.os.SystemClock#elapsedRealtimeNanos}, 5184e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to calculate the age of a fix and to compare Location fixes. This 5194e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * is reliable because elapsed real-time is guaranteed monotonic for 5204e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * each system boot and continues to increment even when the system 5214e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * is in deep sleep (unlike {@link #getTime}. 5224e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 5234e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>All locations generated by the {@link LocationManager} 5244e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * are guaranteed to have a valid elapsed real-time. 5252eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * 5262eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * @return elapsed real-time of fix, in nanoseconds since system boot. 5272eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly */ 5284118012da9a22694b3353040a485f8cdc27e2f17Philip Milne public long getElapsedRealtimeNanos() { 5294118012da9a22694b3353040a485f8cdc27e2f17Philip Milne return mElapsedRealtimeNanos; 5302eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly } 5312eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly 5322eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly /** 5332eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * Set the time of this fix, in elapsed real-time since system boot. 5342eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * 5352eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * @param time elapsed real-time of fix, in nanoseconds since system boot. 5362eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly */ 5374118012da9a22694b3353040a485f8cdc27e2f17Philip Milne public void setElapsedRealtimeNanos(long time) { 5384118012da9a22694b3353040a485f8cdc27e2f17Philip Milne mElapsedRealtimeNanos = time; 5392eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly } 5402eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly 5412eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly /** 5424e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the latitude, in degrees. 5434e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 5444e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>All locations generated by the {@link LocationManager} 5454e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * will have a valid latitude. 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public double getLatitude() { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLatitude; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5524e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the latitude, in degrees. 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLatitude(double latitude) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLatitude = latitude; 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5594e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the longitude, in degrees. 5604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 5614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>All locations generated by the {@link LocationManager} 5624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * will have a valid longitude. 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public double getLongitude() { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLongitude; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5694e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the longitude, in degrees. 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLongitude(double longitude) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLongitude = longitude; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5764e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * True if this location has an altitude. 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasAltitude() { 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHasAltitude; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5834e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the altitude if available, in meters above sea level. 5844e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 5854e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>If this location does not have an altitude then 0.0 is returned. 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public double getAltitude() { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAltitude; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5924e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the altitude, in meters above sea level. 5934e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 5944e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Following this call {@link #hasAltitude} will return true. 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAltitude(double altitude) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAltitude = altitude; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAltitude = true; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6024e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Remove the altitude from this location. 6034e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 6044e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Following this call {@link #hasAltitude} will return false, 6054e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * and {@link #getAltitude} will return 0.0. 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeAltitude() { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAltitude = 0.0f; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAltitude = false; 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6134e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * True if this location has a speed. 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasSpeed() { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHasSpeed; 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6204e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the speed if it is available, in meters/second over ground. 6214e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 6224e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>If this location does not have a speed then 0.0 is returned. 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getSpeed() { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSpeed; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6294e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the speed, in meters/second over ground. 6304e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 6314e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Following this call {@link #hasSpeed} will return true. 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSpeed(float speed) { 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpeed = speed; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasSpeed = true; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6394e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Remove the speed from this location. 6404e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 6414e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Following this call {@link #hasSpeed} will return false, 6424e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * and {@link #getSpeed} will return 0.0. 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeSpeed() { 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpeed = 0.0f; 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasSpeed = false; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6504e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * True if this location has a bearing. 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasBearing() { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHasBearing; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the bearing, in degrees. 6584e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 6594e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Bearing is the horizontal direction of travel of this device, 6604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * and is not related to the device orientation. It is guaranteed to 6614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * be in the range (0.0, 360.0] if the device has a bearing. 6624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 6634e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>If this location does not have a bearing then 0.0 is returned. 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getBearing() { 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBearing; 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6704e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the bearing, in degrees. 6714e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 6724e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Bearing is the horizontal direction of travel of this device, 6734e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * and is not related to the device orientation. 6744e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 6754e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The input will be wrapped into the range (0.0, 360.0]. 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBearing(float bearing) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (bearing < 0.0f) { 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bearing += 360.0f; 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (bearing >= 360.0f) { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bearing -= 360.0f; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBearing = bearing; 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasBearing = true; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6894e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Remove the bearing from this location. 6904e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 6914e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Following this call {@link #hasBearing} will return false, 6924e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * and {@link #getBearing} will return 0.0. 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeBearing() { 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBearing = 0.0f; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasBearing = false; 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7004e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * True if this location has an accuracy. 7014e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7024e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>All locations generated by the {@link LocationManager} have an 7034e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * accuracy. 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasAccuracy() { 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHasAccuracy; 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7104e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the estimated accuracy of this location, in meters. 7114e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7124e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>We define accuracy as the radius of 68% confidence. In other 7134e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * words, if you draw a circle centered at this location's 7144e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * latitude and longitude, and with a radius equal to the accuracy, 7154e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * then there is a 68% probability that the true location is inside 7164e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * the circle. 7174e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7184e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>In statistical terms, it is assumed that location errors 7194e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * are random with a normal distribution, so the 68% confidence circle 7204e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * represents one standard deviation. Note that in practice, location 7214e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * errors do not always follow such a simple distribution. 7224e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7234e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This accuracy estimation is only concerned with horizontal 7244e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * accuracy, and does not indicate the accuracy of bearing, 7254e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * velocity or altitude if those are included in this Location. 7264e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7274e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>If this location does not have an accuracy, then 0.0 is returned. 7284e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * All locations generated by the {@link LocationManager} include 7294e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * an accuracy. 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getAccuracy() { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAccuracy; 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7364e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the estimated accuracy of this location, meters. 7374e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7384e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>See {@link #getAccuracy} for the definition of accuracy. 7394e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7404e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Following this call {@link #hasAccuracy} will return true. 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAccuracy(float accuracy) { 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAccuracy = accuracy; 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAccuracy = true; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7484e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Remove the accuracy from this location. 7494e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7504e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Following this call {@link #hasAccuracy} will return false, and 7514e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #getAccuracy} will return 0.0. 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeAccuracy() { 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAccuracy = 0.0f; 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAccuracy = false; 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7594e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Return true if this Location object is complete. 7604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>A location object is currently considered complete if it has 7624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * a valid provider, accuracy, wall-clock time and elapsed real-time. 7634e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7644e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>All locations supplied by the {@link LocationManager} to 7654e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * applications must be complete. 7664e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7672eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * @see #makeComplete 7682eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * @hide 7692eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly */ 7702eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly public boolean isComplete() { 7712eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly if (mProvider == null) return false; 7722eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly if (!mHasAccuracy) return false; 7732eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly if (mTime == 0) return false; 7744118012da9a22694b3353040a485f8cdc27e2f17Philip Milne if (mElapsedRealtimeNanos == 0) return false; 7752eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly return true; 7762eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly } 7772eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly 7782eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly /** 7794e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Helper to fill incomplete fields. 7804e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7814e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Used to assist in backwards compatibility with 7824e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Location objects received from applications. 7834e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 7842eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * @see #isComplete 7852eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly * @hide 7862eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly */ 7872eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly public void makeComplete() { 7882eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly if (mProvider == null) mProvider = "?"; 7892eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly if (!mHasAccuracy) { 7902eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly mHasAccuracy = true; 7912eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly mAccuracy = 100.0f; 7922eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly } 7932eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly if (mTime == 0) mTime = System.currentTimeMillis(); 7944118012da9a22694b3353040a485f8cdc27e2f17Philip Milne if (mElapsedRealtimeNanos == 0) mElapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos(); 7952eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly } 7962eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly 7972eeeec248a38ff33999c83f4b8d5bab7d50e79d2Nick Pelly /** 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns additional provider-specific information about the 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * location fix as a Bundle. The keys and values are determined 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the provider. If no additional information is available, 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null is returned. 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> A number of common key/value pairs are listed 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * below. Providers that use any of the keys on this list must 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide the corresponding value as described below. 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> satellites - the number of satellites used to derive the fix 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle getExtras() { 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mExtras; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the extra information associated with this fix to the 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given Bundle. 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setExtras(Bundle extras) { 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExtras = (extras == null) ? null : new Bundle(extras); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 8246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public String toString() { 8256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly StringBuilder s = new StringBuilder(); 8266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append("Location["); 8276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(mProvider); 8286fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(String.format(" %.6f,%.6f", mLatitude, mLongitude)); 8296fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mHasAccuracy) s.append(String.format(" acc=%.0f", mAccuracy)); 8306fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly else s.append(" acc=???"); 8316fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mTime == 0) { 8326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" t=?!?"); 8336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 8344118012da9a22694b3353040a485f8cdc27e2f17Philip Milne if (mElapsedRealtimeNanos == 0) { 8356fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" et=?!?"); 8366fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } else { 8375584b497b7fcd8660cc49cfc8ab4dd0c6dad1060Nick Pelly s.append(" et="); 8384118012da9a22694b3353040a485f8cdc27e2f17Philip Milne TimeUtils.formatDuration(mElapsedRealtimeNanos / 1000000L, s); 8396fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 8406fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mHasAltitude) s.append(" alt=").append(mAltitude); 8416fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mHasSpeed) s.append(" vel=").append(mSpeed); 8426fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mHasBearing) s.append(" bear=").append(mBearing); 8436fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 8446fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mExtras != null) { 8456fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" {").append(mExtras).append('}'); 8466fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 8476fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(']'); 8486fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return s.toString(); 8496fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 8506fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 8516fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public void dump(Printer pw, String prefix) { 8526fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly pw.println(prefix + toString()); 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<Location> CREATOR = 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Parcelable.Creator<Location>() { 8576fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Location createFromParcel(Parcel in) { 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String provider = in.readString(); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Location l = new Location(provider); 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mTime = in.readLong(); 8624118012da9a22694b3353040a485f8cdc27e2f17Philip Milne l.mElapsedRealtimeNanos = in.readLong(); 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mLatitude = in.readDouble(); 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mLongitude = in.readDouble(); 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mHasAltitude = in.readInt() != 0; 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mAltitude = in.readDouble(); 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mHasSpeed = in.readInt() != 0; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mSpeed = in.readFloat(); 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mHasBearing = in.readInt() != 0; 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mBearing = in.readFloat(); 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mHasAccuracy = in.readInt() != 0; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mAccuracy = in.readFloat(); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mExtras = in.readBundle(); 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Location[] newArray(int size) { 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Location[size]; 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel parcel, int flags) { 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeString(mProvider); 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeLong(mTime); 8924118012da9a22694b3353040a485f8cdc27e2f17Philip Milne parcel.writeLong(mElapsedRealtimeNanos); 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeDouble(mLatitude); 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeDouble(mLongitude); 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(mHasAltitude ? 1 : 0); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeDouble(mAltitude); 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(mHasSpeed ? 1 : 0); 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeFloat(mSpeed); 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(mHasBearing ? 1 : 0); 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeFloat(mBearing); 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(mHasAccuracy ? 1 : 0); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeFloat(mAccuracy); 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeBundle(mExtras); 9046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 90509016ab4dd056a16809419d612cb865a14980880Victoria Lease 90609016ab4dd056a16809419d612cb865a14980880Victoria Lease /** 90709016ab4dd056a16809419d612cb865a14980880Victoria Lease * Returns one of the optional extra {@link Location}s that can be attached 90809016ab4dd056a16809419d612cb865a14980880Victoria Lease * to this Location. 90909016ab4dd056a16809419d612cb865a14980880Victoria Lease * 91009016ab4dd056a16809419d612cb865a14980880Victoria Lease * @param key the key associated with the desired extra Location 91109016ab4dd056a16809419d612cb865a14980880Victoria Lease * @return the extra Location, or null if unavailable 91209016ab4dd056a16809419d612cb865a14980880Victoria Lease * @hide 91309016ab4dd056a16809419d612cb865a14980880Victoria Lease */ 91409016ab4dd056a16809419d612cb865a14980880Victoria Lease public Location getExtraLocation(String key) { 91509016ab4dd056a16809419d612cb865a14980880Victoria Lease if (mExtras != null) { 91609016ab4dd056a16809419d612cb865a14980880Victoria Lease Parcelable value = mExtras.getParcelable(key); 91709016ab4dd056a16809419d612cb865a14980880Victoria Lease if (value instanceof Location) { 91809016ab4dd056a16809419d612cb865a14980880Victoria Lease return (Location) value; 91909016ab4dd056a16809419d612cb865a14980880Victoria Lease } 92009016ab4dd056a16809419d612cb865a14980880Victoria Lease } 92109016ab4dd056a16809419d612cb865a14980880Victoria Lease return null; 92209016ab4dd056a16809419d612cb865a14980880Victoria Lease } 92309016ab4dd056a16809419d612cb865a14980880Victoria Lease 92409016ab4dd056a16809419d612cb865a14980880Victoria Lease /** 92509016ab4dd056a16809419d612cb865a14980880Victoria Lease * Attaches an extra {@link Location} to this Location. 92609016ab4dd056a16809419d612cb865a14980880Victoria Lease * 92709016ab4dd056a16809419d612cb865a14980880Victoria Lease * @param key the key associated with the Location extra 92809016ab4dd056a16809419d612cb865a14980880Victoria Lease * @param location the Location to attach 92909016ab4dd056a16809419d612cb865a14980880Victoria Lease * @hide 93009016ab4dd056a16809419d612cb865a14980880Victoria Lease */ 93109016ab4dd056a16809419d612cb865a14980880Victoria Lease public void setExtraLocation(String key, Location value) { 93209016ab4dd056a16809419d612cb865a14980880Victoria Lease if (mExtras == null) { 93309016ab4dd056a16809419d612cb865a14980880Victoria Lease mExtras = new Bundle(); 93409016ab4dd056a16809419d612cb865a14980880Victoria Lease } 93509016ab4dd056a16809419d612cb865a14980880Victoria Lease mExtras.putParcelable(key, value); 93609016ab4dd056a16809419d612cb865a14980880Victoria Lease } 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 938