SAR: Add conditional support for SAP/voice call

In current implementation, SAR support for sensors assume automatically
that SoftAP is supported. This CL introduces a separate configurations
for support of voice calls and softAP independent of SAR sensor support.

Bug: 65174506
Test: Unit test

Change-Id: I92eb15142888054b5c8070c2c9c73862f0e5fcdc
Merged-In: I92eb15142888054b5c8070c2c9c73862f0e5fcdc
(cherry picked from commit 8392e5dc1ec0c0e5e9ac5d40dac2a38a47b6b63d)
diff --git a/service/java/com/android/server/wifi/SarInfo.java b/service/java/com/android/server/wifi/SarInfo.java
index 6eb777c..514f15e 100644
--- a/service/java/com/android/server/wifi/SarInfo.java
+++ b/service/java/com/android/server/wifi/SarInfo.java
@@ -23,7 +23,7 @@
  * This class represents the list of SAR inputs that will be used to select the proper
  * power profile.
  * This includes:
- *  - SAR body sensor status
+ *  - SAR sensor status
  *  - Is there an ongoing voice call
  *  - Is SoftAP active
  * It also contains info about state of the other Wifi modes
@@ -64,14 +64,17 @@
     /* For Logging */
     private static final String TAG = "WifiSarInfo";
 
-    public boolean mSarSensorEnabled;
+    /* SAR support configs */
+    public boolean sarVoiceCallSupported;
+    public boolean sarSapSupported;
+    public boolean sarSensorSupported;
 
-    public int mSensorState = SAR_SENSOR_FREE_SPACE;
-    public boolean mIsWifiClientEnabled = false;
-    public boolean mIsWifiSapEnabled = false;
-    public boolean mIsWifiScanOnlyEnabled = false;
-    public boolean mIsVoiceCall = false;
-    public int mAttemptedSarScenario = RESET_SAR_SCENARIO;
+    public int sensorState = SAR_SENSOR_FREE_SPACE;
+    public boolean isWifiClientEnabled = false;
+    public boolean isWifiSapEnabled = false;
+    public boolean isWifiScanOnlyEnabled = false;
+    public boolean isVoiceCall = false;
+    public int attemptedSarScenario = RESET_SAR_SCENARIO;
 
     private boolean mAllWifiDisabled = true;
 
@@ -81,10 +84,6 @@
     private boolean mLastReportedIsVoiceCall = false;
     private int mLastReportedScenario = INITIAL_SAR_SCENARIO;
 
