Refactor code for building ranging report.

- Take out common code for building ranging report for TwoWay and OwR
  measurements in helper methods.
- Add tests for the case where AngleOfArrivalMeasurement cannot be
  computed as the required field aoaAzimuth is not present.

Test: atest
BugId: 246678053
Change-Id: Ia47243a721496ab4e83dd6ae44ed639b7dc5c311
diff --git a/framework/java/android/uwb/RangingReport.java b/framework/java/android/uwb/RangingReport.java
index dc899e2..4bce4b4 100644
--- a/framework/java/android/uwb/RangingReport.java
+++ b/framework/java/android/uwb/RangingReport.java
@@ -80,7 +80,7 @@
         if (obj instanceof RangingReport) {
             RangingReport other = (RangingReport) obj;
             return mRangingMeasurements.equals(other.getMeasurements());
-            // TODO: Equality for RangingReportMetadata
+            // TODO(b/256734264): Equality for RangingReportMetadata
         }
         return false;
     }
diff --git a/service/java/com/android/server/uwb/UwbSessionNotificationManager.java b/service/java/com/android/server/uwb/UwbSessionNotificationManager.java
index 2f8fe19..d7bf201 100644
--- a/service/java/com/android/server/uwb/UwbSessionNotificationManager.java
+++ b/service/java/com/android/server/uwb/UwbSessionNotificationManager.java
@@ -388,6 +388,7 @@
         boolean isDestAoaAzimuthEnabled = false;
         boolean isDestAoaElevationEnabled = false;
         long sessionId = 0;
+
         // For FIRA sessions, check if AOA is enabled for the session or not.
         if (protocolName.equals(FiraParams.PROTOCOL_NAME)) {
             FiraOpenSessionParams openSessionParams = (FiraOpenSessionParams) sessionParams;
@@ -423,164 +424,140 @@
             }
         }
 
