Loading proto/src/telephony.proto +24 −4 Original line number Diff line number Diff line Loading @@ -571,6 +571,21 @@ enum RilErrno { RIL_E_INVALID_RESPONSE = 67; } // Errors returned by ImsService enum ImsServiceErrno { // The operation error is unknown IMS_E_UNKNOWN = 0; // The operation has succeeded IMS_E_SUCCESS = 1; // Sending SMS over IMS failed. Do not retry over IMS again or fallback to CS. IMS_E_SMS_SEND_STATUS_ERROR = 2; // Sending SMS over IMS failed. Retry over IMS again. IMS_E_SMS_SEND_STATUS_ERROR_RETRY = 3; // Sending SMS over IMS failed. Fallback to sending the SMS over CS. IMS_E_SMS_SEND_STATUS_ERROR_FALLBACK = 4; } // PDP_type values in TS 27.007 section 10.1.1. enum PdpType { Loading Loading @@ -1363,13 +1378,13 @@ message SmsSession { // or old data call has removed. DATA_CALL_LIST_CHANGED = 5; // Send a SMS message // Send a SMS message over RIL SMS_SEND = 6; // Message has been sent to network // Message has been sent to network using RIL SMS_SEND_RESULT = 7; // Notification about received SMS // Notification about received SMS using RIL SMS_RECEIVED = 8; // CB message received Loading Loading @@ -1479,7 +1494,9 @@ message SmsSession { // See 3GPP 27.005, 3.2.5 for GSM/UMTS, // 3GPP2 N.S0005 (IS-41C) Table 171 for CDMA, // -1 if unknown or not applicable // Will map to a SmsManager.RESULT_* code if ims_error is populated // SmsManager can be accessed from // frameworks/base/telephony/java/android/telephony/SmsManager.java optional int32 error_code = 10; // RIL error code Loading @@ -1490,6 +1507,9 @@ message SmsSession { // Cellbroadcast message content optional CBMessage cell_broadcast_message = 13; // ImsService error code. optional ImsServiceErrno ims_error = 14; } // Time when session has started, in minutes since epoch, Loading src/java/com/android/internal/telephony/ImsSmsDispatcher.java +17 −5 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import com.android.ims.ImsException; import com.android.ims.ImsManager; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.telephony.util.SMSDispatcherUtil; import java.util.HashMap; Loading @@ -57,6 +58,9 @@ public class ImsSmsDispatcher extends SMSDispatcher { private volatile boolean mIsImsServiceUp; private volatile boolean mIsRegistered; private final ImsManager.Connector mImsManagerConnector; /** Telephony metrics instance for logging metrics event */ private TelephonyMetrics mMetrics = TelephonyMetrics.getInstance(); /** * Listen to the IMS service state change * Loading Loading @@ -107,6 +111,7 @@ public class ImsSmsDispatcher extends SMSDispatcher { int reason) throws RemoteException { Rlog.d(TAG, "onSendSmsResult token=" + token + " messageRef=" + messageRef + " status=" + status + " reason=" + reason); mMetrics.writeOnImsServiceSmsSolicitedResponse(mPhone.getPhoneId(), status, reason); SmsTracker tracker = mTrackers.get(token); if (tracker == null) { throw new IllegalArgumentException("Invalid token."); Loading Loading @@ -159,8 +164,7 @@ public class ImsSmsDispatcher extends SMSDispatcher { } @Override public void onSmsReceived(int token, String format, byte[] pdu) throws RemoteException { public void onSmsReceived(int token, String format, byte[] pdu) { Rlog.d(TAG, "SMS received."); android.telephony.SmsMessage message = android.telephony.SmsMessage.createFromPdu(pdu, format); Loading @@ -169,7 +173,7 @@ public class ImsSmsDispatcher extends SMSDispatcher { int mappedResult; switch (result) { case Intents.RESULT_SMS_HANDLED: mappedResult = ImsSmsImplBase.STATUS_REPORT_STATUS_OK; mappedResult = ImsSmsImplBase.DELIVER_STATUS_OK; break; case Intents.RESULT_SMS_OUT_OF_MEMORY: mappedResult = ImsSmsImplBase.DELIVER_STATUS_ERROR_NO_MEMORY; Loading @@ -189,8 +193,11 @@ public class ImsSmsDispatcher extends SMSDispatcher { Rlog.w(TAG, "SMS Received with a PDU that could not be parsed."); getImsManager().acknowledgeSms(token, 0, mappedResult); } mMetrics.writeImsServiceNewSms(mPhone.getPhoneId(), format, mappedResult); } catch (ImsException e) { Rlog.e(TAG, "Failed to acknowledgeSms(). Error: " + e.getMessage()); mMetrics.writeImsServiceNewSms(mPhone.getPhoneId(), format, ImsSmsImplBase.DELIVER_STATUS_ERROR_GENERIC); } }, true); } Loading Loading @@ -289,8 +296,9 @@ public class ImsSmsDispatcher extends SMSDispatcher { byte[] pdu = (byte[]) map.get(MAP_KEY_PDU); byte smsc[] = (byte[]) map.get(MAP_KEY_SMSC); boolean isRetry = tracker.mRetryCount > 0; String format = getFormat(); if (SmsConstants.FORMAT_3GPP.equals(getFormat()) && tracker.mRetryCount > 0) { if (SmsConstants.FORMAT_3GPP.equals(format) && tracker.mRetryCount > 0) { // per TS 23.040 Section 9.2.3.6: If TP-MTI SMS-SUBMIT (0x01) type // TP-RD (bit 2) is 1 for retry // and TP-MR is set to previously failed sms TP-MR Loading @@ -306,13 +314,17 @@ public class ImsSmsDispatcher extends SMSDispatcher { getImsManager().sendSms( token, tracker.mMessageRef, getFormat(), format, smsc != null ? new String(smsc) : null, isRetry, pdu); mMetrics.writeImsServiceSendSms(mPhone.getPhoneId(), format, ImsSmsImplBase.SEND_STATUS_OK); } catch (ImsException e) { Rlog.e(TAG, "sendSms failed. Falling back to PSTN. Error: " + e.getMessage()); fallbackToPstn(token, tracker); mMetrics.writeImsServiceSendSms(mPhone.getPhoneId(), format, ImsSmsImplBase.SEND_STATUS_ERROR_FALLBACK); } } Loading src/java/com/android/internal/telephony/metrics/SmsSessionEventBuilder.java +5 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,11 @@ public class SmsSessionEventBuilder { return this; } public SmsSessionEventBuilder setImsServiceErrno(int errno) { mEvent.imsError = errno; return this; } public SmsSessionEventBuilder setSettings(TelephonySettings settings) { mEvent.settings = settings; return this; Loading src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java +126 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,8 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.SmsManager; import android.telephony.SmsMessage; import android.telephony.TelephonyHistogram; import android.telephony.TelephonyManager; import android.telephony.data.DataCallResponse; Loading @@ -51,6 +53,7 @@ import android.telephony.ims.ImsReasonInfo; import android.telephony.ims.ImsStreamMediaProfile; import android.telephony.ims.feature.MmTelFeature; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.telephony.ims.stub.ImsSmsImplBase; import android.text.TextUtils; import android.util.Base64; import android.util.SparseArray; Loading Loading @@ -420,6 +423,19 @@ public class TelephonyMetrics { pw.print(event.delay); pw.print(" T="); pw.println(smsSessionEventToString(event.type)); // Only show more info for tx/rx sms if (event.type == SmsSession.Event.Type.SMS_SEND || event.type == SmsSession.Event.Type.SMS_RECEIVED || event.type == SmsSession.Event.Type.SMS_SEND_RESULT) { pw.print(" ReqId="); pw.println(event.rilRequestId); pw.print(" E="); pw.println(event.errorCode); pw.print(" RilE="); pw.println(event.error); pw.print(" ImsE="); pw.println(event.imsError); } } pw.decreaseIndent(); } Loading Loading @@ -1463,6 +1479,31 @@ public class TelephonyMetrics { } } /** * Write SMS related solicited response event * * @param phoneId Phone id * @param errorReason Defined in {@link SmsManager} RESULT_XXX. */ public synchronized void writeOnImsServiceSmsSolicitedResponse(int phoneId, @ImsSmsImplBase.SendStatusResult int resultCode, int errorReason) { InProgressSmsSession smsSession = mInProgressSmsSessions.get(phoneId); if (smsSession == null) { Rlog.e(TAG, "SMS session is missing"); } else { smsSession.addEvent(new SmsSessionEventBuilder( SmsSession.Event.Type.SMS_SEND_RESULT) .setImsServiceErrno(resultCode) .setErrorCode(errorReason) ); smsSession.decreaseExpectedResponse(); finishSmsSessionIfNeeded(smsSession); } } /** * Write deactivate data call response event * Loading Loading @@ -1747,6 +1788,39 @@ public class TelephonyMetrics { smsSession.increaseExpectedResponse(); } /** * Write Send SMS event using ImsService. Expecting response from * {@link #writeOnSmsSolicitedResponse}. * * @param phoneId Phone id * @param format SMS format. Either {@link SmsMessage#FORMAT_3GPP} or * {@link SmsMessage#FORMAT_3GPP2}. * @param resultCode The result of sending the new SMS to the vendor layer to be sent to the * carrier network. */ public synchronized void writeImsServiceSendSms(int phoneId, String format, @ImsSmsImplBase.SendStatusResult int resultCode) { InProgressSmsSession smsSession = startNewSmsSessionIfNeeded(phoneId); int formatCode = SmsSession.Event.Format.SMS_FORMAT_UNKNOWN; switch (format) { case SmsMessage.FORMAT_3GPP : { formatCode = SmsSession.Event.Format.SMS_FORMAT_3GPP; break; } case SmsMessage.FORMAT_3GPP2: { formatCode = SmsSession.Event.Format.SMS_FORMAT_3GPP2; break; } } smsSession.addEvent(new SmsSessionEventBuilder(SmsSession.Event.Type.SMS_SEND) .setTech(SmsSession.Event.Tech.SMS_IMS) .setImsServiceErrno(resultCode) .setFormat(formatCode) ); smsSession.increaseExpectedResponse(); } /** * Write incoming SMS event * Loading @@ -1765,6 +1839,58 @@ public class TelephonyMetrics { finishSmsSessionIfNeeded(smsSession); } /** * Write incoming SMS event * * @param phoneId Phone id * @param format SMS format. Either {@link SmsMessage#FORMAT_3GPP} or * {@link SmsMessage#FORMAT_3GPP2}. * @param result The result of processing the the newly received SMS message. */ public synchronized void writeImsServiceNewSms(int phoneId, String format, @ImsSmsImplBase.DeliverStatusResult int result) { InProgressSmsSession smsSession = startNewSmsSessionIfNeeded(phoneId); int formatCode = SmsSession.Event.Format.SMS_FORMAT_UNKNOWN; switch (format) { case SmsMessage.FORMAT_3GPP : { formatCode = SmsSession.Event.Format.SMS_FORMAT_3GPP; break; } case SmsMessage.FORMAT_3GPP2: { formatCode = SmsSession.Event.Format.SMS_FORMAT_3GPP2; break; } } int smsError = SmsManager.RESULT_ERROR_GENERIC_FAILURE; switch (result) { case ImsSmsImplBase.DELIVER_STATUS_OK: { smsError = SmsManager.RESULT_ERROR_NONE; break; } case ImsSmsImplBase.DELIVER_STATUS_ERROR_NO_MEMORY: { smsError = SmsManager.RESULT_NO_MEMORY; break; } case ImsSmsImplBase.DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED: { smsError = SmsManager.RESULT_REQUEST_NOT_SUPPORTED; break; } case ImsSmsImplBase.DELIVER_STATUS_ERROR_GENERIC: { smsError = SmsManager.RESULT_ERROR_GENERIC_FAILURE; break; } } smsSession.addEvent(new SmsSessionEventBuilder( SmsSession.Event.Type.SMS_RECEIVED) .setTech(SmsSession.Event.Tech.SMS_IMS) .setFormat(formatCode) .setErrorCode(smsError) .setImsServiceErrno(TelephonyProto.ImsServiceErrno.IMS_E_SUCCESS) ); finishSmsSessionIfNeeded(smsSession); } /** * Write incoming Broadcast SMS event * Loading Loading
proto/src/telephony.proto +24 −4 Original line number Diff line number Diff line Loading @@ -571,6 +571,21 @@ enum RilErrno { RIL_E_INVALID_RESPONSE = 67; } // Errors returned by ImsService enum ImsServiceErrno { // The operation error is unknown IMS_E_UNKNOWN = 0; // The operation has succeeded IMS_E_SUCCESS = 1; // Sending SMS over IMS failed. Do not retry over IMS again or fallback to CS. IMS_E_SMS_SEND_STATUS_ERROR = 2; // Sending SMS over IMS failed. Retry over IMS again. IMS_E_SMS_SEND_STATUS_ERROR_RETRY = 3; // Sending SMS over IMS failed. Fallback to sending the SMS over CS. IMS_E_SMS_SEND_STATUS_ERROR_FALLBACK = 4; } // PDP_type values in TS 27.007 section 10.1.1. enum PdpType { Loading Loading @@ -1363,13 +1378,13 @@ message SmsSession { // or old data call has removed. DATA_CALL_LIST_CHANGED = 5; // Send a SMS message // Send a SMS message over RIL SMS_SEND = 6; // Message has been sent to network // Message has been sent to network using RIL SMS_SEND_RESULT = 7; // Notification about received SMS // Notification about received SMS using RIL SMS_RECEIVED = 8; // CB message received Loading Loading @@ -1479,7 +1494,9 @@ message SmsSession { // See 3GPP 27.005, 3.2.5 for GSM/UMTS, // 3GPP2 N.S0005 (IS-41C) Table 171 for CDMA, // -1 if unknown or not applicable // Will map to a SmsManager.RESULT_* code if ims_error is populated // SmsManager can be accessed from // frameworks/base/telephony/java/android/telephony/SmsManager.java optional int32 error_code = 10; // RIL error code Loading @@ -1490,6 +1507,9 @@ message SmsSession { // Cellbroadcast message content optional CBMessage cell_broadcast_message = 13; // ImsService error code. optional ImsServiceErrno ims_error = 14; } // Time when session has started, in minutes since epoch, Loading
src/java/com/android/internal/telephony/ImsSmsDispatcher.java +17 −5 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import com.android.ims.ImsException; import com.android.ims.ImsManager; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.telephony.util.SMSDispatcherUtil; import java.util.HashMap; Loading @@ -57,6 +58,9 @@ public class ImsSmsDispatcher extends SMSDispatcher { private volatile boolean mIsImsServiceUp; private volatile boolean mIsRegistered; private final ImsManager.Connector mImsManagerConnector; /** Telephony metrics instance for logging metrics event */ private TelephonyMetrics mMetrics = TelephonyMetrics.getInstance(); /** * Listen to the IMS service state change * Loading Loading @@ -107,6 +111,7 @@ public class ImsSmsDispatcher extends SMSDispatcher { int reason) throws RemoteException { Rlog.d(TAG, "onSendSmsResult token=" + token + " messageRef=" + messageRef + " status=" + status + " reason=" + reason); mMetrics.writeOnImsServiceSmsSolicitedResponse(mPhone.getPhoneId(), status, reason); SmsTracker tracker = mTrackers.get(token); if (tracker == null) { throw new IllegalArgumentException("Invalid token."); Loading Loading @@ -159,8 +164,7 @@ public class ImsSmsDispatcher extends SMSDispatcher { } @Override public void onSmsReceived(int token, String format, byte[] pdu) throws RemoteException { public void onSmsReceived(int token, String format, byte[] pdu) { Rlog.d(TAG, "SMS received."); android.telephony.SmsMessage message = android.telephony.SmsMessage.createFromPdu(pdu, format); Loading @@ -169,7 +173,7 @@ public class ImsSmsDispatcher extends SMSDispatcher { int mappedResult; switch (result) { case Intents.RESULT_SMS_HANDLED: mappedResult = ImsSmsImplBase.STATUS_REPORT_STATUS_OK; mappedResult = ImsSmsImplBase.DELIVER_STATUS_OK; break; case Intents.RESULT_SMS_OUT_OF_MEMORY: mappedResult = ImsSmsImplBase.DELIVER_STATUS_ERROR_NO_MEMORY; Loading @@ -189,8 +193,11 @@ public class ImsSmsDispatcher extends SMSDispatcher { Rlog.w(TAG, "SMS Received with a PDU that could not be parsed."); getImsManager().acknowledgeSms(token, 0, mappedResult); } mMetrics.writeImsServiceNewSms(mPhone.getPhoneId(), format, mappedResult); } catch (ImsException e) { Rlog.e(TAG, "Failed to acknowledgeSms(). Error: " + e.getMessage()); mMetrics.writeImsServiceNewSms(mPhone.getPhoneId(), format, ImsSmsImplBase.DELIVER_STATUS_ERROR_GENERIC); } }, true); } Loading Loading @@ -289,8 +296,9 @@ public class ImsSmsDispatcher extends SMSDispatcher { byte[] pdu = (byte[]) map.get(MAP_KEY_PDU); byte smsc[] = (byte[]) map.get(MAP_KEY_SMSC); boolean isRetry = tracker.mRetryCount > 0; String format = getFormat(); if (SmsConstants.FORMAT_3GPP.equals(getFormat()) && tracker.mRetryCount > 0) { if (SmsConstants.FORMAT_3GPP.equals(format) && tracker.mRetryCount > 0) { // per TS 23.040 Section 9.2.3.6: If TP-MTI SMS-SUBMIT (0x01) type // TP-RD (bit 2) is 1 for retry // and TP-MR is set to previously failed sms TP-MR Loading @@ -306,13 +314,17 @@ public class ImsSmsDispatcher extends SMSDispatcher { getImsManager().sendSms( token, tracker.mMessageRef, getFormat(), format, smsc != null ? new String(smsc) : null, isRetry, pdu); mMetrics.writeImsServiceSendSms(mPhone.getPhoneId(), format, ImsSmsImplBase.SEND_STATUS_OK); } catch (ImsException e) { Rlog.e(TAG, "sendSms failed. Falling back to PSTN. Error: " + e.getMessage()); fallbackToPstn(token, tracker); mMetrics.writeImsServiceSendSms(mPhone.getPhoneId(), format, ImsSmsImplBase.SEND_STATUS_ERROR_FALLBACK); } } Loading
src/java/com/android/internal/telephony/metrics/SmsSessionEventBuilder.java +5 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,11 @@ public class SmsSessionEventBuilder { return this; } public SmsSessionEventBuilder setImsServiceErrno(int errno) { mEvent.imsError = errno; return this; } public SmsSessionEventBuilder setSettings(TelephonySettings settings) { mEvent.settings = settings; return this; Loading
src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java +126 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,8 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.SmsManager; import android.telephony.SmsMessage; import android.telephony.TelephonyHistogram; import android.telephony.TelephonyManager; import android.telephony.data.DataCallResponse; Loading @@ -51,6 +53,7 @@ import android.telephony.ims.ImsReasonInfo; import android.telephony.ims.ImsStreamMediaProfile; import android.telephony.ims.feature.MmTelFeature; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.telephony.ims.stub.ImsSmsImplBase; import android.text.TextUtils; import android.util.Base64; import android.util.SparseArray; Loading Loading @@ -420,6 +423,19 @@ public class TelephonyMetrics { pw.print(event.delay); pw.print(" T="); pw.println(smsSessionEventToString(event.type)); // Only show more info for tx/rx sms if (event.type == SmsSession.Event.Type.SMS_SEND || event.type == SmsSession.Event.Type.SMS_RECEIVED || event.type == SmsSession.Event.Type.SMS_SEND_RESULT) { pw.print(" ReqId="); pw.println(event.rilRequestId); pw.print(" E="); pw.println(event.errorCode); pw.print(" RilE="); pw.println(event.error); pw.print(" ImsE="); pw.println(event.imsError); } } pw.decreaseIndent(); } Loading Loading @@ -1463,6 +1479,31 @@ public class TelephonyMetrics { } } /** * Write SMS related solicited response event * * @param phoneId Phone id * @param errorReason Defined in {@link SmsManager} RESULT_XXX. */ public synchronized void writeOnImsServiceSmsSolicitedResponse(int phoneId, @ImsSmsImplBase.SendStatusResult int resultCode, int errorReason) { InProgressSmsSession smsSession = mInProgressSmsSessions.get(phoneId); if (smsSession == null) { Rlog.e(TAG, "SMS session is missing"); } else { smsSession.addEvent(new SmsSessionEventBuilder( SmsSession.Event.Type.SMS_SEND_RESULT) .setImsServiceErrno(resultCode) .setErrorCode(errorReason) ); smsSession.decreaseExpectedResponse(); finishSmsSessionIfNeeded(smsSession); } } /** * Write deactivate data call response event * Loading Loading @@ -1747,6 +1788,39 @@ public class TelephonyMetrics { smsSession.increaseExpectedResponse(); } /** * Write Send SMS event using ImsService. Expecting response from * {@link #writeOnSmsSolicitedResponse}. * * @param phoneId Phone id * @param format SMS format. Either {@link SmsMessage#FORMAT_3GPP} or * {@link SmsMessage#FORMAT_3GPP2}. * @param resultCode The result of sending the new SMS to the vendor layer to be sent to the * carrier network. */ public synchronized void writeImsServiceSendSms(int phoneId, String format, @ImsSmsImplBase.SendStatusResult int resultCode) { InProgressSmsSession smsSession = startNewSmsSessionIfNeeded(phoneId); int formatCode = SmsSession.Event.Format.SMS_FORMAT_UNKNOWN; switch (format) { case SmsMessage.FORMAT_3GPP : { formatCode = SmsSession.Event.Format.SMS_FORMAT_3GPP; break; } case SmsMessage.FORMAT_3GPP2: { formatCode = SmsSession.Event.Format.SMS_FORMAT_3GPP2; break; } } smsSession.addEvent(new SmsSessionEventBuilder(SmsSession.Event.Type.SMS_SEND) .setTech(SmsSession.Event.Tech.SMS_IMS) .setImsServiceErrno(resultCode) .setFormat(formatCode) ); smsSession.increaseExpectedResponse(); } /** * Write incoming SMS event * Loading @@ -1765,6 +1839,58 @@ public class TelephonyMetrics { finishSmsSessionIfNeeded(smsSession); } /** * Write incoming SMS event * * @param phoneId Phone id * @param format SMS format. Either {@link SmsMessage#FORMAT_3GPP} or * {@link SmsMessage#FORMAT_3GPP2}. * @param result The result of processing the the newly received SMS message. */ public synchronized void writeImsServiceNewSms(int phoneId, String format, @ImsSmsImplBase.DeliverStatusResult int result) { InProgressSmsSession smsSession = startNewSmsSessionIfNeeded(phoneId); int formatCode = SmsSession.Event.Format.SMS_FORMAT_UNKNOWN; switch (format) { case SmsMessage.FORMAT_3GPP : { formatCode = SmsSession.Event.Format.SMS_FORMAT_3GPP; break; } case SmsMessage.FORMAT_3GPP2: { formatCode = SmsSession.Event.Format.SMS_FORMAT_3GPP2; break; } } int smsError = SmsManager.RESULT_ERROR_GENERIC_FAILURE; switch (result) { case ImsSmsImplBase.DELIVER_STATUS_OK: { smsError = SmsManager.RESULT_ERROR_NONE; break; } case ImsSmsImplBase.DELIVER_STATUS_ERROR_NO_MEMORY: { smsError = SmsManager.RESULT_NO_MEMORY; break; } case ImsSmsImplBase.DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED: { smsError = SmsManager.RESULT_REQUEST_NOT_SUPPORTED; break; } case ImsSmsImplBase.DELIVER_STATUS_ERROR_GENERIC: { smsError = SmsManager.RESULT_ERROR_GENERIC_FAILURE; break; } } smsSession.addEvent(new SmsSessionEventBuilder( SmsSession.Event.Type.SMS_RECEIVED) .setTech(SmsSession.Event.Tech.SMS_IMS) .setFormat(formatCode) .setErrorCode(smsError) .setImsServiceErrno(TelephonyProto.ImsServiceErrno.IMS_E_SUCCESS) ); finishSmsSessionIfNeeded(smsSession); } /** * Write incoming Broadcast SMS event * Loading