-    SarInfo(boolean sarSensorEnabled) {
-        mSarSensorEnabled = sarSensorEnabled;
-    }
-
     /**
      * shouldReport()
      * This method returns false in the following cases:
@@ -100,7 +99,7 @@
      */
     public boolean shouldReport() {
         /* Check if all Wifi modes are disabled */
-        if (!mIsWifiClientEnabled && !mIsWifiSapEnabled && !mIsWifiScanOnlyEnabled) {
+        if (!isWifiClientEnabled && !isWifiSapEnabled && !isWifiScanOnlyEnabled) {
             mAllWifiDisabled = true;
             return false;
         }
@@ -111,9 +110,9 @@
         }
 
         /* Check if some change happened since last successful reporting */
-        if ((mSensorState != mLastReportedSensorState)
-                || (mIsWifiSapEnabled != mLastReportedIsWifiSapEnabled)
-                || (mIsVoiceCall != mLastReportedIsVoiceCall)) {
+        if ((sensorState != mLastReportedSensorState)
+                || (isWifiSapEnabled != mLastReportedIsWifiSapEnabled)
+                || (isVoiceCall != mLastReportedIsVoiceCall)) {
             return true;
         } else {
             return false;
@@ -126,10 +125,10 @@
      * This results in caching the last reported inputs for future comparison.
      */
     public void reportingSuccessful() {
-        mLastReportedSensorState = mSensorState;
-        mLastReportedIsWifiSapEnabled = mIsWifiSapEnabled;
-        mLastReportedIsVoiceCall = mIsVoiceCall;
-        mLastReportedScenario = mAttemptedSarScenario;
+        mLastReportedSensorState = sensorState;
+        mLastReportedIsWifiSapEnabled = isWifiSapEnabled;
+        mLastReportedIsVoiceCall = isVoiceCall;
+        mLastReportedScenario = attemptedSarScenario;
 
         mAllWifiDisabled = false;
     }
@@ -152,7 +151,7 @@
      * another call to set the SAR scenario to the same value would be redundant.
      */
     public boolean setSarScenarioNeeded(int scenario) {
-        mAttemptedSarScenario = scenario;
+        attemptedSarScenario = scenario;
         return (mLastReportedScenario != scenario);
     }
 
@@ -163,11 +162,11 @@
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println("*** WiFi SAR Info Dump  ***");
         pw.println("Current values:");
-        pw.println("    Sensor state is: " + sensorStateToString(mSensorState));
-        pw.println("    Voice Call state is: " + mIsVoiceCall);
-        pw.println("    Wifi Client state is: " + mIsWifiClientEnabled);
-        pw.println("    Wifi Soft AP state is: " + mIsWifiSapEnabled);
-        pw.println("    Wifi ScanOnly state is: " + mIsWifiScanOnlyEnabled);
+        pw.println("    Sensor state is: " + sensorStateToString(sensorState));
+        pw.println("    Voice Call state is: " + isVoiceCall);
+        pw.println("    Wifi Client state is: " + isWifiClientEnabled);
+        pw.println("    Wifi Soft AP state is: " + isWifiSapEnabled);
+        pw.println("    Wifi ScanOnly state is: " + isWifiScanOnlyEnabled);
         pw.println("Last reported values:");
         pw.println("    Sensor state is: " + sensorStateToString(mLastReportedSensorState));
         pw.println("    Soft AP state is: " + mLastReportedIsWifiSapEnabled);
diff --git a/service/java/com/android/server/wifi/SarManager.java b/service/java/com/android/server/wifi/SarManager.java
index d38eab9..89da701 100644
--- a/service/java/com/android/server/wifi/SarManager.java
+++ b/service/java/com/android/server/wifi/SarManager.java
@@ -55,9 +55,11 @@
 
     private SarInfo mSarInfo;
 
-    /* Configuration for SAR */
-    private boolean mEnableSarTxPowerLimit;
-    private boolean mEnableSarBodyProximity;
+    /* Configuration for SAR support */
+    private boolean mSupportSarTxPowerLimit;
+    private boolean mSupportSarVoiceCall;
+    private boolean mSupportSarSoftAp;
+    private boolean mSupportSarSensor;
     /* Sensor event definitions */
     private int mSarSensorEventFreeSpace;
     private int mSarSensorEventNearBody;
@@ -92,27 +94,36 @@
         mSensorListener = new SarSensorEventListener();
 
         readSarConfigs();
-        if (mEnableSarTxPowerLimit) {
-            mSarInfo = new SarInfo(mEnableSarBodyProximity);
+        if (mSupportSarTxPowerLimit) {
+            mSarInfo = new SarInfo();
+            setSarConfigsInInfo();
             registerListeners();
         }
     }
 
     private void readSarConfigs() {
-        mEnableSarTxPowerLimit = mContext.getResources().getBoolean(
+        mSupportSarTxPowerLimit = mContext.getResources().getBoolean(
                 R.bool.config_wifi_framework_enable_sar_tx_power_limit);
         /* In case SAR is disabled,
-           then SAR sensor is automatically disabled as well (irrespective of the config) */
-        if (!mEnableSarTxPowerLimit) {
-            mEnableSarBodyProximity = false;
+           then all SAR inputs are automatically disabled as well (irrespective of the config) */
+        if (!mSupportSarTxPowerLimit) {
+            mSupportSarVoiceCall = false;
+            mSupportSarSoftAp = false;
+            mSupportSarSensor = false;
             return;
         }
 
-        mEnableSarBodyProximity = mContext.getResources().getBoolean(
+        /* Voice calls are supported when SAR is supported */
+        mSupportSarVoiceCall = true;
+
+        mSupportSarSoftAp = mContext.getResources().getBoolean(
+                R.bool.config_wifi_framework_enable_soft_ap_sar_tx_power_limit);
+
+        mSupportSarSensor = mContext.getResources().getBoolean(
                 R.bool.config_wifi_framework_enable_body_proximity_sar_tx_power_limit);
 
         /* Read the sar sensor event Ids */
-        if (mEnableSarBodyProximity) {
+        if (mSupportSarSensor) {
             mSarSensorEventFreeSpace = mContext.getResources().getInteger(
                     R.integer.config_wifi_framework_sar_free_space_event_id);
             mSarSensorEventNearBody = mContext.getResources().getInteger(
@@ -124,18 +135,26 @@
         }
     }
 
+    private void setSarConfigsInInfo() {
+        mSarInfo.sarVoiceCallSupported = mSupportSarVoiceCall;
+        mSarInfo.sarSapSupported = mSupportSarSoftAp;
+        mSarInfo.sarSensorSupported = mSupportSarSensor;
+    }
+
     private void registerListeners() {
-        /* Listen for Phone State changes */
-        registerPhoneStateListener();
+        if (mSupportSarVoiceCall) {
+            /* Listen for Phone State changes */
+            registerPhoneStateListener();
+        }
 
         /* Only listen for SAR sensor if supported */
-        if (mEnableSarBodyProximity) {
+        if (mSupportSarSensor) {
             /* Register the SAR sensor listener.
              * If this fails, we will assume worst case (near head) */
             if (!registerSensorListener()) {
                 Log.e(TAG, "Failed to register sensor listener, setting Sensor to NearHead");
                 /*TODO Need to add a metric to determine how often this happens */
-                mSarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+                mSarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
             }
         }
     }
@@ -162,8 +181,8 @@
      */
     public void setClientWifiState(int state) {
         boolean newIsEnabled;
-        /* No action is taken if SAR is not enabled */
-        if (!mEnableSarTxPowerLimit) {
+        /* No action is taken if SAR is not supported */
+        if (!mSupportSarTxPowerLimit) {
             return;
         }
 
@@ -177,8 +196,8 @@
         }
 
         /* Report change to HAL if needed */
-        if (mSarInfo.mIsWifiClientEnabled != newIsEnabled) {
-            mSarInfo.mIsWifiClientEnabled = newIsEnabled;
+        if (mSarInfo.isWifiClientEnabled != newIsEnabled) {
+            mSarInfo.isWifiClientEnabled = newIsEnabled;
             updateSarScenario();
         }
     }
@@ -188,8 +207,8 @@
      */
     public void setSapWifiState(int state) {
         boolean newIsEnabled;
-        /* No action is taken if SAR is not enabled */
-        if (!mEnableSarTxPowerLimit) {
+        /* No action is taken if SAR is not supported */
+        if (!mSupportSarTxPowerLimit) {
             return;
         }
 
@@ -203,8 +222,8 @@
         }
 
         /* Report change to HAL if needed */
-        if (mSarInfo.mIsWifiSapEnabled != newIsEnabled) {
-            mSarInfo.mIsWifiSapEnabled = newIsEnabled;
+        if (mSarInfo.isWifiSapEnabled != newIsEnabled) {
+            mSarInfo.isWifiSapEnabled = newIsEnabled;
             updateSarScenario();
         }
     }
@@ -214,8 +233,8 @@
      */
     public void setScanOnlyWifiState(int state) {
         boolean newIsEnabled;
-        /* No action is taken if SAR is not enabled */
-        if (!mEnableSarTxPowerLimit) {
+        /* No action is taken if SAR is not supported */
+        if (!mSupportSarTxPowerLimit) {
             return;
         }
 
@@ -229,8 +248,8 @@
         }
 
         /* Report change to HAL if needed */
-        if (mSarInfo.mIsWifiScanOnlyEnabled != newIsEnabled) {
-            mSarInfo.mIsWifiScanOnlyEnabled = newIsEnabled;
+        if (mSarInfo.isWifiScanOnlyEnabled != newIsEnabled) {
+            mSarInfo.isWifiScanOnlyEnabled = newIsEnabled;
             updateSarScenario();
         }
     }
@@ -256,8 +275,8 @@
         }
 
         /* Report change to HAL if needed */
-        if (mSarInfo.mIsVoiceCall != newIsVoiceCall) {
-            mSarInfo.mIsVoiceCall = newIsVoiceCall;
+        if (mSarInfo.isVoiceCall != newIsVoiceCall) {
+            mSarInfo.isVoiceCall = newIsVoiceCall;
             updateSarScenario();
         }
     }
@@ -281,9 +300,9 @@
         }
 
         /* Report change to HAL if needed */
-        if (mSarInfo.mSensorState != newSensorState) {
+        if (mSarInfo.sensorState != newSensorState) {
             Log.d(TAG, "Setting Sensor state to " + SarInfo.sensorStateToString(newSensorState));
-            mSarInfo.mSensorState = newSensorState;
+            mSarInfo.sensorState = newSensorState;
             updateSarScenario();
         }
     }
@@ -305,8 +324,10 @@
      */
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println("*** WiFi SAR Manager Dump ***");
-        pw.println("isSarEnabled: " + mEnableSarTxPowerLimit);
-        pw.println("isSarSensorEnabled: " + mEnableSarBodyProximity);
+        pw.println("isSarSupported: " + mSupportSarTxPowerLimit);
+        pw.println("isSarVoiceCallSupported: " + mSupportSarVoiceCall);
+        pw.println("isSarSoftApSupported: " + mSupportSarSoftAp);
+        pw.println("isSarSensorSupported: " + mSupportSarSensor);
         pw.println("");
         mSarInfo.dump(fd, pw, args);
     }
@@ -330,7 +351,7 @@
             Log.d(TAG, "Received Phone State Change: " + state);
 
             /* In case of an unsolicited event */
-            if (!mEnableSarTxPowerLimit) {
+            if (!mSupportSarTxPowerLimit || !mSupportSarVoiceCall) {
                 return;
             }
             onCellStateChangeEvent(state);
diff --git a/service/java/com/android/server/wifi/WifiVendorHal.java b/service/java/com/android/server/wifi/WifiVendorHal.java
index 2517ba6..fad90d1 100644
--- a/service/java/com/android/server/wifi/WifiVendorHal.java
+++ b/service/java/com/android/server/wifi/WifiVendorHal.java
@@ -2661,22 +2661,28 @@
      * a voice call is ongoing.
      */
     private boolean sarPowerBackoffRequired_1_1(SarInfo sarInfo) {
-        /* As long as no voice call is active, no backoff is needed */
-        return sarInfo.mIsVoiceCall;
+        /* As long as no voice call is active (in case voice call is supported),
+         * no backoff is needed */
+        if (sarInfo.sarVoiceCallSupported) {
+            return sarInfo.isVoiceCall;
+        } else {
+            return false;
+        }
     }
 
     /**
      * frameworkToHalTxPowerScenario_1_1()
      * This method maps the information inside the SarInfo instance into a SAR scenario
      * when device is running the V1_1 version of WifiChip HAL.
-     * In this HAL version, only one scenario is defined which is for VOICE_CALL
-     * otherwise, an exception is thrown.
+     * In this HAL version, only one scenario is defined which is for VOICE_CALL (if voice call is
+     * supported).
+     * Otherwise, an exception is thrown.
      */
     private int frameworkToHalTxPowerScenario_1_1(SarInfo sarInfo) {
-        if (sarInfo.mIsVoiceCall) {
+        if (sarInfo.sarVoiceCallSupported && sarInfo.isVoiceCall) {
             return android.hardware.wifi.V1_1.IWifiChip.TxPowerScenario.VOICE_CALL;
         } else {
-            throw new IllegalArgumentException("bad scenario: voice call not active");
+            throw new IllegalArgumentException("bad scenario: voice call not active/supported");
         }
     }
 
@@ -2690,11 +2696,17 @@
      * a voice call is ongoing.
      */
     private boolean sarPowerBackoffRequired_1_2(SarInfo sarInfo) {
-        if (sarInfo.mSarSensorEnabled) {
-            return (sarInfo.mSensorState != SarInfo.SAR_SENSOR_FREE_SPACE);
-        } else {
-            return sarInfo.mIsVoiceCall;
+        /* If SAR sensor is supported, output only dependent on device proximity */
+        if (sarInfo.sarSensorSupported) {
+            return (sarInfo.sensorState != SarInfo.SAR_SENSOR_FREE_SPACE);
         }
+        if (sarInfo.sarSapSupported && sarInfo.isWifiSapEnabled) {
+            return true;
+        }
+        if (sarInfo.sarVoiceCallSupported && sarInfo.isVoiceCall) {
+            return true;
+        }
+        return false;
     }
 
     /**
@@ -2707,15 +2719,19 @@
      *     near the user body.
      *   - Running in softAP mode can be treated the same way as running a voice call from tx power
      *     backoff perspective.
-     * If SAR sensor input is not considered in this device, then we should revert to the V1_1 HAL
+     * If SAR sensor input is not supported in this device, but SoftAP is,
+     * we make these assumptions:
+     *   - All voice calls are treated as if device is near the head.
+     *   - SoftAP scenario is treated as if device is near the body.
+     * In case neither SAR sensor, nor SoftAP is supported, then we should revert to the V1_1 HAL
      * behavior, and the only valid scenario would be when a voice call is ongoing.
      */
     private int frameworkToHalTxPowerScenario_1_2(SarInfo sarInfo) {
-        if (sarInfo.mSarSensorEnabled) {
-            switch(sarInfo.mSensorState) {
+        if (sarInfo.sarSensorSupported) {
+            switch(sarInfo.sensorState) {
                 case SarInfo.SAR_SENSOR_NEAR_BODY:
                 case SarInfo.SAR_SENSOR_NEAR_HAND:
-                    if (sarInfo.mIsVoiceCall || sarInfo.mIsWifiSapEnabled) {
+                    if (sarInfo.isVoiceCall || sarInfo.isWifiSapEnabled) {
                         return android.hardware.wifi.V1_2.IWifiChip
                                 .TxPowerScenario.ON_BODY_CELL_ON;
                     } else {
@@ -2724,7 +2740,7 @@
                     }
 
                 case SarInfo.SAR_SENSOR_NEAR_HEAD:
-                    if (sarInfo.mIsVoiceCall || sarInfo.mIsWifiSapEnabled) {
+                    if (sarInfo.isVoiceCall || sarInfo.isWifiSapEnabled) {
                         return android.hardware.wifi.V1_2.IWifiChip
                                 .TxPowerScenario.ON_HEAD_CELL_ON;
                     } else {
@@ -2735,13 +2751,25 @@
                 default:
                     throw new IllegalArgumentException("bad scenario: Invalid sensor state");
             }
-        } else {
-            /* SAR Sensors not enabled, act like V1_1 */
-            if (sarInfo.mIsVoiceCall) {
+        } else if (sarInfo.sarSapSupported && sarInfo.sarVoiceCallSupported) {
+            if (sarInfo.isVoiceCall) {
+                return android.hardware.wifi.V1_2.IWifiChip
+                        .TxPowerScenario.ON_HEAD_CELL_ON;
+            } else if (sarInfo.isWifiSapEnabled) {
+                return android.hardware.wifi.V1_2.IWifiChip
+                        .TxPowerScenario.ON_BODY_CELL_ON;
+            } else {
+                throw new IllegalArgumentException("bad scenario: no voice call/softAP active");
+            }
+        } else if (sarInfo.sarVoiceCallSupported) {
+            /* SAR Sensors and SoftAP not supported, act like V1_1 */
+            if (sarInfo.isVoiceCall) {
                 return android.hardware.wifi.V1_1.IWifiChip.TxPowerScenario.VOICE_CALL;
             } else {
                 throw new IllegalArgumentException("bad scenario: voice call not active");
             }
+        } else {
+            throw new IllegalArgumentException("Invalid case: voice call not supported");
         }
     }
 
@@ -2791,7 +2819,7 @@
                 if (sarInfo.setSarScenarioNeeded(halScenario)) {
                     status = iWifiChip.selectTxPowerScenario(halScenario);
                     if (ok(status)) {
-                        mLog.e("Setting SAR scenario to " + halScenario);
+                        mLog.d("Setting SAR scenario to " + halScenario);
                         return true;
                     } else {
                         mLog.e("Failed to set SAR scenario to " + halScenario);
@@ -2839,7 +2867,7 @@
                 if (sarInfo.setSarScenarioNeeded(halScenario)) {
                     status = iWifiChip.selectTxPowerScenario_1_2(halScenario);
                     if (ok(status)) {
-                        mLog.e("Setting SAR scenario to " + halScenario);
+                        mLog.d("Setting SAR scenario to " + halScenario);
                         return true;
                     } else {
                         mLog.e("Failed to set SAR scenario to " + halScenario);
diff --git a/tests/wifitests/src/com/android/server/wifi/SarInfoTest.java b/tests/wifitests/src/com/android/server/wifi/SarInfoTest.java
index 1f0e44c..2bf1f3e 100644
--- a/tests/wifitests/src/com/android/server/wifi/SarInfoTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/SarInfoTest.java
@@ -39,7 +39,7 @@
 
     @Before
     public void setUp() throws Exception {
-        mSarInfo = new SarInfo(true);
+        mSarInfo = new SarInfo();
     }
 
     @After
@@ -142,7 +142,7 @@
      */
     @Test
     public void testSarInfo_shouldReport_wifi_enabled() throws Exception {
-        mSarInfo.mIsWifiClientEnabled = true;
+        mSarInfo.isWifiClientEnabled = true;
         assertTrue(mSarInfo.shouldReport());
     }
 
@@ -151,7 +151,7 @@
      */
     @Test
     public void testSarInfo_check_sensor_wifi_disabled() throws Exception {
-        mSarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        mSarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
         assertFalse(mSarInfo.shouldReport());
     }
 
@@ -160,11 +160,11 @@
      */
     @Test
     public void testSarInfo_check_sensor_wifi_enabled() throws Exception {
-        mSarInfo.mIsWifiSapEnabled = true;
+        mSarInfo.isWifiSapEnabled = true;
         assertTrue(mSarInfo.shouldReport());
         mSarInfo.reportingSuccessful();
 
-        mSarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        mSarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
         assertTrue(mSarInfo.shouldReport());
     }
 
@@ -175,8 +175,8 @@
      */
     @Test
     public void testSarInfo_check_sensor_multiple_wifi_enabled() throws Exception {
-        mSarInfo.mIsWifiScanOnlyEnabled = true;
-        mSarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        mSarInfo.isWifiScanOnlyEnabled = true;
+        mSarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
         assertTrue(mSarInfo.shouldReport());
         mSarInfo.reportingSuccessful();
 
@@ -189,16 +189,16 @@
      */
     @Test
     public void testSarInfo_check_sensor_multiple_values_wifi_enabled() throws Exception {
-        mSarInfo.mIsWifiClientEnabled = true;
-        mSarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        mSarInfo.isWifiClientEnabled = true;
+        mSarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
         assertTrue(mSarInfo.shouldReport());
         mSarInfo.reportingSuccessful();
 
-        mSarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_BODY;
+        mSarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_BODY;
         assertTrue(mSarInfo.shouldReport());
         mSarInfo.reportingSuccessful();
 
-        mSarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        mSarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
         assertTrue(mSarInfo.shouldReport());
     }
 
@@ -207,10 +207,10 @@
      */
     @Test
     public void testSarInfo_change_sensors_while_wifi_disabled() throws Exception {
-        mSarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        mSarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
         assertFalse(mSarInfo.shouldReport());
 
-        mSarInfo.mIsWifiClientEnabled = true;
+        mSarInfo.isWifiClientEnabled = true;
         assertTrue(mSarInfo.shouldReport());
         mSarInfo.reportingSuccessful();
     }
@@ -222,11 +222,11 @@
      */
     @Test
     public void testSarInfo_voice_call_wifi_enabled() throws Exception {
-        mSarInfo.mIsWifiClientEnabled = true;
+        mSarInfo.isWifiClientEnabled = true;
         assertTrue(mSarInfo.shouldReport());
         mSarInfo.reportingSuccessful();
 
-        mSarInfo.mIsVoiceCall = true;
+        mSarInfo.isVoiceCall = true;
         assertTrue(mSarInfo.shouldReport());
     }
 
@@ -237,11 +237,11 @@
      */
     @Test
     public void testSarInfo_sap_wifi_enabled() throws Exception {
-        mSarInfo.mIsWifiClientEnabled = true;
+        mSarInfo.isWifiClientEnabled = true;
         assertTrue(mSarInfo.shouldReport());
         mSarInfo.reportingSuccessful();
 
-        mSarInfo.mIsWifiSapEnabled = true;
+        mSarInfo.isWifiSapEnabled = true;
         assertTrue(mSarInfo.shouldReport());
     }
 
@@ -252,8 +252,8 @@
      */
     @Test
     public void testSarInfo_check_sensor_reporting_no_success_reporting() throws Exception {
-        mSarInfo.mIsWifiClientEnabled = true;
-        mSarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        mSarInfo.isWifiClientEnabled = true;
+        mSarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
         assertTrue(mSarInfo.shouldReport());
 
         /* No call to reportingSuccessful() will be done */
@@ -271,17 +271,17 @@
      */
     @Test
     public void testSarInfo_check_sensor_reporting_no_success_reporting_revert() throws Exception {
-        mSarInfo.mIsWifiClientEnabled = true;
-        mSarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        mSarInfo.isWifiClientEnabled = true;
+        mSarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
         assertTrue(mSarInfo.shouldReport());
         mSarInfo.reportingSuccessful();
 
         /* Changing the sensor state and fail to report */
-        mSarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_BODY;
+        mSarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_BODY;
         assertTrue(mSarInfo.shouldReport());
 
         /* Changing the sensor back to the same value as last reported */
-        mSarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        mSarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
         assertFalse(mSarInfo.shouldReport());
     }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/SarManagerTest.java b/tests/wifitests/src/com/android/server/wifi/SarManagerTest.java
index 369dcba..0cf9dd3 100644
--- a/tests/wifitests/src/com/android/server/wifi/SarManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/SarManagerTest.java
@@ -166,10 +166,14 @@
      * Helper function to set configuration for SAR and create the SAR Manager
      *
      */
-    private void createSarManager(boolean isSarEnabled, boolean isSarSensorEnabled) {
+    private void createSarManager(boolean isSarEnabled, boolean isSarSapEnabled,
+            boolean isSarSensorEnabled) {
         mResources.setBoolean(
                 R.bool.config_wifi_framework_enable_sar_tx_power_limit, isSarEnabled);
         mResources.setBoolean(
+                R.bool.config_wifi_framework_enable_soft_ap_sar_tx_power_limit,
+                isSarSapEnabled);
+        mResources.setBoolean(
                 R.bool.config_wifi_framework_enable_body_proximity_sar_tx_power_limit,
                 isSarSensorEnabled);
         mResources.setString(R.string.config_wifi_sar_sensor_type, SAR_SENSOR_NAME);
@@ -224,6 +228,8 @@
         mResources.setBoolean(
                 R.bool.config_wifi_framework_enable_sar_tx_power_limit, true);
         mResources.setBoolean(
+                R.bool.config_wifi_framework_enable_soft_ap_sar_tx_power_limit, true);
+        mResources.setBoolean(
                 R.bool.config_wifi_framework_enable_body_proximity_sar_tx_power_limit, true);
         if (addToConfigs) {
             mResources.setString(R.string.config_wifi_sar_sensor_type, configSensorName);
@@ -280,7 +286,7 @@
      */
     @Test
     public void testSarMgr_enabledTxPowerScenario_registerPhone() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
         verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_CALL_STATE));
     }
 
@@ -290,7 +296,7 @@
      */
     @Test
     public void testSarMgr_disabledTxPowerScenario_registerPhone() throws Exception {
-        createSarManager(false, false);
+        createSarManager(false, false, false);
         verify(mTelephonyManager, never()).listen(any(), anyInt());
     }
 
@@ -302,7 +308,7 @@
      */
     @Test
     public void testSarMgr_enabledTxPowerScenario_wifiOn_offHook() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -311,12 +317,12 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Set phone state to OFFHOOK */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_OFFHOOK, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertTrue(mSarInfo.isVoiceCall);
     }
 
     /**
@@ -327,7 +333,7 @@
      */
     @Test
     public void testSarMgr_enabledTxPowerScenario_offHook_wifiOn() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -339,7 +345,7 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertTrue(mSarInfo.isVoiceCall);
     }
 
     /**
@@ -349,7 +355,7 @@
      */
     @Test
     public void testSarMgr_enabledTxPowerScenario_wifiOn_offHook_onHook() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -359,21 +365,21 @@
 
         /* Now device should set tx power scenario to NORMAL */
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Set phone state to OFFHOOK */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_OFFHOOK, "");
 
         /* Device should set tx power scenario to Voice call */
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertTrue(mSarInfo.isVoiceCall);
 
         /* Set state back to ONHOOK */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_IDLE, "");
 
         /* Device should set tx power scenario to NORMAL again */
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Disable WiFi State */
         mSarMgr.setClientWifiState(WifiManager.WIFI_STATE_DISABLED);
@@ -387,7 +393,7 @@
      */
     @Test
     public void testSarMgr_enabledTxPowerScenario_wifiOff_offHook_onHook() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -411,7 +417,7 @@
      */
     @Test
     public void testSarMgr_enabledSar_wifiOn_offHook_wifiOff_onHook() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -421,12 +427,12 @@
 
         /* Now device should set tx power scenario to NORMAL */
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Set phone state to OFFHOOK */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_OFFHOOK, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertTrue(mSarInfo.isVoiceCall);
 
         /* Disable WiFi State */
         mSarMgr.setClientWifiState(WifiManager.WIFI_STATE_DISABLED);
@@ -439,7 +445,7 @@
         /* Enable WiFi State again */
         mSarMgr.setClientWifiState(WifiManager.WIFI_STATE_ENABLED);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertFalse(mSarInfo.isVoiceCall);
     }
 
     /**
@@ -448,7 +454,7 @@
      */
     @Test
     public void testSarMgr_enabledSar_wifiOff_offHook_onHook_wifiOn() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -465,7 +471,7 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertFalse(mSarInfo.isVoiceCall);
     }
 
     /**
@@ -474,7 +480,7 @@
      */
     @Test
     public void testSarMgr_enabledSar_offHook_wifiOnOff_onHook() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -488,7 +494,7 @@
         assertNotNull(mSarInfo);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertTrue(mSarInfo.isVoiceCall);
 
         /* Disable WiFi State */
         mSarMgr.setClientWifiState(WifiManager.WIFI_STATE_DISABLED);
@@ -505,7 +511,7 @@
      */
     @Test
     public void testSarMgr_enabledSar_error_wifiOn_offOnHook() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         when(mWifiNative.selectTxPowerScenario(any(SarInfo.class))).thenReturn(false);
         InOrder inOrder = inOrder(mWifiNative);
@@ -516,17 +522,17 @@
         assertNotNull(mSarInfo);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Set phone state to OFFHOOK */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_OFFHOOK, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertTrue(mSarInfo.isVoiceCall);
 
         /* Set state back to ONHOOK */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_IDLE, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertFalse(mSarInfo.isVoiceCall);
     }
 
     /**
@@ -535,7 +541,7 @@
      */
     @Test
     public void testSarMgr_sarSensorOn_WifiOn_sensorEventsTriggered() throws Exception {
-        createSarManager(true, true);
+        createSarManager(true, true, true);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -544,31 +550,31 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_FREE_SPACE, mSarInfo.mSensorState);
+        assertEquals(SarInfo.SAR_SENSOR_FREE_SPACE, mSarInfo.sensorState);
 
         /* Sensor event */
         sendSensorEvent(SAR_SENSOR_EVENT_BODY);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_BODY, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_BODY, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Sensor event */
         sendSensorEvent(SAR_SENSOR_EVENT_HEAD);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Sensor event */
         sendSensorEvent(SAR_SENSOR_EVENT_HAND);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HAND, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HAND, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Sensor event */
         sendSensorEvent(SAR_SENSOR_EVENT_FREE_SPACE);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_FREE_SPACE, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_FREE_SPACE, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
     }
 
     /**
@@ -578,7 +584,7 @@
      */
     @Test
     public void testSarMgr_sarSensorOn_wifiOn_cellOn_sensorEventsTriggered() throws Exception {
-        createSarManager(true, true);
+        createSarManager(true, true, true);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -588,38 +594,38 @@
 
         /* Should get the an event with no calls */
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_FREE_SPACE, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_FREE_SPACE, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Start a Cell call */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_OFFHOOK, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(any(SarInfo.class));
-        assertEquals(SarInfo.SAR_SENSOR_FREE_SPACE, mSarInfo.mSensorState);
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_FREE_SPACE, mSarInfo.sensorState);
+        assertTrue(mSarInfo.isVoiceCall);
 
         /* Sensor event */
         sendSensorEvent(SAR_SENSOR_EVENT_BODY);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_BODY, mSarInfo.mSensorState);
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_BODY, mSarInfo.sensorState);
+        assertTrue(mSarInfo.isVoiceCall);
 
         /* Sensor event */
         sendSensorEvent(SAR_SENSOR_EVENT_HEAD);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertTrue(mSarInfo.isVoiceCall);
 
         /* Sensor event */
         sendSensorEvent(SAR_SENSOR_EVENT_HAND);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HAND, mSarInfo.mSensorState);
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HAND, mSarInfo.sensorState);
+        assertTrue(mSarInfo.isVoiceCall);
 
         /* Sensor event */
         sendSensorEvent(SAR_SENSOR_EVENT_FREE_SPACE);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_FREE_SPACE, mSarInfo.mSensorState);
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_FREE_SPACE, mSarInfo.sensorState);
+        assertTrue(mSarInfo.isVoiceCall);
     }
 
     /**
@@ -629,7 +635,7 @@
      */
     @Test
     public void testSarMgr_sarSensorOn_wifiOn_onHead_cellOnOff() throws Exception {
-        createSarManager(true, true);
+        createSarManager(true, true, true);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -638,26 +644,27 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_FREE_SPACE, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_FREE_SPACE, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Sensor event */
         sendSensorEvent(SAR_SENSOR_EVENT_HEAD);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
+
 
         /* Start a Cell call */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_OFFHOOK, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertTrue(mSarInfo.isVoiceCall);
 
         /* End a Cell call */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_IDLE, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
     }
 
     /**
@@ -668,7 +675,7 @@
      */
     @Test
     public void testSarMgr_sarSensorOn_WifiOffOn_sensorEventTriggered() throws Exception {
-        createSarManager(true, true);
+        createSarManager(true, true, true);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -681,8 +688,8 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_BODY, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_BODY, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
     }
 
     /**
@@ -703,20 +710,20 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Start a Cell Call */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_OFFHOOK, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertTrue(mSarInfo.isVoiceCall);
 
         /* End the call */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_IDLE, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
     }
 
     /**
@@ -737,20 +744,20 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Start a Cell Call */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_OFFHOOK, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertTrue(mSarInfo.isVoiceCall);
 
         /* End the call */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_IDLE, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
     }
 
     /**
@@ -771,20 +778,20 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
 
         /* Start a Cell Call */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_OFFHOOK, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertTrue(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertTrue(mSarInfo.isVoiceCall);
 
         /* End the call */
         mPhoneStateListener.onCallStateChanged(CALL_STATE_IDLE, "");
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsVoiceCall);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isVoiceCall);
     }
 
     /**
@@ -793,7 +800,7 @@
      */
     @Test
     public void testSarMgr_disabledTxPowerScenario_sapOn() throws Exception {
-        createSarManager(false, false);
+        createSarManager(false, false, false);
 
         /* Enable WiFi SoftAP State */
         mSarMgr.setSapWifiState(WifiManager.WIFI_AP_STATE_ENABLED);
@@ -806,7 +813,7 @@
      */
     @Test
     public void testSarMgr_enabledTxPowerScenario_sapOn() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -815,9 +822,9 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
-        assertTrue(mSarInfo.mIsWifiSapEnabled);
-        assertFalse(mSarInfo.mIsWifiScanOnlyEnabled);
+        assertFalse(mSarInfo.isVoiceCall);
+        assertTrue(mSarInfo.isWifiSapEnabled);
+        assertFalse(mSarInfo.isWifiScanOnlyEnabled);
     }
 
     /**
@@ -826,7 +833,7 @@
      */
     @Test
     public void testSarMgr_enabledTxPowerScenario_staOn_sapOnOff() throws Exception {
-        createSarManager(true, true);
+        createSarManager(true, true, true);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -839,20 +846,20 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsWifiSapEnabled);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isWifiSapEnabled);
 
         /* Enable WiFi SoftAP State */
         mSarMgr.setSapWifiState(WifiManager.WIFI_AP_STATE_ENABLED);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertTrue(mSarInfo.mIsWifiSapEnabled);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertTrue(mSarInfo.isWifiSapEnabled);
 
         /* Disable Wifi SoftAP state */
         mSarMgr.setSapWifiState(WifiManager.WIFI_AP_STATE_DISABLED);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsWifiSapEnabled);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_HEAD, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isWifiSapEnabled);
     }
 
     /**
@@ -864,7 +871,7 @@
      */
     @Test
     public void testSarMgr_enabledTxPowerScenario_sapOnOff_staOffOn() throws Exception {
-        createSarManager(true, true);
+        createSarManager(true, true, true);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -877,8 +884,8 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_BODY, mSarInfo.mSensorState);
-        assertTrue(mSarInfo.mIsWifiSapEnabled);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_BODY, mSarInfo.sensorState);
+        assertTrue(mSarInfo.isWifiSapEnabled);
 
         /* Disable Wifi SoftAP state */
         mSarMgr.setSapWifiState(WifiManager.WIFI_AP_STATE_DISABLED);
