| /* |
| * 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_MESSAGING; |
| |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_CDMA_NEW_SMS; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT; |
| import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SIM_SMS_STORAGE_FULL; |
| |
| import android.hardware.radio.messaging.IRadioMessagingIndication; |
| import android.os.AsyncResult; |
| import android.telephony.SmsMessage; |
| |
| import com.android.internal.telephony.uicc.IccUtils; |
| |
| /** |
| * Interface declaring unsolicited radio indications for messaging APIs. |
| */ |
| public class MessagingIndication extends IRadioMessagingIndication.Stub { |
| private final RIL mRil; |
| |
| public MessagingIndication(RIL ril) { |
| mRil = ril; |
| } |
| |
| /** |
| * Indicates when new CDMA SMS is received. |
| * @param indicationType Type of radio indication |
| * @param msg CdmaSmsMessage |
| */ |
| public void cdmaNewSms(int indicationType, |
| android.hardware.radio.messaging.CdmaSmsMessage msg) { |
| mRil.processIndication(HAL_SERVICE_MESSAGING, indicationType); |
| |
| if (mRil.isLogOrTrace()) mRil.unsljLog(RIL_UNSOL_RESPONSE_CDMA_NEW_SMS); |
| |
| SmsMessage sms = new SmsMessage(RILUtils.convertHalCdmaSmsMessage(msg)); |
| if (mRil.mCdmaSmsRegistrant != null) { |
| mRil.mCdmaSmsRegistrant.notifyRegistrant(new AsyncResult(null, sms, null)); |
| } |
| } |
| |
| /** |
| * Indicates that SMS storage on the RUIM is full. Messages cannot be saved on the RUIM until |
| * space is freed. |
| * @param indicationType Type of radio indication |
| */ |
| public void cdmaRuimSmsStorageFull(int indicationType) { |
| mRil.processIndication(HAL_SERVICE_MESSAGING, indicationType); |
| |
| if (mRil.isLogOrTrace()) mRil.unsljLog(RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL); |
| |
| if (mRil.mIccSmsFullRegistrant != null) { |
| mRil.mIccSmsFullRegistrant.notifyRegistrant(); |
| } |
| } |
| |
| /** |
| * Indicates when new Broadcast SMS is received |
| * @param indicationType Type of radio indication |
| * @param data If received from GSM network, "data" is byte array of 88 bytes which indicates |
| * each page of a CBS Message sent to the MS by the BTS as coded in 3GPP 23.041 Section |
| * 9.4.1.2. If received from UMTS network, "data" is byte array of 90 up to 1252 bytes |
| * which contain between 1 and 15 CBS Message pages sent as one packet to the MS by the |
| * BTS as coded in 3GPP 23.041 Section 9.4.2.2 |
| */ |
| public void newBroadcastSms(int indicationType, byte[] data) { |
| mRil.processIndication(HAL_SERVICE_MESSAGING, indicationType); |
| |
| if (mRil.isLogOrTrace()) { |
| mRil.unsljLogvRet( |
| RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS, IccUtils.bytesToHexString(data)); |
| } |
| |
| if (mRil.mGsmBroadcastSmsRegistrant != null) { |
| mRil.mGsmBroadcastSmsRegistrant.notifyRegistrant(new AsyncResult(null, data, null)); |
| } |
| } |
| |
| /** |
| * Indicates when new SMS is received. |
| * @param indicationType Type of radio indication |
| * @param pdu PDU of SMS-DELIVER represented as byte array. |
| * The PDU starts with the SMSC address per TS 27.005 (+CMT:) |
| */ |
| public void newSms(int indicationType, byte[] pdu) { |
| mRil.processIndication(HAL_SERVICE_MESSAGING, indicationType); |
| if (mRil.isLogOrTrace()) mRil.unsljLog(RIL_UNSOL_RESPONSE_NEW_SMS); |
| |
| SmsMessageBase smsb = com.android.internal.telephony.gsm.SmsMessage.createFromPdu(pdu); |
| if (mRil.mGsmSmsRegistrant != null) { |
| mRil.mGsmSmsRegistrant.notifyRegistrant( |
| new AsyncResult(null, smsb == null ? null : new SmsMessage(smsb), null)); |
| } |
| } |
| |
| /** |
| * Indicates when new SMS has been stored on SIM card. |
| * @param indicationType Type of radio indication |
| * @param recordNumber Record number on the SIM |
| */ |
| public void newSmsOnSim(int indicationType, int recordNumber) { |
| mRil.processIndication(HAL_SERVICE_MESSAGING, indicationType); |
| |
| if (mRil.isLogOrTrace()) mRil.unsljLog(RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM); |
| |
| if (mRil.mSmsOnSimRegistrant != null) { |
| mRil.mSmsOnSimRegistrant.notifyRegistrant(new AsyncResult(null, recordNumber, null)); |
| } |
| } |
| |
| /** |
| * Indicates when new SMS Status Report is received. |
| * @param indicationType Type of radio indication |
| * @param pdu PDU of SMS-STATUS-REPORT represented as byte array. |
| * The PDU starts with the SMSC address per TS 27.005 (+CMT:) |
| */ |
| public void newSmsStatusReport(int indicationType, byte[] pdu) { |
| mRil.processIndication(HAL_SERVICE_MESSAGING, indicationType); |
| |
| if (mRil.isLogOrTrace()) mRil.unsljLog(RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT); |
| |
| if (mRil.mSmsStatusRegistrant != null) { |
| mRil.mSmsStatusRegistrant.notifyRegistrant(new AsyncResult(null, pdu, null)); |
| } |
| } |
| |
| /** |
| * Indicates that SMS storage on the SIM is full. Sent when the network attempts to deliver a |
| * new SMS message. Messages cannot be saved on the SIM until space is freed. In particular, |
| * incoming Class 2 messages must not be stored. |
| * @param indicationType Type of radio indication |
| */ |
| public void simSmsStorageFull(int indicationType) { |
| mRil.processIndication(HAL_SERVICE_MESSAGING, indicationType); |
| |
| if (mRil.isLogOrTrace()) mRil.unsljLog(RIL_UNSOL_SIM_SMS_STORAGE_FULL); |
| |
| if (mRil.mIccSmsFullRegistrant != null) { |
| mRil.mIccSmsFullRegistrant.notifyRegistrant(); |
| } |
| } |
| |
| @Override |
| public String getInterfaceHash() { |
| return IRadioMessagingIndication.HASH; |
| } |
| |
| @Override |
| public int getInterfaceVersion() { |
| return IRadioMessagingIndication.VERSION; |
| } |
| } |