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 14648f1a647655f3479bc655d2c3c4873c6aa9b712cgomo 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 15448f1a647655f3479bc655d2c3c4873c6aa9b712cgomo private String mProvider = LocationManager.FUSED_PROVIDER; 15548f1a647655f3479bc655d2c3c4873c6aa9b712cgomo // for deprecated APIs that explicitly request a provider 15648f1a647655f3479bc655d2c3c4873c6aa9b712cgomo 15748f1a647655f3479bc655d2c3c4873c6aa9b712cgomo /** If true, GNSS chipset will make strong tradeoffs to substantially restrict power use */ 15848f1a647655f3479bc655d2c3c4873c6aa9b712cgomo private boolean mLowPowerMode = false; 1596fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 1614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Create a location request with default parameters. 1624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1634e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Default parameters are for a low power, slowly updated location. 1644e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * It can then be adjusted as required by the applications before passing 1654e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to the {@link LocationManager} 1664e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 1674e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return a new location request 1684e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 1696fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static LocationRequest create() { 1706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly LocationRequest request = new LocationRequest(); 1716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return request; 1726fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 1736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1746fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 175c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 1766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static LocationRequest createFromDeprecatedProvider(String provider, long minTime, 1776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly float minDistance, boolean singleShot) { 1786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (minTime < 0) minTime = 0; 1796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (minDistance < 0) minDistance = 0; 1806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly int quality; 1826fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (LocationManager.PASSIVE_PROVIDER.equals(provider)) { 1836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = POWER_NONE; 1846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } else if (LocationManager.GPS_PROVIDER.equals(provider)) { 1856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = ACCURACY_FINE; 1866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } else { 1876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = POWER_LOW; 1886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 1896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 1906fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly LocationRequest request = new LocationRequest() 19148f1a647655f3479bc655d2c3c4873c6aa9b712cgomo .setProvider(provider) 19248f1a647655f3479bc655d2c3c4873c6aa9b712cgomo .setQuality(quality) 19348f1a647655f3479bc655d2c3c4873c6aa9b712cgomo .setInterval(minTime) 19448f1a647655f3479bc655d2c3c4873c6aa9b712cgomo .setFastestInterval(minTime) 19548f1a647655f3479bc655d2c3c4873c6aa9b712cgomo .setSmallestDisplacement(minDistance); 1966fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (singleShot) request.setNumUpdates(1); 1976fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return request; 1986fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 1996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 201c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 2026fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static LocationRequest createFromDeprecatedCriteria(Criteria criteria, long minTime, 2036fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly float minDistance, boolean singleShot) { 2046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (minTime < 0) minTime = 0; 2056fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (minDistance < 0) minDistance = 0; 2066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly int quality; 2086fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly switch (criteria.getAccuracy()) { 2096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case Criteria.ACCURACY_COARSE: 2106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = ACCURACY_BLOCK; 2116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly break; 2126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case Criteria.ACCURACY_FINE: 2136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = ACCURACY_FINE; 2146fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly break; 2156fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly default: { 2166fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly switch (criteria.getPowerRequirement()) { 2176fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case Criteria.POWER_HIGH: 2186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = POWER_HIGH; 219d79b4963e2680078f963fe7afabc28636e7a25c2You Kim break; 2206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly default: 2216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly quality = POWER_LOW; 2226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly LocationRequest request = new LocationRequest() 22748f1a647655f3479bc655d2c3c4873c6aa9b712cgomo .setQuality(quality) 22848f1a647655f3479bc655d2c3c4873c6aa9b712cgomo .setInterval(minTime) 22948f1a647655f3479bc655d2c3c4873c6aa9b712cgomo .setFastestInterval(minTime) 23048f1a647655f3479bc655d2c3c4873c6aa9b712cgomo .setSmallestDisplacement(minDistance); 2316fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (singleShot) request.setNumUpdates(1); 2326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return request; 2336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2346fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2356fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 23648f1a647655f3479bc655d2c3c4873c6aa9b712cgomo public LocationRequest() { 23748f1a647655f3479bc655d2c3c4873c6aa9b712cgomo } 2386fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 23937425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease /** @hide */ 24037425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease public LocationRequest(LocationRequest src) { 24137425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mQuality = src.mQuality; 24237425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mInterval = src.mInterval; 24337425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mFastestInterval = src.mFastestInterval; 24437425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mExplicitFastestInterval = src.mExplicitFastestInterval; 24537425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mExpireAt = src.mExpireAt; 24637425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mNumUpdates = src.mNumUpdates; 24737425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mSmallestDisplacement = src.mSmallestDisplacement; 24837425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease mProvider = src.mProvider; 24982edc9b3482307a8e93655aadabb4f9ad24efe46David Christie mWorkSource = src.mWorkSource; 25040e5782f5c79ea660b98b8875086f592367bc1d2David Christie mHideFromAppOps = src.mHideFromAppOps; 25148f1a647655f3479bc655d2c3c4873c6aa9b712cgomo mLowPowerMode = src.mLowPowerMode; 25237425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease } 25337425c3475877f2fdadb78f669ec57fecf82dca7Victoria Lease 2544e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 2554e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the quality of the request. 2564e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Use with a accuracy constant such as {@link #ACCURACY_FINE}, or a power 2584e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * constant such as {@link #POWER_LOW}. You cannot request both and accuracy and 2594e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * power, only one or the other can be specified. The system will then 2604e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * maximize accuracy or minimize power as appropriate. 2614e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2624e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The quality of the request is a strong hint to the system for which 2634e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * location sources to use. For example, {@link #ACCURACY_FINE} is more likely 2644e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to use GPS, and {@link #POWER_LOW} is more likely to use WIFI & Cell tower 2654e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * positioning, but it also depends on many other factors (such as which sources 2664e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * are available) and is implementation dependent. 2674e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2684e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>{@link #setQuality} and {@link #setInterval} are the most important parameters 2694e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * on a location request. 2704e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2714e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param quality an accuracy or power constant 2724e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 27348f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * @throws InvalidArgumentException if the quality constant is not valid 2744e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 2756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setQuality(int quality) { 2766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkQuality(quality); 2776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mQuality = quality; 2786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 2796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2814e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 2824e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the quality of the request. 2834e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2844e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return an accuracy or power constant 2854e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 2866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public int getQuality() { 2876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mQuality; 2886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 2896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 2904e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 2914e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the desired interval for active location updates, in milliseconds. 2924e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2934e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The location manager will actively try to obtain location updates 2944e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * for your application at this interval, so it has a 2954e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * direct influence on the amount of power used by your application. 2964e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Choose your interval wisely. 2974e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 2984e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This interval is inexact. You may not receive updates at all (if 2994e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * no location sources are available), or you may receive them 3004e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * slower than requested. You may also receive them faster than 3014e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * requested (if other applications are requesting location at a 302d0646dca40ff740bd49755ad60751678b0ccca52Mark Doliner * faster interval). The fastest rate that you will receive 3034e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * updates can be controlled with {@link #setFastestInterval}. 3044e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3054e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Applications with only the coarse location permission may have their 3064e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * interval silently throttled. 3074e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3084e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>An interval of 0 is allowed, but not recommended, since 3094e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * location updates may be extremely fast on future implementations. 3104e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3114e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>{@link #setQuality} and {@link #setInterval} are the most important parameters 3124e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * on a location request. 3134e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3144e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param millis desired interval in millisecond, inexact 3154e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 31648f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * @throws InvalidArgumentException if the interval is less than zero 3174e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setInterval(long millis) { 3196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkInterval(millis); 3206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mInterval = millis; 3214e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly if (!mExplicitFastestInterval) { 32248f1a647655f3479bc655d2c3c4873c6aa9b712cgomo mFastestInterval = (long) (mInterval / FASTEST_INTERVAL_FACTOR); 3234e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly } 3246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 3256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 3266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 3274e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 3284e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the desired interval of this request, in milliseconds. 3294e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3304e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return desired interval in milliseconds, inexact 3314e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public long getInterval() { 3336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mInterval; 3346fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 3356fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 33648f1a647655f3479bc655d2c3c4873c6aa9b712cgomo 33748f1a647655f3479bc655d2c3c4873c6aa9b712cgomo /** 33848f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * Requests the GNSS chipset to run in a low power mode and make strong tradeoffs to 33948f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * substantially restrict power. 34048f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * 34148f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * <p>In this mode, the GNSS chipset will not, on average, run power hungry operations like RF & 342b640517a2e84c53753ff62b5715a7e3efdf42690Yu-Han Yang * signal searches for more than one second per interval (specified by 343b640517a2e84c53753ff62b5715a7e3efdf42690Yu-Han Yang * {@link #setInterval(long)}). 34448f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * 34548f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * @param enabled Enable or disable low power mode 34648f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * @return the same object, so that setters can be chained 34748f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * @hide 34848f1a647655f3479bc655d2c3c4873c6aa9b712cgomo */ 34948f1a647655f3479bc655d2c3c4873c6aa9b712cgomo @SystemApi 35048f1a647655f3479bc655d2c3c4873c6aa9b712cgomo public LocationRequest setLowPowerMode(boolean enabled) { 35148f1a647655f3479bc655d2c3c4873c6aa9b712cgomo mLowPowerMode = enabled; 35248f1a647655f3479bc655d2c3c4873c6aa9b712cgomo return this; 35348f1a647655f3479bc655d2c3c4873c6aa9b712cgomo } 35448f1a647655f3479bc655d2c3c4873c6aa9b712cgomo 35548f1a647655f3479bc655d2c3c4873c6aa9b712cgomo /** 35648f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * Returns true if low power mode is enabled. 35748f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * 35848f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * @hide 35948f1a647655f3479bc655d2c3c4873c6aa9b712cgomo */ 36048f1a647655f3479bc655d2c3c4873c6aa9b712cgomo @SystemApi 36148f1a647655f3479bc655d2c3c4873c6aa9b712cgomo public boolean isLowPowerMode() { 36248f1a647655f3479bc655d2c3c4873c6aa9b712cgomo return mLowPowerMode; 36348f1a647655f3479bc655d2c3c4873c6aa9b712cgomo } 36448f1a647655f3479bc655d2c3c4873c6aa9b712cgomo 3654e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 3664e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Explicitly set the fastest interval for location updates, in 3674e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * milliseconds. 3684e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3694e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This controls the fastest rate at which your application will 3704e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * receive location updates, which might be faster than 3714e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #setInterval} in some situations (for example, if other 3724e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * applications are triggering location updates). 3734e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3744e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This allows your application to passively acquire locations 3754e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * at a rate faster than it actively acquires locations, saving power. 3764e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3774e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>Unlike {@link #setInterval}, this parameter is exact. Your 3784e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * application will never receive updates faster than this value. 3794e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3804e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>If you don't call this method, a fastest interval 3814e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * will be selected for you. It will be a value faster than your 3824e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * active interval ({@link #setInterval}). 3834e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3844e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>An interval of 0 is allowed, but not recommended, since 3854e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * location updates may be extremely fast on future implementations. 3864e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3874e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>If {@link #setFastestInterval} is set slower than {@link #setInterval}, 3884e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * then your effective fastest interval is {@link #setInterval}. 3894e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 3904e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param millis fastest interval for updates in milliseconds, exact 3914e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 39248f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * @throws InvalidArgumentException if the interval is less than zero 3934e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 3946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setFastestInterval(long millis) { 3956fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkInterval(millis); 3964e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly mExplicitFastestInterval = true; 3976fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mFastestInterval = millis; 3986fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 3996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4014e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4024e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the fastest interval of this request, in milliseconds. 4034e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4044e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The system will never provide location updates faster 4054e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * than the minimum of {@link #getFastestInterval} and 4064e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * {@link #getInterval}. 4074e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4084e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return fastest interval in milliseconds, exact 4094e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public long getFastestInterval() { 4116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mFastestInterval; 4126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4144e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4154e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the duration of this request, in milliseconds. 4164e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4174e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The duration begins immediately (and not when the request 4184e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * is passed to the location manager), so call this method again 4194e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * if the request is re-used at a later time. 4204e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4214e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The location manager will automatically stop updates after 4224e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * the request expires. 4234e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4244e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The duration includes suspend time. Values less than 0 4254e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * are allowed, but indicate that the request has already expired. 4264e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4274e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param millis duration of request in milliseconds 4284e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 4294e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4306fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setExpireIn(long millis) { 431e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu long elapsedRealtime = SystemClock.elapsedRealtime(); 432e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu 433e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu // Check for > Long.MAX_VALUE overflow (elapsedRealtime > 0): 434e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu if (millis > Long.MAX_VALUE - elapsedRealtime) { 43548f1a647655f3479bc655d2c3c4873c6aa9b712cgomo mExpireAt = Long.MAX_VALUE; 436e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu } else { 43748f1a647655f3479bc655d2c3c4873c6aa9b712cgomo mExpireAt = millis + elapsedRealtime; 438e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu } 439e72fe16146dd33cb218bf8c16b069f68f331fdf8Laurent Tu 4406fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mExpireAt < 0) mExpireAt = 0; 4416fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 4426fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4436fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4444e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4454e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the request expiration time, in millisecond since boot. 4464e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4474e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This expiration time uses the same time base as {@link SystemClock#elapsedRealtime}. 4484e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4494e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The location manager will automatically stop updates after 4504e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * the request expires. 4514e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4524e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>The duration includes suspend time. Values before {@link SystemClock#elapsedRealtime} 4534e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * are allowed, but indicate that the request has already expired. 4544e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4554e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param millis expiration time of request, in milliseconds since boot including suspend 4564e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 4574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4586fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setExpireAt(long millis) { 4596fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mExpireAt = millis; 4606fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mExpireAt < 0) mExpireAt = 0; 4616fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 4626fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4644e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4654e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the request expiration time, in milliseconds since boot. 4664e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4674e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>This value can be compared to {@link SystemClock#elapsedRealtime} to determine 4684e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * the time until expiration. 4694e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4704e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return expiration time of request, in milliseconds since boot including suspend 4714e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4726fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public long getExpireAt() { 4736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mExpireAt; 4746fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 4756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 4764e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4774e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Set the number of location updates. 4784e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4794e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>By default locations are continuously updated until the request is explicitly 4804e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * removed, however you can optionally request a set number of updates. 4814e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * For example, if your application only needs a single fresh location, 4824e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * then call this method with a value of 1 before passing the request 4834e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * to the location manager. 4844e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 4854e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @param numUpdates the number of location updates requested 4864e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return the same object, so that setters can be chained 48748f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * @throws InvalidArgumentException if numUpdates is 0 or less 4884e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 4894e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly public LocationRequest setNumUpdates(int numUpdates) { 49048f1a647655f3479bc655d2c3c4873c6aa9b712cgomo if (numUpdates <= 0) { 49148f1a647655f3479bc655d2c3c4873c6aa9b712cgomo throw new IllegalArgumentException( 49248f1a647655f3479bc655d2c3c4873c6aa9b712cgomo "invalid numUpdates: " + numUpdates); 49348f1a647655f3479bc655d2c3c4873c6aa9b712cgomo } 4944e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly mNumUpdates = numUpdates; 4954e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly return this; 4964e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly } 4974e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 4984e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly /** 4994e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * Get the number of updates requested. 5004e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * 5014e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * <p>By default this is {@link Integer#MAX_VALUE}, which indicates that 5024e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * locations are updated until the request is explicitly removed. 50348f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * 5044e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly * @return number of updates 5054e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly */ 5066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public int getNumUpdates() { 5076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mNumUpdates; 5086fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 5116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public void decrementNumUpdates() { 5126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mNumUpdates != Integer.MAX_VALUE) { 5136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mNumUpdates--; 5146fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5156fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mNumUpdates < 0) { 5166fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mNumUpdates = 0; 5176fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 522c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 5236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setProvider(String provider) { 5246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkProvider(provider); 5256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mProvider = provider; 5266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 5276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5286fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5296fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 530c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 5316fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public String getProvider() { 5326fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mProvider; 5336fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5346fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5356fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 536c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 5376fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public LocationRequest setSmallestDisplacement(float meters) { 5386fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly checkDisplacement(meters); 5396fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly mSmallestDisplacement = meters; 5406fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return this; 5416fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5426fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5436fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 544c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 5456fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public float getSmallestDisplacement() { 5466fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return mSmallestDisplacement; 5476fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5486fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 5493e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie /** 5503e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * Sets the WorkSource to use for power blaming of this location request. 5513e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5523e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * <p>No permissions are required to make this call, however the LocationManager 5533e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * will throw a SecurityException when requesting location updates if the caller 5543e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * doesn't have the {@link android.Manifest.permission#UPDATE_DEVICE_STATS} permission. 5553e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5563e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @param workSource WorkSource defining power blame for this location request. 5573e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @hide 5583e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie */ 559c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 56082edc9b3482307a8e93655aadabb4f9ad24efe46David Christie public void setWorkSource(WorkSource workSource) { 56182edc9b3482307a8e93655aadabb4f9ad24efe46David Christie mWorkSource = workSource; 56282edc9b3482307a8e93655aadabb4f9ad24efe46David Christie } 56382edc9b3482307a8e93655aadabb4f9ad24efe46David Christie 56482edc9b3482307a8e93655aadabb4f9ad24efe46David Christie /** @hide */ 565c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 56682edc9b3482307a8e93655aadabb4f9ad24efe46David Christie public WorkSource getWorkSource() { 56782edc9b3482307a8e93655aadabb4f9ad24efe46David Christie return mWorkSource; 56882edc9b3482307a8e93655aadabb4f9ad24efe46David Christie } 56982edc9b3482307a8e93655aadabb4f9ad24efe46David Christie 5703e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie /** 5713e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * Sets whether or not this location request should be hidden from AppOps. 5723e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5733e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * <p>Hiding a location request from AppOps will remove user visibility in the UI as to this 5743e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * request's existence. It does not affect power blaming in the Battery page. 5753e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5763e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * <p>No permissions are required to make this call, however the LocationManager 5773e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * will throw a SecurityException when requesting location updates if the caller 5783e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * doesn't have the {@link android.Manifest.permission#UPDATE_APP_OPS_STATS} permission. 5793e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * 5803e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @param hideFromAppOps If true AppOps won't keep track of this location request. 5813e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie * @hide 58248f1a647655f3479bc655d2c3c4873c6aa9b712cgomo * @see android.app.AppOpsManager 5833e32bdd41832d383b03f928cfd2341b9693dc78bDavid Christie */ 584c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 58540e5782f5c79ea660b98b8875086f592367bc1d2David Christie public void setHideFromAppOps(boolean hideFromAppOps) { 58640e5782f5c79ea660b98b8875086f592367bc1d2David Christie mHideFromAppOps = hideFromAppOps; 58740e5782f5c79ea660b98b8875086f592367bc1d2David Christie } 58840e5782f5c79ea660b98b8875086f592367bc1d2David Christie 58940e5782f5c79ea660b98b8875086f592367bc1d2David Christie /** @hide */ 590c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 59140e5782f5c79ea660b98b8875086f592367bc1d2David Christie public boolean getHideFromAppOps() { 59240e5782f5c79ea660b98b8875086f592367bc1d2David Christie return mHideFromAppOps; 59340e5782f5c79ea660b98b8875086f592367bc1d2David Christie } 59440e5782f5c79ea660b98b8875086f592367bc1d2David Christie 5956fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private static void checkInterval(long millis) { 5966fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (millis < 0) { 5976fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly throw new IllegalArgumentException("invalid interval: " + millis); 5986fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 5996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 6016fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private static void checkQuality(int quality) { 6026fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly switch (quality) { 6036fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_FINE: 6046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_BLOCK: 6056fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_CITY: 6066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_NONE: 6076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_LOW: 6086fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_HIGH: 6096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly break; 6106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly default: 6116fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly throw new IllegalArgumentException("invalid quality: " + quality); 6126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6146fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 6156fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private static void checkDisplacement(float meters) { 6166fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (meters < 0.0f) { 6176fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly throw new IllegalArgumentException("invalid displacement: " + meters); 6186fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6196fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6206fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 6216fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly private static void checkProvider(String name) { 6226fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (name == null) { 6236fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly throw new IllegalArgumentException("invalid provider: " + name); 6246fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6256fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6266fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 6276fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static final Parcelable.Creator<LocationRequest> CREATOR = 6286fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly new Parcelable.Creator<LocationRequest>() { 62948f1a647655f3479bc655d2c3c4873c6aa9b712cgomo @Override 63048f1a647655f3479bc655d2c3c4873c6aa9b712cgomo public LocationRequest createFromParcel(Parcel in) { 63148f1a647655f3479bc655d2c3c4873c6aa9b712cgomo LocationRequest request = new LocationRequest(); 63248f1a647655f3479bc655d2c3c4873c6aa9b712cgomo request.setQuality(in.readInt()); 63348f1a647655f3479bc655d2c3c4873c6aa9b712cgomo request.setFastestInterval(in.readLong()); 63448f1a647655f3479bc655d2c3c4873c6aa9b712cgomo request.setInterval(in.readLong()); 63548f1a647655f3479bc655d2c3c4873c6aa9b712cgomo request.setExpireAt(in.readLong()); 63648f1a647655f3479bc655d2c3c4873c6aa9b712cgomo request.setNumUpdates(in.readInt()); 63748f1a647655f3479bc655d2c3c4873c6aa9b712cgomo request.setSmallestDisplacement(in.readFloat()); 63848f1a647655f3479bc655d2c3c4873c6aa9b712cgomo request.setHideFromAppOps(in.readInt() != 0); 63948f1a647655f3479bc655d2c3c4873c6aa9b712cgomo request.setLowPowerMode(in.readInt() != 0); 64048f1a647655f3479bc655d2c3c4873c6aa9b712cgomo String provider = in.readString(); 64148f1a647655f3479bc655d2c3c4873c6aa9b712cgomo if (provider != null) request.setProvider(provider); 64248f1a647655f3479bc655d2c3c4873c6aa9b712cgomo WorkSource workSource = in.readParcelable(null); 64348f1a647655f3479bc655d2c3c4873c6aa9b712cgomo if (workSource != null) request.setWorkSource(workSource); 64448f1a647655f3479bc655d2c3c4873c6aa9b712cgomo return request; 64548f1a647655f3479bc655d2c3c4873c6aa9b712cgomo } 64648f1a647655f3479bc655d2c3c4873c6aa9b712cgomo 64748f1a647655f3479bc655d2c3c4873c6aa9b712cgomo @Override 64848f1a647655f3479bc655d2c3c4873c6aa9b712cgomo public LocationRequest[] newArray(int size) { 64948f1a647655f3479bc655d2c3c4873c6aa9b712cgomo return new LocationRequest[size]; 65048f1a647655f3479bc655d2c3c4873c6aa9b712cgomo } 65148f1a647655f3479bc655d2c3c4873c6aa9b712cgomo }; 6524e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 6536fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 6546fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public int describeContents() { 6556fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return 0; 6566fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6574e31c4fffbc42b4c2b5dca6431cfeef9e078f5b4Nick Pelly 6586fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 6596fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public void writeToParcel(Parcel parcel, int flags) { 6606fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeInt(mQuality); 6616fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeLong(mFastestInterval); 6626fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeLong(mInterval); 6636fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeLong(mExpireAt); 6646fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeInt(mNumUpdates); 6656fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeFloat(mSmallestDisplacement); 66640e5782f5c79ea660b98b8875086f592367bc1d2David Christie parcel.writeInt(mHideFromAppOps ? 1 : 0); 66748f1a647655f3479bc655d2c3c4873c6aa9b712cgomo parcel.writeInt(mLowPowerMode ? 1 : 0); 6686fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly parcel.writeString(mProvider); 66982edc9b3482307a8e93655aadabb4f9ad24efe46David Christie parcel.writeParcelable(mWorkSource, 0); 6706fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6716fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 6726fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly /** @hide */ 6736fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public static String qualityToString(int quality) { 6746fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly switch (quality) { 6756fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_FINE: 6766fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "ACCURACY_FINE"; 6776fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_BLOCK: 6786fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "ACCURACY_BLOCK"; 6796fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case ACCURACY_CITY: 6806fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "ACCURACY_CITY"; 6816fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_NONE: 6826fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "POWER_NONE"; 6836fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_LOW: 6846fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "POWER_LOW"; 6856fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly case POWER_HIGH: 6866fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "POWER_HIGH"; 6876fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly default: 6886fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return "???"; 6896fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6906fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 6916fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly 6926fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly @Override 6936fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly public String toString() { 6946fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly StringBuilder s = new StringBuilder(); 6956fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append("Request[").append(qualityToString(mQuality)); 6966fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mProvider != null) s.append(' ').append(mProvider); 6976fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mQuality != POWER_NONE) { 6986fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" requested="); 6996fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly TimeUtils.formatDuration(mInterval, s); 7006fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 7016fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" fastest="); 7026fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly TimeUtils.formatDuration(mFastestInterval, s); 7036fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly if (mExpireAt != Long.MAX_VALUE) { 7046fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly long expireIn = mExpireAt - SystemClock.elapsedRealtime(); 7056fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" expireIn="); 7066fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly TimeUtils.formatDuration(expireIn, s); 7076fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 70848f1a647655f3479bc655d2c3c4873c6aa9b712cgomo if (mNumUpdates != Integer.MAX_VALUE) { 7096fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(" num=").append(mNumUpdates); 7106fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 71148f1a647655f3479bc655d2c3c4873c6aa9b712cgomo s.append(" lowPowerMode=").append(mLowPowerMode); 7126fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly s.append(']'); 7136fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly return s.toString(); 7146fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly } 7156fa9ad4afcd762aea519ff61811386c23d18ddb2Nick Pelly} 716