-        // TODO(b/246678053): Refactor this code, try to take out the common code into a method.
+        // TODO(b/256734264): The unit tests are currently not checking for this field, as
+        //  RangingReport.equals() does not compare it.
+        PersistableBundle rangingReportMetadata = new RangingReportMetadata.Builder()
+                .setSessionId(sessionId)
+                .setRawNtfData(rangingData.getRawNtfData())
+                .build()
+                .toBundle();
+        RangingReport.Builder rangingReportBuilder = new RangingReport.Builder()
+                .addRangingReportMetadata(rangingReportMetadata);
+
         if (rangingData.getRangingMeasuresType()
                 == UwbUciConstants.RANGING_MEASUREMENT_TYPE_TWO_WAY) {
             List<RangingMeasurement> rangingMeasurements = new ArrayList<>();
             UwbTwoWayMeasurement[] uwbTwoWayMeasurement = rangingData.getRangingTwoWayMeasures();
             for (int i = 0; i < rangingData.getNoOfRangingMeasures(); ++i) {
-                UwbAddress macAddress = UwbAddress.fromBytes(TlvUtil.getReverseBytes(
-                        uwbTwoWayMeasurement[i].getMacAddress()));
                 int rangingStatus = uwbTwoWayMeasurement[i].getRangingStatus();
-                DistanceMeasurement distanceMeasurement = null;
-                AngleOfArrivalMeasurement angleOfArrivalMeasurement = null;
-                AngleOfArrivalMeasurement destinationAngleOfArrivalMeasurement = null;
-                int los = uwbTwoWayMeasurement[i].mNLoS;
-                int rssi = uwbTwoWayMeasurement[i].getRssi();
 
-                if (rangingStatus == FiraParams.STATUS_CODE_OK) {
-                    // Distance measurement is mandatory
-                    distanceMeasurement = new DistanceMeasurement.Builder()
-                            .setMeters(uwbTwoWayMeasurement[i].getDistance() / (double) 100)
-                            .setErrorMeters(0)
-                            // TODO: Need to fetch distance FOM once it is added to UCI spec.
-                            .setConfidenceLevel(0)
-                            .build();
-                    // Aoa measurement is optional based on configuration.
-                    if (isAoaAzimuthEnabled || isAoaElevationEnabled) {
-                        AngleMeasurement azimuthAngleMeasurement = null;
-                        AngleMeasurement altitudeAngleMeasurement = null;
-                        if (isAoaAzimuthEnabled) {
-                            azimuthAngleMeasurement = new AngleMeasurement(
-                                    UwbUtil.degreeToRadian(uwbTwoWayMeasurement[i].getAoaAzimuth()),
-                                    0, uwbTwoWayMeasurement[i].getAoaAzimuthFom() / (double) 100);
-                        }
-                        if (isAoaElevationEnabled) {
-                            altitudeAngleMeasurement = new AngleMeasurement(
-                                    UwbUtil.degreeToRadian(
-                                            uwbTwoWayMeasurement[i].getAoaElevation()),
-                                    0, uwbTwoWayMeasurement[i].getAoaElevationFom() / (double) 100);
-                        }
-                        // AngleOfArrivalMeasurement
-                        angleOfArrivalMeasurement = new AngleOfArrivalMeasurement.Builder(
-                                azimuthAngleMeasurement)
-                                .setAltitude(altitudeAngleMeasurement)
-                                .build();
-                    }
-                    if (isDestAoaAzimuthEnabled || isDestAoaElevationEnabled) {
-                        AngleMeasurement destinationAzimuthAngleMeasurement = null;
-                        AngleMeasurement destinationAltitudeAngleMeasurement = null;
-                        if (isDestAoaAzimuthEnabled) {
-                            destinationAzimuthAngleMeasurement = new AngleMeasurement(
-                                    UwbUtil.degreeToRadian(
-                                            uwbTwoWayMeasurement[i].getAoaDestAzimuth()),
-                                    0,
-                                    uwbTwoWayMeasurement[i].getAoaDestAzimuthFom() / (double) 100);
-                        }
-                        if (isDestAoaElevationEnabled) {
-                            destinationAltitudeAngleMeasurement = new AngleMeasurement(
-                                    UwbUtil.degreeToRadian(
-                                            uwbTwoWayMeasurement[i].getAoaDestElevation()),
-                                    0,
-                                    uwbTwoWayMeasurement[i].getAoaDestElevationFom()
-                                            / (double) 100);
-                        }
-                        // Dest AngleOfArrivalMeasurement
-                        destinationAngleOfArrivalMeasurement =
-                                new AngleOfArrivalMeasurement.Builder(
-                                        destinationAzimuthAngleMeasurement)
-                                    .setAltitude(destinationAltitudeAngleMeasurement)
-                                    .build();
-                    }
-                }
-                RangingMeasurement.Builder rangingMeasurementBuilder =
-                        new RangingMeasurement.Builder()
-                            .setRemoteDeviceAddress(macAddress)
-                            .setStatus(rangingStatus)
-                            .setElapsedRealtimeNanos(elapsedRealtimeNanos)
-                            .setDistanceMeasurement(distanceMeasurement)
-                            .setAngleOfArrivalMeasurement(angleOfArrivalMeasurement)
-                            .setDestinationAngleOfArrivalMeasurement(
-                                    destinationAngleOfArrivalMeasurement)
-                            .setLineOfSight(los);
+                RangingMeasurement.Builder rangingMeasurementBuilder = buildRangingMeasurement(
+                        uwbTwoWayMeasurement[i].getMacAddress(), rangingStatus,
+                        elapsedRealtimeNanos, uwbTwoWayMeasurement[i].getNLoS());
+                int rssi = uwbTwoWayMeasurement[i].getRssi();
                 if (rssi < 0) {
                     rangingMeasurementBuilder.setRssiDbm(rssi);
                 }
+
+                if (rangingStatus == FiraParams.STATUS_CODE_OK) {
+                    // Distance measurement is mandatory
+                    rangingMeasurementBuilder.setDistanceMeasurement(
+                            buildDistanceMeasurement(uwbTwoWayMeasurement[i].getDistance()));
+
+                    // Aoa measurement is optional based on configuration.
+                    AngleOfArrivalMeasurement angleOfArrivalMeasurement =
+                            computeAngleOfArrivalMeasurement(
+                                    isAoaAzimuthEnabled, isAoaElevationEnabled,
+                                    uwbTwoWayMeasurement[i].getAoaAzimuth(),
+                                    uwbTwoWayMeasurement[i].getAoaAzimuthFom(),
+                                    uwbTwoWayMeasurement[i].getAoaElevation(),
+                                    uwbTwoWayMeasurement[i].getAoaElevationFom());
+                    if (angleOfArrivalMeasurement != null) {
+                        rangingMeasurementBuilder.setAngleOfArrivalMeasurement(
+                                angleOfArrivalMeasurement);
+                    }
+
+                    // Dest AngleOfArrivalMeasurement
+                    AngleOfArrivalMeasurement destinationAngleOfArrivalMeasurement =
+                            computeAngleOfArrivalMeasurement(
+                                    isDestAoaAzimuthEnabled, isDestAoaElevationEnabled,
+                                    uwbTwoWayMeasurement[i].getAoaDestAzimuth(),
+                                    uwbTwoWayMeasurement[i].getAoaDestAzimuthFom(),
+                                    uwbTwoWayMeasurement[i].getAoaDestElevation(),
+                                    uwbTwoWayMeasurement[i].getAoaDestElevationFom());
+                    if (destinationAngleOfArrivalMeasurement != null) {
+                        rangingMeasurementBuilder.setDestinationAngleOfArrivalMeasurement(
+                                destinationAngleOfArrivalMeasurement);
+                    }
+                }
+
                 // TODO: No ranging measurement metadata defined, added for future usage
                 PersistableBundle rangingMeasurementMetadata = new PersistableBundle();
                 rangingMeasurementBuilder.setRangingMeasurementMetadata(rangingMeasurementMetadata);
+
                 rangingMeasurements.add(rangingMeasurementBuilder.build());
             }
 
-            PersistableBundle rangingReportMetadata = new RangingReportMetadata.Builder()
-                    .setSessionId(sessionId)
-                    .setRawNtfData(rangingData.getRawNtfData())
-                    .build()
-                    .toBundle();
-
-            if (rangingMeasurements.size() == 1) {
-                return new RangingReport.Builder()
-                        .addMeasurement(rangingMeasurements.get(0))
-                        .addRangingReportMetadata(rangingReportMetadata)
-                        .build();
-            } else {
-                return new RangingReport.Builder()
-                        .addMeasurements(rangingMeasurements)
-                        .addRangingReportMetadata(rangingReportMetadata)
-                        .build();
-            }
+            rangingReportBuilder.addMeasurements(rangingMeasurements);
         } else if (rangingData.getRangingMeasuresType()
                 == UwbUciConstants.RANGING_MEASUREMENT_TYPE_OWR_AOA) {
-            RangingMeasurement rangingMeasurement = null;
             UwbOwrAoaMeasurement uwbOwrAoaMeasurement = rangingData.getRangingOwrAoaMeasure();
 
-            UwbAddress macAddress = UwbAddress.fromBytes(TlvUtil.getReverseBytes(
-                    uwbOwrAoaMeasurement.getMacAddress()));
             int rangingStatus = uwbOwrAoaMeasurement.getRangingStatus();
-            AngleOfArrivalMeasurement angleOfArrivalMeasurement = null;
-            int los = uwbOwrAoaMeasurement.getNLoS();
+            RangingMeasurement.Builder rangingMeasurementBuilder = buildRangingMeasurement(
+                    uwbOwrAoaMeasurement.getMacAddress(), rangingStatus, elapsedRealtimeNanos,
+                    uwbOwrAoaMeasurement.getNLoS());
 
             if (rangingStatus == FiraParams.STATUS_CODE_OK) {
-                if (isAoaAzimuthEnabled || isAoaElevationEnabled) {
-                    AngleMeasurement azimuthAngleMeasurement = null;
-                    AngleMeasurement altitudeAngleMeasurement = null;
-                    if (isAoaAzimuthEnabled) {
-                        azimuthAngleMeasurement = new AngleMeasurement(
-                                UwbUtil.degreeToRadian(uwbOwrAoaMeasurement.getAoaAzimuth()),
-                                0, uwbOwrAoaMeasurement.getAoaAzimuthFom() / (double) 100);
-                    }
-                    if (isAoaElevationEnabled) {
-                        altitudeAngleMeasurement = new AngleMeasurement(
-                                UwbUtil.degreeToRadian(uwbOwrAoaMeasurement.getAoaElevation()),
-                                0, uwbOwrAoaMeasurement.getAoaElevationFom() / (double) 100);
-                    }
-                    // AngleOfArrivalMeasurement
-                    angleOfArrivalMeasurement = new AngleOfArrivalMeasurement.Builder(
-                            azimuthAngleMeasurement)
-                            .setAltitude(altitudeAngleMeasurement)
-                            .build();
+                // AngleOfArrivalMeasurement
+                AngleOfArrivalMeasurement angleOfArrivalMeasurement =
+                        computeAngleOfArrivalMeasurement(
+                                isAoaAzimuthEnabled, isAoaElevationEnabled,
+                                uwbOwrAoaMeasurement.getAoaAzimuth(),
+                                uwbOwrAoaMeasurement.getAoaAzimuthFom(),
+                                uwbOwrAoaMeasurement.getAoaElevation(),
+                                uwbOwrAoaMeasurement.getAoaElevationFom());
+                if (angleOfArrivalMeasurement != null) {
+                    rangingMeasurementBuilder.setAngleOfArrivalMeasurement(
+                            angleOfArrivalMeasurement);
                 }
             }
-            rangingMeasurement = new RangingMeasurement.Builder()
-                    .setRemoteDeviceAddress(macAddress)
-                    .setStatus(rangingStatus)
-                    .setElapsedRealtimeNanos(elapsedRealtimeNanos)
-                    .setAngleOfArrivalMeasurement(angleOfArrivalMeasurement)
-                    .setLineOfSight(los)
-                    .build();
 
-            // TODO(b/246678053): Add rawNtfData[] for the OWR AoA Measurements.
-            PersistableBundle rangingReportMetadata = new RangingReportMetadata.Builder()
-                    .setSessionId(sessionId)
-                    .build()
-                    .toBundle();
+            rangingReportBuilder.addMeasurement(rangingMeasurementBuilder.build());
+        }
+        return rangingReportBuilder.build();
+    }
 
