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