@@ -887,8 +894,8 @@
         /* Enable WiFi Clinet State */
         mSarMgr.setClientWifiState(WifiManager.WIFI_STATE_ENABLED);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertEquals(SarInfo.SAR_SENSOR_NEAR_BODY, mSarInfo.mSensorState);
-        assertFalse(mSarInfo.mIsWifiSapEnabled);
+        assertEquals(SarInfo.SAR_SENSOR_NEAR_BODY, mSarInfo.sensorState);
+        assertFalse(mSarInfo.isWifiSapEnabled);
     }
 
     /**
@@ -897,15 +904,15 @@
      */
     @Test
     public void testSarMgr_enabledTxPowerScenario_staOff_sapOff_scanOnlyOn() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         /* Enable Wifi ScanOnly State */
         mSarMgr.setScanOnlyWifiState(WifiManager.WIFI_STATE_ENABLED);
         captureSarInfo(mWifiNative);
 
         verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsWifiSapEnabled);
-        assertTrue(mSarInfo.mIsWifiScanOnlyEnabled);
+        assertFalse(mSarInfo.isWifiSapEnabled);
+        assertTrue(mSarInfo.isWifiScanOnlyEnabled);
     }
 
     /**
@@ -914,7 +921,7 @@
      */
     @Test
     public void testSarMgr_enabledTxPowerScenario_staOn_sapOff_scanOnlyOn() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -923,8 +930,8 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsWifiSapEnabled);