-            return new RangingReport.Builder()
-                        .addMeasurement(rangingMeasurement)
-                        .addRangingReportMetadata(rangingReportMetadata)
-                        .build();
+    private static AngleOfArrivalMeasurement computeAngleOfArrivalMeasurement(
+            boolean isAoaAzimuthEnabled, boolean isAoaElevationEnabled, float aoaAzimuth,
+            int aoaAzimuthFom, float aoaElevation, int aoaElevationFom) {
+        // Azimuth is required field (and elevation is an optional field), to build the
+        // AngleOfArrivalMeasurement.
+        if (isAoaAzimuthEnabled) {
+            AngleMeasurement azimuthAngleMeasurement = new AngleMeasurement(
+                    UwbUtil.degreeToRadian(aoaAzimuth), 0, aoaAzimuthFom / (double) 100);
+            // AngleOfArrivalMeasurement
+            AngleOfArrivalMeasurement.Builder angleOfArrivalMeasurementBuilder =
+                    new AngleOfArrivalMeasurement.Builder(azimuthAngleMeasurement);
+
+            // Elevation is optional field, to build the AngleOfArrivalMeasurement.
+            if (isAoaElevationEnabled) {
+                AngleMeasurement altitudeAngleMeasurement = new AngleMeasurement(
+                        UwbUtil.degreeToRadian(aoaElevation), 0, aoaElevationFom / (double) 100);
+                angleOfArrivalMeasurementBuilder.setAltitude(altitudeAngleMeasurement);
+            }
+
+            return angleOfArrivalMeasurementBuilder.build();
         }
 
         return null;
     }
