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

Commit 008db19a authored by Brad Ebinger's avatar Brad Ebinger Committed by android-build-merger
Browse files

Merge "Adds metrics for SMS over IMS using ImsService"

am: 4340d8ba

Change-Id: I5f066fe7f74e472f419e589b0651ddc14adbb21c
parents 370f42fb 4340d8ba
Loading
Loading
Loading
Loading
+32 −3
Original line number Diff line number Diff line
@@ -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 {

@@ -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
@@ -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;

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

@@ -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
@@ -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);
+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
@@ -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;
@@ -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;
@@ -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
     *
@@ -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
     *
@@ -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
     *