One-sided RTT APs (non-80211mc capable) enabled in API (service)

Bug: 163335690
Test: All unit tests pass.
Change-Id: I2f8b704d3e3e3d18c199b3f476c3fcb0ecb0e27d
diff --git a/framework/java/android/net/wifi/rtt/RangingResult.java b/framework/java/android/net/wifi/rtt/RangingResult.java
index e2f270c..9724d3c 100644
--- a/framework/java/android/net/wifi/rtt/RangingResult.java
+++ b/framework/java/android/net/wifi/rtt/RangingResult.java
@@ -237,13 +237,13 @@
     /**
      * @return The number of attempted measurements used in the RTT exchange resulting in this set
      * of results. The number of successful measurements is returned by
-     * {@link #getNumSuccessfulMeasurements()} which at most, if there are no errors, will be 1 less
-     * that the number of attempted measurements.
+     * {@link #getNumSuccessfulMeasurements()} which at most, if there are no errors, will be 1
+     * less than the number of attempted measurements.
      * <p>
-     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, and if the method
-     * {@link #is80211mcMeasurement()} returns true, otherwise will throw an exception. If the value
-     * is 0, it should be interpreted as no information available, which may occur for one-sided RTT
-     * measurements. Instead {@link RangingRequest#getRttBurstSize()} should be used instead.
+     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
+     * exception. If the value is 0, it should be interpreted as no information available, which may
+     * occur for one-sided RTT measurements. Instead {@link RangingRequest#getRttBurstSize()}
+     * should be used instead.
      */
     public int getNumAttemptedMeasurements() {
         if (mStatus != STATUS_SUCCESS) {
diff --git a/service/java/com/android/server/wifi/rtt/RttNative.java b/service/java/com/android/server/wifi/rtt/RttNative.java
index 98dc170..afe9a35 100644
--- a/service/java/com/android/server/wifi/rtt/RttNative.java
+++ b/service/java/com/android/server/wifi/rtt/RttNative.java
@@ -40,6 +40,7 @@
 import android.os.RemoteException;
 import android.util.Log;
 
+import com.android.modules.utils.build.SdkLevel;
 import com.android.server.wifi.HalDeviceManager;
 import com.android.server.wifi.util.NativeUtil;
 
@@ -388,13 +389,12 @@
         // Skipping any configurations which have an error (printing out a message).
         // The caller will only get results for valid configurations.
         for (ResponderConfig responder: request.mRttPeers) {
-            if (!isCalledFromPrivilegedContext) {
+            if (!SdkLevel.isAtLeastS() && !isCalledFromPrivilegedContext) {
                 if (!responder.supports80211mc) {
                     Log.e(TAG, "Invalid responder: does not support 802.11mc");
                     continue;
                 }
             }
-
             RttConfig config = new RttConfig();
 
             System.arraycopy(responder.macAddress.toByteArray(), 0, config.addr, 0,
@@ -477,7 +477,7 @@
         // Skipping any configurations which have an error (printing out a message).
         // The caller will only get results for valid configurations.
         for (ResponderConfig responder: request.mRttPeers) {
-            if (!isCalledFromPrivilegedContext) {
+            if (!SdkLevel.isAtLeastS() && !isCalledFromPrivilegedContext) {
                 if (!responder.supports80211mc) {
                     Log.e(TAG, "Invalid responder: does not support 802.11mc");
                     continue;
@@ -779,7 +779,8 @@
                     rttResult.distanceInMm, rttResult.distanceSdInMm,
                     rttResult.rssi / -2, rttResult.numberPerBurstPeer,
                     rttResult.successNumber, lci, lcr, responderLocation,
-                    rttResult.timeStampInUs / CONVERSION_US_TO_MS));
+                    rttResult.timeStampInUs / CONVERSION_US_TO_MS,
+                    rttResult.type == RttType.TWO_SIDED));
         }
         return rangingResults;
     }
@@ -815,7 +816,8 @@
                     rttResult.distanceInMm, rttResult.distanceSdInMm,
                     rttResult.rssi / -2, rttResult.numberPerBurstPeer,
                     rttResult.successNumber, lci, lcr, responderLocation,
-                    rttResult.timeStampInUs / CONVERSION_US_TO_MS));
+                    rttResult.timeStampInUs / CONVERSION_US_TO_MS,
+                    rttResult.type == RttType.TWO_SIDED));
         }
         return rangingResults;
     }
diff --git a/service/java/com/android/server/wifi/rtt/RttServiceImpl.java b/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
index 3122a94..76cd2d6 100644
--- a/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
+++ b/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
@@ -55,6 +55,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.WakeupMessage;
 import com.android.modules.utils.BasicShellCommandHandler;
+import com.android.modules.utils.build.SdkLevel;
 import com.android.server.wifi.Clock;
 import com.android.server.wifi.WifiSettingsConfigStore;
 import com.android.server.wifi.proto.nano.WifiMetricsProto;
