Merge "Fixes to GnssAntennaInfo API"
This commit is contained in:
committed by
Android (Google) Code Review
commit
fe446f7f24
@@ -16,72 +16,37 @@
|
||||
|
||||
package android.location;
|
||||
|
||||
import android.annotation.IntDef;
|
||||
import android.annotation.FloatRange;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* A class that contains information about a GNSS antenna. GNSS antenna characteristics can change
|
||||
* with device configuration, such as when a device is folded open or closed. Antenna information is
|
||||
* delivered to registered instances of {@link Callback}.
|
||||
* delivered to registered instances of {@link Listener}.
|
||||
*/
|
||||
public final class GnssAntennaInfo implements Parcelable {
|
||||
private final double mCarrierFrequencyMHz;
|
||||
private final PhaseCenterOffsetCoordinates mPhaseCenterOffsetCoordinates;
|
||||
private final PhaseCenterVariationCorrections mPhaseCenterVariationCorrections;
|
||||
private final SignalGainCorrections mSignalGainCorrections;
|
||||
private final PhaseCenterOffset mPhaseCenterOffset;
|
||||
private final SphericalCorrections mPhaseCenterVariationCorrections;
|
||||
private final SphericalCorrections mSignalGainCorrections;
|
||||
|
||||
/**
|
||||
* Used for receiving GNSS antenna info from the GNSS engine. You can implement this interface
|
||||
* and call {@link LocationManager#registerAntennaInfoCallback};
|
||||
* and call {@link LocationManager#registerAntennaInfoListener};
|
||||
*/
|
||||
public abstract static class Callback {
|
||||
public interface Listener {
|
||||
/**
|
||||
* The status of GNSS antenna info.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({STATUS_NOT_SUPPORTED, STATUS_READY, STATUS_LOCATION_DISABLED})
|
||||
public @interface GnssAntennaInfoStatus {
|
||||
}
|
||||
|
||||
/**
|
||||
* The system does not support GNSS antenna info.
|
||||
*
|
||||
* This status will not change in the future.
|
||||
*/
|
||||
public static final int STATUS_NOT_SUPPORTED = 0;
|
||||
|
||||
/**
|
||||
* GNSS antenna info updates are being successfully tracked.
|
||||
*/
|
||||
public static final int STATUS_READY = 1;
|
||||
|
||||
/**
|
||||
* GNSS provider or Location is disabled, updated will not be received until they are
|
||||
* enabled.
|
||||
*/
|
||||
public static final int STATUS_LOCATION_DISABLED = 2;
|
||||
|
||||
/**
|
||||
* Returns the latest GNSS antenna info. This event is triggered when a callback is
|
||||
* Returns the latest GNSS antenna info. This event is triggered when a listener is
|
||||
* registered, and whenever the antenna info changes (due to a device configuration change).
|
||||
*/
|
||||
public void onGnssAntennaInfoReceived(@NonNull List<GnssAntennaInfo> gnssAntennaInfos) {}
|
||||
|
||||
/**
|
||||
* Returns the latest status of the GNSS antenna info sub-system.
|
||||
*/
|
||||
public void onStatusChanged(@GnssAntennaInfoStatus int status) {}
|
||||
void onGnssAntennaInfoReceived(@NonNull List<GnssAntennaInfo> gnssAntennaInfos);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -90,37 +55,31 @@ public final class GnssAntennaInfo implements Parcelable {
|
||||
* for mobiles - see sensor or form factor documents for details. Uncertainties are reported
|
||||
* to 1-sigma.
|
||||
*/
|
||||
public static final class PhaseCenterOffsetCoordinates implements Parcelable {
|
||||
private final double mPhaseCenterOffsetCoordinateXMillimeters;
|
||||
private final double mPhaseCenterOffsetCoordinateXUncertaintyMillimeters;
|
||||
private final double mPhaseCenterOffsetCoordinateYMillimeters;
|
||||
private final double mPhaseCenterOffsetCoordinateYUncertaintyMillimeters;
|
||||
private final double mPhaseCenterOffsetCoordinateZMillimeters;
|
||||
private final double mPhaseCenterOffsetCoordinateZUncertaintyMillimeters;
|
||||
public static final class PhaseCenterOffset implements Parcelable {
|
||||
private final double mOffsetXMm;
|
||||
private final double mOffsetXUncertaintyMm;
|
||||
private final double mOffsetYMm;
|
||||
private final double mOffsetYUncertaintyMm;
|
||||
private final double mOffsetZMm;
|
||||
private final double mOffsetZUncertaintyMm;
|
||||
|
||||
@VisibleForTesting
|
||||
public PhaseCenterOffsetCoordinates(double phaseCenterOffsetCoordinateXMillimeters,
|
||||
double phaseCenterOffsetCoordinateXUncertaintyMillimeters,
|
||||
double phaseCenterOffsetCoordinateYMillimeters,
|
||||
double phaseCenterOffsetCoordinateYUncertaintyMillimeters,
|
||||
double phaseCenterOffsetCoordinateZMillimeters,
|
||||
double phaseCenterOffsetCoordinateZUncertaintyMillimeters) {
|
||||
mPhaseCenterOffsetCoordinateXMillimeters = phaseCenterOffsetCoordinateXMillimeters;
|
||||
mPhaseCenterOffsetCoordinateYMillimeters = phaseCenterOffsetCoordinateYMillimeters;
|
||||
mPhaseCenterOffsetCoordinateZMillimeters = phaseCenterOffsetCoordinateZMillimeters;
|
||||
mPhaseCenterOffsetCoordinateXUncertaintyMillimeters =
|
||||
phaseCenterOffsetCoordinateXUncertaintyMillimeters;
|
||||
mPhaseCenterOffsetCoordinateYUncertaintyMillimeters =
|
||||
phaseCenterOffsetCoordinateYUncertaintyMillimeters;
|
||||
mPhaseCenterOffsetCoordinateZUncertaintyMillimeters =
|
||||
phaseCenterOffsetCoordinateZUncertaintyMillimeters;
|
||||
public PhaseCenterOffset(
|
||||
double offsetXMm, double offsetXUncertaintyMm,
|
||||
double offsetYMm, double offsetYUncertaintyMm,
|
||||
double offsetZMm, double offsetZUncertaintyMm) {
|
||||
mOffsetXMm = offsetXMm;
|
||||
mOffsetYMm = offsetYMm;
|
||||
mOffsetZMm = offsetZMm;
|
||||
mOffsetXUncertaintyMm = offsetXUncertaintyMm;
|
||||
mOffsetYUncertaintyMm = offsetYUncertaintyMm;
|
||||
mOffsetZUncertaintyMm = offsetZUncertaintyMm;
|
||||
}
|
||||
|
||||
public static final @NonNull Creator<PhaseCenterOffsetCoordinates> CREATOR =
|
||||
new Creator<PhaseCenterOffsetCoordinates>() {
|
||||
public static final @NonNull Creator<PhaseCenterOffset> CREATOR =
|
||||
new Creator<PhaseCenterOffset>() {
|
||||
@Override
|
||||
public PhaseCenterOffsetCoordinates createFromParcel(Parcel in) {
|
||||
return new PhaseCenterOffsetCoordinates(
|
||||
public PhaseCenterOffset createFromParcel(Parcel in) {
|
||||
return new PhaseCenterOffset(
|
||||
in.readDouble(),
|
||||
in.readDouble(),
|
||||
in.readDouble(),
|
||||
@@ -131,33 +90,39 @@ public final class GnssAntennaInfo implements Parcelable {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PhaseCenterOffsetCoordinates[] newArray(int size) {
|
||||
return new PhaseCenterOffsetCoordinates[size];
|
||||
public PhaseCenterOffset[] newArray(int size) {
|
||||
return new PhaseCenterOffset[size];
|
||||
}
|
||||
};
|
||||
|
||||
public double getXCoordMillimeters() {
|
||||
return mPhaseCenterOffsetCoordinateXMillimeters;
|
||||
@FloatRange()
|
||||
public double getXOffsetMm() {
|
||||
return mOffsetXMm;
|
||||
}
|
||||
|
||||
public double getXCoordUncertaintyMillimeters() {
|
||||
return mPhaseCenterOffsetCoordinateXUncertaintyMillimeters;
|
||||
@FloatRange()
|
||||
public double getXOffsetUncertaintyMm() {
|
||||
return mOffsetXUncertaintyMm;
|
||||
}
|
||||
|
||||
public double getYCoordMillimeters() {
|
||||
return mPhaseCenterOffsetCoordinateYMillimeters;
|
||||
@FloatRange()
|
||||
public double getYOffsetMm() {
|
||||
return mOffsetYMm;
|
||||
}
|
||||
|
||||
public double getYCoordUncertaintyMillimeters() {
|
||||
return mPhaseCenterOffsetCoordinateYUncertaintyMillimeters;
|
||||
@FloatRange()
|
||||
public double getYOffsetUncertaintyMm() {
|
||||
return mOffsetYUncertaintyMm;
|
||||
}
|
||||
|
||||
public double getZCoordMillimeters() {
|
||||
return mPhaseCenterOffsetCoordinateZMillimeters;
|
||||
@FloatRange()
|
||||
public double getZOffsetMm() {
|
||||
return mOffsetZMm;
|
||||
}
|
||||
|
||||
public double getZCoordUncertaintyMillimeters() {
|
||||
return mPhaseCenterOffsetCoordinateZUncertaintyMillimeters;
|
||||
@FloatRange()
|
||||
public double getZOffsetUncertaintyMm() {
|
||||
return mOffsetZUncertaintyMm;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -167,30 +132,27 @@ public final class GnssAntennaInfo implements Parcelable {
|
||||
|
||||
@Override
|
||||
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
||||
dest.writeDouble(mPhaseCenterOffsetCoordinateXMillimeters);
|
||||
dest.writeDouble(mPhaseCenterOffsetCoordinateXUncertaintyMillimeters);
|
||||
dest.writeDouble(mPhaseCenterOffsetCoordinateYMillimeters);
|
||||
dest.writeDouble(mPhaseCenterOffsetCoordinateYUncertaintyMillimeters);
|
||||
dest.writeDouble(mPhaseCenterOffsetCoordinateZMillimeters);
|
||||
dest.writeDouble(mPhaseCenterOffsetCoordinateZUncertaintyMillimeters);
|
||||
dest.writeDouble(mOffsetXMm);
|
||||
dest.writeDouble(mOffsetXUncertaintyMm);
|
||||
dest.writeDouble(mOffsetYMm);
|
||||
dest.writeDouble(mOffsetYUncertaintyMm);
|
||||
dest.writeDouble(mOffsetZMm);
|
||||
dest.writeDouble(mOffsetZUncertaintyMm);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder builder = new StringBuilder("PhaseCenteroffset:\n");
|
||||
builder.append("X: " + mPhaseCenterOffsetCoordinateXMillimeters + " +/- "
|
||||
+ mPhaseCenterOffsetCoordinateXUncertaintyMillimeters + "\n");
|
||||
builder.append("Y: " + mPhaseCenterOffsetCoordinateYMillimeters + " +/- "
|
||||
+ mPhaseCenterOffsetCoordinateYUncertaintyMillimeters + "\n");
|
||||
builder.append("Z: " + mPhaseCenterOffsetCoordinateZMillimeters + " +/- "
|
||||
+ mPhaseCenterOffsetCoordinateZUncertaintyMillimeters + "\n");
|
||||
return builder.toString();
|
||||
return "PhaseCenterOffset{"
|
||||
+ "OffsetXMm=" + mOffsetXMm + " +/-" + mOffsetXUncertaintyMm
|
||||
+ ", OffsetYMm=" + mOffsetYMm + " +/-" + mOffsetYUncertaintyMm
|
||||
+ ", OffsetZMm=" + mOffsetZMm + " +/-" + mOffsetZUncertaintyMm
|
||||
+ '}';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class containing information about the phase center variation (PCV) corrections. The PCV
|
||||
* correction is added to the phase measurement to obtain the corrected value.
|
||||
* Represents corrections on a spherical mapping. Corrections are added to measurements to
|
||||
* obtain the corrected values.
|
||||
*
|
||||
* The corrections and associated (1-sigma) uncertainties are represented by respect 2D arrays.
|
||||
*
|
||||
@@ -203,229 +165,7 @@ public final class GnssAntennaInfo implements Parcelable {
|
||||
* at 180 degrees. They are separated by deltaPhi, the regular spacing between zenith angles,
|
||||
* i.e., deltaPhi = 180 / (number of columns - 1).
|
||||
*/
|
||||
public static final class PhaseCenterVariationCorrections extends SphericalCorrections {
|
||||
|
||||
@VisibleForTesting
|
||||
public PhaseCenterVariationCorrections(
|
||||
@NonNull double[][] phaseCenterVariationCorrectionsMillimeters,
|
||||
@NonNull double[][] phaseCenterVariationCorrectionUncertaintiesMillimeters) {
|
||||
super(phaseCenterVariationCorrectionsMillimeters,
|
||||
phaseCenterVariationCorrectionUncertaintiesMillimeters);
|
||||
}
|
||||
|
||||
private PhaseCenterVariationCorrections(@NonNull Parcel in) {
|
||||
super(in);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the phase center variation correction in millimeters at the specified row and column
|
||||
* in the underlying 2D array.
|
||||
* @param row zero-based major index in the array
|
||||
* @param column zero-based minor index in the array
|
||||
* @return phase center correction in millimeters
|
||||
*/
|
||||
public double getPhaseCenterVariationCorrectionMillimetersAt(int row, int column) {
|
||||
return super.getCorrectionAt(row, column);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the phase center variation correction uncertainty in millimeters at the specified row
|
||||
* and column in the underlying 2D array.
|
||||
* @param row zero-based major index in the array
|
||||
* @param column zero-based minor index in the array
|
||||
* @return 1-sigma phase center correction uncertainty in millimeters
|
||||
*/
|
||||
public double getPhaseCenterVariationCorrectionUncertaintyMillimetersAt(
|
||||
int row, int column) {
|
||||
return super.getCorrectionUncertaintyAt(row, column);
|
||||
}
|
||||
|
||||
public @NonNull double[][] getRawCorrectionsArray() {
|
||||
return super.getRawCorrectionsArray().clone();
|
||||
}
|
||||
|
||||
public @NonNull double[][] getRawCorrectionUncertaintiesArray() {
|
||||
return super.getRawCorrectionUncertaintiesArray().clone();
|
||||
}
|
||||
|
||||
public int getNumRows() {
|
||||
return super.getNumRows();
|
||||
}
|
||||
|
||||
public int getNumColumns() {
|
||||
return super.getNumColumns();
|
||||
}
|
||||
|
||||
/**
|
||||
* The fixed theta angle separation between successive rows.
|
||||
*/
|
||||
public double getDeltaTheta() {
|
||||
return super.getDeltaTheta();
|
||||
}
|
||||
|
||||
/**
|
||||
* The fixed phi angle separation between successive columns.
|
||||
*/
|
||||
public double getDeltaPhi() {
|
||||
return super.getDeltaPhi();
|
||||
}
|
||||
|
||||
public static final @NonNull Creator<PhaseCenterVariationCorrections> CREATOR =
|
||||
new Creator<PhaseCenterVariationCorrections>() {
|
||||
@Override
|
||||
public PhaseCenterVariationCorrections createFromParcel(Parcel in) {
|
||||
return new PhaseCenterVariationCorrections(in);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PhaseCenterVariationCorrections[] newArray(int size) {
|
||||
return new PhaseCenterVariationCorrections[size];
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
||||
super.writeToParcel(dest, flags);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder builder = new StringBuilder("PhaseCenterVariationCorrections:\n");
|
||||
builder.append(super.toString());
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class containing information about the signal gain (SG) corrections. The SG
|
||||
* correction is added to the signal gain to obtain the corrected value.
|
||||
*
|
||||
* The corrections and associated (1-sigma) uncertainties are represented by respect 2D arrays.
|
||||
*
|
||||
* Each row (major indices) represents a fixed theta. The first row corresponds to a
|
||||
* theta angle of 0 degrees. The last row corresponds to a theta angle of (360 - deltaTheta)
|
||||
* degrees, where deltaTheta is the regular spacing between azimuthal angles, i.e., deltaTheta
|
||||
* = 360 / (number of rows).
|
||||
*
|
||||
* The columns (minor indices) represent fixed zenith angles, beginning at 0 degrees and ending
|
||||
* at 180 degrees. They are separated by deltaPhi, the regular spacing between zenith angles,
|
||||
* i.e., deltaPhi = 180 / (number of columns - 1).
|
||||
*/
|
||||
public static final class SignalGainCorrections extends SphericalCorrections {
|
||||
|
||||
@VisibleForTesting
|
||||
public SignalGainCorrections(
|
||||
@NonNull double[][] signalGainCorrectionsDbi,
|
||||
@NonNull double[][] signalGainCorrectionUncertaintiesDbi) {
|
||||
super(signalGainCorrectionsDbi,
|
||||
signalGainCorrectionUncertaintiesDbi);
|
||||
}
|
||||
|
||||
private SignalGainCorrections(@NonNull Parcel in) {
|
||||
super(in);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the signal gain correction in dbi at the specified row and column
|
||||
* in the underlying 2D array.
|
||||
* @param row zero-based major index in the array
|
||||
* @param column zero-based minor index in the array
|
||||
* @return signal gain correction in dbi
|
||||
*/
|
||||
public double getSignalGainCorrectionDbiAt(int row, int column) {
|
||||
return super.getCorrectionAt(row, column);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the signal gain correction correction uncertainty in dbi at the specified row
|
||||
* and column in the underlying 2D array.
|
||||
* @param row zero-based major index in the array
|
||||
* @param column zero-based minor index in the array
|
||||
* @return 1-sigma signal gain correction uncertainty in dbi
|
||||
*/
|
||||
public double getSignalGainCorrectionUncertaintyDbiAt(int row, int column) {
|
||||
return super.getCorrectionUncertaintyAt(row, column);
|
||||
}
|
||||
|
||||
public @NonNull double[][] getRawCorrectionsArray() {
|
||||
return super.getRawCorrectionsArray().clone();
|
||||
}
|
||||
|
||||
public @NonNull double[][] getRawCorrectionUncertaintiesArray() {
|
||||
return super.getRawCorrectionUncertaintiesArray().clone();
|
||||
}
|
||||
|
||||
public int getNumRows() {
|
||||
return super.getNumRows();
|
||||
}
|
||||
|
||||
public int getNumColumns() {
|
||||
return super.getNumColumns();
|
||||
}
|
||||
|
||||
/**
|
||||
* The fixed theta angle separation between successive rows.
|
||||
*/
|
||||
public double getDeltaTheta() {
|
||||
return super.getDeltaTheta();
|
||||
}
|
||||
|
||||
/**
|
||||
* The fixed phi angle separation between successive columns.
|
||||
*/
|
||||
public double getDeltaPhi() {
|
||||
return super.getDeltaPhi();
|
||||
}
|
||||
|
||||
public static final @NonNull Creator<SignalGainCorrections> CREATOR =
|
||||
new Creator<SignalGainCorrections>() {
|
||||
@Override
|
||||
public SignalGainCorrections createFromParcel(Parcel in) {
|
||||
return new SignalGainCorrections(in);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SignalGainCorrections[] newArray(int size) {
|
||||
return new SignalGainCorrections[size];
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
||||
super.writeToParcel(dest, flags);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder builder = new StringBuilder("SignalGainCorrections:\n");
|
||||
builder.append(super.toString());
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents corrections on a spherical mapping.
|
||||
*
|
||||
* Each row (major indices) represents a fixed theta. The first row corresponds to a
|
||||
* theta angle of 0 degrees. The last row corresponds to a theta angle of (360 - deltaTheta)
|
||||
* degrees, where deltaTheta is the regular spacing between azimuthal angles, i.e., deltaTheta
|
||||
* = 360 / (number of rows).
|
||||
*
|
||||
* The columns (minor indices) represent fixed zenith angles, beginning at 0 degrees and ending
|
||||
* at 180 degrees. They are separated by deltaPhi, the regular spacing between zenith angles,
|
||||
* i.e., deltaPhi = 180 / (number of columns - 1).
|
||||
*/
|
||||
private abstract static class SphericalCorrections implements Parcelable {
|
||||
public static final class SphericalCorrections implements Parcelable{
|
||||
private final double[][] mCorrections;
|
||||
private final double[][] mCorrectionUncertainties;
|
||||
private final double mDeltaTheta;
|
||||
@@ -433,7 +173,7 @@ public final class GnssAntennaInfo implements Parcelable {
|
||||
private final int mNumRows;
|
||||
private final int mNumColumns;
|
||||
|
||||
SphericalCorrections(@NonNull double[][] corrections,
|
||||
public SphericalCorrections(@NonNull double[][] corrections,
|
||||
@NonNull double[][] correctionUncertainties) {
|
||||
if (corrections.length != correctionUncertainties.length
|
||||
|| corrections[0].length != correctionUncertainties[0].length) {
|
||||
@@ -474,54 +214,84 @@ public final class GnssAntennaInfo implements Parcelable {
|
||||
in.readDoubleArray(correctionUncertainties[row]);
|
||||
}
|
||||
|
||||
mNumRows = corrections.length;
|
||||
mNumColumns = corrections[0].length;
|
||||
mNumRows = numRows;
|
||||
mNumColumns = numColumns;
|
||||
mCorrections = corrections;
|
||||
mCorrectionUncertainties = correctionUncertainties;
|
||||
mDeltaTheta = 360.0d / mNumRows;
|
||||
mDeltaPhi = 180.0d / (mNumColumns - 1);
|
||||
}
|
||||
|
||||
private double getCorrectionAt(int row, int column) {
|
||||
return mCorrections[row][column];
|
||||
}
|
||||
|
||||
private double getCorrectionUncertaintyAt(int row, int column) {
|
||||
return mCorrectionUncertainties[row][column];
|
||||
}
|
||||
|
||||
/**
|
||||
* Array representing corrections on a spherical mapping. Corrections are added to
|
||||
* measurements to obtain the corrected values.
|
||||
*
|
||||
* Each row (major indices) represents a fixed theta. The first row corresponds to a
|
||||
* theta angle of 0 degrees. The last row corresponds to a theta angle of (360 - deltaTheta)
|
||||
* degrees, where deltaTheta is the regular spacing between azimuthal angles, i.e.,
|
||||
* deltaTheta = 360 / (number of rows).
|
||||
*
|
||||
* The columns (minor indices) represent fixed zenith angles, beginning at 0 degrees and
|
||||
* ending at 180 degrees. They are separated by deltaPhi, the regular spacing between zenith
|
||||
* angles, i.e., deltaPhi = 180 / (number of columns - 1).
|
||||
*/
|
||||
@NonNull
|
||||
private double[][] getRawCorrectionsArray() {
|
||||
public double[][] getCorrectionsArray() {
|
||||
return mCorrections;
|
||||
}
|
||||
|
||||
/**
|
||||
* Array representing uncertainty on corrections on a spherical mapping.
|
||||
*
|
||||
* Each row (major indices) represents a fixed theta. The first row corresponds to a
|
||||
* theta angle of 0 degrees. The last row corresponds to a theta angle of (360 - deltaTheta)
|
||||
* degrees, where deltaTheta is the regular spacing between azimuthal angles, i.e.,
|
||||
* deltaTheta = 360 / (number of rows).
|
||||
*
|
||||
* The columns (minor indices) represent fixed zenith angles, beginning at 0 degrees and
|
||||
* ending at 180 degrees. They are separated by deltaPhi, the regular spacing between zenith
|
||||
* angles, i.e., deltaPhi = 180 / (number of columns - 1).
|
||||
*/
|
||||
@NonNull
|
||||
private double[][] getRawCorrectionUncertaintiesArray() {
|
||||
public double[][] getCorrectionUncertaintiesArray() {
|
||||
return mCorrectionUncertainties;
|
||||
}
|
||||
|
||||
private int getNumRows() {
|
||||
return mNumRows;
|
||||
}
|
||||
|
||||
private int getNumColumns() {
|
||||
return mNumColumns;
|
||||
}
|
||||
|
||||
/**
|
||||
* The fixed theta angle separation between successive rows.
|
||||
*/
|
||||
private double getDeltaTheta() {
|
||||
@FloatRange(from = 0.0f, to = 360.0f)
|
||||
public double getDeltaTheta() {
|
||||
return mDeltaTheta;
|
||||
}
|
||||
|
||||
/**
|
||||
* The fixed phi angle separation between successive columns.
|
||||
*/
|
||||
private double getDeltaPhi() {
|
||||
@FloatRange(from = 0.0f, to = 180.0f)
|
||||
public double getDeltaPhi() {
|
||||
return mDeltaPhi;
|
||||
}
|
||||
|
||||
|
||||
public static final @NonNull Creator<SphericalCorrections> CREATOR =
|
||||
new Creator<SphericalCorrections>() {
|
||||
@Override
|
||||
public SphericalCorrections createFromParcel(Parcel in) {
|
||||
return new SphericalCorrections(in);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SphericalCorrections[] newArray(int size) {
|
||||
return new SphericalCorrections[size];
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
||||
dest.writeInt(mNumRows);
|
||||
@@ -534,62 +304,114 @@ public final class GnssAntennaInfo implements Parcelable {
|
||||
}
|
||||
}
|
||||
|
||||
private String arrayToString(double[][] array) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (int row = 0; row < mNumRows; row++) {
|
||||
builder.append("[ ");
|
||||
for (int column = 0; column < mNumColumns - 1; column++) {
|
||||
builder.append(array[row][column] + ", ");
|
||||
}
|
||||
builder.append(array[row][mNumColumns - 1] + " ]\n");
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append("DeltaTheta: " + mDeltaTheta + "\n");
|
||||
builder.append("DeltaPhi: " + mDeltaPhi + "\n");
|
||||
builder.append("CorrectionsArray:\n");
|
||||
builder.append(arrayToString(mCorrections));
|
||||
builder.append("CorrectionUncertaintiesArray:\n");
|
||||
builder.append(arrayToString(mCorrectionUncertainties));
|
||||
return builder.toString();
|
||||
return "SphericalCorrections{"
|
||||
+ "Corrections=" + Arrays.toString(mCorrections)
|
||||
+ ", CorrectionUncertainties=" + Arrays.toString(mCorrectionUncertainties)
|
||||
+ ", DeltaTheta=" + mDeltaTheta
|
||||
+ ", DeltaPhi=" + mDeltaPhi
|
||||
+ '}';
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
public GnssAntennaInfo(
|
||||
private GnssAntennaInfo(
|
||||
double carrierFrequencyMHz,
|
||||
@NonNull PhaseCenterOffsetCoordinates phaseCenterOffsetCoordinates,
|
||||
@Nullable PhaseCenterVariationCorrections phaseCenterVariationCorrections,
|
||||
@Nullable SignalGainCorrections signalGainCorrectionDbi) {
|
||||
if (phaseCenterOffsetCoordinates == null) {
|
||||
@NonNull PhaseCenterOffset phaseCenterOffset,
|
||||
@Nullable SphericalCorrections phaseCenterVariationCorrections,
|
||||
@Nullable SphericalCorrections signalGainCorrectionDbi) {
|
||||
if (phaseCenterOffset == null) {
|
||||
throw new IllegalArgumentException("Phase Center Offset Coordinates cannot be null.");
|
||||
}
|
||||
mCarrierFrequencyMHz = carrierFrequencyMHz;
|
||||
mPhaseCenterOffsetCoordinates = phaseCenterOffsetCoordinates;
|
||||
mPhaseCenterOffset = phaseCenterOffset;
|
||||
mPhaseCenterVariationCorrections = phaseCenterVariationCorrections;
|
||||
mSignalGainCorrections = signalGainCorrectionDbi;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder class for GnssAntennaInfo.
|
||||
*/
|
||||
public static class Builder {
|
||||
private double mCarrierFrequencyMHz;
|
||||
private PhaseCenterOffset mPhaseCenterOffset;
|
||||
private SphericalCorrections mPhaseCenterVariationCorrections;
|
||||
private SphericalCorrections mSignalGainCorrections;
|
||||
|
||||
/**
|
||||
* Set antenna carrier frequency (MHz).
|
||||
* @param carrierFrequencyMHz antenna carrier frequency (MHz)
|
||||
* @return Builder builder object
|
||||
*/
|
||||
@NonNull
|
||||
public Builder setCarrierFrequencyMHz(@FloatRange(from = 0.0f) double carrierFrequencyMHz) {
|
||||
mCarrierFrequencyMHz = carrierFrequencyMHz;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set antenna phase center offset.
|
||||
* @param phaseCenterOffset phase center offset object
|
||||
* @return Builder builder object
|
||||
*/
|
||||
@NonNull
|
||||
public Builder setPhaseCenterOffset(@NonNull PhaseCenterOffset phaseCenterOffset) {
|
||||
mPhaseCenterOffset = Objects.requireNonNull(phaseCenterOffset);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set phase center variation corrections.
|
||||
* @param phaseCenterVariationCorrections phase center variation corrections object
|
||||
* @return Builder builder object
|
||||
*/
|
||||
@NonNull
|
||||
public Builder setPhaseCenterVariationCorrections(
|
||||
@Nullable SphericalCorrections phaseCenterVariationCorrections) {
|
||||
mPhaseCenterVariationCorrections = phaseCenterVariationCorrections;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set signal gain corrections.
|
||||
* @param signalGainCorrections signal gain corrections object
|
||||
* @return Builder builder object
|
||||
*/
|
||||
@NonNull
|
||||
public Builder setSignalGainCorrections(
|
||||
@Nullable SphericalCorrections signalGainCorrections) {
|
||||
mSignalGainCorrections = signalGainCorrections;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build GnssAntennaInfo object.
|
||||
* @return instance of GnssAntennaInfo
|
||||
*/
|
||||
@NonNull
|
||||
public GnssAntennaInfo build() {
|
||||
return new GnssAntennaInfo(mCarrierFrequencyMHz, mPhaseCenterOffset,
|
||||
mPhaseCenterVariationCorrections, mSignalGainCorrections);
|
||||
}
|
||||
}
|
||||
|
||||
@FloatRange(from = 0.0f)
|
||||
public double getCarrierFrequencyMHz() {
|
||||
return mCarrierFrequencyMHz;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public PhaseCenterOffsetCoordinates getPhaseCenterOffsetCoordinates() {
|
||||
return mPhaseCenterOffsetCoordinates;
|
||||
public PhaseCenterOffset getPhaseCenterOffset() {
|
||||
return mPhaseCenterOffset;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public PhaseCenterVariationCorrections getPhaseCenterVariationCorrections() {
|
||||
public SphericalCorrections getPhaseCenterVariationCorrections() {
|
||||
return mPhaseCenterVariationCorrections;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public SignalGainCorrections getSignalGainCorrections() {
|
||||
public SphericalCorrections getSignalGainCorrections() {
|
||||
return mSignalGainCorrections;
|
||||
}
|
||||
|
||||
@@ -600,16 +422,18 @@ public final class GnssAntennaInfo implements Parcelable {
|
||||
double carrierFrequencyMHz = in.readDouble();
|
||||
|
||||
ClassLoader classLoader = getClass().getClassLoader();
|
||||
PhaseCenterOffsetCoordinates phaseCenterOffsetCoordinates =
|
||||
PhaseCenterOffset phaseCenterOffset =
|
||||
in.readParcelable(classLoader);
|
||||
PhaseCenterVariationCorrections phaseCenterVariationCorrections =
|
||||
SphericalCorrections phaseCenterVariationCorrections =
|
||||
in.readParcelable(classLoader);
|
||||
SignalGainCorrections signalGainCorrections =
|
||||
SphericalCorrections signalGainCorrections =
|
||||
in.readParcelable(classLoader);
|
||||
|
||||
return new GnssAntennaInfo(carrierFrequencyMHz,
|
||||
phaseCenterOffsetCoordinates,
|
||||
phaseCenterVariationCorrections, signalGainCorrections);
|
||||
return new GnssAntennaInfo(
|
||||
carrierFrequencyMHz,
|
||||
phaseCenterOffset,
|
||||
phaseCenterVariationCorrections,
|
||||
signalGainCorrections);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -626,29 +450,18 @@ public final class GnssAntennaInfo implements Parcelable {
|
||||
@Override
|
||||
public void writeToParcel(@NonNull Parcel parcel, int flags) {
|
||||
parcel.writeDouble(mCarrierFrequencyMHz);
|
||||
|
||||
// Write Phase Center Offset
|
||||
parcel.writeParcelable(mPhaseCenterOffsetCoordinates, flags);
|
||||
|
||||
// Write Phase Center Variation Corrections
|
||||
parcel.writeParcelable(mPhaseCenterOffset, flags);
|
||||
parcel.writeParcelable(mPhaseCenterVariationCorrections, flags);
|
||||
|
||||
// Write Signal Gain Corrections
|
||||
parcel.writeParcelable(mSignalGainCorrections, flags);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder builder = new StringBuilder("[ GnssAntennaInfo:\n");
|
||||
builder.append("CarrierFrequencyMHz: " + mCarrierFrequencyMHz + "\n");
|
||||
builder.append(mPhaseCenterOffsetCoordinates.toString());
|
||||
builder.append(mPhaseCenterVariationCorrections == null
|
||||
? "PhaseCenterVariationCorrections: null\n"
|
||||
: mPhaseCenterVariationCorrections.toString());
|
||||
builder.append(mSignalGainCorrections == null
|
||||
? "SignalGainCorrections: null\n"
|
||||
: mSignalGainCorrections.toString());
|
||||
builder.append("]");
|
||||
return builder.toString();
|
||||
return "GnssAntennaInfo{"
|
||||
+ "CarrierFrequencyMHz=" + mCarrierFrequencyMHz
|
||||
+ ", PhaseCenterOffset=" + mPhaseCenterOffset
|
||||
+ ", PhaseCenterVariationCorrections=" + mPhaseCenterVariationCorrections
|
||||
+ ", SignalGainCorrections=" + mSignalGainCorrections
|
||||
+ '}';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,15 +16,11 @@
|
||||
|
||||
package android.location;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.SystemApi;
|
||||
|
||||
/**
|
||||
* A container of supported GNSS chipset capabilities.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public final class GnssCapabilities {
|
||||
/**
|
||||
* Bit mask indicating GNSS chipset supports low power mode.
|
||||
@@ -105,7 +101,10 @@ public final class GnssCapabilities {
|
||||
|
||||
/**
|
||||
* Returns {@code true} if GNSS chipset supports low power mode, {@code false} otherwise.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public boolean hasLowPowerMode() {
|
||||
return hasCapability(LOW_POWER_MODE);
|
||||
}
|
||||
@@ -113,28 +112,40 @@ public final class GnssCapabilities {
|
||||
/**
|
||||
* Returns {@code true} if GNSS chipset supports blacklisting satellites, {@code false}
|
||||
* otherwise.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public boolean hasSatelliteBlacklist() {
|
||||
return hasCapability(SATELLITE_BLACKLIST);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if GNSS chipset supports geofencing, {@code false} otherwise.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public boolean hasGeofencing() {
|
||||
return hasCapability(GEOFENCING);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if GNSS chipset supports measurements, {@code false} otherwise.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public boolean hasMeasurements() {
|
||||
return hasCapability(MEASUREMENTS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if GNSS chipset supports navigation messages, {@code false} otherwise.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public boolean hasNavMessages() {
|
||||
return hasCapability(NAV_MESSAGES);
|
||||
}
|
||||
@@ -142,7 +153,10 @@ public final class GnssCapabilities {
|
||||
/**
|
||||
* Returns {@code true} if GNSS chipset supports measurement corrections, {@code false}
|
||||
* otherwise.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public boolean hasMeasurementCorrections() {
|
||||
return hasCapability(MEASUREMENT_CORRECTIONS);
|
||||
}
|
||||
@@ -150,7 +164,10 @@ public final class GnssCapabilities {
|
||||
/**
|
||||
* Returns {@code true} if GNSS chipset supports line-of-sight satellite identification
|
||||
* measurement corrections, {@code false} otherwise.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public boolean hasMeasurementCorrectionsLosSats() {
|
||||
return hasCapability(MEASUREMENT_CORRECTIONS_LOS_SATS);
|
||||
}
|
||||
@@ -158,7 +175,10 @@ public final class GnssCapabilities {
|
||||
/**
|
||||
* Returns {@code true} if GNSS chipset supports per satellite excess-path-length measurement
|
||||
* corrections, {@code false} otherwise.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public boolean hasMeasurementCorrectionsExcessPathLength() {
|
||||
return hasCapability(MEASUREMENT_CORRECTIONS_EXCESS_PATH_LENGTH);
|
||||
}
|
||||
@@ -166,7 +186,10 @@ public final class GnssCapabilities {
|
||||
/**
|
||||
* Returns {@code true} if GNSS chipset supports reflecting planes measurement corrections,
|
||||
* {@code false} otherwise.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public boolean hasMeasurementCorrectionsReflectingPane() {
|
||||
return hasCapability(MEASUREMENT_CORRECTIONS_REFLECTING_PLANE);
|
||||
}
|
||||
@@ -178,28 +201,6 @@ public final class GnssCapabilities {
|
||||
return hasCapability(ANTENNA_INFO);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder("GnssCapabilities: ( ");
|
||||
if (hasLowPowerMode()) sb.append("LOW_POWER_MODE ");
|
||||
if (hasSatelliteBlacklist()) sb.append("SATELLITE_BLACKLIST ");
|
||||
if (hasGeofencing()) sb.append("GEOFENCING ");
|
||||
if (hasGnssAntennaInfo()) sb.append("ANTENNA_INFO ");
|
||||
if (hasMeasurements()) sb.append("MEASUREMENTS ");
|
||||
if (hasNavMessages()) sb.append("NAV_MESSAGES ");
|
||||
if (hasMeasurementCorrections()) sb.append("MEASUREMENT_CORRECTIONS ");
|
||||
if (hasMeasurementCorrectionsLosSats()) sb.append("MEASUREMENT_CORRECTIONS_LOS_SATS ");
|
||||
if (hasMeasurementCorrectionsExcessPathLength()) {
|
||||
sb.append("MEASUREMENT_CORRECTIONS_EXCESS_PATH_LENGTH ");
|
||||
}
|
||||
if (hasMeasurementCorrectionsReflectingPane()) {
|
||||
sb.append("MEASUREMENT_CORRECTIONS_REFLECTING_PLANE ");
|
||||
}
|
||||
sb.append(")");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private boolean hasCapability(long capability) {
|
||||
return (mGnssCapabilities & capability) == capability;
|
||||
}
|
||||
|
||||
@@ -23,5 +23,4 @@ import android.location.GnssAntennaInfo;
|
||||
*/
|
||||
oneway interface IGnssAntennaInfoListener {
|
||||
void onGnssAntennaInfoReceived(in List<GnssAntennaInfo> gnssAntennaInfo);
|
||||
void onStatusChanged(in int status);
|
||||
}
|
||||
@@ -1813,13 +1813,7 @@ public class LocationManager {
|
||||
|
||||
/**
|
||||
* Returns the supported capabilities of the GNSS chipset.
|
||||
*
|
||||
* @throws SecurityException if the ACCESS_FINE_LOCATION permission is not present.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
@RequiresPermission(ACCESS_FINE_LOCATION)
|
||||
public @NonNull GnssCapabilities getGnssCapabilities() {
|
||||
try {
|
||||
long gnssCapabilities = mService.getGnssCapabilities(mContext.getPackageName());
|
||||
@@ -2264,35 +2258,36 @@ public class LocationManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a Gnss Antenna Info callback.
|
||||
* Registers a Gnss Antenna Info listener. Only expect results if
|
||||
* {@link GnssCapabilities#hasGnssAntennaInfo()} shows that antenna info is supported.
|
||||
*
|
||||
* @param executor the executor that the callback runs on.
|
||||
* @param callback a {@link GnssAntennaInfo.Callback} object to register.
|
||||
* @return {@code true} if the callback was added successfully, {@code false} otherwise.
|
||||
* @param executor the executor that the listener runs on.
|
||||
* @param listener a {@link GnssAntennaInfo.Listener} object to register.
|
||||
* @return {@code true} if the listener was added successfully, {@code false} otherwise.
|
||||
*
|
||||
* @throws IllegalArgumentException if executor is null
|
||||
* @throws IllegalArgumentException if callback is null
|
||||
* @throws IllegalArgumentException if listener is null
|
||||
* @throws SecurityException if the ACCESS_FINE_LOCATION permission is not present
|
||||
*/
|
||||
@RequiresPermission(ACCESS_FINE_LOCATION)
|
||||
public boolean registerAntennaInfoCallback(
|
||||
public boolean registerAntennaInfoListener(
|
||||
@NonNull @CallbackExecutor Executor executor,
|
||||
@NonNull GnssAntennaInfo.Callback callback) {
|
||||
@NonNull GnssAntennaInfo.Listener listener) {
|
||||
try {
|
||||
return mGnssAntennaInfoListenerManager.addListener(callback, executor);
|
||||
return mGnssAntennaInfoListenerManager.addListener(listener, executor);
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters a GNSS Antenna Info callback.
|
||||
* Unregisters a GNSS Antenna Info listener.
|
||||
*
|
||||
* @param callback a {@link GnssAntennaInfo.Callback} object to remove.
|
||||
* @param listener a {@link GnssAntennaInfo.Listener} object to remove.
|
||||
*/
|
||||
public void unregisterAntennaInfoCallback(@NonNull GnssAntennaInfo.Callback callback) {
|
||||
public void unregisterAntennaInfoListener(@NonNull GnssAntennaInfo.Listener listener) {
|
||||
try {
|
||||
mGnssAntennaInfoListenerManager.removeListener(callback);
|
||||
mGnssAntennaInfoListenerManager.removeListener(listener);
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
}
|
||||
@@ -3043,7 +3038,7 @@ public class LocationManager {
|
||||
}
|
||||
|
||||
private class GnssAntennaInfoListenerManager extends
|
||||
AbstractListenerManager<Void, GnssAntennaInfo.Callback> {
|
||||
AbstractListenerManager<Void, GnssAntennaInfo.Listener> {
|
||||
|
||||
@Nullable
|
||||
private IGnssAntennaInfoListener mListenerTransport;
|
||||
@@ -3075,11 +3070,6 @@ public class LocationManager {
|
||||
public void onGnssAntennaInfoReceived(final List<GnssAntennaInfo> gnssAntennaInfos) {
|
||||
execute((callback) -> callback.onGnssAntennaInfoReceived(gnssAntennaInfos));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStatusChanged(int status) {
|
||||
execute((listener) -> listener.onStatusChanged(status));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user