1 /* 2 * Copyright 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.uwb; 18 19 import android.annotation.NonNull; 20 import android.annotation.Nullable; 21 import android.annotation.SystemApi; 22 import android.os.Parcel; 23 import android.os.Parcelable; 24 25 import java.util.Objects; 26 27 /** 28 * Represents an angle of arrival measurement between two devices using Ultra Wideband 29 * 30 * @hide 31 */ 32 @SystemApi 33 public final class AngleOfArrivalMeasurement implements Parcelable { 34 private final AngleMeasurement mAzimuthAngleMeasurement; 35 private final AngleMeasurement mAltitudeAngleMeasurement; 36 AngleOfArrivalMeasurement(@onNull AngleMeasurement azimuthAngleMeasurement, @Nullable AngleMeasurement altitudeAngleMeasurement)37 private AngleOfArrivalMeasurement(@NonNull AngleMeasurement azimuthAngleMeasurement, 38 @Nullable AngleMeasurement altitudeAngleMeasurement) { 39 mAzimuthAngleMeasurement = azimuthAngleMeasurement; 40 mAltitudeAngleMeasurement = altitudeAngleMeasurement; 41 } 42 43 /** 44 * Azimuth angle measurement 45 * <p>Azimuth {@link AngleMeasurement} of remote device in horizontal coordinate system, this is 46 * the angle clockwise from the meridian when viewing above the north pole. 47 * 48 * <p>See: https://en.wikipedia.org/wiki/Horizontal_coordinate_system 49 * 50 * <p>On an Android device, azimuth north is defined as the angle perpendicular away from the 51 * back of the device when holding it in portrait mode upright. 52 * 53 * <p>Azimuth angle must be supported when Angle of Arrival is supported 54 * 55 * @return the azimuth {@link AngleMeasurement} 56 */ 57 @NonNull getAzimuth()58 public AngleMeasurement getAzimuth() { 59 return mAzimuthAngleMeasurement; 60 } 61 62 /** 63 * Altitude angle measurement 64 * <p>Altitude {@link AngleMeasurement} of remote device in horizontal coordinate system, this 65 * is the angle above the equator when the north pole is up. 66 * 67 * <p>See: https://en.wikipedia.org/wiki/Horizontal_coordinate_system 68 * 69 * <p>On an Android device, altitude is defined as the angle vertical from ground when holding 70 * the device in portrait mode upright. 71 * 72 * @return altitude {@link AngleMeasurement} or null when this is not available 73 */ 74 @Nullable getAltitude()75 public AngleMeasurement getAltitude() { 76 return mAltitudeAngleMeasurement; 77 } 78 79 /** 80 * @hide 81 */ 82 @Override equals(Object obj)83 public boolean equals(Object obj) { 84 if (this == obj) { 85 return true; 86 } 87 88 if (obj instanceof AngleOfArrivalMeasurement) { 89 AngleOfArrivalMeasurement other = (AngleOfArrivalMeasurement) obj; 90 return mAzimuthAngleMeasurement.equals(other.getAzimuth()) 91 && mAltitudeAngleMeasurement.equals(other.getAltitude()); 92 } 93 return false; 94 } 95 96 /** 97 * @hide 98 */ 99 @Override hashCode()100 public int hashCode() { 101 return Objects.hash(mAzimuthAngleMeasurement, mAltitudeAngleMeasurement); 102 } 103 104 @Override describeContents()105 public int describeContents() { 106 return 0; 107 } 108 109 @Override writeToParcel(@onNull Parcel dest, int flags)110 public void writeToParcel(@NonNull Parcel dest, int flags) { 111 dest.writeParcelable(mAzimuthAngleMeasurement, flags); 112 dest.writeParcelable(mAltitudeAngleMeasurement, flags); 113 } 114 115 public static final @android.annotation.NonNull Creator<AngleOfArrivalMeasurement> CREATOR = 116 new Creator<AngleOfArrivalMeasurement>() { 117 @Override 118 public AngleOfArrivalMeasurement createFromParcel(Parcel in) { 119 Builder builder = 120 new Builder(in.readParcelable(AngleMeasurement.class.getClassLoader())); 121 122 builder.setAltitude(in.readParcelable(AngleMeasurement.class.getClassLoader())); 123 124 return builder.build(); 125 } 126 127 @Override 128 public AngleOfArrivalMeasurement[] newArray(int size) { 129 return new AngleOfArrivalMeasurement[size]; 130 } 131 }; 132 133 /** 134 * Builder class for {@link AngleOfArrivalMeasurement}. 135 */ 136 public static final class Builder { 137 private final AngleMeasurement mAzimuthAngleMeasurement; 138 private AngleMeasurement mAltitudeAngleMeasurement = null; 139 140 /** 141 * Constructs an {@link AngleOfArrivalMeasurement} object 142 * 143 * @param azimuthAngle the azimuth angle of the measurement 144 */ Builder(@onNull AngleMeasurement azimuthAngle)145 public Builder(@NonNull AngleMeasurement azimuthAngle) { 146 mAzimuthAngleMeasurement = azimuthAngle; 147 } 148 149 /** 150 * Set the altitude angle 151 * 152 * @param altitudeAngle altitude angle 153 */ 154 @NonNull setAltitude(@onNull AngleMeasurement altitudeAngle)155 public Builder setAltitude(@NonNull AngleMeasurement altitudeAngle) { 156 mAltitudeAngleMeasurement = altitudeAngle; 157 return this; 158 } 159 160 /** 161 * Build the {@link AngleOfArrivalMeasurement} object 162 */ 163 @NonNull build()164 public AngleOfArrivalMeasurement build() { 165 return new AngleOfArrivalMeasurement(mAzimuthAngleMeasurement, 166 mAltitudeAngleMeasurement); 167 } 168 } 169 } 170