blob: 601c87e69b70ae26135f3a20422fef2351d42497 [file]
/*
* 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.IntDef;
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.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* A class contains parameters to provide additional assistance information dependent on the GNSS
* constellation.
*
* @hide
*/
@FlaggedApi(Flags.FLAG_GNSS_ASSISTANCE_INTERFACE)
@SystemApi
public final class AuxiliaryInformation implements Parcelable {
/**
* BDS B1C Satellite orbit type.
*
* <p>This is defined in BDS-SIS-ICD-B1I-3.0, section 3.1.
*
* @hide
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef({
BDS_B1C_ORBIT_TYPE_UNDEFINED,
BDS_B1C_ORBIT_TYPE_GEO,
BDS_B1C_ORBIT_TYPE_IGSO,
BDS_B1C_ORBIT_TYPE_MEO
})
public @interface BeidouB1CSatelliteOrbitType {}
/**
* The following enumerations must be in sync with the values declared in
* AuxiliaryInformation.aidl.
*/
/** The orbit type is undefined. */
public static final int BDS_B1C_ORBIT_TYPE_UNDEFINED = 0;
/** The orbit type is GEO. */
public static final int BDS_B1C_ORBIT_TYPE_GEO = 1;
/** The orbit type is IGSO. */
public static final int BDS_B1C_ORBIT_TYPE_IGSO = 2;
/** The orbit type is MEO. */
public static final int BDS_B1C_ORBIT_TYPE_MEO = 3;
/**
* 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
*/
private final int mSvid;
/** The list of available signal types for the satellite. */
@NonNull private final List<GnssSignalType> mAvailableSignalTypes;
/**
* Glonass carrier frequency number of the satellite. This is required for Glonass.
*
* <p>This is defined in Glonass ICD v5.1 section 3.3.1.1.
*/
private final int mFrequencyChannelNumber;
/** BDS B1C satellite orbit type. This is required for Beidou. */
private final @BeidouB1CSatelliteOrbitType int mSatType;
private AuxiliaryInformation(Builder builder) {
// Allow Svid beyond the range to support potential future extensibility.
Preconditions.checkArgument(builder.mSvid >= 1);
Preconditions.checkNotNull(
builder.mAvailableSignalTypes, "AvailableSignalTypes cannot be null");
Preconditions.checkArgument(builder.mAvailableSignalTypes.size() > 0);
Preconditions.checkArgumentInRange(
builder.mFrequencyChannelNumber, -7, 6, "FrequencyChannelNumber");
Preconditions.checkArgumentInRange(
builder.mSatType, BDS_B1C_ORBIT_TYPE_UNDEFINED, BDS_B1C_ORBIT_TYPE_MEO, "SatType");
mSvid = builder.mSvid;
mAvailableSignalTypes =
Collections.unmodifiableList(new ArrayList<>(builder.mAvailableSignalTypes));
mFrequencyChannelNumber = builder.mFrequencyChannelNumber;
mSatType = builder.mSatType;
}
/**
* 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)
public int getSvid() {
return mSvid;
}
/** Returns the list of available signal types for the satellite. */
@NonNull
public List<GnssSignalType> getAvailableSignalTypes() {
return mAvailableSignalTypes;
}
/** Returns the Glonass carrier frequency number of the satellite. */
@IntRange(from = -7, to = 6)
public int getFrequencyChannelNumber() {
return mFrequencyChannelNumber;
}
/** Returns the BDS B1C satellite orbit type. */
@BeidouB1CSatelliteOrbitType
public int getSatType() {
return mSatType;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(mSvid);
dest.writeTypedList(mAvailableSignalTypes);
dest.writeInt(mFrequencyChannelNumber);
dest.writeInt(mSatType);
}
@Override
@NonNull
public String toString() {
StringBuilder builder = new StringBuilder("AuxiliaryInformation[");
builder.append("svid = ").append(mSvid);
builder.append(", availableSignalTypes = ").append(mAvailableSignalTypes);
builder.append(", frequencyChannelNumber = ").append(mFrequencyChannelNumber);
builder.append(", satType = ").append(mSatType);
builder.append("]");
return builder.toString();
}
public static final @NonNull Parcelable.Creator<AuxiliaryInformation> CREATOR =
new Parcelable.Creator<AuxiliaryInformation>() {
@Override
public AuxiliaryInformation createFromParcel(@NonNull Parcel in) {
return new AuxiliaryInformation.Builder()
.setSvid(in.readInt())
.setAvailableSignalTypes(
in.createTypedArrayList(GnssSignalType.CREATOR))
.setFrequencyChannelNumber(in.readInt())
.setSatType(in.readInt())
.build();
}
@Override
public AuxiliaryInformation[] newArray(int size) {
return new AuxiliaryInformation[size];
}
};
/** A builder class for {@link AuxiliaryInformation}. */
public static final class Builder {
private int mSvid;
private List<GnssSignalType> mAvailableSignalTypes;
private int mFrequencyChannelNumber;
private @BeidouB1CSatelliteOrbitType int mSatType;
/**
* Sets 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
*/
@NonNull
public Builder setSvid(@IntRange(from = 1) int svid) {
mSvid = svid;
return this;
}
/**
* Sets the list of available signal types for the satellite.
*
* <p>The list must be set and cannot be an empty list.
*/
@NonNull
public Builder setAvailableSignalTypes(@NonNull List<GnssSignalType> availableSignalTypes) {
mAvailableSignalTypes = availableSignalTypes;
return this;
}
/** Sets the Glonass carrier frequency number of the satellite. */
@NonNull
public Builder setFrequencyChannelNumber(
@IntRange(from = -7, to = 6) int frequencyChannelNumber) {
mFrequencyChannelNumber = frequencyChannelNumber;
return this;
}
/** Sets the BDS B1C satellite orbit type. */
@NonNull
public Builder setSatType(@BeidouB1CSatelliteOrbitType int satType) {
mSatType = satType;
return this;
}
/** Builds a {@link AuxiliaryInformation} instance as specified by this builder. */
@NonNull
public AuxiliaryInformation build() {
return new AuxiliaryInformation(this);
}
}
}