/* * 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_DATA; import android.hardware.radio.RadioError; import android.hardware.radio.RadioResponseInfo; import android.hardware.radio.data.IRadioDataResponse; import android.telephony.data.DataCallResponse; import android.telephony.data.NetworkSlicingConfig; import com.android.internal.telephony.data.KeepaliveStatus; import java.util.ArrayList; /** * Interface declaring response functions to solicited radio requests for data APIs. */ public class DataResponse extends IRadioDataResponse.Stub { private final RIL mRil; public DataResponse(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 * @param id The pdu session id allocated */ public void allocatePduSessionIdResponse(RadioResponseInfo responseInfo, int id) { RILRequest rr = mRil.processResponse(HAL_SERVICE_DATA, responseInfo); if (rr != null) { if (responseInfo.error == RadioError.NONE) { RadioResponse.sendMessageResponse(rr.mResult, id); } mRil.processResponseDone(rr, responseInfo, id); } } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void cancelHandoverResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_DATA, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void deactivateDataCallResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_DATA, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param dataCallResultList Response to get data call list as defined by SetupDataCallResult */ public void getDataCallListResponse(RadioResponseInfo responseInfo, android.hardware.radio.data.SetupDataCallResult[] dataCallResultList) { RILRequest rr = mRil.processResponse(HAL_SERVICE_DATA, responseInfo); if (rr != null) { ArrayList response = RILUtils.convertHalDataCallResultList(dataCallResultList); if (responseInfo.error == RadioError.NONE) { RadioResponse.sendMessageResponse(rr.mResult, response); } mRil.processResponseDone(rr, responseInfo, response); } } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param slicingConfig Current slicing configuration */ public void getSlicingConfigResponse(RadioResponseInfo responseInfo, android.hardware.radio.data.SlicingConfig slicingConfig) { RILRequest rr = mRil.processResponse(HAL_SERVICE_DATA, responseInfo); if (rr != null) { NetworkSlicingConfig ret = RILUtils.convertHalSlicingConfig(slicingConfig); 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 */ public void releasePduSessionIdResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_DATA, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void setDataAllowedResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_DATA, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void setDataProfileResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_DATA, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void setDataThrottlingResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_DATA, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void setInitialAttachApnResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_DATA, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param setupDataCallResult Response to data call setup as defined by SetupDataCallResult */ public void setupDataCallResponse(RadioResponseInfo responseInfo, android.hardware.radio.data.SetupDataCallResult setupDataCallResult) { RILRequest rr = mRil.processResponse(HAL_SERVICE_DATA, responseInfo); if (rr != null) { DataCallResponse response = RILUtils.convertHalDataCallResult(setupDataCallResult); if (responseInfo.error == RadioError.NONE) { RadioResponse.sendMessageResponse(rr.mResult, response); } mRil.processResponseDone(rr, responseInfo, response); } } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void startHandoverResponse(RadioResponseInfo responseInfo) { RadioResponse.responseVoid(HAL_SERVICE_DATA, mRil, responseInfo); } /** * @param responseInfo Response info struct containing response type, serial no. and error * @param keepaliveStatus status of the keepalive with a handle for the session */ public void startKeepaliveResponse(RadioResponseInfo responseInfo, android.hardware.radio.data.KeepaliveStatus keepaliveStatus) { RILRequest rr = mRil.processResponse(HAL_SERVICE_DATA, responseInfo); if (rr == null) return; KeepaliveStatus ret = null; try { switch(responseInfo.error) { case RadioError.NONE: int convertedStatus = RILUtils.convertHalKeepaliveStatusCode( keepaliveStatus.code); if (convertedStatus < 0) { ret = new KeepaliveStatus(KeepaliveStatus.ERROR_UNSUPPORTED); } else { ret = new KeepaliveStatus( keepaliveStatus.sessionHandle, convertedStatus); } // If responseInfo.error is NONE, response function sends the response message // even if result is actually an error. RadioResponse.sendMessageResponse(rr.mResult, ret); break; case RadioError.REQUEST_NOT_SUPPORTED: ret = new KeepaliveStatus(KeepaliveStatus.ERROR_UNSUPPORTED); break; case RadioError.NO_RESOURCES: ret = new KeepaliveStatus(KeepaliveStatus.ERROR_NO_RESOURCES); break; default: ret = new KeepaliveStatus(KeepaliveStatus.ERROR_UNKNOWN); break; } } finally { // If responseInfo.error != NONE, the processResponseDone sends the response message. mRil.processResponseDone(rr, responseInfo, ret); } } /** * @param responseInfo Response info struct containing response type, serial no. and error */ public void stopKeepaliveResponse(RadioResponseInfo responseInfo) { RILRequest rr = mRil.processResponse(HAL_SERVICE_DATA, responseInfo); if (rr == null) return; try { if (responseInfo.error == RadioError.NONE) { RadioResponse.sendMessageResponse(rr.mResult, null); } else { //TODO: Error code translation } } finally { mRil.processResponseDone(rr, responseInfo, null); } } @Override public String getInterfaceHash() { return IRadioDataResponse.HASH; } @Override public int getInterfaceVersion() { return IRadioDataResponse.VERSION; } }