blob: f065def35f7a8f7cc6f8c6967d81fc8a840d4c04 [file] [log] [blame]
/*
* Copyright (C) 2024 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.FlaggedApi;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.location.flags.Flags;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.internal.util.Preconditions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* A class contains the real time integrity status of a GNSS satellite based on notice advisory.
*
* @hide
*/
@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
@SystemApi
public final class RealTimeIntegrityModel implements Parcelable {
/**
* Bad satellite ID number or OSN number for Glonass.
*
* <p>The distinction is made by looking at the constellation field. Values
* must be in the range of:
*
* <p> - GPS: 1-32
* <p> - GLONASS: 1-25
* <p> - QZSS: 183-206
* <p> - Galileo: 1-36
* <p> - Beidou: 1-63
*/
private final int mBadSvid;
/**
* The type of the bad signal or signals.
*
* <p>An empty list means that all signals on the specific SV are not healthy.
*/
@NonNull private final List<GnssSignalType> mBadSignalTypes;
/** UTC timestamp (in seconds) when the advisory was published. */
private final long mPublishDateSeconds;
/** UTC timestamp (in seconds) for the start of the event. */
private final long mStartDateSeconds;
/** UTC timestamp (in seconds) for the end of the event. */
private final long mEndDateSeconds;
/**
* Abbreviated type of the advisory, providing a concise summary of the event.
*
* <p>This field follows different definitions depending on the GNSS constellation:
* <p> - GPS: See NANU type definitions(https://www.navcen.uscg.gov/nanu-abbreviations-and-descriptions)
* <p> - Galileo: See NAGU type definitions(https://www.gsc-europa.eu/system-service-status/nagu-information)
* <p> - QZSS: See NAQU type definitions](https://sys.qzss.go.jp/dod/en/naqu/type.html)
* <p> - BeiDou: Not used; set to an empty string.
*/
@NonNull private final String mAdvisoryType;
/**
* Unique identifier for the advisory within its constellation's system.
*
* <p>For BeiDou, this is not used and should be an empty string.
*/
@NonNull private final String mAdvisoryNumber;
private RealTimeIntegrityModel(Builder builder) {
// Allow SV ID beyond the range to support potential future extensibility.
Preconditions.checkArgument(builder.mBadSvid >= 1);
Preconditions.checkArgument(builder.mPublishDateSeconds > 0);
Preconditions.checkArgument(builder.mStartDateSeconds > 0);
Preconditions.checkArgument(builder.mEndDateSeconds > 0);
Preconditions.checkNotNull(builder.mAdvisoryType, "AdvisoryType cannot be null");
Preconditions.checkNotNull(builder.mAdvisoryNumber, "AdvisoryNumber cannot be null");
if (builder.mBadSignalTypes == null) {
mBadSignalTypes = new ArrayList<>();
} else {
mBadSignalTypes = Collections.unmodifiableList(
new ArrayList<>(builder.mBadSignalTypes));
}
mBadSvid = builder.mBadSvid;
mPublishDateSeconds = builder.mPublishDateSeconds;
mStartDateSeconds = builder.mStartDateSeconds;
mEndDateSeconds = builder.mEndDateSeconds;
mAdvisoryType = builder.mAdvisoryType;
mAdvisoryNumber = builder.mAdvisoryNumber;
}
/**
* Returns the Pseudo-random or satellite ID number for the satellite,
* a.k.a. Space Vehicle (SV), or OSN number for Glonass.
*
* <p>The distinction is made by looking at the constellation field. Values
* must be in the range of:
*
* <p> - GPS: 1-32
* <p> - GLONASS: 1-25
* <p> - QZSS: 183-206
* <p> - Galileo: 1-36
* <p> - Beidou: 1-63
*/
@IntRange(from = 1, to = 206)
public int getBadSvid() {
return mBadSvid;
}
/**
* Returns the type of the bad signal or signals.
*
* <p>An empty list means that all signals on the specific SV are not healthy.
*/
@NonNull
public List<GnssSignalType> getBadSignalTypes() {
return mBadSignalTypes;
}
/** Returns the UTC timestamp (in seconds) when the advisory was published */
@IntRange(from = 0)
public long getPublishDateSeconds() {
return mPublishDateSeconds;
}
/** Returns UTC timestamp (in seconds) for the start of the event. */
@IntRange(from = 0)
public long getStartDateSeconds() {
return mStartDateSeconds;
}
/** Returns UTC timestamp (in seconds) for the end of the event. */
@IntRange(from = 0)
public long getEndDateSeconds() {
return mEndDateSeconds;
}
/** Returns the abbreviated type of notice advisory. */
@NonNull
public String getAdvisoryType() {
return mAdvisoryType;
}
/** Returns the unique identifier for the advisory. */
@NonNull
public String getAdvisoryNumber() {
return mAdvisoryNumber;
}
public static final @NonNull Creator<RealTimeIntegrityModel> CREATOR =
new Creator<RealTimeIntegrityModel>() {
@Override
@NonNull
public RealTimeIntegrityModel createFromParcel(Parcel in) {
RealTimeIntegrityModel realTimeIntegrityModel =
new RealTimeIntegrityModel.Builder()
.setBadSvid(in.readInt())
.setBadSignalTypes(
in.createTypedArrayList(GnssSignalType.CREATOR))
.setPublishDateSeconds(in.readLong())
.setStartDateSeconds(in.readLong())
.setEndDateSeconds(in.readLong())
.setAdvisoryType(in.readString8())
.setAdvisoryNumber(in.readString8())
.build();
return realTimeIntegrityModel;
}
@Override
public RealTimeIntegrityModel[] newArray(int size) {
return new RealTimeIntegrityModel[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel parcel, int flags) {
parcel.writeInt(mBadSvid);
parcel.writeTypedList(mBadSignalTypes);
parcel.writeLong(mPublishDateSeconds);
parcel.writeLong(mStartDateSeconds);
parcel.writeLong(mEndDateSeconds);
parcel.writeString8(mAdvisoryType);
parcel.writeString8(mAdvisoryNumber);
}
@Override
@NonNull
public String toString() {
StringBuilder builder = new StringBuilder("RealTimeIntegrityModel[");
builder.append("badSvid = ").append(mBadSvid);
builder.append(", badSignalTypes = ").append(mBadSignalTypes);
builder.append(", publishDateSeconds = ").append(mPublishDateSeconds);
builder.append(", startDateSeconds = ").append(mStartDateSeconds);
builder.append(", endDateSeconds = ").append(mEndDateSeconds);
builder.append(", advisoryType = ").append(mAdvisoryType);
builder.append(", advisoryNumber = ").append(mAdvisoryNumber);
builder.append("]");
return builder.toString();
}
/** Builder for {@link RealTimeIntegrityModel} */
public static final class Builder {
private int mBadSvid;
private List<GnssSignalType> mBadSignalTypes;
private long mPublishDateSeconds;
private long mStartDateSeconds;
private long mEndDateSeconds;
private String mAdvisoryType;
private String mAdvisoryNumber;
/**
* Sets the bad satellite ID number or OSN number for Glonass.
*
* <p>The distinction is made by looking at the constellation field. Values
* must be in the range of:
*
* <p> - GPS: 1-32
* <p> - GLONASS: 1-25
* <p> - QZSS: 183-206
* <p> - Galileo: 1-36
* <p> - Beidou: 1-63
*/
@NonNull
public Builder setBadSvid(@IntRange(from = 1, to = 206) int badSvid) {
mBadSvid = badSvid;
return this;
}
/**
* Sets the type of the bad signal or signals.
*
* <p>An empty list means that all signals on the specific SV are not healthy.
*/
@NonNull
public Builder setBadSignalTypes(@NonNull List<GnssSignalType> badSignalTypes) {
mBadSignalTypes = badSignalTypes;
return this;
}
/** Sets the UTC timestamp (in seconds) when the advisory was published. */
@NonNull
public Builder setPublishDateSeconds(@IntRange(from = 0) long publishDateSeconds) {
mPublishDateSeconds = publishDateSeconds;
return this;
}
/** Sets the UTC timestamp (in seconds) for the start of the event. */
@NonNull
public Builder setStartDateSeconds(@IntRange(from = 0) long startDateSeconds) {
mStartDateSeconds = startDateSeconds;
return this;
}
/** Sets the UTC timestamp (in seconds) for the end of the event. */
@NonNull
public Builder setEndDateSeconds(@IntRange(from = 0) long endDateSeconds) {
mEndDateSeconds = endDateSeconds;
return this;
}
/** Sets the abbreviated type of notice advisory. */
@NonNull
public Builder setAdvisoryType(@NonNull String advisoryType) {
mAdvisoryType = advisoryType;
return this;
}
/** Sets the unique identifier for the advisory. */
@NonNull
public Builder setAdvisoryNumber(@NonNull String advisoryNumber) {
mAdvisoryNumber = advisoryNumber;
return this;
}
/** Builds a {@link RealTimeIntegrityModel} instance as specified by this builder. */
@NonNull
public RealTimeIntegrityModel build() {
return new RealTimeIntegrityModel(this);
}
}
}