Merge "VoNR toggle"
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index b86421c..b5c4e01 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -341,6 +341,10 @@
private static final int CMD_GET_SLICING_CONFIG = 110;
private static final int EVENT_GET_SLICING_CONFIG_DONE = 111;
private static final int CMD_ERASE_DATA_SHARED_PREFERENCES = 112;
+ private static final int CMD_ENABLE_VONR = 113;
+ private static final int EVENT_ENABLE_VONR_DONE = 114;
+ private static final int CMD_IS_VONR_ENABLED = 115;
+ private static final int EVENT_IS_VONR_ENABLED_DONE = 116;
// Parameters of select command.
private static final int SELECT_COMMAND = 0xA4;
@@ -834,7 +838,7 @@
} else {
// request.result must be set to something non-null
// for the calling thread to unblock
- if (request.result != null) {
+ if (ar.result != null) {
request.result = ar.result;
} else {
request.result = false;
@@ -851,6 +855,46 @@
notifyRequester(request);
break;
+ case CMD_IS_VONR_ENABLED: {
+ request = (MainThreadRequest) msg.obj;
+ onCompleted = obtainMessage(EVENT_IS_VONR_ENABLED_DONE,
+ request);
+ Phone phone = getPhoneFromRequest(request);
+ if (phone != null) {
+ phone.isVoNrEnabled(onCompleted, request.workSource);
+ } else {
+ loge("isVoNrEnabled: No phone object");
+ request.result = false;
+ notifyRequester(request);
+ }
+ break;
+ }
+
+ case EVENT_IS_VONR_ENABLED_DONE:
+ ar = (AsyncResult) msg.obj;
+ request = (MainThreadRequest) ar.userObj;
+ if (ar.exception == null && ar.result != null) {
+ request.result = ar.result;
+ } else {
+ // request.result must be set to something non-null
+ // for the calling thread to unblock
+ if (ar.result != null) {
+ request.result = ar.result;
+ } else {
+ request.result = false;
+ }
+ if (ar.result == null) {
+ loge("isVoNrEnabled: Empty response");
+ } else if (ar.exception instanceof CommandException) {
+ loge("isVoNrEnabled: CommandException: "
+ + ar.exception);
+ } else {
+ loge("isVoNrEnabled: Unknown exception");
+ }
+ }
+ notifyRequester(request);
+ break;
+
case CMD_ENABLE_NR_DUAL_CONNECTIVITY: {
request = (MainThreadRequest) msg.obj;
onCompleted = obtainMessage(EVENT_ENABLE_NR_DUAL_CONNECTIVITY_DONE, request);
@@ -899,6 +943,49 @@
break;
}
+ case CMD_ENABLE_VONR: {
+ request = (MainThreadRequest) msg.obj;
+ onCompleted = obtainMessage(EVENT_ENABLE_VONR_DONE, request);
+ Phone phone = getPhoneFromRequest(request);
+ if (phone != null) {
+ phone.setVoNrEnabled((boolean) request.argument, onCompleted,
+ request.workSource);
+ } else {
+ loge("setVoNrEnabled: No phone object");
+ request.result =
+ TelephonyManager.ENABLE_VONR_RADIO_NOT_AVAILABLE;
+ notifyRequester(request);
+ }
+ break;
+ }
+
+ case EVENT_ENABLE_VONR_DONE: {
+ ar = (AsyncResult) msg.obj;
+ request = (MainThreadRequest) ar.userObj;
+ if (ar.exception == null) {
+ request.result = TelephonyManager.ENABLE_VONR_SUCCESS;
+ } else {
+ request.result = TelephonyManager.ENABLE_VONR_RADIO_ERROR;
+ if (ar.exception instanceof CommandException) {
+ CommandException.Error error =
+ ((CommandException) (ar.exception)).getCommandError();
+ if (error == CommandException.Error.RADIO_NOT_AVAILABLE) {
+ request.result = TelephonyManager.ENABLE_VONR_RADIO_NOT_AVAILABLE;
+ } else if (error == CommandException.Error.REQUEST_NOT_SUPPORTED) {
+ request.result = TelephonyManager.ENABLE_VONR_REQUEST_NOT_SUPPORTED;
+ } else {
+ request.result = TelephonyManager.ENABLE_VONR_RADIO_ERROR;
+ }
+ loge("setVoNrEnabled" + ": CommandException: "
+ + ar.exception);
+ } else {
+ loge("setVoNrEnabled" + ": Unknown exception");
+ }
+ }
+ notifyRequester(request);
+ break;
+ }
+
case CMD_GET_ALLOWED_NETWORK_TYPES_BITMASK:
request = (MainThreadRequest) msg.obj;
onCompleted = obtainMessage(EVENT_GET_ALLOWED_NETWORK_TYPES_BITMASK_DONE,
@@ -8160,6 +8247,53 @@
}
/**
+ * Enable or disable Voice over NR (VoNR)
+ * @param subId the subscription ID that this action applies to.
+ * @param enabled enable or disable VoNR.
+ * @return operation result.
+ */
+ @Override
+ public int setVoNrEnabled(int subId, boolean enabled) {
+ enforceModifyPermission();
+ final Phone phone = getPhone(subId);
+
+ final long identity = Binder.clearCallingIdentity();
+ if (phone == null) {
+ loge("setVoNrEnabled fails with no phone object for subId: " + subId);
+ return TelephonyManager.ENABLE_VONR_RADIO_NOT_AVAILABLE;
+ }
+
+ WorkSource workSource = getWorkSource(Binder.getCallingUid());
+ try {
+ int result = (int) sendRequest(CMD_ENABLE_VONR, enabled, subId,
+ workSource);
+ if (DBG) log("setVoNrEnabled result: " + result);
+ return result;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Is voice over NR enabled
+ * @return true if VoNR is enabled else false
+ */
+ @Override
+ public boolean isVoNrEnabled(int subId) {
+ enforceReadPrivilegedPermission("isVoNrEnabled");
+ WorkSource workSource = getWorkSource(Binder.getCallingUid());
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ boolean isEnabled = (boolean) sendRequest(CMD_IS_VONR_ENABLED,
+ null, subId, workSource);
+ if (DBG) log("isVoNrEnabled: " + isEnabled);
+ return isEnabled;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
* Action set from carrier signalling broadcast receivers to start/stop reporting the default
* network status based on which carrier apps could apply actions accordingly,
* enable/disable default url handler for example.