| /* |
| * 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); |
| } |
| } |
| } |