@@ -1114,16 +1115,16 @@
                     }
 
                     int errorCode = RangingResult.STATUS_FAIL;
-                    if (!isCalledFromPrivilegedContext) {
-                        if (!peer.supports80211mc) {
-                            errorCode = RangingResult.STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC;
-                        }
+
+                    if (!SdkLevel.isAtLeastS() && !isCalledFromPrivilegedContext
+                            && !peer.supports80211mc) {
+                        errorCode = RangingResult.STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC;
                     }
 
                     if (peer.peerHandle == null) {
                         finalResults.add(
                                 new RangingResult(errorCode, peer.macAddress, 0, 0, 0, 0, 0, null,
-                                        null, null, 0));
+                                        null, null, 0, false));
                     } else {
                         finalResults.add(
                                 new RangingResult(errorCode, peer.peerHandle, 0, 0, 0, 0, 0, null,
@@ -1148,32 +1149,32 @@
                         finalResults.add(new RangingResult(
                                 status,
                                 peer.macAddress,
-                                resultForRequest.getDistanceMm(),
-                                resultForRequest.getDistanceStdDevMm(),
-                                resultForRequest.getRssi(),
-                                resultForRequest.getNumAttemptedMeasurements(),
-                                resultForRequest.getNumSuccessfulMeasurements(),
+                                resultForRequest.mDistanceMm,
+                                resultForRequest.mDistanceStdDevMm,
+                                resultForRequest.mRssi,
+                                resultForRequest.mNumAttemptedMeasurements,
+                                resultForRequest.mNumSuccessfulMeasurements,
                                 lci,
                                 lcr,
                                 responderLocation,
-                                resultForRequest.getRangingTimestampMillis()));
+                                resultForRequest.mTimestamp,
+                                resultForRequest.mIs80211mcMeasurement));
                     } else {
                         finalResults.add(new RangingResult(
                                 status,
                                 peer.peerHandle,
-                                resultForRequest.getDistanceMm(),
-                                resultForRequest.getDistanceStdDevMm(),
-                                resultForRequest.getRssi(),
-                                resultForRequest.getNumAttemptedMeasurements(),
-                                resultForRequest.getNumSuccessfulMeasurements(),
+                                resultForRequest.mDistanceMm,
+                                resultForRequest.mDistanceStdDevMm,
+                                resultForRequest.mRssi,
+                                resultForRequest.mNumAttemptedMeasurements,
+                                resultForRequest.mNumSuccessfulMeasurements,
                                 lci,
                                 lcr,
                                 responderLocation,
-                                resultForRequest.getRangingTimestampMillis()));
+                                resultForRequest.mTimestamp));
                     }
                 }
             }
-
             return finalResults;
         }
 
diff --git a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttMetricsTest.java b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttMetricsTest.java
index 57cad2b..2c2f892 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttMetricsTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttMetricsTest.java
@@ -610,7 +610,7 @@
         for (ResponderConfig peer : request.mRttPeers) {
 
             RangingResult rttResult = new RangingResult(status, peer.macAddress,
-                    (int) (distance * 1000), 0, 0, 8, 8, null, null, null, 0);
+                    (int) (distance * 1000), 0, 0, 8, 8, null, null, null, 0, true);
             distance += incrDistanceM;
             rangingResults.add(rttResult);
         }
diff --git a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java
index e3b88e6..dafda86 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java
@@ -17,8 +17,6 @@
 
 package com.android.server.wifi.rtt;
 
