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

Commit ed1431a7 authored by Hakjun Choi's avatar Hakjun Choi
Browse files

Add missed error case for sms metrics

There is a case retry send exceeded max retry count, it is needed to distinguish this case from others

Bug: 413194045
Flag: com.android.internal.telephony.flags.satellite_25q4_apis
Test: atest GsmSmsDispatcherTest ImsSmsDispatcherTest SmsDispatchersControllerTest
Change-Id: I4dfbea3d431078f4cab423d7b4aaf6daa973d29c
parent b4d5b259
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.internal.telephony;

import android.annotation.NonNull;
import android.app.Activity;
import android.content.Context;
import android.os.Binder;
@@ -41,6 +42,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails;
import com.android.internal.telephony.analytics.TelephonyAnalytics;
import com.android.internal.telephony.analytics.TelephonyAnalytics.SmsMmsAnalytics;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.uicc.IccUtils;
import com.android.internal.telephony.util.SMSDispatcherUtil;
@@ -365,8 +367,8 @@ public class ImsSmsDispatcher extends SMSDispatcher {
    }

    public ImsSmsDispatcher(Phone phone, SmsDispatchersController smsDispatchersController,
            FeatureConnectorFactory factory) {
        super(phone, smsDispatchersController);
            FeatureConnectorFactory factory, @NonNull FeatureFlags featureFlags) {
        super(phone, smsDispatchersController, featureFlags);
        mConnectorFactory = factory;

        mImsManagerConnector = mConnectorFactory.create(mContext, mPhone.getPhoneId(), TAG,
+84 −106
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static com.android.internal.telephony.IccSmsInterfaceManager.SMS_MESSAGE_
import static com.android.internal.telephony.SmsDispatchersController.PendingRequest;
import static com.android.internal.telephony.SmsResponse.NO_ERROR_CODE;

import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.app.Activity;
import android.app.AlertDialog;
@@ -53,6 +54,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.PersistableBundle;
import android.os.Process;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
@@ -90,6 +92,7 @@ import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails;
import com.android.internal.telephony.analytics.TelephonyAnalytics;
import com.android.internal.telephony.analytics.TelephonyAnalytics.SmsMmsAnalytics;
import com.android.internal.telephony.cdma.sms.UserData;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.flags.Flags;
import com.android.internal.telephony.satellite.SatelliteController;
import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
@@ -183,6 +186,7 @@ public abstract class SMSDispatcher extends Handler {
    protected Phone mPhone;
    @UnsupportedAppUsage
    protected final Context mContext;
    private final @NonNull FeatureFlags mFeatureFlags;
    @UnsupportedAppUsage
    protected final ContentResolver mResolver;
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
@@ -244,7 +248,8 @@ public abstract class SMSDispatcher extends Handler {
     * Create a new SMS dispatcher.
     * @param phone the Phone to use
     */
    protected SMSDispatcher(Phone phone, SmsDispatchersController smsDispatchersController) {
    protected SMSDispatcher(Phone phone, SmsDispatchersController smsDispatchersController,
            @NonNull FeatureFlags featureFlags) {
        mPhone = phone;
        mSmsDispatchersController = smsDispatchersController;
        mContext = phone.getContext();
@@ -261,6 +266,7 @@ public abstract class SMSDispatcher extends Handler {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_SIM_STATE_CHANGED);
        mContext.registerReceiver(mBroadcastReceiver, intentFilter);
        mFeatureFlags = featureFlags;
        Rlog.d(TAG, "SMSDispatcher: ctor mSmsCapable=" + mSmsCapable + " format=" + getFormat()
                + " mSmsSendDisabled=" + mSmsSendDisabled);
    }
@@ -1148,33 +1154,7 @@ public abstract class SMSDispatcher extends Handler {
            mPhone.notifySmsSent(tracker.mDestAddress);
            mSmsDispatchersController.notifySmsSent(tracker, false,
                tracker.isSinglePartOrLastPart(), true /*success*/);

            mPhone.getSmsStats().onOutgoingSms(
                    tracker.mImsRetry > 0 /* isOverIms */,
                    SmsConstants.FORMAT_3GPP2.equals(getFormat()),
                    false /* fallbackToCs */,
                    SmsManager.RESULT_ERROR_NONE,
                    tracker.mMessageId,
                    tracker.isFromDefaultSmsApplication(mContext),
                    tracker.getInterval(),
                    mTelephonyManager.isEmergencyNumber(tracker.mDestAddress),
                    tracker.isMtSmsPollingMessage(mContext),
                    tracker.getPduLength(),
                    tracker.getAppPackageName(),
                    tracker.getAppUid());
            if (mPhone != null) {
                TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
                if (telephonyAnalytics != null) {
                    SmsMmsAnalytics smsMmsAnalytics = telephonyAnalytics.getSmsMmsAnalytics();
                    if (smsMmsAnalytics != null) {
                        smsMmsAnalytics.onOutgoingSms(
                                tracker.mImsRetry > 0 /* isOverIms */,
                                SmsManager.RESULT_ERROR_NONE
                        );
                    }
                }
            }

            reportOutgoingSmsMetrics(tracker, SmsManager.RESULT_ERROR_NONE, NO_ERROR_CODE);
        } else {
            if (DBG) {
                Rlog.d(TAG, "SMS send failed "
@@ -1214,32 +1194,7 @@ public abstract class SMSDispatcher extends Handler {
            if (!isIms() && ss != ServiceState.STATE_IN_SERVICE) {
                tracker.onFailed(mContext, getNotInServiceError(ss), NO_ERROR_CODE);
                notifySmsSentFailedToEmergencyStateTracker(tracker, false);
                mPhone.getSmsStats().onOutgoingSms(
                        tracker.mImsRetry > 0 /* isOverIms */,
                        SmsConstants.FORMAT_3GPP2.equals(getFormat()),
                        false /* fallbackToCs */,
                        getNotInServiceError(ss),
                        tracker.mMessageId,
                        tracker.isFromDefaultSmsApplication(mContext),
                        tracker.getInterval(),
                        mTelephonyManager.isEmergencyNumber(tracker.mDestAddress),
                        tracker.isMtSmsPollingMessage(mContext),
                        tracker.getPduLength(),
                        tracker.getAppPackageName(),
                        tracker.getAppUid());
                if (mPhone != null) {
                    TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
                    if (telephonyAnalytics != null) {
                        SmsMmsAnalytics smsMmsAnalytics = telephonyAnalytics.getSmsMmsAnalytics();
                        if (smsMmsAnalytics != null) {
                            smsMmsAnalytics.onOutgoingSms(
                                    tracker.mImsRetry > 0 /* isOverIms */,
                                    getNotInServiceError(ss)
                            );
                        }
                    }
                }

                reportOutgoingSmsMetrics(tracker, getNotInServiceError(ss), NO_ERROR_CODE);
            } else if (error == SmsManager.RESULT_RIL_SMS_SEND_FAIL_RETRY
                    && tracker.mRetryCount < getMaxSmsRetryCount()) {
                // Retry after a delay if needed.
@@ -1254,62 +1209,13 @@ public abstract class SMSDispatcher extends Handler {
                int errorCode = (smsResponse != null) ? smsResponse.mErrorCode : NO_ERROR_CODE;
                Message retryMsg = obtainMessage(EVENT_SEND_RETRY, tracker);
                sendMessageDelayed(retryMsg, getSmsRetryDelayValue());
                mPhone.getSmsStats().onOutgoingSms(
                        tracker.mImsRetry > 0 /* isOverIms */,
                        SmsConstants.FORMAT_3GPP2.equals(getFormat()),
                        false /* fallbackToCs */,
                        SmsManager.RESULT_RIL_SMS_SEND_FAIL_RETRY,
                        errorCode,
                        tracker.mMessageId,
                        tracker.isFromDefaultSmsApplication(mContext),
                        tracker.getInterval(),
                        mTelephonyManager.isEmergencyNumber(tracker.mDestAddress),
                        tracker.isMtSmsPollingMessage(mContext),
                        tracker.getPduLength(),
                        tracker.getAppPackageName(),
                        tracker.getAppUid());
                if (mPhone != null) {
                    TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
                    if (telephonyAnalytics != null) {
                        SmsMmsAnalytics smsMmsAnalytics = telephonyAnalytics.getSmsMmsAnalytics();
                        if (smsMmsAnalytics != null) {
                            smsMmsAnalytics.onOutgoingSms(
                                    tracker.mImsRetry > 0 /* isOverIms */,
                                    SmsManager.RESULT_RIL_SMS_SEND_FAIL_RETRY
                            );
                        }
                    }
                }

                reportOutgoingSmsMetrics(tracker, SmsManager.RESULT_RIL_SMS_SEND_FAIL_RETRY,
                        errorCode);
            } else {
                int errorCode = (smsResponse != null) ? smsResponse.mErrorCode : NO_ERROR_CODE;
                tracker.onFailed(mContext, error, errorCode);
                notifySmsSentFailedToEmergencyStateTracker(tracker, false);
                mPhone.getSmsStats().onOutgoingSms(
                        tracker.mImsRetry > 0 /* isOverIms */,
                        SmsConstants.FORMAT_3GPP2.equals(getFormat()),
                        false /* fallbackToCs */,
                        error,
                        errorCode,
                        tracker.mMessageId,
                        tracker.isFromDefaultSmsApplication(mContext),
                        tracker.getInterval(),
                        mTelephonyManager.isEmergencyNumber(tracker.mDestAddress),
                        tracker.isMtSmsPollingMessage(mContext),
                        tracker.getPduLength(),
                        tracker.getAppPackageName(),
                        tracker.getAppUid());
                if (mPhone != null) {
                    TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
                    if (telephonyAnalytics != null) {
                        SmsMmsAnalytics smsMmsAnalytics = telephonyAnalytics.getSmsMmsAnalytics();
                        if (smsMmsAnalytics != null) {
                            smsMmsAnalytics.onOutgoingSms(
                                    tracker.mImsRetry > 0 /* isOverIms */,
                                    error);
                        }
                    }
                }
                reportOutgoingSmsMetrics(tracker, error, errorCode);
            }
        }
    }
@@ -2726,6 +2632,43 @@ public abstract class SMSDispatcher extends Handler {
            mAppUid = android.os.Process.INVALID_UID;
        }

        @VisibleForTesting
        public SmsTracker(
                HashMap<String, Object> data,
                String destAddr,
                String format,
                long messageId,
                int initialRetryCount,
                String fullMessageText
        ) {
            this.mData = data;
            this.mDestAddress = destAddr;
            this.mFormat = format;
            this.mMessageId = messageId;
            this.mRetryCount = initialRetryCount;
            this.mFullMessageText = fullMessageText;

            this.mAppInfo = null;
            this.mSentIntent = null;
            this.mDeliveryIntent = null;
            this.mSmsHeader = null;
            this.mExpectMore = false;
            this.mUsesImsServiceForIms = false;
            this.mMessageRef = 0;
            this.mValidityPeriod = -1;
            this.mPriority = 0;
            this.mIsText = true;
            this.mPersistMessage = false;
            this.mUserId = 0;
            this.mSubId = 0;
            this.mIsForVvm = false;
            this.mCarrierId = 0;
            this.mSkipShortCodeDestAddrCheck = false;
            this.mUniqueMessageId = messageId;
            this.mResultCodeFromCarrierMessagingService = CarrierMessagingService.SEND_STATUS_OK;
            this.mAppUid = Process.INVALID_UID;
        }

        public HashMap<String, Object> getData() {
            return mData;
        }
@@ -3306,6 +3249,41 @@ public abstract class SMSDispatcher extends Handler {
        }
    }

    private void reportOutgoingSmsMetrics(SmsTracker tracker, int result, int errorCode) {
        if (mPhone != null) {
            int resultForMetrics = result;
            if (mFeatureFlags.satellite25q4Apis()
                    && result == SmsManager.RESULT_RIL_SMS_SEND_FAIL_RETRY
                    && tracker.mRetryCount >= getMaxSmsRetryCount()) {
                resultForMetrics = SmsManager.RESULT_SMS_SEND_FAIL_AFTER_MAX_RETRY;
            }

            mPhone.getSmsStats().onOutgoingSms(
                    tracker.mImsRetry > 0 /* isOverIms */,
                    SmsConstants.FORMAT_3GPP2.equals(getFormat()),
                    false /* fallbackToCs */,
                    resultForMetrics,
                    errorCode,
                    tracker.mMessageId,
                    tracker.isFromDefaultSmsApplication(mContext),
                    tracker.getInterval(),
                    mTelephonyManager.isEmergencyNumber(tracker.mDestAddress),
                    tracker.isMtSmsPollingMessage(mContext),
                    tracker.getPduLength(),
                    tracker.getAppPackageName(),
                    tracker.getAppUid());
            TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
            if (telephonyAnalytics != null) {
                SmsMmsAnalytics smsMmsAnalytics = telephonyAnalytics.getSmsMmsAnalytics();
                if (smsMmsAnalytics != null) {
                    smsMmsAnalytics.onOutgoingSms(
                            tracker.mImsRetry > 0 /* isOverIms */,
                            result);
                }
            }
        }
    }

    /**
     * Dump local logs
     */
+4 −3
Original line number Diff line number Diff line
@@ -414,16 +414,17 @@ public class SmsDispatchersController extends Handler {

        // Create dispatchers, inbound SMS handlers and
        // broadcast undelivered messages in raw table.
        mImsSmsDispatcher = new ImsSmsDispatcher(phone, this, ImsManager::getConnector);
        mImsSmsDispatcher = new ImsSmsDispatcher(phone, this, ImsManager::getConnector,
                mFeatureFlags);
        mGsmInboundSmsHandler = GsmInboundSmsHandler.makeInboundSmsHandler(phone.getContext(),
                storageMonitor, phone, looper, mFeatureFlags);
        if (ENABLE_CDMA_DISPATCHER) {
            mCdmaDispatcher = new CdmaSMSDispatcher(phone, this);
            mCdmaDispatcher = new CdmaSMSDispatcher(phone, this, mFeatureFlags);
            mCdmaInboundSmsHandler = CdmaInboundSmsHandler.makeInboundSmsHandler(phone.getContext(),
                    storageMonitor, phone, (CdmaSMSDispatcher) mCdmaDispatcher, looper,
                    mFeatureFlags);
        }
        mGsmDispatcher = new GsmSMSDispatcher(phone, this, mGsmInboundSmsHandler);
        mGsmDispatcher = new GsmSMSDispatcher(phone, this, mGsmInboundSmsHandler, mFeatureFlags);
        SmsBroadcastUndelivered.initialize(phone.getContext(),
                mGsmInboundSmsHandler, mCdmaInboundSmsHandler, mFeatureFlags);
        InboundSmsHandler.registerNewMessageNotificationActionHandler(phone.getContext());
+5 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.internal.telephony.cdma;

import static com.android.internal.telephony.SmsResponse.NO_ERROR_CODE;

import android.annotation.NonNull;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
import android.os.Message;
@@ -34,6 +35,7 @@ import com.android.internal.telephony.SmsController;
import com.android.internal.telephony.SmsDispatchersController;
import com.android.internal.telephony.SmsHeader;
import com.android.internal.telephony.SmsMessageBase;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.util.SMSDispatcherUtil;
import com.android.telephony.Rlog;

@@ -41,8 +43,9 @@ public class CdmaSMSDispatcher extends SMSDispatcher {
    private static final String TAG = "CdmaSMSDispatcher";
    private static final boolean VDBG = false;

    public CdmaSMSDispatcher(Phone phone, SmsDispatchersController smsDispatchersController) {
        super(phone, smsDispatchersController);
    public CdmaSMSDispatcher(Phone phone, SmsDispatchersController smsDispatchersController,
            @NonNull FeatureFlags featureFlags) {
        super(phone, smsDispatchersController, featureFlags);
        Rlog.d(TAG, "CdmaSMSDispatcher created");
    }

+4 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.internal.telephony.gsm;

import static com.android.internal.telephony.SmsResponse.NO_ERROR_CODE;

import android.annotation.NonNull;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.AsyncResult;
import android.os.Build;
@@ -34,6 +35,7 @@ import com.android.internal.telephony.SmsController;
import com.android.internal.telephony.SmsDispatchersController;
import com.android.internal.telephony.SmsHeader;
import com.android.internal.telephony.SmsMessageBase;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.uicc.IccRecords;
import com.android.internal.telephony.uicc.IccUtils;
import com.android.internal.telephony.uicc.UiccCardApplication;
@@ -54,8 +56,8 @@ public final class GsmSMSDispatcher extends SMSDispatcher {
    private GsmInboundSmsHandler mGsmInboundSmsHandler;

    public GsmSMSDispatcher(Phone phone, SmsDispatchersController smsDispatchersController,
            GsmInboundSmsHandler gsmInboundSmsHandler) {
        super(phone, smsDispatchersController);
            GsmInboundSmsHandler gsmInboundSmsHandler, @NonNull FeatureFlags featureFlags) {
        super(phone, smsDispatchersController, featureFlags);
        mCi.setOnSmsStatus(this, EVENT_NEW_SMS_STATUS_REPORT, null);
        mGsmInboundSmsHandler = gsmInboundSmsHandler;
        mUiccController = UiccController.getInstance();
Loading