-        assertTrue(mSarInfo.mIsWifiScanOnlyEnabled);
+        assertFalse(mSarInfo.isWifiSapEnabled);
+        assertTrue(mSarInfo.isWifiScanOnlyEnabled);
 
         /* Now enable Client state */
         mSarMgr.setClientWifiState(WifiManager.WIFI_STATE_ENABLED);
@@ -940,7 +947,7 @@
      */
     @Test
     public void testSarMgr_enabledTxPowerScenario_wifi_sap_scanOnly() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         InOrder inOrder = inOrder(mWifiNative);
 
@@ -949,16 +956,16 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
-        assertFalse(mSarInfo.mIsWifiSapEnabled);
-        assertFalse(mSarInfo.mIsWifiScanOnlyEnabled);
+        assertFalse(mSarInfo.isVoiceCall);
+        assertFalse(mSarInfo.isWifiSapEnabled);
+        assertFalse(mSarInfo.isWifiScanOnlyEnabled);
 
         /* Enable SoftAP state */
         mSarMgr.setSapWifiState(WifiManager.WIFI_AP_STATE_ENABLED);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
-        assertTrue(mSarInfo.mIsWifiSapEnabled);
-        assertFalse(mSarInfo.mIsWifiScanOnlyEnabled);
+        assertFalse(mSarInfo.isVoiceCall);
+        assertTrue(mSarInfo.isWifiSapEnabled);
+        assertFalse(mSarInfo.isWifiScanOnlyEnabled);
 
         /* Disable WiFi State */
         mSarMgr.setClientWifiState(WifiManager.WIFI_STATE_DISABLED);
