178 lines
5.8 KiB
Java
178 lines
5.8 KiB
Java
package androidx.core.location;
|
|
|
|
import android.location.GpsSatellite;
|
|
import android.location.GpsStatus;
|
|
import android.os.Build;
|
|
import androidx.annotation.GuardedBy;
|
|
import androidx.annotation.RestrictTo;
|
|
import androidx.core.util.Preconditions;
|
|
import java.util.Iterator;
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY})
|
|
public class GpsStatusWrapper extends GnssStatusCompat {
|
|
private static final int BEIDOU_PRN_COUNT = 35;
|
|
private static final int BEIDOU_PRN_OFFSET = 200;
|
|
private static final int GLONASS_PRN_COUNT = 24;
|
|
private static final int GLONASS_PRN_OFFSET = 64;
|
|
private static final int GPS_PRN_COUNT = 32;
|
|
private static final int GPS_PRN_OFFSET = 0;
|
|
private static final int QZSS_SVID_MAX = 200;
|
|
private static final int QZSS_SVID_MIN = 193;
|
|
private static final int SBAS_PRN_MAX = 64;
|
|
private static final int SBAS_PRN_MIN = 33;
|
|
private static final int SBAS_PRN_OFFSET = -87;
|
|
@GuardedBy("mWrapped")
|
|
private Iterator<GpsSatellite> mCachedIterator;
|
|
@GuardedBy("mWrapped")
|
|
private int mCachedIteratorPosition;
|
|
@GuardedBy("mWrapped")
|
|
private GpsSatellite mCachedSatellite;
|
|
@GuardedBy("mWrapped")
|
|
private int mCachedSatelliteCount = -1;
|
|
private final GpsStatus mWrapped;
|
|
|
|
public GpsStatusWrapper(GpsStatus gpsStatus) {
|
|
GpsStatus gpsStatus2 = (GpsStatus) Preconditions.checkNotNull(gpsStatus);
|
|
this.mWrapped = gpsStatus2;
|
|
this.mCachedIterator = gpsStatus2.getSatellites().iterator();
|
|
this.mCachedIteratorPosition = -1;
|
|
this.mCachedSatellite = null;
|
|
}
|
|
|
|
private static int getConstellationFromPrn(int i) {
|
|
if (i > 0 && i <= 32) {
|
|
return 1;
|
|
}
|
|
if (i >= 33 && i <= 64) {
|
|
return 2;
|
|
}
|
|
if (i > 64 && i <= 88) {
|
|
return 3;
|
|
}
|
|
if (i <= 200 || i > 235) {
|
|
return (i < QZSS_SVID_MIN || i > 200) ? 0 : 4;
|
|
}
|
|
return 5;
|
|
}
|
|
|
|
private GpsSatellite getSatellite(int i) {
|
|
GpsSatellite gpsSatellite;
|
|
synchronized (this.mWrapped) {
|
|
if (i < this.mCachedIteratorPosition) {
|
|
this.mCachedIterator = this.mWrapped.getSatellites().iterator();
|
|
this.mCachedIteratorPosition = -1;
|
|
}
|
|
while (true) {
|
|
int i2 = this.mCachedIteratorPosition;
|
|
if (i2 >= i) {
|
|
break;
|
|
}
|
|
this.mCachedIteratorPosition = i2 + 1;
|
|
if (!this.mCachedIterator.hasNext()) {
|
|
this.mCachedSatellite = null;
|
|
break;
|
|
}
|
|
this.mCachedSatellite = this.mCachedIterator.next();
|
|
}
|
|
gpsSatellite = this.mCachedSatellite;
|
|
}
|
|
return (GpsSatellite) Preconditions.checkNotNull(gpsSatellite);
|
|
}
|
|
|
|
private static int getSvidFromPrn(int i) {
|
|
int constellationFromPrn = getConstellationFromPrn(i);
|
|
return constellationFromPrn != 2 ? constellationFromPrn != 3 ? constellationFromPrn != 5 ? i : i - 200 : i - 64 : i + 87;
|
|
}
|
|
|
|
public boolean equals(Object obj) {
|
|
if (this == obj) {
|
|
return true;
|
|
}
|
|
if (!(obj instanceof GpsStatusWrapper)) {
|
|
return false;
|
|
}
|
|
return this.mWrapped.equals(((GpsStatusWrapper) obj).mWrapped);
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public float getAzimuthDegrees(int i) {
|
|
return getSatellite(i).getAzimuth();
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public float getBasebandCn0DbHz(int i) {
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public float getCarrierFrequencyHz(int i) {
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public float getCn0DbHz(int i) {
|
|
return getSatellite(i).getSnr();
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public int getConstellationType(int i) {
|
|
if (Build.VERSION.SDK_INT < 24) {
|
|
return 1;
|
|
}
|
|
return getConstellationFromPrn(getSatellite(i).getPrn());
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public float getElevationDegrees(int i) {
|
|
return getSatellite(i).getElevation();
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public int getSatelliteCount() {
|
|
int i;
|
|
synchronized (this.mWrapped) {
|
|
if (this.mCachedSatelliteCount == -1) {
|
|
for (GpsSatellite gpsSatellite : this.mWrapped.getSatellites()) {
|
|
this.mCachedSatelliteCount++;
|
|
}
|
|
this.mCachedSatelliteCount++;
|
|
}
|
|
i = this.mCachedSatelliteCount;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public int getSvid(int i) {
|
|
return Build.VERSION.SDK_INT < 24 ? getSatellite(i).getPrn() : getSvidFromPrn(getSatellite(i).getPrn());
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public boolean hasAlmanacData(int i) {
|
|
return getSatellite(i).hasAlmanac();
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public boolean hasBasebandCn0DbHz(int i) {
|
|
return false;
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public boolean hasCarrierFrequencyHz(int i) {
|
|
return false;
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public boolean hasEphemerisData(int i) {
|
|
return getSatellite(i).hasEphemeris();
|
|
}
|
|
|
|
public int hashCode() {
|
|
return this.mWrapped.hashCode();
|
|
}
|
|
|
|
@Override // androidx.core.location.GnssStatusCompat
|
|
public boolean usedInFix(int i) {
|
|
return getSatellite(i).usedInFix();
|
|
}
|
|
}
|