/* * Copyright (C) 2018 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.FloatRange; import android.annotation.NonNull; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; import java.util.Objects; /** * Holds the characteristics of the reflecting plane that a satellite signal has bounced from. * *

Starting with Android T, this class supports {@link #equals} and {@link #hashCode}, which * are not supported before that. * * @hide */ @SystemApi public final class GnssReflectingPlane implements Parcelable { /** Represents latitude in degrees of the reflecting plane */ @FloatRange(from = -90.0f, to = 90.0f) private final double mLatitudeDegrees; /** Represents longitude in degrees of the reflecting plane. */ @FloatRange(from = -180.0f, to = 180.0f) private final double mLongitudeDegrees; /** * Represents altitude in meters above the WGS 84 reference ellipsoid of the reflection point in * the plane */ @FloatRange(from = -1000.0f, to = 10000.0f) private final double mAltitudeMeters; /** Represents azimuth clockwise from north of the reflecting plane in degrees. */ @FloatRange(from = 0.0f, to = 360.0f) private final double mAzimuthDegrees; private GnssReflectingPlane(Builder builder) { mLatitudeDegrees = builder.mLatitudeDegrees; mLongitudeDegrees = builder.mLongitudeDegrees; mAltitudeMeters = builder.mAltitudeMeters; mAzimuthDegrees = builder.mAzimuthDegrees; } /** Gets the latitude in degrees of the reflecting plane. */ @FloatRange(from = -90.0f, to = 90.0f) public double getLatitudeDegrees() { return mLatitudeDegrees; } /** Gets the longitude in degrees of the reflecting plane. */ @FloatRange(from = -180.0f, to = 180.0f) public double getLongitudeDegrees() { return mLongitudeDegrees; } /** * Gets the altitude in meters above the WGS 84 reference ellipsoid of the reflecting point * within the plane */ @FloatRange(from = -1000.0f, to = 10000.0f) public double getAltitudeMeters() { return mAltitudeMeters; } /** Gets the azimuth clockwise from north of the reflecting plane in degrees. */ @FloatRange(from = 0.0f, to = 360.0f) public double getAzimuthDegrees() { return mAzimuthDegrees; } @Override public int describeContents() { return 0; } public static final Creator CREATOR = new Creator() { @Override @NonNull public GnssReflectingPlane createFromParcel(@NonNull Parcel parcel) { GnssReflectingPlane reflectingPlane = new Builder() .setLatitudeDegrees(parcel.readDouble()) .setLongitudeDegrees(parcel.readDouble()) .setAltitudeMeters(parcel.readDouble()) .setAzimuthDegrees(parcel.readDouble()) .build(); return reflectingPlane; } @Override public GnssReflectingPlane[] newArray(int i) { return new GnssReflectingPlane[i]; } }; @Override public void writeToParcel(@NonNull Parcel parcel, int flags) { parcel.writeDouble(mLatitudeDegrees); parcel.writeDouble(mLongitudeDegrees); parcel.writeDouble(mAltitudeMeters); parcel.writeDouble(mAzimuthDegrees); } @NonNull @Override public String toString() { StringBuilder builder = new StringBuilder("ReflectingPlane["); builder.append(" LatitudeDegrees=").append(mLatitudeDegrees); builder.append(" LongitudeDegrees=").append(mLongitudeDegrees); builder.append(" AltitudeMeters=").append(mAltitudeMeters); builder.append(" AzimuthDegrees=").append(mAzimuthDegrees); builder.append(']'); return builder.toString(); } @Override public boolean equals(Object obj) { if (obj instanceof GnssReflectingPlane) { GnssReflectingPlane that = (GnssReflectingPlane) obj; return Double.compare(this.mLatitudeDegrees, that.mLatitudeDegrees) == 0 && Double.compare(this.mLongitudeDegrees, that.mLongitudeDegrees) == 0 && Double.compare(this.mAltitudeMeters, that.mAltitudeMeters) == 0 && Double.compare(this.mAzimuthDegrees, that.mAzimuthDegrees) == 0; } return false; } @Override public int hashCode() { return Objects.hash(mLatitudeDegrees, mLatitudeDegrees, mAltitudeMeters, mAzimuthDegrees); } /** Builder for {@link GnssReflectingPlane} */ public static final class Builder { /** For documentation, see corresponding fields in {@link GnssReflectingPlane}. */ private double mLatitudeDegrees; private double mLongitudeDegrees; private double mAltitudeMeters; private double mAzimuthDegrees; /** Sets the latitude in degrees of the reflecting plane. */ @NonNull public Builder setLatitudeDegrees( @FloatRange(from = -90.0f, to = 90.0f) double latitudeDegrees) { mLatitudeDegrees = latitudeDegrees; return this; } /** Sets the longitude in degrees of the reflecting plane. */ @NonNull public Builder setLongitudeDegrees( @FloatRange(from = -180.0f, to = 180.0f) double longitudeDegrees) { mLongitudeDegrees = longitudeDegrees; return this; } /** * Sets the altitude in meters above the WGS 84 reference ellipsoid of the reflecting point * within the plane */ @NonNull public Builder setAltitudeMeters( @FloatRange(from = -1000.0f, to = 10000.0f) double altitudeMeters) { mAltitudeMeters = altitudeMeters; return this; } /** Sets the azimuth clockwise from north of the reflecting plane in degrees. */ @NonNull public Builder setAzimuthDegrees( @FloatRange(from = 0.0f, to = 360.0f) double azimuthDegrees) { mAzimuthDegrees = azimuthDegrees; return this; } /** Builds a {@link GnssReflectingPlane} object as specified by this builder. */ @NonNull public GnssReflectingPlane build() { return new GnssReflectingPlane(this); } } }