16fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly/* 26fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * Copyright (C) 2012 The Android Open Source Project 36fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * 46fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * Licensed under the Apache License, Version 2.0 (the "License"); 56fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * you may not use this file except in compliance with the License. 66fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * You may obtain a copy of the License at 76fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * 86fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * http://www.apache.org/licenses/LICENSE-2.0 96fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * 106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * Unless required by applicable law or agreed to in writing, software 116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * distributed under the License is distributed on an "AS IS" BASIS, 126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * See the License for the specific language governing permissions and 146fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly * limitations under the License. 156fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly */ 166fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 176fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellypackage android.location; 186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 19c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christieimport android.annotation.SystemApi; 206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport android.os.Parcel; 216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport android.os.Parcelable; 226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport android.os.SystemClock; 2382edc9b3482307a8e93655aadabb4f9ad24efe46David Christieimport android.os.WorkSource; 246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport android.util.TimeUtils; 256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 264e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 274e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly/** 284e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * A data object that contains quality of service parameters for requests 294e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to the {@link LocationManager}. 304e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 314e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>LocationRequest objects are used to request a quality of service 324e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * for location updates from the Location Manager. 334e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 344e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>For example, if your application wants high accuracy location 354e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * it should create a location request with {@link #setQuality} set to 364e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #ACCURACY_FINE} or {@link #POWER_HIGH}, and it should set 374e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #setInterval} to less than one second. This would be 384e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * appropriate for mapping applications that are showing your location 394e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * in real-time. 404e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 414e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>At the other extreme, if you want negligible power 424e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * impact, but to still receive location updates when available, then use 434e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #setQuality} with {@link #POWER_NONE}. With this request your 444e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * application will not trigger (and therefore will not receive any 454e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * power blame) any location updates, but will receive locations 464e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * triggered by other applications. This would be appropriate for 474e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * applications that have no firm requirement for location, but can 484e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * take advantage when available. 494e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 504e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>In between these two extremes is a very common use-case, where 514e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * applications definitely want to receive 524e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * updates at a specified interval, and can receive them faster when 534e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * available, but still want a low power impact. These applications 544e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * should consider {@link #POWER_LOW} combined with a faster 554e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #setFastestInterval} (such as 1 minute) and a slower 564e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #setInterval} (such as 60 minutes). They will only be assigned 574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * power blame for the interval set by {@link #setInterval}, but can 584e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * still receive locations triggered by other applications at a rate up 594e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to {@link #setFastestInterval}. This style of request is appropriate for 604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * many location aware applications, including background usage. Do be 614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * careful to also throttle {@link #setFastestInterval} if you perform 624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * heavy-weight work after receiving an update - such as using the network. 634e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 644e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Activities should strongly consider removing all location 654e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * request when entering the background 664e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * (for example at {@link android.app.Activity#onPause}), or 674e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * at least swap the request to a larger interval and lower quality. 684e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Future version of the location manager may automatically perform background 694e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * throttling on behalf of applications. 704e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 714e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Applications cannot specify the exact location sources that are 724e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * used by Android's <em>Fusion Engine</em>. In fact, the system 734e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * may have multiple location sources (providers) running and may 744e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * fuse the results from several sources into a single Location object. 754e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 764e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Location requests from applications with 774e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} and not 784e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} will 794e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * be automatically throttled to a slower interval, and the location 804e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * object will be obfuscated to only show a coarse level of accuracy. 814e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 824e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>All location requests are considered hints, and you may receive 834e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * locations that are more accurate, less accurate, and slower 844e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * than requested. 857ab7f538924371a9dd4be7a27a6ae3b4c04b301cLaurent Tu * 867ab7f538924371a9dd4be7a27a6ae3b4c04b301cLaurent Tu * @hide 874e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 88c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie@SystemApi 896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellypublic final class LocationRequest implements Parcelable { 904e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 914e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Used with {@link #setQuality} to request the most accurate locations available. 924e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 934e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This may be up to 1 meter accuracy, although this is implementation dependent. 944e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 954e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly public static final int ACCURACY_FINE = 100; 964e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 974e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 984e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Used with {@link #setQuality} to request "block" level accuracy. 994e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1004e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Block level accuracy is considered to be about 100 meter accuracy, 1014e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * although this is implementation dependent. Using a coarse accuracy 1024e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * such as this often consumes less power. 1034e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1044e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly public static final int ACCURACY_BLOCK = 102; 1054e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 1064e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1074e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Used with {@link #setQuality} to request "city" level accuracy. 1084e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1094e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>City level accuracy is considered to be about 10km accuracy, 1104e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * although this is implementation dependent. Using a coarse accuracy 1114e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * such as this often consumes less power. 1124e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1134e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly public static final int ACCURACY_CITY = 104; 1144e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 1154e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1164e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Used with {@link #setQuality} to require no direct power impact (passive locations). 1174e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1184e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This location request will not trigger any active location requests, 1194e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * but will receive locations triggered by other applications. Your application 1204e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * will not receive any direct power blame for location work. 1214e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static final int POWER_NONE = 200; 1234e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 1244e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1254e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Used with {@link #setQuality} to request low power impact. 1264e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1274e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This location request will avoid high power location work where 1284e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * possible. 1294e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1306fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static final int POWER_LOW = 201; 1314e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 1324e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1334e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Used with {@link #setQuality} to allow high power consumption for location. 1344e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1354e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This location request will allow high power location work. 1364e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1376fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static final int POWER_HIGH = 203; 1386fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1394e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1404e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * By default, mFastestInterval = FASTEST_INTERVAL_MULTIPLE * mInterval 1414e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1424e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly private static final double FASTEST_INTERVAL_FACTOR = 6.0; // 6x 1434e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 1446fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private int mQuality = POWER_LOW; 1454e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly private long mInterval = 60 * 60 * 1000; // 60 minutes 1464e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly private long mFastestInterval = (long)(mInterval / FASTEST_INTERVAL_FACTOR); // 10 minutes 1474e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly private boolean mExplicitFastestInterval = false; 1486fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private long mExpireAt = Long.MAX_VALUE; // no expiry 1496fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private int mNumUpdates = Integer.MAX_VALUE; // no expiry 1506fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private float mSmallestDisplacement = 0.0f; // meters 1516de10472786ee17106b096eddbb603ab735c11a7David Christie private WorkSource mWorkSource = null; 15240e5782f5c79ea660b98b8875086f592367bc1d2David Christie private boolean mHideFromAppOps = false; // True if this request shouldn't be counted by AppOps 1536fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 15409016ab4dd056a16809419d612cb865a14980880Victoria Lease private String mProvider = LocationManager.FUSED_PROVIDER; // for deprecated APIs that explicitly request a provider 1556fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1564e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Create a location request with default parameters. 1584e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1594e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Default parameters are for a low power, slowly updated location. 1604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * It can then be adjusted as required by the applications before passing 1614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to the {@link LocationManager} 1624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1634e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return a new location request 1644e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static LocationRequest create() { 1666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly LocationRequest request = new LocationRequest(); 1676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return request; 1686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 1696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 171c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 1726fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static LocationRequest createFromDeprecatedProvider(String provider, long minTime, 1736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly float minDistance, boolean singleShot) { 1746fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (minTime < 0) minTime = 0; 1756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (minDistance < 0) minDistance = 0; 1766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly int quality; 1786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (LocationManager.PASSIVE_PROVIDER.equals(provider)) { 1796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = POWER_NONE; 1806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } else if (LocationManager.GPS_PROVIDER.equals(provider)) { 1816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = ACCURACY_FINE; 1826fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } else { 1836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = POWER_LOW; 1846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 1856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly LocationRequest request = new LocationRequest() 1876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setProvider(provider) 1886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setQuality(quality) 1896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setInterval(minTime) 1906fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setFastestInterval(minTime) 1916fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setSmallestDisplacement(minDistance); 1926fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (singleShot) request.setNumUpdates(1); 1936fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return request; 1946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 1956fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1966fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 197c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 1986fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static LocationRequest createFromDeprecatedCriteria(Criteria criteria, long minTime, 1996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly float minDistance, boolean singleShot) { 2006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (minTime < 0) minTime = 0; 2016fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (minDistance < 0) minDistance = 0; 2026fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2036fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly int quality; 2046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly switch (criteria.getAccuracy()) { 2056fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case Criteria.ACCURACY_COARSE: 2066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = ACCURACY_BLOCK; 2076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly break; 2086fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case Criteria.ACCURACY_FINE: 2096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = ACCURACY_FINE; 2106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly break; 2116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly default: { 2126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly switch (criteria.getPowerRequirement()) { 2136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case Criteria.POWER_HIGH: 2146fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = POWER_HIGH; 2156fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly default: 2166fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = POWER_LOW; 2176fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly LocationRequest request = new LocationRequest() 2226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setQuality(quality) 2236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setInterval(minTime) 2246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setFastestInterval(minTime) 2256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setSmallestDisplacement(minDistance); 2266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (singleShot) request.setNumUpdates(1); 2276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return request; 2286fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2296fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2306fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 2316fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest() { } 2326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 23337425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease /** @hide */ 23437425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease public LocationRequest(LocationRequest src) { 23537425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mQuality = src.mQuality; 23637425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mInterval = src.mInterval; 23737425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mFastestInterval = src.mFastestInterval; 23837425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mExplicitFastestInterval = src.mExplicitFastestInterval; 23937425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mExpireAt = src.mExpireAt; 24037425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mNumUpdates = src.mNumUpdates; 24137425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mSmallestDisplacement = src.mSmallestDisplacement; 24237425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mProvider = src.mProvider; 24382edc9b3482307a8e93655aadabb4f9ad24efe46David Christie mWorkSource = src.mWorkSource; 24440e5782f5c79ea660b98b8875086f592367bc1d2David Christie mHideFromAppOps = src.mHideFromAppOps; 24537425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease } 24637425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease 2474e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 2484e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the quality of the request. 2494e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2504e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Use with a accuracy constant such as {@link #ACCURACY_FINE}, or a power 2514e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * constant such as {@link #POWER_LOW}. You cannot request both and accuracy and 2524e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * power, only one or the other can be specified. The system will then 2534e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * maximize accuracy or minimize power as appropriate. 2544e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2554e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The quality of the request is a strong hint to the system for which 2564e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * location sources to use. For example, {@link #ACCURACY_FINE} is more likely 2574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to use GPS, and {@link #POWER_LOW} is more likely to use WIFI & Cell tower 2584e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * positioning, but it also depends on many other factors (such as which sources 2594e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * are available) and is implementation dependent. 2604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>{@link #setQuality} and {@link #setInterval} are the most important parameters 2624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * on a location request. 2634e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2644e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param quality an accuracy or power constant 2654e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @throws InvalidArgumentException if the quality constant is not valid 2664e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 2674e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 2686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setQuality(int quality) { 2696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkQuality(quality); 2706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mQuality = quality; 2716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 2726fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2744e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 2754e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the quality of the request. 2764e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2774e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return an accuracy or power constant 2784e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 2796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public int getQuality() { 2806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mQuality; 2816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2826fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2834e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 2844e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the desired interval for active location updates, in milliseconds. 2854e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2864e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The location manager will actively try to obtain location updates 2874e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * for your application at this interval, so it has a 2884e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * direct influence on the amount of power used by your application. 2894e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Choose your interval wisely. 2904e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2914e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This interval is inexact. You may not receive updates at all (if 2924e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * no location sources are available), or you may receive them 2934e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * slower than requested. You may also receive them faster than 2944e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * requested (if other applications are requesting location at a 2954e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * faster interval). The fastest rate that that you will receive 2964e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * updates can be controlled with {@link #setFastestInterval}. 2974e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2984e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Applications with only the coarse location permission may have their 2994e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * interval silently throttled. 3004e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3014e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>An interval of 0 is allowed, but not recommended, since 3024e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * location updates may be extremely fast on future implementations. 3034e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3044e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>{@link #setQuality} and {@link #setInterval} are the most important parameters 3054e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * on a location request. 3064e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3074e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param millis desired interval in millisecond, inexact 3084e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @throws InvalidArgumentException if the interval is less than zero 3094e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 3104e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setInterval(long millis) { 3126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkInterval(millis); 3136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mInterval = millis; 3144e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly if (!mExplicitFastestInterval) { 3154e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly mFastestInterval = (long)(mInterval / FASTEST_INTERVAL_FACTOR); 3164e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly } 3176fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 3186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 3196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 3204e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 3214e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the desired interval of this request, in milliseconds. 3224e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3234e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return desired interval in milliseconds, inexact 3244e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public long getInterval() { 3266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mInterval; 3276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 3286fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 3294e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 3304e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Explicitly set the fastest interval for location updates, in 3314e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * milliseconds. 3324e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3334e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This controls the fastest rate at which your application will 3344e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * receive location updates, which might be faster than 3354e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #setInterval} in some situations (for example, if other 3364e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * applications are triggering location updates). 3374e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3384e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This allows your application to passively acquire locations 3394e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * at a rate faster than it actively acquires locations, saving power. 3404e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3414e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Unlike {@link #setInterval}, this parameter is exact. Your 3424e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * application will never receive updates faster than this value. 3434e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3444e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>If you don't call this method, a fastest interval 3454e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * will be selected for you. It will be a value faster than your 3464e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * active interval ({@link #setInterval}). 3474e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3484e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>An interval of 0 is allowed, but not recommended, since 3494e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * location updates may be extremely fast on future implementations. 3504e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3514e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>If {@link #setFastestInterval} is set slower than {@link #setInterval}, 3524e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * then your effective fastest interval is {@link #setInterval}. 3534e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3544e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param millis fastest interval for updates in milliseconds, exact 3554e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @throws InvalidArgumentException if the interval is less than zero 3564e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 3574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3586fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setFastestInterval(long millis) { 3596fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkInterval(millis); 3604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly mExplicitFastestInterval = true; 3616fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mFastestInterval = millis; 3626fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 3636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 3646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 3654e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 3664e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the fastest interval of this request, in milliseconds. 3674e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3684e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The system will never provide location updates faster 3694e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * than the minimum of {@link #getFastestInterval} and 3704e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #getInterval}. 3714e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3724e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return fastest interval in milliseconds, exact 3734e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3746fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public long getFastestInterval() { 3756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mFastestInterval; 3766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 3776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 3784e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 3794e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the duration of this request, in milliseconds. 3804e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3814e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The duration begins immediately (and not when the request 3824e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * is passed to the location manager), so call this method again 3834e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * if the request is re-used at a later time. 3844e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3854e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The location manager will automatically stop updates after 3864e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * the request expires. 3874e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3884e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The duration includes suspend time. Values less than 0 3894e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * are allowed, but indicate that the request has already expired. 3904e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3914e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param millis duration of request in milliseconds 3924e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 3934e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setExpireIn(long millis) { 395e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu long elapsedRealtime = SystemClock.elapsedRealtime(); 396e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu 397e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu // Check for > Long.MAX_VALUE overflow (elapsedRealtime > 0): 398e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu if (millis > Long.MAX_VALUE - elapsedRealtime) { 399e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu mExpireAt = Long.MAX_VALUE; 400e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu } else { 401e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu mExpireAt = millis + elapsedRealtime; 402e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu } 403e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu 4046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mExpireAt < 0) mExpireAt = 0; 4056fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 4066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4084e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4094e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the request expiration time, in millisecond since boot. 4104e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4114e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This expiration time uses the same time base as {@link SystemClock#elapsedRealtime}. 4124e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4134e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The location manager will automatically stop updates after 4144e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * the request expires. 4154e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4164e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The duration includes suspend time. Values before {@link SystemClock#elapsedRealtime} 4174e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * are allowed, but indicate that the request has already expired. 4184e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4194e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param millis expiration time of request, in milliseconds since boot including suspend 4204e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 4214e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setExpireAt(long millis) { 4236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mExpireAt = millis; 4246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mExpireAt < 0) mExpireAt = 0; 4256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 4266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4284e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4294e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the request expiration time, in milliseconds since boot. 4304e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4314e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This value can be compared to {@link SystemClock#elapsedRealtime} to determine 4324e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * the time until expiration. 4334e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4344e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return expiration time of request, in milliseconds since boot including suspend 4354e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4366fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public long getExpireAt() { 4376fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mExpireAt; 4386fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4396fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4404e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4414e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the number of location updates. 4424e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4434e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>By default locations are continuously updated until the request is explicitly 4444e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * removed, however you can optionally request a set number of updates. 4454e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * For example, if your application only needs a single fresh location, 4464e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * then call this method with a value of 1 before passing the request 4474e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to the location manager. 4484e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4494e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param numUpdates the number of location updates requested 4504e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @throws InvalidArgumentException if numUpdates is 0 or less 4514e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 4524e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4534e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly public LocationRequest setNumUpdates(int numUpdates) { 4544e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly if (numUpdates <= 0) throw new IllegalArgumentException("invalid numUpdates: " + numUpdates); 4554e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly mNumUpdates = numUpdates; 4564e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly return this; 4574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly } 4584e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 4594e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the number of updates requested. 4614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>By default this is {@link Integer#MAX_VALUE}, which indicates that 4634e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * locations are updated until the request is explicitly removed. 4644e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return number of updates 4654e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public int getNumUpdates() { 4676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mNumUpdates; 4686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 4716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public void decrementNumUpdates() { 4726fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mNumUpdates != Integer.MAX_VALUE) { 4736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mNumUpdates--; 4746fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mNumUpdates < 0) { 4766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mNumUpdates = 0; 4776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 482c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 4836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setProvider(String provider) { 4846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkProvider(provider); 4856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mProvider = provider; 4866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 4876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 490c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 4916fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public String getProvider() { 4926fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mProvider; 4936fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4956fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 496c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 4976fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setSmallestDisplacement(float meters) { 4986fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkDisplacement(meters); 4996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mSmallestDisplacement = meters; 5006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 5016fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5026fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5036fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 504c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 5056fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public float getSmallestDisplacement() { 5066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mSmallestDisplacement; 5076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5086fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5093e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie /** 5103e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * Sets the WorkSource to use for power blaming of this location request. 5113e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5123e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * <p>No permissions are required to make this call, however the LocationManager 5133e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * will throw a SecurityException when requesting location updates if the caller 5143e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * doesn't have the {@link android.Manifest.permission#UPDATE_DEVICE_STATS} permission. 5153e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5163e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @param workSource WorkSource defining power blame for this location request. 5173e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @hide 5183e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie */ 519c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 52082edc9b3482307a8e93655aadabb4f9ad24efe46David Christie public void setWorkSource(WorkSource workSource) { 52182edc9b3482307a8e93655aadabb4f9ad24efe46David Christie mWorkSource = workSource; 52282edc9b3482307a8e93655aadabb4f9ad24efe46David Christie } 52382edc9b3482307a8e93655aadabb4f9ad24efe46David Christie 52482edc9b3482307a8e93655aadabb4f9ad24efe46David Christie /** @hide */ 525c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 52682edc9b3482307a8e93655aadabb4f9ad24efe46David Christie public WorkSource getWorkSource() { 52782edc9b3482307a8e93655aadabb4f9ad24efe46David Christie return mWorkSource; 52882edc9b3482307a8e93655aadabb4f9ad24efe46David Christie } 52982edc9b3482307a8e93655aadabb4f9ad24efe46David Christie 5303e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie /** 5313e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * Sets whether or not this location request should be hidden from AppOps. 5323e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5333e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * <p>Hiding a location request from AppOps will remove user visibility in the UI as to this 5343e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * request's existence. It does not affect power blaming in the Battery page. 5353e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5363e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * <p>No permissions are required to make this call, however the LocationManager 5373e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * will throw a SecurityException when requesting location updates if the caller 5383e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * doesn't have the {@link android.Manifest.permission#UPDATE_APP_OPS_STATS} permission. 5393e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5403e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @param hideFromAppOps If true AppOps won't keep track of this location request. 5413e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @see android.app.AppOpsManager 5423e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @hide 5433e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie */ 544c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 54540e5782f5c79ea660b98b8875086f592367bc1d2David Christie public void setHideFromAppOps(boolean hideFromAppOps) { 54640e5782f5c79ea660b98b8875086f592367bc1d2David Christie mHideFromAppOps = hideFromAppOps; 54740e5782f5c79ea660b98b8875086f592367bc1d2David Christie } 54840e5782f5c79ea660b98b8875086f592367bc1d2David Christie 54940e5782f5c79ea660b98b8875086f592367bc1d2David Christie /** @hide */ 550c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 55140e5782f5c79ea660b98b8875086f592367bc1d2David Christie public boolean getHideFromAppOps() { 55240e5782f5c79ea660b98b8875086f592367bc1d2David Christie return mHideFromAppOps; 55340e5782f5c79ea660b98b8875086f592367bc1d2David Christie } 55440e5782f5c79ea660b98b8875086f592367bc1d2David Christie 5556fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private static void checkInterval(long millis) { 5566fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (millis < 0) { 5576fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly throw new IllegalArgumentException("invalid interval: " + millis); 5586fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5596fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5606fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5616fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private static void checkQuality(int quality) { 5626fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly switch (quality) { 5636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_FINE: 5646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_BLOCK: 5656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_CITY: 5666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_NONE: 5676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_LOW: 5686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_HIGH: 5696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly break; 5706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly default: 5716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly throw new IllegalArgumentException("invalid quality: " + quality); 5726fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5746fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private static void checkDisplacement(float meters) { 5766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (meters < 0.0f) { 5776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly throw new IllegalArgumentException("invalid displacement: " + meters); 5786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private static void checkProvider(String name) { 5826fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (name == null) { 5836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly throw new IllegalArgumentException("invalid provider: " + name); 5846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static final Parcelable.Creator<LocationRequest> CREATOR = 5886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly new Parcelable.Creator<LocationRequest>() { 5896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 5906fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest createFromParcel(Parcel in) { 5916fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly LocationRequest request = new LocationRequest(); 5926fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly request.setQuality(in.readInt()); 5936fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly request.setFastestInterval(in.readLong()); 5946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly request.setInterval(in.readLong()); 5956fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly request.setExpireAt(in.readLong()); 5966fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly request.setNumUpdates(in.readInt()); 5976fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly request.setSmallestDisplacement(in.readFloat()); 59840e5782f5c79ea660b98b8875086f592367bc1d2David Christie request.setHideFromAppOps(in.readInt() != 0); 5996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly String provider = in.readString(); 6006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (provider != null) request.setProvider(provider); 601def20a3350ce239b929ef0ebbbf913cc0b42cf5fDavid Christie WorkSource workSource = in.readParcelable(null); 60282edc9b3482307a8e93655aadabb4f9ad24efe46David Christie if (workSource != null) request.setWorkSource(workSource); 6036fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return request; 6046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6056fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 6066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest[] newArray(int size) { 6076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return new LocationRequest[size]; 6086fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly }; 6104e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 6116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 6126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public int describeContents() { 6136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return 0; 6146fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6154e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 6166fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 6176fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public void writeToParcel(Parcel parcel, int flags) { 6186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeInt(mQuality); 6196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeLong(mFastestInterval); 6206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeLong(mInterval); 6216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeLong(mExpireAt); 6226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeInt(mNumUpdates); 6236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeFloat(mSmallestDisplacement); 62440e5782f5c79ea660b98b8875086f592367bc1d2David Christie parcel.writeInt(mHideFromAppOps ? 1 : 0); 6256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeString(mProvider); 62682edc9b3482307a8e93655aadabb4f9ad24efe46David Christie parcel.writeParcelable(mWorkSource, 0); 6276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6286fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 6296fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 6306fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static String qualityToString(int quality) { 6316fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly switch (quality) { 6326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_FINE: 6336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "ACCURACY_FINE"; 6346fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_BLOCK: 6356fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "ACCURACY_BLOCK"; 6366fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_CITY: 6376fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "ACCURACY_CITY"; 6386fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_NONE: 6396fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "POWER_NONE"; 6406fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_LOW: 6416fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "POWER_LOW"; 6426fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_HIGH: 6436fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "POWER_HIGH"; 6446fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly default: 6456fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "???"; 6466fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6476fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6486fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 6496fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 6506fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public String toString() { 6516fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly StringBuilder s = new StringBuilder(); 6526fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append("Request[").append(qualityToString(mQuality)); 6536fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mProvider != null) s.append(' ').append(mProvider); 6546fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mQuality != POWER_NONE) { 6556fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" requested="); 6566fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly TimeUtils.formatDuration(mInterval, s); 6576fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6586fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" fastest="); 6596fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly TimeUtils.formatDuration(mFastestInterval, s); 6606fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mExpireAt != Long.MAX_VALUE) { 6616fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly long expireIn = mExpireAt - SystemClock.elapsedRealtime(); 6626fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" expireIn="); 6636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly TimeUtils.formatDuration(expireIn, s); 6646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mNumUpdates != Integer.MAX_VALUE){ 6666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" num=").append(mNumUpdates); 6676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(']'); 6696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return s.toString(); 6706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly} 672