@@ -971,9 +978,9 @@
         /* Disable SoftAP state */
         mSarMgr.setSapWifiState(WifiManager.WIFI_AP_STATE_DISABLED);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
-        assertFalse(mSarInfo.mIsWifiSapEnabled);
-        assertTrue(mSarInfo.mIsWifiScanOnlyEnabled);
+        assertFalse(mSarInfo.isVoiceCall);
+        assertFalse(mSarInfo.isWifiSapEnabled);
+        assertTrue(mSarInfo.isWifiScanOnlyEnabled);
     }
 
     /**
@@ -983,7 +990,7 @@
      */
     @Test
     public void testSarMgr_enabledTxPowerScenario_error_wifi_sap_scanOnly() throws Exception {
-        createSarManager(true, false);
+        createSarManager(true, false, false);
 
         when(mWifiNative.selectTxPowerScenario(any(SarInfo.class))).thenReturn(false);
         InOrder inOrder = inOrder(mWifiNative);
@@ -993,39 +1000,39 @@
         captureSarInfo(mWifiNative);
 
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
-        assertFalse(mSarInfo.mIsWifiSapEnabled);
-        assertFalse(mSarInfo.mIsWifiScanOnlyEnabled);
+        assertFalse(mSarInfo.isVoiceCall);
+        assertFalse(mSarInfo.isWifiSapEnabled);
+        assertFalse(mSarInfo.isWifiScanOnlyEnabled);
 
         /* Enable SoftAP state */
         mSarMgr.setSapWifiState(WifiManager.WIFI_AP_STATE_ENABLED);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
-        assertTrue(mSarInfo.mIsWifiSapEnabled);
-        assertFalse(mSarInfo.mIsWifiScanOnlyEnabled);
+        assertFalse(mSarInfo.isVoiceCall);
+        assertTrue(mSarInfo.isWifiSapEnabled);
+        assertFalse(mSarInfo.isWifiScanOnlyEnabled);
 
         /* Disable WiFi State, reporting should still happen */
         mSarMgr.setClientWifiState(WifiManager.WIFI_STATE_DISABLED);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
-        assertTrue(mSarInfo.mIsWifiSapEnabled);
-        assertFalse(mSarInfo.mIsWifiScanOnlyEnabled);
-        assertFalse(mSarInfo.mIsWifiClientEnabled);
+        assertFalse(mSarInfo.isVoiceCall);
+        assertTrue(mSarInfo.isWifiSapEnabled);
+        assertFalse(mSarInfo.isWifiScanOnlyEnabled);
+        assertFalse(mSarInfo.isWifiClientEnabled);
 
         /* Enable ScanOnly state */
         mSarMgr.setScanOnlyWifiState(WifiManager.WIFI_STATE_ENABLED);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
-        assertTrue(mSarInfo.mIsWifiSapEnabled);
-        assertTrue(mSarInfo.mIsWifiScanOnlyEnabled);
-        assertFalse(mSarInfo.mIsWifiClientEnabled);
+        assertFalse(mSarInfo.isVoiceCall);
+        assertTrue(mSarInfo.isWifiSapEnabled);
+        assertTrue(mSarInfo.isWifiScanOnlyEnabled);
+        assertFalse(mSarInfo.isWifiClientEnabled);
 
         /* Disable SoftAP state */
         mSarMgr.setSapWifiState(WifiManager.WIFI_AP_STATE_DISABLED);
         inOrder.verify(mWifiNative).selectTxPowerScenario(eq(mSarInfo));
-        assertFalse(mSarInfo.mIsVoiceCall);
-        assertFalse(mSarInfo.mIsWifiSapEnabled);
-        assertTrue(mSarInfo.mIsWifiScanOnlyEnabled);
-        assertFalse(mSarInfo.mIsWifiClientEnabled);
+        assertFalse(mSarInfo.isVoiceCall);
+        assertFalse(mSarInfo.isWifiSapEnabled);
+        assertTrue(mSarInfo.isWifiScanOnlyEnabled);
+        assertFalse(mSarInfo.isWifiClientEnabled);
     }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNativeTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNativeTest.java
