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 196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport android.os.Parcel; 206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport android.os.Parcelable; 216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport android.os.SystemClock; 2282edc9b3482307a8e93655aadabb4f9ad24efe46David Christieimport android.os.WorkSource; 236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellyimport android.util.TimeUtils; 246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 254e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 264e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly/** 274e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * A data object that contains quality of service parameters for requests 284e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to the {@link LocationManager}. 294e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 304e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>LocationRequest objects are used to request a quality of service 314e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * for location updates from the Location Manager. 324e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 334e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>For example, if your application wants high accuracy location 344e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * it should create a location request with {@link #setQuality} set to 354e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #ACCURACY_FINE} or {@link #POWER_HIGH}, and it should set 364e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #setInterval} to less than one second. This would be 374e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * appropriate for mapping applications that are showing your location 384e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * in real-time. 394e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 404e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>At the other extreme, if you want negligible power 414e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * impact, but to still receive location updates when available, then use 424e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #setQuality} with {@link #POWER_NONE}. With this request your 434e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * application will not trigger (and therefore will not receive any 444e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * power blame) any location updates, but will receive locations 454e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * triggered by other applications. This would be appropriate for 464e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * applications that have no firm requirement for location, but can 474e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * take advantage when available. 484e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 494e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>In between these two extremes is a very common use-case, where 504e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * applications definitely want to receive 514e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * updates at a specified interval, and can receive them faster when 524e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * available, but still want a low power impact. These applications 534e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * should consider {@link #POWER_LOW} combined with a faster 544e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #setFastestInterval} (such as 1 minute) and a slower 554e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #setInterval} (such as 60 minutes). They will only be assigned 564e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * power blame for the interval set by {@link #setInterval}, but can 574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * still receive locations triggered by other applications at a rate up 584e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to {@link #setFastestInterval}. This style of request is appropriate for 594e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * many location aware applications, including background usage. Do be 604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * careful to also throttle {@link #setFastestInterval} if you perform 614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * heavy-weight work after receiving an update - such as using the network. 624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 634e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Activities should strongly consider removing all location 644e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * request when entering the background 654e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * (for example at {@link android.app.Activity#onPause}), or 664e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * at least swap the request to a larger interval and lower quality. 674e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Future version of the location manager may automatically perform background 684e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * throttling on behalf of applications. 694e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 704e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Applications cannot specify the exact location sources that are 714e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * used by Android's <em>Fusion Engine</em>. In fact, the system 724e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * may have multiple location sources (providers) running and may 734e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * fuse the results from several sources into a single Location object. 744e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 754e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Location requests from applications with 764e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} and not 774e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} will 784e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * be automatically throttled to a slower interval, and the location 794e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * object will be obfuscated to only show a coarse level of accuracy. 804e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 814e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>All location requests are considered hints, and you may receive 824e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * locations that are more accurate, less accurate, and slower 834e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * than requested. 847ab7f538924371a9dd4be7a27a6ae3b4c04b301cLaurent Tu * 857ab7f538924371a9dd4be7a27a6ae3b4c04b301cLaurent Tu * @hide 864e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pellypublic final class LocationRequest implements Parcelable { 884e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 894e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Used with {@link #setQuality} to request the most accurate locations available. 904e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 914e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This may be up to 1 meter accuracy, although this is implementation dependent. 924e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 934e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly public static final int ACCURACY_FINE = 100; 944e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 954e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 964e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Used with {@link #setQuality} to request "block" level accuracy. 974e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 984e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Block level accuracy is considered to be about 100 meter accuracy, 994e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * although this is implementation dependent. Using a coarse accuracy 1004e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * such as this often consumes less power. 1014e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1024e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly public static final int ACCURACY_BLOCK = 102; 1034e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 1044e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1054e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Used with {@link #setQuality} to request "city" level accuracy. 1064e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1074e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>City level accuracy is considered to be about 10km accuracy, 1084e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * although this is implementation dependent. Using a coarse accuracy 1094e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * such as this often consumes less power. 1104e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1114e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly public static final int ACCURACY_CITY = 104; 1124e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 1134e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1144e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Used with {@link #setQuality} to require no direct power impact (passive locations). 1154e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1164e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This location request will not trigger any active location requests, 1174e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * but will receive locations triggered by other applications. Your application 1184e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * will not receive any direct power blame for location work. 1194e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static final int POWER_NONE = 200; 1214e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 1224e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1234e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Used with {@link #setQuality} to request low power impact. 1244e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1254e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This location request will avoid high power location work where 1264e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * possible. 1274e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1286fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static final int POWER_LOW = 201; 1294e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 1304e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1314e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Used with {@link #setQuality} to allow high power consumption for location. 1324e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1334e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This location request will allow high power location work. 1344e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1356fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static final int POWER_HIGH = 203; 1366fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1374e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1384e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * By default, mFastestInterval = FASTEST_INTERVAL_MULTIPLE * mInterval 1394e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1404e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly private static final double FASTEST_INTERVAL_FACTOR = 6.0; // 6x 1414e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 1426fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private int mQuality = POWER_LOW; 1434e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly private long mInterval = 60 * 60 * 1000; // 60 minutes 1444e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly private long mFastestInterval = (long)(mInterval / FASTEST_INTERVAL_FACTOR); // 10 minutes 1454e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly private boolean mExplicitFastestInterval = false; 1466fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private long mExpireAt = Long.MAX_VALUE; // no expiry 1476fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private int mNumUpdates = Integer.MAX_VALUE; // no expiry 1486fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private float mSmallestDisplacement = 0.0f; // meters 1496de10472786ee17106b096eddbb603ab735c11a7David Christie private WorkSource mWorkSource = null; 15040e5782f5c79ea660b98b8875086f592367bc1d2David Christie private boolean mHideFromAppOps = false; // True if this request shouldn't be counted by AppOps 1516fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 15209016ab4dd056a16809419d612cb865a14980880Victoria Lease private String mProvider = LocationManager.FUSED_PROVIDER; // for deprecated APIs that explicitly request a provider 1536fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1544e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1554e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Create a location request with default parameters. 1564e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Default parameters are for a low power, slowly updated location. 1584e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * It can then be adjusted as required by the applications before passing 1594e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to the {@link LocationManager} 1604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return a new location request 1624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static LocationRequest create() { 1646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly LocationRequest request = new LocationRequest(); 1656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return request; 1666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 1676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 1696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static LocationRequest createFromDeprecatedProvider(String provider, long minTime, 1706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly float minDistance, boolean singleShot) { 1716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (minTime < 0) minTime = 0; 1726fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (minDistance < 0) minDistance = 0; 1736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1746fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly int quality; 1756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (LocationManager.PASSIVE_PROVIDER.equals(provider)) { 1766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = POWER_NONE; 1776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } else if (LocationManager.GPS_PROVIDER.equals(provider)) { 1786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = ACCURACY_FINE; 1796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } else { 1806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = POWER_LOW; 1816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 1826fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly LocationRequest request = new LocationRequest() 1846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setProvider(provider) 1856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setQuality(quality) 1866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setInterval(minTime) 1876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setFastestInterval(minTime) 1886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setSmallestDisplacement(minDistance); 1896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (singleShot) request.setNumUpdates(1); 1906fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return request; 1916fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 1926fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1936fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 1946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static LocationRequest createFromDeprecatedCriteria(Criteria criteria, long minTime, 1956fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly float minDistance, boolean singleShot) { 1966fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (minTime < 0) minTime = 0; 1976fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (minDistance < 0) minDistance = 0; 1986fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly int quality; 2006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly switch (criteria.getAccuracy()) { 2016fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case Criteria.ACCURACY_COARSE: 2026fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = ACCURACY_BLOCK; 2036fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly break; 2046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case Criteria.ACCURACY_FINE: 2056fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = ACCURACY_FINE; 2066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly break; 2076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly default: { 2086fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly switch (criteria.getPowerRequirement()) { 2096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case Criteria.POWER_HIGH: 2106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = POWER_HIGH; 2116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly default: 2126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = POWER_LOW; 2136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2146fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2156fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2166fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2176fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly LocationRequest request = new LocationRequest() 2186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setQuality(quality) 2196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setInterval(minTime) 2206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setFastestInterval(minTime) 2216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly .setSmallestDisplacement(minDistance); 2226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (singleShot) request.setNumUpdates(1); 2236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return request; 2246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 2276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest() { } 2286fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 22937425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease /** @hide */ 23037425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease public LocationRequest(LocationRequest src) { 23137425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mQuality = src.mQuality; 23237425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mInterval = src.mInterval; 23337425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mFastestInterval = src.mFastestInterval; 23437425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mExplicitFastestInterval = src.mExplicitFastestInterval; 23537425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mExpireAt = src.mExpireAt; 23637425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mNumUpdates = src.mNumUpdates; 23737425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mSmallestDisplacement = src.mSmallestDisplacement; 23837425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mProvider = src.mProvider; 23982edc9b3482307a8e93655aadabb4f9ad24efe46David Christie mWorkSource = src.mWorkSource; 24040e5782f5c79ea660b98b8875086f592367bc1d2David Christie mHideFromAppOps = src.mHideFromAppOps; 24137425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease } 24237425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease 2434e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 2444e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the quality of the request. 2454e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2464e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Use with a accuracy constant such as {@link #ACCURACY_FINE}, or a power 2474e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * constant such as {@link #POWER_LOW}. You cannot request both and accuracy and 2484e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * power, only one or the other can be specified. The system will then 2494e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * maximize accuracy or minimize power as appropriate. 2504e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2514e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The quality of the request is a strong hint to the system for which 2524e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * location sources to use. For example, {@link #ACCURACY_FINE} is more likely 2534e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to use GPS, and {@link #POWER_LOW} is more likely to use WIFI & Cell tower 2544e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * positioning, but it also depends on many other factors (such as which sources 2554e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * are available) and is implementation dependent. 2564e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>{@link #setQuality} and {@link #setInterval} are the most important parameters 2584e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * on a location request. 2594e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param quality an accuracy or power constant 2614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @throws InvalidArgumentException if the quality constant is not valid 2624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 2634e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 2646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setQuality(int quality) { 2656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkQuality(quality); 2666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mQuality = quality; 2676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 2686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2704e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 2714e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the quality of the request. 2724e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2734e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return an accuracy or power constant 2744e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 2756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public int getQuality() { 2766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mQuality; 2776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2794e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 2804e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the desired interval for active location updates, in milliseconds. 2814e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2824e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The location manager will actively try to obtain location updates 2834e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * for your application at this interval, so it has a 2844e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * direct influence on the amount of power used by your application. 2854e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Choose your interval wisely. 2864e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2874e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This interval is inexact. You may not receive updates at all (if 2884e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * no location sources are available), or you may receive them 2894e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * slower than requested. You may also receive them faster than 2904e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * requested (if other applications are requesting location at a 2914e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * faster interval). The fastest rate that that you will receive 2924e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * updates can be controlled with {@link #setFastestInterval}. 2934e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2944e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Applications with only the coarse location permission may have their 2954e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * interval silently throttled. 2964e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2974e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>An interval of 0 is allowed, but not recommended, since 2984e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * location updates may be extremely fast on future implementations. 2994e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3004e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>{@link #setQuality} and {@link #setInterval} are the most important parameters 3014e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * on a location request. 3024e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3034e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param millis desired interval in millisecond, inexact 3044e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @throws InvalidArgumentException if the interval is less than zero 3054e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 3064e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setInterval(long millis) { 3086fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkInterval(millis); 3096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mInterval = millis; 3104e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly if (!mExplicitFastestInterval) { 3114e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly mFastestInterval = (long)(mInterval / FASTEST_INTERVAL_FACTOR); 3124e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly } 3136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 3146fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 3156fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 3164e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 3174e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the desired interval of this request, in milliseconds. 3184e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3194e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return desired interval in milliseconds, inexact 3204e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public long getInterval() { 3226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mInterval; 3236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 3246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 3254e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 3264e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Explicitly set the fastest interval for location updates, in 3274e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * milliseconds. 3284e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3294e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This controls the fastest rate at which your application will 3304e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * receive location updates, which might be faster than 3314e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #setInterval} in some situations (for example, if other 3324e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * applications are triggering location updates). 3334e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3344e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This allows your application to passively acquire locations 3354e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * at a rate faster than it actively acquires locations, saving power. 3364e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3374e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Unlike {@link #setInterval}, this parameter is exact. Your 3384e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * application will never receive updates faster than this value. 3394e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3404e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>If you don't call this method, a fastest interval 3414e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * will be selected for you. It will be a value faster than your 3424e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * active interval ({@link #setInterval}). 3434e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3444e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>An interval of 0 is allowed, but not recommended, since 3454e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * location updates may be extremely fast on future implementations. 3464e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3474e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>If {@link #setFastestInterval} is set slower than {@link #setInterval}, 3484e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * then your effective fastest interval is {@link #setInterval}. 3494e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3504e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param millis fastest interval for updates in milliseconds, exact 3514e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @throws InvalidArgumentException if the interval is less than zero 3524e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 3534e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3546fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setFastestInterval(long millis) { 3556fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkInterval(millis); 3564e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly mExplicitFastestInterval = true; 3576fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mFastestInterval = millis; 3586fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 3596fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 3606fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 3614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 3624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the fastest interval of this request, in milliseconds. 3634e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3644e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The system will never provide location updates faster 3654e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * than the minimum of {@link #getFastestInterval} and 3664e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #getInterval}. 3674e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3684e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return fastest interval in milliseconds, exact 3694e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public long getFastestInterval() { 3716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mFastestInterval; 3726fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 3736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 3744e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 3754e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the duration of this request, in milliseconds. 3764e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3774e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The duration begins immediately (and not when the request 3784e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * is passed to the location manager), so call this method again 3794e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * if the request is re-used at a later time. 3804e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3814e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The location manager will automatically stop updates after 3824e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * the request expires. 3834e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3844e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The duration includes suspend time. Values less than 0 3854e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * are allowed, but indicate that the request has already expired. 3864e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3874e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param millis duration of request in milliseconds 3884e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 3894e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3906fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setExpireIn(long millis) { 391e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu long elapsedRealtime = SystemClock.elapsedRealtime(); 392e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu 393e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu // Check for > Long.MAX_VALUE overflow (elapsedRealtime > 0): 394e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu if (millis > Long.MAX_VALUE - elapsedRealtime) { 395e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu mExpireAt = Long.MAX_VALUE; 396e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu } else { 397e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu mExpireAt = millis + elapsedRealtime; 398e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu } 399e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu 4006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mExpireAt < 0) mExpireAt = 0; 4016fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 4026fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4036fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4044e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4054e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the request expiration time, in millisecond since boot. 4064e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4074e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This expiration time uses the same time base as {@link SystemClock#elapsedRealtime}. 4084e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4094e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The location manager will automatically stop updates after 4104e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * the request expires. 4114e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4124e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The duration includes suspend time. Values before {@link SystemClock#elapsedRealtime} 4134e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * are allowed, but indicate that the request has already expired. 4144e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4154e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param millis expiration time of request, in milliseconds since boot including suspend 4164e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 4174e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setExpireAt(long millis) { 4196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mExpireAt = millis; 4206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mExpireAt < 0) mExpireAt = 0; 4216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 4226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4244e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4254e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the request expiration time, in milliseconds since boot. 4264e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4274e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This value can be compared to {@link SystemClock#elapsedRealtime} to determine 4284e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * the time until expiration. 4294e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4304e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return expiration time of request, in milliseconds since boot including suspend 4314e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public long getExpireAt() { 4336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mExpireAt; 4346fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4356fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4364e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4374e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the number of location updates. 4384e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4394e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>By default locations are continuously updated until the request is explicitly 4404e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * removed, however you can optionally request a set number of updates. 4414e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * For example, if your application only needs a single fresh location, 4424e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * then call this method with a value of 1 before passing the request 4434e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to the location manager. 4444e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4454e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param numUpdates the number of location updates requested 4464e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @throws InvalidArgumentException if numUpdates is 0 or less 4474e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 4484e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4494e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly public LocationRequest setNumUpdates(int numUpdates) { 4504e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly if (numUpdates <= 0) throw new IllegalArgumentException("invalid numUpdates: " + numUpdates); 4514e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly mNumUpdates = numUpdates; 4524e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly return this; 4534e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly } 4544e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 4554e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4564e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the number of updates requested. 4574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4584e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>By default this is {@link Integer#MAX_VALUE}, which indicates that 4594e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * locations are updated until the request is explicitly removed. 4604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return number of updates 4614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4626fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public int getNumUpdates() { 4636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mNumUpdates; 4646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 4676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public void decrementNumUpdates() { 4686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mNumUpdates != Integer.MAX_VALUE) { 4696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mNumUpdates--; 4706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mNumUpdates < 0) { 4726fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mNumUpdates = 0; 4736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4746fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 4786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setProvider(String provider) { 4796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkProvider(provider); 4806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mProvider = provider; 4816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 4826fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 4856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public String getProvider() { 4866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mProvider; 4876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 4906fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setSmallestDisplacement(float meters) { 4916fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkDisplacement(meters); 4926fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mSmallestDisplacement = meters; 4936fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 4946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4956fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4966fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 4976fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public float getSmallestDisplacement() { 4986fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mSmallestDisplacement; 4996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5013e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie /** 5023e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * Sets the WorkSource to use for power blaming of this location request. 5033e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5043e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * <p>No permissions are required to make this call, however the LocationManager 5053e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * will throw a SecurityException when requesting location updates if the caller 5063e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * doesn't have the {@link android.Manifest.permission#UPDATE_DEVICE_STATS} permission. 5073e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5083e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @param workSource WorkSource defining power blame for this location request. 5093e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @hide 5103e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie */ 51182edc9b3482307a8e93655aadabb4f9ad24efe46David Christie public void setWorkSource(WorkSource workSource) { 51282edc9b3482307a8e93655aadabb4f9ad24efe46David Christie mWorkSource = workSource; 51382edc9b3482307a8e93655aadabb4f9ad24efe46David Christie } 51482edc9b3482307a8e93655aadabb4f9ad24efe46David Christie 51582edc9b3482307a8e93655aadabb4f9ad24efe46David Christie /** @hide */ 51682edc9b3482307a8e93655aadabb4f9ad24efe46David Christie public WorkSource getWorkSource() { 51782edc9b3482307a8e93655aadabb4f9ad24efe46David Christie return mWorkSource; 51882edc9b3482307a8e93655aadabb4f9ad24efe46David Christie } 51982edc9b3482307a8e93655aadabb4f9ad24efe46David Christie 5203e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie /** 5213e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * Sets whether or not this location request should be hidden from AppOps. 5223e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5233e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * <p>Hiding a location request from AppOps will remove user visibility in the UI as to this 5243e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * request's existence. It does not affect power blaming in the Battery page. 5253e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5263e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * <p>No permissions are required to make this call, however the LocationManager 5273e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * will throw a SecurityException when requesting location updates if the caller 5283e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * doesn't have the {@link android.Manifest.permission#UPDATE_APP_OPS_STATS} permission. 5293e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5303e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @param hideFromAppOps If true AppOps won't keep track of this location request. 5313e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @see android.app.AppOpsManager 5323e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @hide 5333e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie */ 53440e5782f5c79ea660b98b8875086f592367bc1d2David Christie public void setHideFromAppOps(boolean hideFromAppOps) { 53540e5782f5c79ea660b98b8875086f592367bc1d2David Christie mHideFromAppOps = hideFromAppOps; 53640e5782f5c79ea660b98b8875086f592367bc1d2David Christie } 53740e5782f5c79ea660b98b8875086f592367bc1d2David Christie 53840e5782f5c79ea660b98b8875086f592367bc1d2David Christie /** @hide */ 53940e5782f5c79ea660b98b8875086f592367bc1d2David Christie public boolean getHideFromAppOps() { 54040e5782f5c79ea660b98b8875086f592367bc1d2David Christie return mHideFromAppOps; 54140e5782f5c79ea660b98b8875086f592367bc1d2David Christie } 54240e5782f5c79ea660b98b8875086f592367bc1d2David Christie 5436fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private static void checkInterval(long millis) { 5446fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (millis < 0) { 5456fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly throw new IllegalArgumentException("invalid interval: " + millis); 5466fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5476fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5486fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5496fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private static void checkQuality(int quality) { 5506fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly switch (quality) { 5516fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_FINE: 5526fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_BLOCK: 5536fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_CITY: 5546fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_NONE: 5556fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_LOW: 5566fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_HIGH: 5576fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly break; 5586fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly default: 5596fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly throw new IllegalArgumentException("invalid quality: " + quality); 5606fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5616fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5626fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private static void checkDisplacement(float meters) { 5646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (meters < 0.0f) { 5656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly throw new IllegalArgumentException("invalid displacement: " + meters); 5666fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5676fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private static void checkProvider(String name) { 5706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (name == null) { 5716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly throw new IllegalArgumentException("invalid provider: " + name); 5726fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5746fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static final Parcelable.Creator<LocationRequest> CREATOR = 5766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly new Parcelable.Creator<LocationRequest>() { 5776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 5786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest createFromParcel(Parcel in) { 5796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly LocationRequest request = new LocationRequest(); 5806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly request.setQuality(in.readInt()); 5816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly request.setFastestInterval(in.readLong()); 5826fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly request.setInterval(in.readLong()); 5836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly request.setExpireAt(in.readLong()); 5846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly request.setNumUpdates(in.readInt()); 5856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly request.setSmallestDisplacement(in.readFloat()); 58640e5782f5c79ea660b98b8875086f592367bc1d2David Christie request.setHideFromAppOps(in.readInt() != 0); 5876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly String provider = in.readString(); 5886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (provider != null) request.setProvider(provider); 589def20a3350ce239b929ef0ebbbf913cc0b42cf5fDavid Christie WorkSource workSource = in.readParcelable(null); 59082edc9b3482307a8e93655aadabb4f9ad24efe46David Christie if (workSource != null) request.setWorkSource(workSource); 5916fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return request; 5926fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5936fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 5946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest[] newArray(int size) { 5956fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return new LocationRequest[size]; 5966fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5976fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly }; 5984e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 5996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 6006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public int describeContents() { 6016fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return 0; 6026fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6034e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 6046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 6056fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public void writeToParcel(Parcel parcel, int flags) { 6066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeInt(mQuality); 6076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeLong(mFastestInterval); 6086fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeLong(mInterval); 6096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeLong(mExpireAt); 6106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeInt(mNumUpdates); 6116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeFloat(mSmallestDisplacement); 61240e5782f5c79ea660b98b8875086f592367bc1d2David Christie parcel.writeInt(mHideFromAppOps ? 1 : 0); 6136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeString(mProvider); 61482edc9b3482307a8e93655aadabb4f9ad24efe46David Christie parcel.writeParcelable(mWorkSource, 0); 6156fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6166fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 6176fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 6186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static String qualityToString(int quality) { 6196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly switch (quality) { 6206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_FINE: 6216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "ACCURACY_FINE"; 6226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_BLOCK: 6236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "ACCURACY_BLOCK"; 6246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_CITY: 6256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "ACCURACY_CITY"; 6266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_NONE: 6276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "POWER_NONE"; 6286fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_LOW: 6296fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "POWER_LOW"; 6306fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_HIGH: 6316fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "POWER_HIGH"; 6326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly default: 6336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "???"; 6346fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6356fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6366fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 6376fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 6386fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public String toString() { 6396fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly StringBuilder s = new StringBuilder(); 6406fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append("Request[").append(qualityToString(mQuality)); 6416fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mProvider != null) s.append(' ').append(mProvider); 6426fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mQuality != POWER_NONE) { 6436fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" requested="); 6446fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly TimeUtils.formatDuration(mInterval, s); 6456fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6466fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" fastest="); 6476fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly TimeUtils.formatDuration(mFastestInterval, s); 6486fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mExpireAt != Long.MAX_VALUE) { 6496fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly long expireIn = mExpireAt - SystemClock.elapsedRealtime(); 6506fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" expireIn="); 6516fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly TimeUtils.formatDuration(expireIn, s); 6526fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6536fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mNumUpdates != Integer.MAX_VALUE){ 6546fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" num=").append(mNumUpdates); 6556fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6566fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(']'); 6576fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return s.toString(); 6586fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6596fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly} 660