/* * 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 static com.android.internal.telephony.RILConstants.RIL_UNSOL_DATA_CALL_LIST_CHANGED; import static com.android.internal.telephony.RILConstants.RIL_UNSOL_KEEPALIVE_STATUS; import static com.android.internal.telephony.RILConstants.RIL_UNSOL_PCO_DATA; import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SLICING_CONFIG_CHANGED; import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UNTHROTTLE_APN; import android.hardware.radio.data.IRadioDataIndication; import android.os.AsyncResult; import android.os.RemoteException; import android.telephony.PcoData; import android.telephony.data.DataCallResponse; import android.telephony.data.DataProfile; import android.telephony.data.NetworkSlicingConfig; import com.android.internal.telephony.data.KeepaliveStatus; import java.util.ArrayList; /** * Interface declaring unsolicited radio indications for data APIs. */ public class DataIndication extends IRadioDataIndication.Stub { private final RIL mRil; public DataIndication(RIL ril) { mRil = ril; } /** * Indicates data call contexts have changed. * @param indicationType Type of radio indication * @param dcList List of SetupDataCallResult identical to that returned by getDataCallList. * It is the complete list of current data contexts including new contexts that have * been activated. */ public void dataCallListChanged(int indicationType, android.hardware.radio.data.SetupDataCallResult[] dcList) { mRil.processIndication(HAL_SERVICE_DATA, indicationType); if (mRil.isLogOrTrace()) mRil.unsljLogRet(RIL_UNSOL_DATA_CALL_LIST_CHANGED, dcList); ArrayList response = RILUtils.convertHalDataCallResultList(dcList); mRil.mDataCallListChangedRegistrants.notifyRegistrants( new AsyncResult(null, response, null)); } /** * Indicates a status update for an ongoing Keepalive session. * @param indicationType Type of radio indication * @param halStatus Status of the ongoing Keepalive session */ public void keepaliveStatus(int indicationType, android.hardware.radio.data.KeepaliveStatus halStatus) { mRil.processIndication(HAL_SERVICE_DATA, indicationType); if (mRil.isLogOrTrace()) { mRil.unsljLogRet( RIL_UNSOL_KEEPALIVE_STATUS, "handle=" + halStatus.sessionHandle + " code=" + halStatus.code); } KeepaliveStatus ks = new KeepaliveStatus( halStatus.sessionHandle, halStatus.code); mRil.mNattKeepaliveStatusRegistrants.notifyRegistrants(new AsyncResult(null, ks, null)); } /** * Indicates when there is new Carrier PCO data received for a data call. * @param indicationType Type of radio indication * @param pco New PcoData */ public void pcoData(int indicationType, android.hardware.radio.data.PcoDataInfo pco) { mRil.processIndication(HAL_SERVICE_DATA, indicationType); PcoData response = new PcoData(pco.cid, pco.bearerProto, pco.pcoId, pco.contents); if (mRil.isLogOrTrace()) mRil.unsljLogRet(RIL_UNSOL_PCO_DATA, response); mRil.mPcoDataRegistrants.notifyRegistrants(new AsyncResult(null, response, null)); } /** * Stop throttling calls to setupDataCall for the given APN. * @param indicationType Type of radio indication * @param dpi DataProfileInfo associated with the APN to unthrottle * @throws RemoteException */ public void unthrottleApn(int indicationType, android.hardware.radio.data.DataProfileInfo dpi) throws RemoteException { mRil.processIndication(HAL_SERVICE_DATA, indicationType); DataProfile response = RILUtils.convertToDataProfile(dpi); if (mRil.isLogOrTrace()) mRil.unsljLogRet(RIL_UNSOL_UNTHROTTLE_APN, response); mRil.mApnUnthrottledRegistrants.notifyRegistrants(new AsyncResult(null, response, null)); } /** * Current slicing configuration including URSP rules and NSSAIs * (configured, allowed and rejected). * @param indicationType Type of radio indication * @param slicingConfig Current slicing configuration */ public void slicingConfigChanged(int indicationType, android.hardware.radio.data.SlicingConfig slicingConfig) throws RemoteException { mRil.processIndication(HAL_SERVICE_DATA, indicationType); if (mRil.isLogOrTrace()) { mRil.unsljLogRet(RIL_UNSOL_SLICING_CONFIG_CHANGED, slicingConfig); } NetworkSlicingConfig ret = RILUtils.convertHalSlicingConfig(slicingConfig); mRil.mSlicingConfigChangedRegistrants.notifyRegistrants( new AsyncResult(null, ret, null)); } @Override public String getInterfaceHash() { return IRadioDataIndication.HASH; } @Override public int getInterfaceVersion() { return IRadioDataIndication.VERSION; } }