/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.location; import android.annotation.NonNull; import android.util.SparseArray; import java.util.Iterator; import java.util.NoSuchElementException; /** * This class represents the current state of the GPS engine and is used in conjunction with {@link * GpsStatus.Listener}. * * @deprecated Use {@link GnssStatus} instead. */ @Deprecated public final class GpsStatus { private static final int MAX_SATELLITES = 255; private static final int GLONASS_SVID_OFFSET = 64; private static final int BEIDOU_SVID_OFFSET = 200; private static final int SBAS_SVID_OFFSET = -87; private int mTimeToFirstFix; private final SparseArray mSatellites = new SparseArray<>(); private final class SatelliteIterator implements Iterator { private final int mSatellitesCount; private int mIndex = 0; SatelliteIterator() { mSatellitesCount = mSatellites.size(); } @Override public boolean hasNext() { for (; mIndex < mSatellitesCount; ++mIndex) { GpsSatellite satellite = mSatellites.valueAt(mIndex); if (satellite.mValid) { return true; } } return false; } @Override public GpsSatellite next() { while (mIndex < mSatellitesCount) { GpsSatellite satellite = mSatellites.valueAt(mIndex); ++mIndex; if (satellite.mValid) { return satellite; } } throw new NoSuchElementException(); } @Override public void remove() { throw new UnsupportedOperationException(); } } private Iterable mSatelliteList = SatelliteIterator::new; /** * Event sent when the GPS system has started. */ public static final int GPS_EVENT_STARTED = 1; /** * Event sent when the GPS system has stopped. */ public static final int GPS_EVENT_STOPPED = 2; /** * Event sent when the GPS system has received its first fix since starting. * Call {@link #getTimeToFirstFix()} to find the time from start to first fix. */ public static final int GPS_EVENT_FIRST_FIX = 3; /** * Event sent periodically to report GPS satellite status. * Call {@link #getSatellites()} to retrieve the status for each satellite. */ public static final int GPS_EVENT_SATELLITE_STATUS = 4; /** * Used for receiving notifications when GPS status has changed. * * @deprecated Use {@link GnssStatus.Callback} instead. */ @Deprecated public interface Listener { /** * Called to report changes in the GPS status. * The event number is one of: *
    *
  • {@link GpsStatus#GPS_EVENT_STARTED} *
  • {@link GpsStatus#GPS_EVENT_STOPPED} *
  • {@link GpsStatus#GPS_EVENT_FIRST_FIX} *
  • {@link GpsStatus#GPS_EVENT_SATELLITE_STATUS} *
* * When this method is called, the client should call * {@link LocationManager#getGpsStatus} to get additional * status information. * * @param event event number for this notification */ void onGpsStatusChanged(int event); } /** * Used for receiving NMEA sentences from the GPS. * NMEA 0183 is a standard for communicating with marine electronic devices * and is a common method for receiving data from a GPS, typically over a serial port. * See NMEA 0183 for more details. * You can implement this interface and call {@link LocationManager#addNmeaListener} * to receive NMEA data from the GPS engine. * @deprecated use {@link OnNmeaMessageListener} instead. */ @Deprecated public interface NmeaListener { void onNmeaReceived(long timestamp, String nmea); } /** * Builds a GpsStatus from the given GnssStatus. */ @NonNull public static GpsStatus create(@NonNull GnssStatus gnssStatus, int timeToFirstFix) { GpsStatus status = new GpsStatus(); status.setStatus(gnssStatus, timeToFirstFix); return status; } /** * Builds an empty GpsStatus. Should only be used for legacy reasons. * * @hide */ @NonNull static GpsStatus createEmpty() { return new GpsStatus(); } private GpsStatus() { } /** * @hide */ void setStatus(GnssStatus status, int timeToFirstFix) { for (int i = 0; i < mSatellites.size(); i++) { mSatellites.valueAt(i).mValid = false; } mTimeToFirstFix = timeToFirstFix; for (int i = 0; i < status.getSatelliteCount(); i++) { int constellationType = status.getConstellationType(i); int prn = status.getSvid(i); // Other satellites passed through these APIs before GnssSvStatus was availble. // GPS, SBAS & QZSS can pass through at their nominally // assigned prn number (as long as it fits in the valid 0-255 range below.) // Glonass, and Beidou are passed through with the defacto standard offsets // Other future constellation reporting (e.g. Galileo) needs to use // GnssSvStatus on (N level) HAL & Java layers. if (constellationType == GnssStatus.CONSTELLATION_GLONASS) { prn += GLONASS_SVID_OFFSET; } else if (constellationType == GnssStatus.CONSTELLATION_BEIDOU) { prn += BEIDOU_SVID_OFFSET; } else if (constellationType == GnssStatus.CONSTELLATION_SBAS) { prn += SBAS_SVID_OFFSET; } else if ((constellationType != GnssStatus.CONSTELLATION_GPS) && (constellationType != GnssStatus.CONSTELLATION_QZSS)) { continue; } if (prn <= 0 || prn > MAX_SATELLITES) { continue; } GpsSatellite satellite = mSatellites.get(prn); if (satellite == null) { satellite = new GpsSatellite(prn); mSatellites.put(prn, satellite); } satellite.mValid = true; satellite.mSnr = status.getCn0DbHz(i); satellite.mElevation = status.getElevationDegrees(i); satellite.mAzimuth = status.getAzimuthDegrees(i); satellite.mHasEphemeris = status.hasEphemerisData(i); satellite.mHasAlmanac = status.hasAlmanacData(i); satellite.mUsedInFix = status.usedInFix(i); } } /** * Returns the time required to receive the first fix since the most recent * restart of the GPS engine. * * @return time to first fix in milliseconds */ public int getTimeToFirstFix() { return mTimeToFirstFix; } /** * Returns an array of {@link GpsSatellite} objects, which represent the * current state of the GPS engine. * * @return the list of satellites */ public Iterable getSatellites() { return mSatelliteList; } /** * Returns the maximum number of satellites that can be in the satellite * list that can be returned by {@link #getSatellites()}. * * @return the maximum number of satellites */ public int getMaxSatellites() { return mSatellites.size(); } }