406 lines
16 KiB
Java
406 lines
16 KiB
Java
/*
|
|
* 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<DriverCall> 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;
|
|
}
|
|
}
|