/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.telephony; import static android.telephony.TelephonyManager.HAL_SERVICE_VOICE; import android.hardware.radio.RadioError; import android.hardware.radio.RadioResponseInfo; import android.hardware.radio.voice.IRadioVoiceResponse; import java.util.ArrayList; import java.util.Collections; /** * Interface declaring response functions to solicited radio requests for SIM APIs. */ public class VoiceResponse extends IRadioVoiceResponse.Stub { private final RIL mRil; public VoiceResponse(RIL ril) { mRil = ril; } /** * Acknowledge the receipt of radio request sent to the vendor. This must be sent only for * radio request which take long time to respond. * For more details, refer https://source.android.com/devices/tech/connect/ril.html * @param serial Serial no. of the request whose acknowledgement is sent. */ public void acknowledgeRequest(int serial) { mRil.processRequestAck(serial); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void acceptCallResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void cancelPendingUssdResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void conferenceResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void dialResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void emergencyDialResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void exitEmergencyCallbackModeResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void explicitCallTransferResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param callForwardInfos points to a vector of CallForwardInfo, one for * each distinct registered phone number. */ public void getCallForwardStatusResponse(RadioResponseInfo responseInfo, android.hardware.radio.voice.CallForwardInfo[] callForwardInfos) { RILRequest rr = mRil.processResponse(HAL_SERVICE_VOICE, responseInfo); if (rr != null) { CallForwardInfo[] ret = new CallForwardInfo[callForwardInfos.length]; for (int i = 0; i < callForwardInfos.length; i++) { ret[i] = new CallForwardInfo(); ret[i].status = callForwardInfos[i].status; ret[i].reason = callForwardInfos[i].reason; ret[i].serviceClass = callForwardInfos[i].serviceClass; ret[i].toa = callForwardInfos[i].toa; ret[i].number = callForwardInfos[i].number; ret[i].timeSeconds = callForwardInfos[i].timeSeconds; } if (responseInfo.error == RadioError.NONE) { RadioResponse.sendMessageResponse(rr.mResult, ret); } mRil.processResponseDone(rr, responseInfo, ret); } } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param enable If current call waiting state is disabled, enable = false else true * @param serviceClass If enable, then callWaitingResp[1] must follow, with the TS 27.007 * service class bit vector of services for which call waiting is enabled. * For example, if callWaitingResp[0] is 1 and callWaitingResp[1] is 3, then call waiting * is enabled for data and voice and disabled for everything else. */ public void getCallWaitingResponse(RadioResponseInfo responseInfo, boolean enable, int serviceClass) { RadioResponse.responseInts( HAL_SERVICE_VOICE, mRil, responseInfo, enable ? 1 : 0, serviceClass); } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param status indicates CLIP status */ public void getClipResponse(RadioResponseInfo responseInfo, int status) { RadioResponse.responseInts(HAL_SERVICE_VOICE, mRil, responseInfo, status); } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param n is "n" parameter from TS 27.007 7.7 * @param m is "m" parameter from TS 27.007 7.7 */ public void getClirResponse(RadioResponseInfo responseInfo, int n, int m) { RadioResponse.responseInts(HAL_SERVICE_VOICE, mRil, responseInfo, n, m); } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param calls Current call list */ public void getCurrentCallsResponse(RadioResponseInfo responseInfo, android.hardware.radio.voice.Call[] calls) { RILRequest rr = mRil.processResponse(HAL_SERVICE_VOICE, responseInfo); if (rr != null) { int num = calls.length; ArrayList dcCalls = new ArrayList<>(num); DriverCall dc; for (int i = 0; i < num; i++) { dc = RILUtils.convertToDriverCall(calls[i]); dcCalls.add(dc); if (dc.isVoicePrivacy) { mRil.mVoicePrivacyOnRegistrants.notifyRegistrants(); mRil.riljLog("InCall VoicePrivacy is enabled"); } else { mRil.mVoicePrivacyOffRegistrants.notifyRegistrants(); mRil.riljLog("InCall VoicePrivacy is disabled"); } } Collections.sort(dcCalls); if ((num == 0) && mRil.mTestingEmergencyCall.getAndSet(false)) { if (mRil.mEmergencyCallbackModeRegistrant != null) { mRil.riljLog("responseCurrentCalls: call ended, testing emergency call," + " notify ECM Registrants"); mRil.mEmergencyCallbackModeRegistrant.notifyRegistrant(); } } if (responseInfo.error == RadioError.NONE) { RadioResponse.sendMessageResponse(rr.mResult, dcCalls); } mRil.processResponseDone(rr, responseInfo, dcCalls); } } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param fcInfo Contains LastCallFailCause and vendor cause code. GSM failure reasons * are mapped to cause codes defined in TS 24.008 Annex H where possible. CDMA failure * reasons are derived from the possible call failure scenarios described in the * "CDMA IS-2000 Release A (C.S0005-A v6.0)" standard. */ public void getLastCallFailCauseResponse(RadioResponseInfo responseInfo, android.hardware.radio.voice.LastCallFailCauseInfo fcInfo) { RILRequest rr = mRil.processResponse(HAL_SERVICE_VOICE, responseInfo); if (rr != null) { LastCallFailCause ret = new LastCallFailCause(); ret.causeCode = fcInfo.causeCode; ret.vendorCause = fcInfo.vendorCause; if (responseInfo.error == RadioError.NONE) { RadioResponse.sendMessageResponse(rr.mResult, ret); } mRil.processResponseDone(rr, responseInfo, ret); } } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param enable true for "mute enabled" and false for "mute disabled" */ public void getMuteResponse(RadioResponseInfo responseInfo, boolean enable) { RadioResponse.responseInts(HAL_SERVICE_VOICE, mRil, responseInfo, enable ? 1 : 0); } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param enable false for Standard Privacy Mode (Public Long Code Mask) * true for Enhanced Privacy Mode (Private Long Code Mask) */ public void getPreferredVoicePrivacyResponse(RadioResponseInfo responseInfo, boolean enable) { RadioResponse.responseInts(HAL_SERVICE_VOICE, mRil, responseInfo, enable ? 1 : 0); } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param mode TTY mode */ public void getTtyModeResponse(RadioResponseInfo responseInfo, int mode) { RadioResponse.responseInts(HAL_SERVICE_VOICE, mRil, responseInfo, mode); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void handleStkCallSetupRequestFromSimResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void hangupConnectionResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void hangupForegroundResumeBackgroundResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void hangupWaitingOrBackgroundResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param enable true for "vonr enabled" and false for "vonr disabled" */ public void isVoNrEnabledResponse(RadioResponseInfo responseInfo, boolean enable) { RILRequest rr = mRil.processResponse(HAL_SERVICE_VOICE, responseInfo); if (rr != null) { if (responseInfo.error == RadioError.NONE) { RadioResponse.sendMessageResponse(rr.mResult, enable); } mRil.processResponseDone(rr, responseInfo, enable); } } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void rejectCallResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void sendBurstDtmfResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void sendCdmaFeatureCodeResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void sendDtmfResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void sendUssdResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void separateConnectionResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void setCallForwardResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void setCallWaitingResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void setClirResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void setMuteResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void setPreferredVoicePrivacyResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void setTtyModeResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void setVoNrEnabledResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void startDtmfResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void stopDtmfResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void switchWaitingOrHoldingAndActiveResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_VOICE, mRil, responseInfo); } @Override public String getInterfaceHash() { return IRadioVoiceResponse.HASH; } @Override public int getInterfaceVersion() { return IRadioVoiceResponse.VERSION; } }