-import static junit.framework.Assert.fail;
-
 import static org.hamcrest.core.IsEqual.equalTo;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -183,48 +181,6 @@
     }
 
     /**
-     * Validate ranging request with a mix of Repsonders with and without IEEE 802.11mc support,
-     * from a non- privileged context.
-     */
-    @Test
-    public void testRangeRequestNotPrivilegedNo80211mcSupportMixed() throws Exception {
-        int cmdId = 66;
-
-        // the request has 3 responders: first AP support 802.11mc, second AP does not, third is
-        // Aware (which supports 802.11mc by default)
-        RangingRequest request = RttTestUtils.getDummyRangingRequest((byte) 0);
-
-        // (1) issue range request
-        mDut.rangeRequest(cmdId, request, false);
-
-        // (2) verify HAL call and parameters
-        verify(mockRttController).rangeRequest(eq(cmdId), mRttConfigCaptor.capture());
-
-        // verify contents of HAL request (hard codes knowledge from getDummyRangingRequest()).
-        ArrayList<RttConfig> halRequest = mRttConfigCaptor.getValue();
-
-        collector.checkThat("number of entries", halRequest.size(), equalTo(2));
-
-        RttConfig rttConfig = halRequest.get(0);
-        collector.checkThat("entry 0: MAC", rttConfig.addr,
-                equalTo(MacAddress.fromString("00:01:02:03:04:00").toByteArray()));
-        collector.checkThat("entry 0: rtt type", rttConfig.type, equalTo(RttType.TWO_SIDED));
-        collector.checkThat("entry 0: peer type", rttConfig.peer, equalTo(RttPeerType.AP));
-        collector.checkThat("entry 0: lci", rttConfig.mustRequestLci, equalTo(true));
-        collector.checkThat("entry 0: lcr", rttConfig.mustRequestLcr, equalTo(true));
-
-        rttConfig = halRequest.get(1);
-        collector.checkThat("entry 1: MAC", rttConfig.addr,
-                equalTo(MacAddress.fromString("08:09:08:07:06:05").toByteArray()));
-        collector.checkThat("entry 1: rtt type", rttConfig.type, equalTo(RttType.TWO_SIDED));
-        collector.checkThat("entry 1: peer type", rttConfig.peer, equalTo(RttPeerType.NAN));
-        collector.checkThat("entry 1: lci", rttConfig.mustRequestLci, equalTo(false));
-        collector.checkThat("entry 1: lcr", rttConfig.mustRequestLcr, equalTo(false));
-
-        verifyNoMoreInteractions(mockRttController, mockRttServiceImpl);
-    }
-
-    /**
      * Validate successful ranging flow - with privileges access but with limited capabilities:
      * - No single-sided RTT
      * - No LCI/LCR
@@ -324,26 +280,6 @@
     }
 
     /**
-     * Validate ranging request with all Repsonders without IEEE 802.11mc support, from a non-
-     * privileged context.
-     */
-    @Test
-    public void testRangeRequestNotPrivilegedNo80211mcSupportForAny() throws Exception {
-        int cmdId = 77;
-        RangingRequest request = RttTestUtils.getDummyRangingRequestNo80211mcSupport((byte) 0);
-
-        // (1) issue range request
-        mDut.rangeRequest(cmdId, request, false);
-
-        // (2) verify immediate result callback (empty result set)
-        verify(mockRttServiceImpl).onRangingResults(eq(cmdId), mRttResultCaptor.capture());
-
-        collector.checkThat("Result set", mRttResultCaptor.getValue().size(), equalTo(0));
-
-        verifyNoMoreInteractions(mockRttController, mockRttServiceImpl);
-    }
-
-    /**
      * Validate no range request when Wi-Fi is down
      */
     @Test
diff --git a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
index 687c24f..09522a6 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
@@ -763,12 +763,12 @@
         RangingResult removed = results.second.remove(1);
         results.second.add(
                 new RangingResult(RangingResult.STATUS_FAIL, removed.getMacAddress(), 0, 0, 0, 0, 0,
-                        null, null, null, 0));
+                        null, null, null, 0, false));
         results.first.remove(0); // remove an AP request
         removed = results.second.remove(0);
         results.second.add(
                 new RangingResult(RangingResult.STATUS_FAIL, removed.getMacAddress(), 0, 0, 0, 0, 0,
-                        null, null, null, 0));
+                        null, null, null, 0, false));
 
         // (1) request ranging operation
         mDut.startRanging(mockIbinder, mPackageName, mFeatureId, null, request, mockCallback);
@@ -810,7 +810,7 @@
         for (RangingResult result : results.second) {
             allFailResults.add(
                     new RangingResult(RangingResult.STATUS_FAIL, result.getMacAddress(), 0, 0, 0, 0,
-                            0, null, null, null, 0));
+                            0, null, null, null, 0, false));
         }
 
         // (1) request ranging operation