index fbdc8f5..abec9dc 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiNativeTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiNativeTest.java
@@ -593,7 +593,7 @@
     @Test
     public void testSelectTxPowerScenario_success() throws Exception {
         when(mWifiVendorHal.selectTxPowerScenario(any(SarInfo.class))).thenReturn(true);
-        SarInfo sarInfo = new SarInfo(true);
+        SarInfo sarInfo = new SarInfo();
         assertTrue(mWifiNative.selectTxPowerScenario(sarInfo));
         verify(mWifiVendorHal).selectTxPowerScenario(sarInfo);
     }
@@ -604,7 +604,7 @@
     @Test
     public void testSelectTxPowerScenario_failure() throws Exception {
         when(mWifiVendorHal.selectTxPowerScenario(any(SarInfo.class))).thenReturn(false);
-        SarInfo sarInfo = new SarInfo(true);
+        SarInfo sarInfo = new SarInfo();
         assertFalse(mWifiNative.selectTxPowerScenario(sarInfo));
         verify(mWifiVendorHal).selectTxPowerScenario(sarInfo);
     }
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java b/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java
index fc030b8..f089ebb 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java
@@ -2006,8 +2006,8 @@
     @Test
     public void testSelectTxPowerScenario_1_0() throws RemoteException {
         // Create a SAR info record (no sensor support)
-        SarInfo sarInfo = new SarInfo(false);
-        sarInfo.mIsVoiceCall = true;
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.isVoiceCall = true;
 
         assertTrue(mWifiVendorHal.startVendorHalSta());
         // Should fail because we exposed the 1.0 IWifiChip.
@@ -2023,8 +2023,12 @@
     @Test
     public void testSelectTxPowerScenario_1_1() throws RemoteException {
         // Create a SAR info record (no sensor support)
-        SarInfo sarInfo = new SarInfo(false);
-        sarInfo.mIsVoiceCall = true;
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = false;
+        sarInfo.sarSensorSupported = false;
+
+        sarInfo.isVoiceCall = true;
 
         // Now expose the 1.1 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_1(mHalDeviceManager, mLooper.getLooper());
@@ -2045,8 +2049,12 @@
     @Test
     public void testSelectTxPowerScenario_1_2() throws RemoteException {
         // Create a SAR info record (no sensor support)
-        SarInfo sarInfo = new SarInfo(false);
-        sarInfo.mIsVoiceCall = true;
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = false;
+        sarInfo.sarSensorSupported = false;
+
+        sarInfo.isVoiceCall = true;
 
         // Now expose the 1.2 IWifiChip
         mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
@@ -2067,7 +2075,7 @@
     @Test
     public void testResetTxPowerScenario_1_0() throws RemoteException {
         // Create a SAR info record (no sensor support)
-        SarInfo sarInfo = new SarInfo(false);
+        SarInfo sarInfo = new SarInfo();
 
         assertTrue(mWifiVendorHal.startVendorHalSta());
         // Should fail because we exposed the 1.0 IWifiChip.
@@ -2083,7 +2091,10 @@
     @Test
     public void testResetTxPowerScenario_1_1() throws RemoteException {
         // Create a SAR info record (no sensor support)
-        SarInfo sarInfo = new SarInfo(false);
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = false;
+        sarInfo.sarSensorSupported = false;
 
         // Now expose the 1.1 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_1(mHalDeviceManager, mLooper.getLooper());
@@ -2105,8 +2116,11 @@
     public void testResetTxPowerScenario_not_needed_1_1() throws RemoteException {
         InOrder inOrder = inOrder(mIWifiChipV11);
 
-        // Create a SAR info record (no sensor support)
-        SarInfo sarInfo = new SarInfo(false);
+        // Create a SAR info record (no sensor or SAP support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = false;
+        sarInfo.sarSensorSupported = false;
 
         // Now expose the 1.1 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_1(mHalDeviceManager, mLooper.getLooper());
@@ -2134,8 +2148,11 @@
      */
     @Test
     public void testResetTxPowerScenario_1_2() throws RemoteException {
-        // Create a SAR info record (no sensor support)
-        SarInfo sarInfo = new SarInfo(false);
+        // Create a SAR info record (no sensor or SAP support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = false;
+        sarInfo.sarSensorSupported = false;
 
         // Now expose the 1.2 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
@@ -2157,8 +2174,11 @@
     public void testResetTxPowerScenario_not_needed_1_2() throws RemoteException {
         InOrder inOrder = inOrder(mIWifiChipV12);
 
-        // Create a SAR info record (no sensor support)
-        SarInfo sarInfo = new SarInfo(false);
+        // Create a SAR info record (no sensor or SAP support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = false;
+        sarInfo.sarSensorSupported = false;
 
         // Now expose the 1.2 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
@@ -2180,15 +2200,77 @@
         mWifiVendorHal.stopVendorHal();
     }
 
+     /**
+     * Test the selectTxPowerScenario HIDL method invocation with no sensor support, but with
+     * SAP and voice call support.
+     * When SAP is enabled, should result in SAP with near body scenario
+     * Using IWifiChip 1.2 interface
+     */
+    @Test
+    public void testSapScenarios_SelectTxPowerV1_2() throws RemoteException {
+        // Create a SAR info record (with sensor and SAP support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = true;
+        sarInfo.sarSensorSupported = false;
+
+        sarInfo.isWifiSapEnabled = true;
+
+        // Expose the 1.2 IWifiChip.
+        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
+        when(mIWifiChipV12.selectTxPowerScenario_1_2(anyInt())).thenReturn(mWifiStatusSuccess);
+
+        // ON_BODY_CELL_ON
+        assertTrue(mWifiVendorHal.startVendorHalSta());
+        assertTrue(mWifiVendorHal.selectTxPowerScenario(sarInfo));
+        verify(mIWifiChipV12).selectTxPowerScenario_1_2(
+                eq(android.hardware.wifi.V1_2.IWifiChip.TxPowerScenario.ON_BODY_CELL_ON));
+        verify(mIWifiChipV12, never()).resetTxPowerScenario();
+        mWifiVendorHal.stopVendorHal();
+    }
+
+    /**
+     * Test the selectTxPowerScenario HIDL method invocation with no sensor support, but with
+     * SAP and voice call support.
+     * When a voice call is ongoing, should result in cell with near head scenario
+     * Using IWifiChip 1.2 interface
+     */
+    @Test
+    public void testVoiceCallScenarios_SelectTxPowerV1_2() throws RemoteException {
+        // Create a SAR info record (with sensor and SAP support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = true;
+        sarInfo.sarSensorSupported = false;
+
+        sarInfo.isVoiceCall = true;
+
+        // Expose the 1.2 IWifiChip.
+        mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
+        when(mIWifiChipV12.selectTxPowerScenario_1_2(anyInt())).thenReturn(mWifiStatusSuccess);
+
+        // ON_HEAD_CELL_ON
+        assertTrue(mWifiVendorHal.startVendorHalSta());
+        assertTrue(mWifiVendorHal.selectTxPowerScenario(sarInfo));
+        verify(mIWifiChipV12).selectTxPowerScenario_1_2(
+                eq(android.hardware.wifi.V1_2.IWifiChip.TxPowerScenario.ON_HEAD_CELL_ON));
+        verify(mIWifiChipV12, never()).resetTxPowerScenario();
+        mWifiVendorHal.stopVendorHal();
+    }
+
     /**
      * Test the selectTxPowerScenario HIDL method invocation with sensor related scenarios
      * to IWifiChip 1.2 interface
      */
     @Test
     public void testHeadSensorScenarios_SelectTxPowerV1_2() throws RemoteException {
-        // Create a SAR info record (with sensor support)
-        SarInfo sarInfo = new SarInfo(true);
-        sarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        // Create a SAR info record (with sensor and SAP support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = true;
+        sarInfo.sarSensorSupported = true;
+
+        sarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
 
         // Expose the 1.2 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
@@ -2212,9 +2294,13 @@
     public void testSetTxPowerScenario_not_needed_1_2() throws RemoteException {
         InOrder inOrder = inOrder(mIWifiChipV12);
 
-        // Create a SAR info record (no sensor support)
-        SarInfo sarInfo = new SarInfo(true);
-        sarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        // Create a SAR info record (no sensor and SAP support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = true;
+        sarInfo.sarSensorSupported = true;
+
+        sarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
 
         // Now expose the 1.2 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
@@ -2244,9 +2330,13 @@
      */
     @Test
     public void testHandSensorScenarios_SelectTxPowerV1_2() throws RemoteException {
-        // Create a SAR info record (with sensor support)
-        SarInfo sarInfo = new SarInfo(true);
-        sarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HAND;
+        // Create a SAR info record (with sensor and SAR support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = true;
+        sarInfo.sarSensorSupported = true;
+
+        sarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HAND;
 
         // Expose the 1.2 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
@@ -2260,7 +2350,7 @@
                 eq(android.hardware.wifi.V1_2.IWifiChip.TxPowerScenario.ON_BODY_CELL_OFF));
 
         // Then select a scenario with cell on
-        sarInfo.mIsVoiceCall = true;
+        sarInfo.isVoiceCall = true;
         assertTrue(mWifiVendorHal.selectTxPowerScenario(sarInfo));
         verify(mIWifiChipV12).selectTxPowerScenario_1_2(
                 eq(android.hardware.wifi.V1_2.IWifiChip.TxPowerScenario.ON_BODY_CELL_ON));
@@ -2275,9 +2365,13 @@
      */
     @Test
     public void testOnHeadCellOffOn_SelectTxPowerScenarioV1_1() throws RemoteException {
-        // Create a SAR info record (with sensor support)
-        SarInfo sarInfo = new SarInfo(true);
-        sarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        // Create a SAR info record (with sensor and SAP support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = true;
+        sarInfo.sarSensorSupported = true;
+
+        sarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
 
         // Expose the 1.1 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_1(mHalDeviceManager, mLooper.getLooper());
@@ -2291,7 +2385,7 @@
         verify(mIWifiChipV11).resetTxPowerScenario();
 
         // Then select a scenario with cell on
-        sarInfo.mIsVoiceCall = true;
+        sarInfo.isVoiceCall = true;
         assertTrue(mWifiVendorHal.selectTxPowerScenario(sarInfo));
         verify(mIWifiChipV11).selectTxPowerScenario(
                 eq(android.hardware.wifi.V1_1.IWifiChip.TxPowerScenario.VOICE_CALL));
@@ -2306,9 +2400,13 @@
      */
     @Test
     public void testInvalidSelectTxPowerScenario_1_2() throws RemoteException {
-        // Create a SAR info record (with sensor support)
-        SarInfo sarInfo = new SarInfo(true);
-        sarInfo.mSensorState = SAR_SENSOR_INVALID_STATE;
+        // Create a SAR info record (with sensor and SAP support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = true;
+        sarInfo.sarSensorSupported = true;
+
+        sarInfo.sensorState = SAR_SENSOR_INVALID_STATE;
 
         // Expose the 1.2 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
@@ -2330,11 +2428,15 @@
      */
     @Test
     public void testSelectTxPowerScenario_1_2_head_sap() throws RemoteException {
-        // Create a SAR info record (with sensor support)
-        SarInfo sarInfo = new SarInfo(true);
-        sarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
-        sarInfo.mIsWifiSapEnabled = true;
-        sarInfo.mIsVoiceCall = false;
+        // Create a SAR info record (with sensor and SAP support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = true;
+        sarInfo.sarSensorSupported = true;
+
+        sarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        sarInfo.isWifiSapEnabled = true;
+        sarInfo.isVoiceCall = false;
 
         // Expose the 1.2 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
@@ -2358,11 +2460,15 @@
      */
     @Test
     public void testSelectTxPowerScenario_1_2_head_sap_call() throws RemoteException {
-        // Create a SAR info record (with sensor support)
-        SarInfo sarInfo = new SarInfo(true);
-        sarInfo.mSensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
-        sarInfo.mIsWifiSapEnabled = true;
-        sarInfo.mIsVoiceCall = true;
+        // Create a SAR info record (with sensor and SAP support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = true;
+        sarInfo.sarSensorSupported = true;
+
+        sarInfo.sensorState = SarInfo.SAR_SENSOR_NEAR_HEAD;
+        sarInfo.isWifiSapEnabled = true;
+        sarInfo.isVoiceCall = true;
 
         // Expose the 1.2 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
@@ -2386,11 +2492,15 @@
      */
     @Test
     public void testSelectTxPowerScenario_1_2_freespace_sap() throws RemoteException {
-        // Create a SAR info record (with sensor support)
-        SarInfo sarInfo = new SarInfo(true);
-        sarInfo.mSensorState = SarInfo.SAR_SENSOR_FREE_SPACE;
-        sarInfo.mIsWifiSapEnabled = true;
-        sarInfo.mIsVoiceCall = false;
+        // Create a SAR info record (with sensor and SAP support)
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = true;
+        sarInfo.sarSensorSupported = true;
+
+        sarInfo.sensorState = SarInfo.SAR_SENSOR_FREE_SPACE;
+        sarInfo.isWifiSapEnabled = true;
+        sarInfo.isVoiceCall = false;
 
         // Expose the 1.2 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());
@@ -2414,9 +2524,13 @@
     @Test
     public void testSelectTxPowerScenario_1_2_no_sensors_sap() throws RemoteException {
         // Create a SAR info record (with no sensor support)
-        SarInfo sarInfo = new SarInfo(false);
-        sarInfo.mIsWifiSapEnabled = true;
-        sarInfo.mIsVoiceCall = false;
+        SarInfo sarInfo = new SarInfo();
+        sarInfo.sarVoiceCallSupported = true;
+        sarInfo.sarSapSupported = true;
+        sarInfo.sarSensorSupported = true;
+
+        sarInfo.isWifiSapEnabled = true;
+        sarInfo.isVoiceCall = false;
 
         // Expose the 1.2 IWifiChip.
         mWifiVendorHal = new WifiVendorHalSpyV1_2(mHalDeviceManager, mLooper.getLooper());