Snap for 8857176 from aa389ab5e88aaad197ce927092f4871bb2ec2b32 to mainline-go-resolv-release

Change-Id: I726e23c21876e21dd0b4ebebb4ea5f3d58401b62
diff --git a/apex/Android.bp b/apex/Android.bp
index b8ae3de..9e86c9b 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -61,8 +61,11 @@
 
 sdk {
     name: "uwb-module-sdk",
-    bootclasspath_fragments: ["com.android.uwb-bootclasspath-fragment"],
-    systemserverclasspath_fragments: ["com.android.uwb-systemserverclasspath-fragment"],
+    apexes: [
+        // Adds exportable dependencies of the APEX to the sdk,
+        // e.g. *classpath_fragments.
+        "com.android.uwb",
+    ],
 }
 
 // Encapsulate the contributions made by the com.android.uwb to the bootclasspath.
diff --git a/service/java/com/android/server/uwb/UwbShellCommand.java b/service/java/com/android/server/uwb/UwbShellCommand.java
index f5a7604..4167dae 100644
--- a/service/java/com/android/server/uwb/UwbShellCommand.java
+++ b/service/java/com/android/server/uwb/UwbShellCommand.java
@@ -69,6 +69,7 @@
 import com.android.server.uwb.jni.NativeUwbManager;
 import com.android.server.uwb.util.ArrayUtils;
 
+import com.google.common.io.BaseEncoding;
 import com.google.uwb.support.base.Params;
 import com.google.uwb.support.ccc.CccOpenRangingParams;
 import com.google.uwb.support.ccc.CccParams;
@@ -163,6 +164,7 @@
     private static int sSessionHandleIdNext = 0;
 
     private final UwbServiceImpl mUwbService;
+    private final UwbServiceCore mUwbServiceCore;
     private final UwbCountryCode mUwbCountryCode;
     private final NativeUwbManager mNativeUwbManager;
     private final Context mContext;
@@ -172,6 +174,7 @@
         mContext = context;
         mUwbCountryCode = uwbInjector.getUwbCountryCode();
         mNativeUwbManager = uwbInjector.getNativeUwbManager();
+        mUwbServiceCore = uwbInjector.getUwbServiceCore();
     }
 
     private static String bundleToString(@Nullable PersistableBundle bundle) {
@@ -345,7 +348,8 @@
         }
     }
 
-    private Pair<FiraOpenSessionParams, Boolean> buildFiraOpenSessionParams() {
+    private Pair<FiraOpenSessionParams, Boolean> buildFiraOpenSessionParams(
+            GenericSpecificationParams specificationParams) {
         FiraOpenSessionParams.Builder builder =
                 new FiraOpenSessionParams.Builder(DEFAULT_FIRA_OPEN_SESSION_PARAMS);
         boolean shouldBlockCall = false;
@@ -469,18 +473,41 @@
                     }
                 }
             }
+            if (option.equals("-g")) {
+                String staticSTSIV = getNextArgRequired();
+                if (staticSTSIV.length() == 12) {
+                    builder.setStaticStsIV(BaseEncoding.base16().decode(staticSTSIV.toUpperCase()));
+                } else {
+                    throw new IllegalArgumentException("staticSTSIV expecting 6 bytes");
+                }
+            }
+            if (option.equals("-v")) {
+                String vendor_id = getNextArgRequired();
+                if (vendor_id.length() == 4) {
+                    builder.setVendorId(BaseEncoding.base16().decode(vendor_id.toUpperCase()));
+                } else {
+                    throw new IllegalArgumentException("vendorId expecting 2 bytes");
+                }
+            }
             option = getNextOption();
         }
         if (aoaResultReqEnabled && interleavingEnabled) {
             throw new IllegalArgumentException(
                     "Both interleaving (-z) and aoa result req (-e) cannot be specified");
         }
