Merge "VoNR toggle"
diff --git a/src/java/com/android/internal/telephony/CommandsInterface.java b/src/java/com/android/internal/telephony/CommandsInterface.java
index a6ff3fa..8a5cbda 100644
--- a/src/java/com/android/internal/telephony/CommandsInterface.java
+++ b/src/java/com/android/internal/telephony/CommandsInterface.java
@@ -1599,6 +1599,17 @@
     default void isNrDualConnectivityEnabled(Message message, WorkSource workSource) {}
 
     /**
+     * Enable or disable Voice over NR (VoNR)
+     * @param enabled enable or disable VoNR.
+     */
+    default void setVoNrEnabled(boolean enabled, Message message, WorkSource workSource) {}
+
+    /**
+     * Is voice over NR enabled
+     */
+    default void isVoNrEnabled(Message message, WorkSource workSource) {}
+
+    /**
      * Request to enable/disable network state change notifications when
      * location information (lac and/or cid) has changed.
      *
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index 9d16f1f..c718dbb 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -4656,6 +4656,21 @@
         mCi.setSimCardPower(state, result, workSource);
     }
 
+    /**
+     * Enable or disable Voice over NR (VoNR)
+     * @param enabled enable or disable VoNR.
+     **/
+    public void setVoNrEnabled(boolean enabled, Message result, WorkSource workSource) {
+        mCi.setVoNrEnabled(enabled, result, workSource);
+    }
+
+    /**
+     * Is voice over NR enabled
+     */
+    public void isVoNrEnabled(Message message, WorkSource workSource) {
+        mCi.isVoNrEnabled(message, workSource);
+    }
+
     public void setCarrierTestOverride(String mccmnc, String imsi, String iccid, String gid1,
             String gid2, String pnn, String spn, String carrierPrivilegeRules, String apn) {
     }
diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java
index 29e12e1..dccd4f9 100644
--- a/src/java/com/android/internal/telephony/RIL.java
+++ b/src/java/com/android/internal/telephony/RIL.java
@@ -64,6 +64,7 @@
 import android.os.PowerManager.WakeLock;
 import android.os.RemoteException;
 import android.os.SystemClock;
+import android.os.SystemProperties;
 import android.os.WorkSource;
 import android.provider.Settings;
 import android.sysprop.TelephonyProperties;
@@ -235,6 +236,8 @@
 
     final Integer mPhoneId;
 
+    private static final String PROPERTY_IS_VONR_ENABLED = "persist.radio.is_vonr_enabled_";
+
     /**
      * A set that records if radio service is disabled in hal for
      * a specific phone id slot to avoid further getService request.
@@ -3096,6 +3099,46 @@
         }
     }
 
+    private void setVoNrEnabled(boolean enabled) {
+        SystemProperties.set(PROPERTY_IS_VONR_ENABLED + mPhoneId, String.valueOf(enabled));
+    }
+
+    private boolean isVoNrEnabled() {
+        return SystemProperties.getBoolean(PROPERTY_IS_VONR_ENABLED + mPhoneId, true);
+    }
+
+    /**
+     * Is voice over NR enabled
+     */
+    @Override
+    public void isVoNrEnabled(Message result, WorkSource workSource) {
+        boolean isEnabled = isVoNrEnabled();
+        if (result != null) {
+            AsyncResult.forMessage(result, isEnabled, null);
+            result.sendToTarget();
+        }
+    }
+
+    /**
+     * Enable or disable Voice over NR (VoNR)
+     * @param enabled enable or disable VoNR.
+     */
+    @Override
+    public void setVoNrEnabled(boolean enabled, Message result, WorkSource workSource) {
+        setVoNrEnabled(enabled);
+        /* calling a query api to let HAL know that VoNREnabled state is updated.
+           This is a temporary work around as new HIDL API is not allowed.
+           HAL can check the value of PROPERTY_IS_VONR_ENABLED property to determine
+           if there is any change whenever it receives isNrDualConnectivityEnabled request.
+           This behavior will be removed in Android T.
+         */
+        isNrDualConnectivityEnabled(null, workSource);
+        if (result != null) {
+            AsyncResult.forMessage(result, null, null);
+            result.sendToTarget();
+        }
+    }
+
     @Override
     public void setCdmaSubscriptionSource(int cdmaSubscription , Message result) {
         IRadio radioProxy = getRadioProxy(result);