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

Commit 21b963e4 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 5304822 from 1be3fdb7 to pi-qpr3-release

Change-Id: I5caefc09aaa4a470c21311da4db8243d7538bd47
parents fdebdebd 1be3fdb7
Loading
Loading
Loading
Loading
+24 −4
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 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 {

@@ -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
@@ -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
@@ -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,
+17 −5
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);
@@ -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;
@@ -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);
        }
@@ -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
@@ -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);
        }
    }

+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;
+126 −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;
@@ -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();
        }
@@ -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
     *
@@ -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
     *
@@ -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
     *