Loading proto/src/telephony.proto +32 −3 Original line number Diff line number Diff line Loading @@ -568,6 +568,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 an SMS over IMS has failed. Do not retry over IMS again or fallback to CS. IMS_E_SMS_SEND_STATUS_ERROR = 2; // Sending an SMS over IMS has failed. Retry over IMS again. IMS_E_SMS_SEND_STATUS_ERROR_RETRY = 3; // Sending an SMS over IMS has 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 @@ -1307,17 +1322,27 @@ 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 CB_SMS_RECEIVED = 9; // Send an SMS message over ImsService SMS_SEND_IMS_SERVICE = 10; // Receive an SMS message result over ImsService SMS_SEND_RESULT_IMS_SERVICE = 11; // Receive an SMS message over ImsService SMS_RECEIVED_IMS_SERVICE = 12; } // Formats used to encode SMS messages Loading Loading @@ -1417,6 +1442,7 @@ message SmsSession { // See 3GPP 27.005, 3.2.5 for GSM/UMTS, // 3GPP2 N.S0005 (IS-41C) Table 171 for CDMA, // or ImsService for IMS specific error codes (using ImsService specific Event.Type) // -1 if unknown or not applicable optional int32 error_code = 10; Loading @@ -1428,6 +1454,9 @@ message SmsSession { // Cellbroadcast message content optional CBMessage cell_broadcast_message = 13; // ImsService error code. optional ImsServiceErrno imsError = 14; } // Time when session has started, in minutes since epoch, Loading src/java/com/android/internal/telephony/ImsSmsDispatcher.java +11 −4 Original line number Diff line number Diff line Loading @@ -36,6 +36,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 @@ -61,6 +62,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 @@ -112,6 +116,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 @@ -165,8 +170,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 Loading @@ -199,6 +203,7 @@ public class ImsSmsDispatcher extends SMSDispatcher { Rlog.e(TAG, "Failed to acknowledgeSms(). Error: " + e.getMessage()); } }, true); mMetrics.writeImsServiceNewSms(mPhone.getPhoneId(), format); } }; Loading Loading @@ -339,8 +344,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 @@ -356,10 +362,11 @@ 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); } catch (ImsException e) { Rlog.e(TAG, "sendSms failed. Falling back to PSTN. Error: " + e.getMessage()); fallbackToPstn(token, tracker); 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 +86 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,8 @@ import android.os.Build; import android.os.SystemClock; 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 @@ -48,6 +50,7 @@ import android.telephony.ims.ImsCallSession; import android.telephony.ims.ImsReasonInfo; 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 @@ -1450,6 +1453,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_IMS_SERVICE) .setImsServiceErrno(resultCode) .setErrorCode(errorReason) ); smsSession.decreaseExpectedResponse(); finishSmsSessionIfNeeded(smsSession); } } /** * Write deactivate data call response event * Loading Loading @@ -1734,6 +1762,35 @@ 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}. */ public synchronized void writeImsServiceSendSms(int phoneId, String format) { 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_IMS_SERVICE) .setTech(SmsSession.Event.Tech.SMS_IMS) .setFormat(formatCode) ); smsSession.increaseExpectedResponse(); } /** * Write incoming SMS event * Loading @@ -1752,6 +1809,35 @@ 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}. */ public synchronized void writeImsServiceNewSms(int phoneId, String format) { 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_RECEIVED_IMS_SERVICE) .setTech(SmsSession.Event.Tech.SMS_IMS) .setFormat(formatCode) ); finishSmsSessionIfNeeded(smsSession); } /** * Write incoming Broadcast SMS event * Loading Loading
proto/src/telephony.proto +32 −3 Original line number Diff line number Diff line Loading @@ -568,6 +568,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 an SMS over IMS has failed. Do not retry over IMS again or fallback to CS. IMS_E_SMS_SEND_STATUS_ERROR = 2; // Sending an SMS over IMS has failed. Retry over IMS again. IMS_E_SMS_SEND_STATUS_ERROR_RETRY = 3; // Sending an SMS over IMS has 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 @@ -1307,17 +1322,27 @@ 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 CB_SMS_RECEIVED = 9; // Send an SMS message over ImsService SMS_SEND_IMS_SERVICE = 10; // Receive an SMS message result over ImsService SMS_SEND_RESULT_IMS_SERVICE = 11; // Receive an SMS message over ImsService SMS_RECEIVED_IMS_SERVICE = 12; } // Formats used to encode SMS messages Loading Loading @@ -1417,6 +1442,7 @@ message SmsSession { // See 3GPP 27.005, 3.2.5 for GSM/UMTS, // 3GPP2 N.S0005 (IS-41C) Table 171 for CDMA, // or ImsService for IMS specific error codes (using ImsService specific Event.Type) // -1 if unknown or not applicable optional int32 error_code = 10; Loading @@ -1428,6 +1454,9 @@ message SmsSession { // Cellbroadcast message content optional CBMessage cell_broadcast_message = 13; // ImsService error code. optional ImsServiceErrno imsError = 14; } // Time when session has started, in minutes since epoch, Loading
src/java/com/android/internal/telephony/ImsSmsDispatcher.java +11 −4 Original line number Diff line number Diff line Loading @@ -36,6 +36,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 @@ -61,6 +62,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 @@ -112,6 +116,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 @@ -165,8 +170,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 Loading @@ -199,6 +203,7 @@ public class ImsSmsDispatcher extends SMSDispatcher { Rlog.e(TAG, "Failed to acknowledgeSms(). Error: " + e.getMessage()); } }, true); mMetrics.writeImsServiceNewSms(mPhone.getPhoneId(), format); } }; Loading Loading @@ -339,8 +344,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 @@ -356,10 +362,11 @@ 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); } catch (ImsException e) { Rlog.e(TAG, "sendSms failed. Falling back to PSTN. Error: " + e.getMessage()); fallbackToPstn(token, tracker); 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 +86 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,8 @@ import android.os.Build; import android.os.SystemClock; 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 @@ -48,6 +50,7 @@ import android.telephony.ims.ImsCallSession; import android.telephony.ims.ImsReasonInfo; 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 @@ -1450,6 +1453,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_IMS_SERVICE) .setImsServiceErrno(resultCode) .setErrorCode(errorReason) ); smsSession.decreaseExpectedResponse(); finishSmsSessionIfNeeded(smsSession); } } /** * Write deactivate data call response event * Loading Loading @@ -1734,6 +1762,35 @@ 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}. */ public synchronized void writeImsServiceSendSms(int phoneId, String format) { 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_IMS_SERVICE) .setTech(SmsSession.Event.Tech.SMS_IMS) .setFormat(formatCode) ); smsSession.increaseExpectedResponse(); } /** * Write incoming SMS event * Loading @@ -1752,6 +1809,35 @@ 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}. */ public synchronized void writeImsServiceNewSms(int phoneId, String format) { 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_RECEIVED_IMS_SERVICE) .setTech(SmsSession.Event.Tech.SMS_IMS) .setFormat(formatCode) ); finishSmsSessionIfNeeded(smsSession); } /** * Write incoming Broadcast SMS event * Loading