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());