@@ -841,59 +841,6 @@
     }
 
     /**
-     * Validate that when the HAL returns results with "missing" entries (i.e. some requests
-     * don't get results) AND these correspond to peers which do not support 802.11mc AND the
-     * request is from a non-privileged context: they are filled-in with FAILED results.
-     */
-    @Test
-    public void testMissingResultsForNonSupportOf80211mc() throws Exception {
-        RangingRequest request = RttTestUtils.getDummyRangingRequest((byte) 0);
-        Pair<List<RangingResult>, List<RangingResult>> results =
-                RttTestUtils.getDummyRangingResults(request);
-        results.first.remove(1); // remove the entry which doesn't support 802.11mc
-        RangingResult removed = results.second.remove(1);
-        results.second.add(
-                new RangingResult(RangingResult.STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC,
-                        removed.getMacAddress(), 0, 0, 0, 0, 0, null, null, null, 0));
-        results.first.remove(
-                0); // remove an AP request (i.e. test combo of missing for different reasons)
-        removed = results.second.remove(0);
-        results.second.add(
-                new RangingResult(RangingResult.STATUS_FAIL, removed.getMacAddress(), 0, 0, 0, 0, 0,
-                        null, null, null, 0));
-
-        when(mockContext.checkCallingOrSelfPermission(
-                android.Manifest.permission.LOCATION_HARDWARE)).thenReturn(
-                PackageManager.PERMISSION_DENIED);
-
-        // (1) request ranging operation
-        mDut.startRanging(mockIbinder, mPackageName, mFeatureId, null, request, mockCallback);
-        mMockLooper.dispatchAll();
-
-        // (2) verify that request issued to native
-        verify(mockNative).rangeRequest(mIntCaptor.capture(), eq(request), eq(false));
-        verifyWakeupSet(true, 0);
-
-        // (3) return results with missing entries
-        mDut.onRangingResults(mIntCaptor.getValue(), results.second);
-        mMockLooper.dispatchAll();
-
-        // (5) verify that (full) results dispatched
-        verify(mockCallback).onRangingResults(mListCaptor.capture());
-        assertTrue(compareListContentsNoOrdering(results.second, mListCaptor.getValue()));
-        verifyWakeupCancelled();
-
-        // verify metrics
-        verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request));
-        verify(mockMetrics).recordResult(eq(request), eq(results.second), anyInt());
-        verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
-
-        verify(mockNative, atLeastOnce()).isReady();
-        verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
-                mAlarmManager.getAlarmManager());
-    }
-
-    /**
      * Validate that when the HAL times out we fail, clean-up the queue and move to the next
      * request.
      */
diff --git a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttTestUtils.java b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttTestUtils.java
index b5147a0..8e503e6 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttTestUtils.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttTestUtils.java
@@ -69,7 +69,7 @@
         MacAddress mac1 = MacAddress.fromString("08:09:08:07:06:05");
 
         builder.addAccessPoint(scan1);
-        builder.addAccessPoint(scan2);
+        builder.addNon80211mcCapableAccessPoint(scan2);
         builder.addWifiAwarePeer(mac1);
         // Changing default RTT burst size to a valid, but maximum, value
         builder.setRttBurstSize(RangingRequest.getMaxRttBurstSize());
@@ -105,8 +105,8 @@
         ScanResult scan2 = new ScanResult();
         scan2.BSSID = "0A:0B:0C:0D:0E:" + String.format("%02d", lastMacByte);
 
-        builder.addAccessPoint(scan1);
-        builder.addAccessPoint(scan2);
+        builder.addNon80211mcCapableAccessPoint(scan1);
+        builder.addNon80211mcCapableAccessPoint(scan2);
 
         return builder.build();
     }
@@ -127,15 +127,15 @@
         List<RangingResult> results = new ArrayList<>();
 
         if (request != null) {
-            for (ResponderConfig peer: request.mRttPeers) {
+            for (ResponderConfig peer : request.mRttPeers) {
                 RangingResult rangingResult;
                 halResults.add(new RangingResult(RangingResult.STATUS_SUCCESS,
                         peer.macAddress, rangeCmBase, rangeStdDevCmBase, rssiBase,
-                        8, 5, null, null, null, rangeTimestampBase));
+                        8, 5, null, null, null, rangeTimestampBase, true));
                 if (peer.peerHandle == null) {
                     rangingResult = new RangingResult(RangingResult.STATUS_SUCCESS,
                             peer.macAddress, rangeCmBase++, rangeStdDevCmBase++, rssiBase++,
-                            8, 5, null, null, null, rangeTimestampBase++);
+                            8, 5, null, null, null, rangeTimestampBase++, true);
                 } else {
                     rangingResult = new RangingResult(RangingResult.STATUS_SUCCESS,
                             peer.peerHandle, rangeCmBase++, rangeStdDevCmBase++, rssiBase++,
@@ -148,15 +148,15 @@
             results.add(new RangingResult(RangingResult.STATUS_SUCCESS,
                     MacAddress.fromString("10:01:02:03:04:05"), rangeCmBase++,
                     rangeStdDevCmBase++, rssiBase++, 8, 4, null, null,
-                    null, rangeTimestampBase++));
+                    null, rangeTimestampBase++, true));
             results.add(new RangingResult(RangingResult.STATUS_SUCCESS,
                     MacAddress.fromString("1A:0B:0C:0D:0E:0F"), rangeCmBase++,
                     rangeStdDevCmBase++, rssiBase++, 9, 3, null, null,
-                    null, rangeTimestampBase++));
+                    null, rangeTimestampBase++, true));
             results.add(new RangingResult(RangingResult.STATUS_SUCCESS,
                     MacAddress.fromString("08:09:08:07:06:05"), rangeCmBase++,
                     rangeStdDevCmBase++, rssiBase++, 10, 2, null, null,
-                    null, rangeTimestampBase++));
+                    null, rangeTimestampBase++, true));
             halResults.addAll(results);
         }