19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.location;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
196bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaaimport android.util.SparseArray;
206bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.NoSuchElementException;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class represents the current state of the GPS engine.
27e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang *
28e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * <p>This class is used in conjunction with the {@link Listener} interface.
29e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang *
30e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang * @deprecated use {@link GnssStatus} and {@link GnssStatus.Callback}.
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
32e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang@Deprecated
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class GpsStatus {
34b7c4ae91d95cfdb9a87eca1f543ddb2fa38a7c45Mike Lockwood    private static final int NUM_SATELLITES = 255;
3549d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley    private static final int GLONASS_SVID_OFFSET = 64;
3649d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley    private static final int BEIDOU_SVID_OFFSET = 200;
37f6527aebbce5e2b6b771fa42ae499c2e7584bd26Wyatt Riley    private static final int SBAS_SVID_OFFSET = -87;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* These package private values are modified by the LocationManager class */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mTimeToFirstFix;
416bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa    private final SparseArray<GpsSatellite> mSatellites = new SparseArray<>();
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final class SatelliteIterator implements Iterator<GpsSatellite> {
446bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa        private final int mSatellitesCount;
456bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa
466bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa        private int mIndex = 0;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4830f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang        SatelliteIterator() {
4930f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang            mSatellitesCount = mSatellites.size();
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5230f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang        @Override
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean hasNext() {
546bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa            for (; mIndex < mSatellitesCount; ++mIndex) {
556bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa                GpsSatellite satellite = mSatellites.valueAt(mIndex);
566bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa                if (satellite.mValid) {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6330f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang        @Override
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public GpsSatellite next() {
656bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa            while (mIndex < mSatellitesCount) {
666bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa                GpsSatellite satellite = mSatellites.valueAt(mIndex);
676bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa                ++mIndex;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (satellite.mValid) {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return satellite;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NoSuchElementException();
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7530f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang        @Override
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void remove() {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new UnsupportedOperationException();
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Iterable<GpsSatellite> mSatelliteList = new Iterable<GpsSatellite>() {
8230f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang        @Override
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Iterator<GpsSatellite> iterator() {
8430f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang            return new SatelliteIterator();
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Event sent when the GPS system has started.
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int GPS_EVENT_STARTED = 1;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Event sent when the GPS system has stopped.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int GPS_EVENT_STOPPED = 2;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Event sent when the GPS system has received its first fix since starting.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call {@link #getTimeToFirstFix()} to find the time from start to first fix.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int GPS_EVENT_FIRST_FIX = 3;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Event sent periodically to report GPS satellite status.
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call {@link #getSatellites()} to retrieve the status for each satellite.
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int GPS_EVENT_SATELLITE_STATUS = 4;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used for receiving notifications when GPS status has changed.
112e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * @deprecated use {@link GnssStatus.Callback} instead.
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
114e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang    @Deprecated
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface Listener {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called to report changes in the GPS status.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The event number is one of:
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <ul>
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <li> {@link GpsStatus#GPS_EVENT_STARTED}
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <li> {@link GpsStatus#GPS_EVENT_STOPPED}
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <li> {@link GpsStatus#GPS_EVENT_FIRST_FIX}
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <li> {@link GpsStatus#GPS_EVENT_SATELLITE_STATUS}
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * </ul>
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1266bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa         * When this method is called, the client should call
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@link LocationManager#getGpsStatus} to get additional
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * status information.
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event event number for this notification
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onGpsStatusChanged(int event);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
135b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood    /**
136640992dec96fa88f0bbd42c6a02902640a000b35Mike Lockwood     * Used for receiving NMEA sentences from the GPS.
137640992dec96fa88f0bbd42c6a02902640a000b35Mike Lockwood     * NMEA 0183 is a standard for communicating with marine electronic devices
138640992dec96fa88f0bbd42c6a02902640a000b35Mike Lockwood     * and is a common method for receiving data from a GPS, typically over a serial port.
139640992dec96fa88f0bbd42c6a02902640a000b35Mike Lockwood     * See <a href="http://en.wikipedia.org/wiki/NMEA_0183">NMEA 0183</a> for more details.
140640992dec96fa88f0bbd42c6a02902640a000b35Mike Lockwood     * You can implement this interface and call {@link LocationManager#addNmeaListener}
141640992dec96fa88f0bbd42c6a02902640a000b35Mike Lockwood     * to receive NMEA data from the GPS engine.
142e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang     * @deprecated use {@link OnNmeaMessageListener} instead.
143b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood     */
144e8abe8e5ad830bd130b258c6801d75f6542200b5Lifu Tang    @Deprecated
145b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood    public interface NmeaListener {
146b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood        void onNmeaReceived(long timestamp, String nmea);
147b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood    }
148b16e7800be4f879135f239f1f8f586f3712df01eMike Lockwood
1496bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa    // For API-compat a public ctor() is not available
1506bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa    GpsStatus() {}
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15276a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang    private void setStatus(int svCount, int[] svidWithFlags, float[] cn0s, float[] elevations,
153120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang            float[] azimuths) {
1546bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa        clearSatellites();
1556bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa        for (int i = 0; i < svCount; i++) {
156120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang            final int constellationType =
157120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang                    (svidWithFlags[i] >> GnssStatus.CONSTELLATION_TYPE_SHIFT_WIDTH)
158120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang                    & GnssStatus.CONSTELLATION_TYPE_MASK;
15949d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley            int prn = svidWithFlags[i] >> GnssStatus.SVID_SHIFT_WIDTH;
16049d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley            // Other satellites passed through these APIs before GnssSvStatus was availble.
16149d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley            // GPS, SBAS & QZSS can pass through at their nominally
16249d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley            // assigned prn number (as long as it fits in the valid 0-255 range below.)
16349d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley            // Glonass, and Beidou are passed through with the defacto standard offsets
16449d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley            // Other future constellation reporting (e.g. Galileo) needs to use
16549d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley            // GnssSvStatus on (N level) HAL & Java layers.
16649d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley            if (constellationType == GnssStatus.CONSTELLATION_GLONASS) {
16749d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley                prn += GLONASS_SVID_OFFSET;
16849d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley            } else if (constellationType == GnssStatus.CONSTELLATION_BEIDOU) {
16949d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley                prn += BEIDOU_SVID_OFFSET;
170f6527aebbce5e2b6b771fa42ae499c2e7584bd26Wyatt Riley            } else if (constellationType == GnssStatus.CONSTELLATION_SBAS) {
171f6527aebbce5e2b6b771fa42ae499c2e7584bd26Wyatt Riley                prn += SBAS_SVID_OFFSET;
17249d9891c573f8c4994841b24f8d90690c342e8aeWyatt Riley            } else if ((constellationType != GnssStatus.CONSTELLATION_GPS) &&
173f6527aebbce5e2b6b771fa42ae499c2e7584bd26Wyatt Riley                    (constellationType != GnssStatus.CONSTELLATION_QZSS)) {
17430f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang                continue;
17530f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang            }
1766bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa            if (prn > 0 && prn <= NUM_SATELLITES) {
1776bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa                GpsSatellite satellite = mSatellites.get(prn);
1786bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa                if (satellite == null) {
1796bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa                    satellite = new GpsSatellite(prn);
1806bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa                    mSatellites.put(prn, satellite);
1816bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa                }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
183a3d2d769833c7b796d073fb4002efe21142a7dc4Mike Lockwood                satellite.mValid = true;
18476a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang                satellite.mSnr = cn0s[i];
185a3d2d769833c7b796d073fb4002efe21142a7dc4Mike Lockwood                satellite.mElevation = elevations[i];
186a3d2d769833c7b796d073fb4002efe21142a7dc4Mike Lockwood                satellite.mAzimuth = azimuths[i];
18730f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang                satellite.mHasEphemeris =
188120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang                        (svidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA) != 0;
18930f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang                satellite.mHasAlmanac =
190120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang                        (svidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_ALMANAC_DATA) != 0;
19130f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang                satellite.mUsedInFix =
192120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang                        (svidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) != 0;
193a3d2d769833c7b796d073fb4002efe21142a7dc4Mike Lockwood            }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19830f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang     * Copies GPS satellites information from GnssStatus object.
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Since this method is only used within {@link LocationManager#getGpsStatus},
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it does not need to be synchronized.
20130f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang     * @hide
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20330f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang    void setStatus(GnssStatus status, int timeToFirstFix) {
20430f95a7d67870c28d2aaa88ee989c099f5670225Lifu Tang        mTimeToFirstFix = timeToFirstFix;
20576a620f0482ba54a4921c7c7e7eeb8ea87c12d3eLifu Tang        setStatus(status.mSvCount, status.mSvidWithFlags, status.mCn0DbHz, status.mElevations,
206120480f17ae18bbe8c6fa7ec4854281fdf349b59Lifu Tang                status.mAzimuths);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setTimeToFirstFix(int ttff) {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTimeToFirstFix = ttff;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2146bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa     * Returns the time required to receive the first fix since the most recent
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * restart of the GPS engine.
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return time to first fix in milliseconds
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getTimeToFirstFix() {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTimeToFirstFix;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns an array of {@link GpsSatellite} objects, which represent the
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current state of the GPS engine.
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the list of satellites
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Iterable<GpsSatellite> getSatellites() {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSatelliteList;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the maximum number of satellites that can be in the satellite
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * list that can be returned by {@link #getSatellites()}.
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the maximum number of satellites
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getMaxSatellites() {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NUM_SATELLITES;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2426bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa
2436bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa    private void clearSatellites() {
2446bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa        int satellitesCount = mSatellites.size();
2456bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa        for (int i = 0; i < satellitesCount; i++) {
2466bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa            GpsSatellite satellite = mSatellites.valueAt(i);
2476bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa            satellite.mValid = false;
2486bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa        }
2496bde4683ae1f70f7b5e53f853b6a7479bcebd5d5destradaa    }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
251