Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a59b7d16 authored by Brad Ebinger's avatar Brad Ebinger
Browse files

Adds metrics for SMS over IMS using ImsService

We didn't previously collect metrics for SMS over IMS
using ImsService.

Bug: 119434950
Test: Manual
Merged-In: Ib8c7ada5ea95dc93a987b1ba48fc309b399bcb64
Change-Id: Ib8c7ada5ea95dc93a987b1ba48fc309b399bcb64
parent ba0b55d4
Loading
Loading
Loading
Loading
+32 −3
Original line number Diff line number Diff line
@@ -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 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 {

@@ -1363,17 +1378,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
@@ -1479,6 +1504,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;

@@ -1490,6 +1516,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,
+11 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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
     *
@@ -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.");
@@ -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);
@@ -193,6 +197,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                    Rlog.e(TAG, "Failed to acknowledgeSms(). Error: " + e.getMessage());
                }
            }, true);
            mMetrics.writeImsServiceNewSms(mPhone.getPhoneId(), format);
        }
    };

@@ -289,8 +294,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
@@ -306,10 +312,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);
+5 −0
Original line number Diff line number Diff line
@@ -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;
+86 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -1463,6 +1466,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
     *
@@ -1747,6 +1775,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
     *
@@ -1765,6 +1822,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
     *