+        // Enable rssi reporting if device supports it.
+        if (specificationParams.getFiraSpecificationParams().hasRssiReportingSupport()) {
+            builder.setIsRssiReportingEnabled(true);
+        }
         // TODO: Add remaining params if needed.
         return Pair.create(builder.build(), shouldBlockCall);
     }
 
     private void startFiraRangingSession(PrintWriter pw) throws Exception {
-        Pair<FiraOpenSessionParams, Boolean> firaOpenSessionParams = buildFiraOpenSessionParams();
+        GenericSpecificationParams specificationParams =
+                mUwbServiceCore.getCachedSpecificationParams(null);
+        Pair<FiraOpenSessionParams, Boolean> firaOpenSessionParams =
+                buildFiraOpenSessionParams(specificationParams);
         startRangingSession(
                 firaOpenSessionParams.first, null, firaOpenSessionParams.first.getSessionId(),
                 firaOpenSessionParams.second, pw);
@@ -897,7 +924,9 @@
                 + " [-z <numRangeMrmts, numAoaAzimuthMrmts, numAoaElevationMrmts>"
                 + "(interleaving-ratio)"
                 + " [-e none|enabled|azimuth-only|elevation-only](aoa type)"
-                + " [-f <tof,azimuth,elevation,aoa-fom>(result-report-config)");
+                + " [-f <tof,azimuth,elevation,aoa-fom>(result-report-config)"
+                + " [-g <staticStsIV>(staticStsIV 6-bytes)"
+                + " [-v <staticStsVendorId>(staticStsVendorId 2-bytes)");
         pw.println("    Starts a FIRA ranging session with the provided params."
                 + " Note: default behavior is to cache the latest ranging reports which can be"
                 + " retrieved using |get-ranging-session-reports|");
diff --git a/service/tests/src/com/android/server/uwb/UwbShellCommandTest.java b/service/tests/src/com/android/server/uwb/UwbShellCommandTest.java
index 3d5504e..2942d65 100644
--- a/service/tests/src/com/android/server/uwb/UwbShellCommandTest.java
+++ b/service/tests/src/com/android/server/uwb/UwbShellCommandTest.java
@@ -22,10 +22,13 @@
 import static com.android.server.uwb.UwbShellCommand.DEFAULT_FIRA_OPEN_SESSION_PARAMS;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.uwb.support.fira.FiraParams.RangeDataNtfConfigCapabilityFlag.HAS_RANGE_DATA_NTF_CONFIG_DISABLE;
+import static com.google.uwb.support.fira.FiraParams.RangeDataNtfConfigCapabilityFlag.HAS_RANGE_DATA_NTF_CONFIG_ENABLE;
 
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.validateMockitoUsage;
 import static org.mockito.Mockito.verify;
@@ -51,8 +54,11 @@
 
 import com.google.uwb.support.base.Params;
 import com.google.uwb.support.ccc.CccOpenRangingParams;
+import com.google.uwb.support.ccc.CccSpecificationParams;
 import com.google.uwb.support.ccc.CccStartRangingParams;
 import com.google.uwb.support.fira.FiraOpenSessionParams;
+import com.google.uwb.support.fira.FiraSpecificationParams;
+import com.google.uwb.support.generic.GenericSpecificationParams;
 
 import org.junit.After;
 import org.junit.Before;
@@ -63,6 +69,8 @@
 import org.mockito.MockitoAnnotations;
 
 import java.io.FileDescriptor;
+import java.util.EnumSet;
+import java.util.List;
 
 /**
  * Unit tests for {@link com.android.server.uwb.UwbShellCommand}.
@@ -76,6 +84,7 @@
     @Mock UwbServiceImpl mUwbService;
     @Mock UwbCountryCode mUwbCountryCode;
     @Mock Context mContext;
+    @Mock UwbServiceCore mUwbServiceCore;
 
     UwbShellCommand mUwbShellCommand;
 
@@ -84,6 +93,19 @@
         MockitoAnnotations.initMocks(this);
 
         when(mUwbInjector.getUwbCountryCode()).thenReturn(mUwbCountryCode);
+        when(mUwbInjector.getUwbServiceCore()).thenReturn(mUwbServiceCore);
+        GenericSpecificationParams params = new GenericSpecificationParams.Builder()
+                .setCccSpecificationParams(mock(CccSpecificationParams.class))
+                .setFiraSpecificationParams(
+                        new FiraSpecificationParams.Builder()
+                                .setSupportedChannels(List.of(9))
+                                .setRangeDataNtfConfigCapabilities(
+                                        EnumSet.of(
+                                                HAS_RANGE_DATA_NTF_CONFIG_DISABLE,
+                                                HAS_RANGE_DATA_NTF_CONFIG_ENABLE))
+                                .build())
+                .build();
+        when(mUwbServiceCore.getCachedSpecificationParams(any())).thenReturn(params);
 
         mUwbShellCommand = new UwbShellCommand(mUwbInjector, mUwbService, mContext);