+
+    private static RangingMeasurement.Builder buildRangingMeasurement(
+            byte[] macAddress, int rangingStatus, long elapsedRealtimeNanos, int los) {
+        return new RangingMeasurement.Builder()
+                .setRemoteDeviceAddress(UwbAddress.fromBytes(TlvUtil.getReverseBytes(macAddress)))
+                .setStatus(rangingStatus)
+                .setElapsedRealtimeNanos(elapsedRealtimeNanos)
+                .setLineOfSight(los);
+    }
+
+    private static DistanceMeasurement buildDistanceMeasurement(int distance) {
+        return new DistanceMeasurement.Builder()
+                .setMeters(distance / (double) 100)
+                .setErrorMeters(0)
+                // TODO: Need to fetch distance FOM once it is added to UCI spec.
+                .setConfidenceLevel(0)
+                .build();
+    }
 }
diff --git a/service/java/com/android/server/uwb/UwbTestUtils.java b/service/java/com/android/server/uwb/UwbTestUtils.java
index e969595..83ad2ba 100644
--- a/service/java/com/android/server/uwb/UwbTestUtils.java
+++ b/service/java/com/android/server/uwb/UwbTestUtils.java
@@ -138,40 +138,43 @@
         if (isAoaAzimuthEnabled || isAoaElevationEnabled) {
             AngleMeasurement aoaAzimuth = null;
             AngleMeasurement aoaElevation = null;
+            AngleOfArrivalMeasurement.Builder aoaBuilder = null;
+
             if (isAoaAzimuthEnabled) {
-                aoaAzimuth =
-                        new AngleMeasurement(
-                                degreeToRadian(TEST_AOA_AZIMUTH), 0,
-                                TEST_AOA_AZIMUTH_FOM / (double) 100);
+                aoaAzimuth = new AngleMeasurement(
+                        degreeToRadian(TEST_AOA_AZIMUTH), 0,
+                        TEST_AOA_AZIMUTH_FOM / (double) 100);
+                aoaBuilder = new AngleOfArrivalMeasurement.Builder(aoaAzimuth);
             }
-            if (isAoaElevationEnabled) {
-                aoaElevation =
-                        new AngleMeasurement(
-                                degreeToRadian(TEST_AOA_ELEVATION), 0,
-                                TEST_AOA_ELEVATION_FOM / (double) 100);
+            if (isAoaElevationEnabled && aoaBuilder != null) {
+                aoaElevation = new AngleMeasurement(
+                        degreeToRadian(TEST_AOA_ELEVATION), 0,
+                        TEST_AOA_ELEVATION_FOM / (double) 100);
+                aoaBuilder.setAltitude(aoaElevation);
             }
-            aoaMeasurement = new AngleOfArrivalMeasurement.Builder(aoaAzimuth)
-                    .setAltitude(aoaElevation)
-                    .build();
+
+            aoaMeasurement = (aoaBuilder != null) ? aoaBuilder.build() : null;
         }
         if (isDestAoaAzimuthEnabled || isDestAoaElevationEnabled) {
             AngleMeasurement aoaDestAzimuth = null;
             AngleMeasurement aoaDestElevation = null;
+            AngleOfArrivalMeasurement.Builder aoaBuilder = null;
+
             if (isDestAoaAzimuthEnabled) {
                 aoaDestAzimuth =
                         new AngleMeasurement(
                                 degreeToRadian(TEST_AOA_DEST_AZIMUTH), 0,
                                 TEST_AOA_DEST_AZIMUTH_FOM / (double) 100);
+                aoaBuilder = new AngleOfArrivalMeasurement.Builder(aoaDestAzimuth);
             }
-            if (isDestAoaElevationEnabled) {
+            if (isDestAoaElevationEnabled && aoaBuilder != null) {
                 aoaDestElevation =
                         new AngleMeasurement(
                                 degreeToRadian(TEST_AOA_DEST_ELEVATION), 0,
                                 TEST_AOA_DEST_ELEVATION_FOM / (double) 100);
+                aoaBuilder.setAltitude(aoaDestElevation);
             }
-            aoaDestMeasurement = new AngleOfArrivalMeasurement.Builder(aoaDestAzimuth)
-                    .setAltitude(aoaDestElevation)
-                    .build();
+            aoaDestMeasurement = (aoaBuilder != null) ? aoaBuilder.build() : null;
         }
 
         RangingReport rangingReport = buildRangingReport(macAddress, rangingMeasurementType,
diff --git a/service/tests/src/com/android/server/uwb/UwbSessionNotificationManagerTest.java b/service/tests/src/com/android/server/uwb/UwbSessionNotificationManagerTest.java
index f10fa32..7cfce4d 100644
--- a/service/tests/src/com/android/server/uwb/UwbSessionNotificationManagerTest.java
+++ b/service/tests/src/com/android/server/uwb/UwbSessionNotificationManagerTest.java
@@ -146,9 +146,6 @@
                 mSessionHandle, testRangingDataAndRangingReport.second);
     }
 
-    // TODO(b/246678053): Confirm tests are checking case when one of Azimuth/Elevation is null, as
-    // code sends null while the AngleOfArrivalMeasurement builder takes only non-null as input.
-
     @Test
     public void testOnRangingResult_forTwoWay_WithNoAoaElevation() throws Exception {
         when(mFiraParams.getAoaResultRequest()).thenReturn(
@@ -195,6 +192,91 @@
     }
 
     @Test
+    public void testOnRangingResult_forTwoWay_WithAoaAndNoDestAzimuth() throws Exception {
+        when(mFiraParams.getAoaResultRequest()).thenReturn(
+                FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS);
+        when(mFiraParams.hasResultReportPhase()).thenReturn(true);
+        when(mFiraParams.hasAngleOfArrivalAzimuthReport()).thenReturn(false);
+        when(mFiraParams.hasAngleOfArrivalElevationReport()).thenReturn(true);
+        Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
+                UwbTestUtils.generateRangingDataAndRangingReport(
+                        PEER_SHORT_MAC_ADDRESS, RANGING_MEASUREMENT_TYPE_TWO_WAY,
+                        true, true, false, true, TEST_ELAPSED_NANOS);
+        mUwbSessionNotificationManager.onRangingResult(
+                mUwbSession, testRangingDataAndRangingReport.first);
+        verify(mIUwbRangingCallbacks).onRangingResult(
+                mSessionHandle, testRangingDataAndRangingReport.second);
+    }
+
+    @Test
+    public void testOnRangingResult_forTwoWay_WithAoaAndNoDestElevation() throws Exception {
+        when(mFiraParams.getAoaResultRequest()).thenReturn(
+                FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS);
+        when(mFiraParams.hasResultReportPhase()).thenReturn(true);
+        when(mFiraParams.hasAngleOfArrivalAzimuthReport()).thenReturn(true);
+        when(mFiraParams.hasAngleOfArrivalElevationReport()).thenReturn(false);
+        Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
+                UwbTestUtils.generateRangingDataAndRangingReport(
+                        PEER_SHORT_MAC_ADDRESS, RANGING_MEASUREMENT_TYPE_TWO_WAY,
+                        true, true, true, false, TEST_ELAPSED_NANOS);
+        mUwbSessionNotificationManager.onRangingResult(
+                mUwbSession, testRangingDataAndRangingReport.first);
+        verify(mIUwbRangingCallbacks).onRangingResult(
+                mSessionHandle, testRangingDataAndRangingReport.second);
+    }
+
+    @Test
+    public void testOnRangingResult_forTwoWay_WithNoAoaAndDestAoa() throws Exception {
+        when(mFiraParams.getAoaResultRequest()).thenReturn(
+                FiraParams.AOA_RESULT_REQUEST_MODE_NO_AOA_REPORT);
+        when(mFiraParams.hasResultReportPhase()).thenReturn(true);
+        when(mFiraParams.hasAngleOfArrivalAzimuthReport()).thenReturn(true);
+        when(mFiraParams.hasAngleOfArrivalElevationReport()).thenReturn(true);
+        Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
+                UwbTestUtils.generateRangingDataAndRangingReport(
+                        PEER_SHORT_MAC_ADDRESS, RANGING_MEASUREMENT_TYPE_TWO_WAY,
+                        false, false, true, true, TEST_ELAPSED_NANOS);
+        mUwbSessionNotificationManager.onRangingResult(
+                mUwbSession, testRangingDataAndRangingReport.first);
+        verify(mIUwbRangingCallbacks).onRangingResult(
+                mSessionHandle, testRangingDataAndRangingReport.second);
+    }
+
+    @Test
+    public void testOnRangingResult_forTwoWay_WithNoAoaAzimuthAndDestAoa() throws Exception {
+        when(mFiraParams.getAoaResultRequest()).thenReturn(
+                FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_ELEVATION_ONLY);
+        when(mFiraParams.hasResultReportPhase()).thenReturn(true);
+        when(mFiraParams.hasAngleOfArrivalAzimuthReport()).thenReturn(true);
+        when(mFiraParams.hasAngleOfArrivalElevationReport()).thenReturn(true);
+        Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
+                UwbTestUtils.generateRangingDataAndRangingReport(
+                        PEER_SHORT_MAC_ADDRESS, RANGING_MEASUREMENT_TYPE_TWO_WAY,
+                        false, true, true, true, TEST_ELAPSED_NANOS);
+        mUwbSessionNotificationManager.onRangingResult(
+                mUwbSession, testRangingDataAndRangingReport.first);
+        verify(mIUwbRangingCallbacks).onRangingResult(
+                mSessionHandle, testRangingDataAndRangingReport.second);
+    }
+
+    @Test
+    public void testOnRangingResult_forTwoWay_WithNoAoaElevationAndDestAoa() throws Exception {
+        when(mFiraParams.getAoaResultRequest()).thenReturn(
+                FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS_AZIMUTH_ONLY);
+        when(mFiraParams.hasResultReportPhase()).thenReturn(true);
+        when(mFiraParams.hasAngleOfArrivalAzimuthReport()).thenReturn(true);
+        when(mFiraParams.hasAngleOfArrivalElevationReport()).thenReturn(true);
+        Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
+                UwbTestUtils.generateRangingDataAndRangingReport(
+                        PEER_SHORT_MAC_ADDRESS, RANGING_MEASUREMENT_TYPE_TWO_WAY,
+                        true, false, true, true, TEST_ELAPSED_NANOS);
+        mUwbSessionNotificationManager.onRangingResult(
+                mUwbSession, testRangingDataAndRangingReport.first);
+        verify(mIUwbRangingCallbacks).onRangingResult(
+                mSessionHandle, testRangingDataAndRangingReport.second);
+    }
+
+    @Test
     public void testOnRangingResult_forOwrAoa() throws Exception {
         Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
                 UwbTestUtils.generateRangingDataAndRangingReport(