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

Commit 04a22802 authored by Hwangoo Park's avatar Hwangoo Park
Browse files

Add SCBM control to EmergencyStateTracker

After successfully sending an emergency SMS in the 5G SA TC of a carrier
that supports emergency callback mode, the TC failed due to the process
of the modem changing the current network(LTE) to NR due to
exitEmergencyMode. So, in this case, instead of calling
exitEmergencyMode, EmergencyStateTracker need to set the emergency mode
(MODE_EMERGENCY_CALLBACK) to the modem so that the modem can maintain
the current network(LTE).
This change applies the SCBM related logic to EmergencyStateTracker.
SCBM will be separately managed from ECBM, and when both ECBM and SCBM
are terminated, EmergencyStateTracker calls exitEmergencyMode on the
modem.

The followings are added when emergency callback mode supports:
 - Enter SCBM when emergency SMS is successfully sent.
 - Set MODE_EMERGENCY_CALLBACK on the modem when SCBM enters.
 - Exit SCBM when its timer is expired and send exitEmergencyMode to
   modem.
 - While in SCBM, if emergency call is started, then exit SCBM.
 - Whlie in SCBM, if emergency SMS is successfully sent or emergency SMS
   is received, then re-initiate SCBM timer.
 - While in SCBM, if sending emergency SMS is failed, then keep the SCBM
   timer.

Bug: 314849793
Bug: 300026427
Test: atest SmsDispatchersControllerTest, EmergencyStateTrackerTest
Test: manual (While in ECBM, SCBM entered and after both are expired,
exit emergency mode)
Test: manual (While in SCBM, emergency call started and exit SCBM, ECBM
entered)
Test: manual (Enter SCBM and exit emergency mode when it's expired)
Test: equipment test (SMS: 5G SA E911 2.2/2.5, Call: 5G SA E911 2.1)

Change-Id: I715a983dc26299d02afd60eb6d0fbcbfbae3d53e
parent d488df87
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -203,12 +203,12 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                        mTrackers.remove(token);
                        mPhone.notifySmsSent(tracker.mDestAddress);
                        mSmsDispatchersController.notifySmsSentToEmergencyStateTracker(
                                tracker.mDestAddress, tracker.mMessageId);
                                tracker.mDestAddress, tracker.mMessageId, true);
                        break;
                    case ImsSmsImplBase.SEND_STATUS_ERROR:
                        tracker.onFailed(mContext, reason, networkReasonCode);
                        mTrackers.remove(token);
                        notifySmsSentFailedToEmergencyStateTracker(tracker);
                        notifySmsSentFailedToEmergencyStateTracker(tracker, true);
                        break;
                    case ImsSmsImplBase.SEND_STATUS_ERROR_RETRY:
                        int maxRetryCountOverIms = getMaxRetryCountOverIms();
@@ -227,7 +227,7 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                        } else {
                            tracker.onFailed(mContext, reason, networkReasonCode);
                            mTrackers.remove(token);
                            notifySmsSentFailedToEmergencyStateTracker(tracker);
                            notifySmsSentFailedToEmergencyStateTracker(tracker, true);
                        }
                        break;
                    case ImsSmsImplBase.SEND_STATUS_ERROR_FALLBACK:
@@ -304,6 +304,11 @@ public class ImsSmsDispatcher extends SMSDispatcher {
                    switch (result) {
                        case Intents.RESULT_SMS_HANDLED:
                            mappedResult = ImsSmsImplBase.DELIVER_STATUS_OK;
                            if (message != null) {
                                mSmsDispatchersController
                                        .notifySmsReceivedViaImsToEmergencyStateTracker(
                                                message.getOriginatingAddress());
                            }
                            break;
                        case Intents.RESULT_SMS_OUT_OF_MEMORY:
                            mappedResult = ImsSmsImplBase.DELIVER_STATUS_ERROR_NO_MEMORY;
+8 −6
Original line number Diff line number Diff line
@@ -1013,10 +1013,12 @@ public abstract class SMSDispatcher extends Handler {
     * Notifies the {@link SmsDispatchersController} that sending MO SMS is failed.
     *
     * @param tracker holds the SMS message to be sent
     * @param isOverIms a flag specifying whether SMS is sent via IMS or not
     */
    protected void notifySmsSentFailedToEmergencyStateTracker(SmsTracker tracker) {
    protected void notifySmsSentFailedToEmergencyStateTracker(SmsTracker tracker,
            boolean isOverIms) {
        mSmsDispatchersController.notifySmsSentFailedToEmergencyStateTracker(
                tracker.mDestAddress, tracker.mMessageId);
                tracker.mDestAddress, tracker.mMessageId, isOverIms);
    }

    /**
@@ -1052,7 +1054,7 @@ public abstract class SMSDispatcher extends Handler {
            tracker.onSent(mContext);
            mPhone.notifySmsSent(tracker.mDestAddress);
            mSmsDispatchersController.notifySmsSentToEmergencyStateTracker(
                    tracker.mDestAddress, tracker.mMessageId);
                    tracker.mDestAddress, tracker.mMessageId, false);

            mPhone.getSmsStats().onOutgoingSms(
                    tracker.mImsRetry > 0 /* isOverIms */,
@@ -1103,7 +1105,7 @@ public abstract class SMSDispatcher extends Handler {
            // if sms over IMS is not supported on data and voice is not available...
            if (!isIms() && ss != ServiceState.STATE_IN_SERVICE) {
                tracker.onFailed(mContext, getNotInServiceError(ss), NO_ERROR_CODE);
                notifySmsSentFailedToEmergencyStateTracker(tracker);
                notifySmsSentFailedToEmergencyStateTracker(tracker, false);
                mPhone.getSmsStats().onOutgoingSms(
                        tracker.mImsRetry > 0 /* isOverIms */,
                        SmsConstants.FORMAT_3GPP2.equals(getFormat()),
@@ -1164,7 +1166,7 @@ public abstract class SMSDispatcher extends Handler {
            } else {
                int errorCode = (smsResponse != null) ? smsResponse.mErrorCode : NO_ERROR_CODE;
                tracker.onFailed(mContext, error, errorCode);
                notifySmsSentFailedToEmergencyStateTracker(tracker);
                notifySmsSentFailedToEmergencyStateTracker(tracker, false);
                mPhone.getSmsStats().onOutgoingSms(
                        tracker.mImsRetry > 0 /* isOverIms */,
                        SmsConstants.FORMAT_3GPP2.equals(getFormat()),
@@ -2389,7 +2391,7 @@ public abstract class SMSDispatcher extends Handler {
            int errorCode) {
        for (SmsTracker tracker : trackers) {
            tracker.onFailed(mContext, error, errorCode);
            notifySmsSentFailedToEmergencyStateTracker(tracker);
            notifySmsSentFailedToEmergencyStateTracker(tracker, false);
        }
        if (trackers.length > 0) {
            // This error occurs before the SMS is sent. Make an assumption if it would have
+47 −8
Original line number Diff line number Diff line
@@ -109,6 +109,9 @@ public class SmsDispatchersController extends Handler {
    /** Called when AP domain selection is abnormally terminated. */
    private static final int EVENT_DOMAIN_SELECTION_TERMINATED_ABNORMALLY = 20;

    /** Called when MT SMS is received via IMS. */
    private static final int EVENT_SMS_RECEIVED_VIA_IMS = 21;

    /** Delete any partial message segments after being IN_SERVICE for 1 day. */
    private static final long PARTIAL_SEGMENT_WAIT_DURATION = (long) (60 * 60 * 1000) * 24;
    /** Constant for invalid time */
@@ -487,8 +490,10 @@ public class SmsDispatchersController extends Handler {
                String destAddr = (String) args.arg1;
                Long messageId = (Long) args.arg2;
                Boolean success = (Boolean) args.arg3;
                Boolean isOverIms = (Boolean) args.arg4;
                try {
                    handleSmsSentCompletedUsingDomainSelection(destAddr, messageId, success);
                    handleSmsSentCompletedUsingDomainSelection(
                            destAddr, messageId, success, isOverIms);
                } finally {
                    args.recycle();
                }
@@ -499,6 +504,10 @@ public class SmsDispatchersController extends Handler {
                        (DomainSelectionConnectionHolder) msg.obj);
                break;
            }
            case EVENT_SMS_RECEIVED_VIA_IMS: {
                handleSmsReceivedViaIms((String) msg.obj);
                break;
            }
            default:
                if (isCdmaMo()) {
                    mCdmaDispatcher.handleMessage(msg);
@@ -808,7 +817,7 @@ public class SmsDispatchersController extends Handler {
                Rlog.e(TAG, "sendRetrySms failed to re-encode per missing fields!");
                tracker.onFailed(mContext, SmsManager.RESULT_SMS_SEND_RETRY_FAILED, NO_ERROR_CODE);
                notifySmsSentFailedToEmergencyStateTracker(
                        tracker.mDestAddress, tracker.mMessageId);
                        tracker.mDestAddress, tracker.mMessageId, !retryUsingImsService);
                return;
            }
            String scAddr = (String) map.get("scAddr");
@@ -817,7 +826,7 @@ public class SmsDispatchersController extends Handler {
                Rlog.e(TAG, "sendRetrySms failed due to null destAddr");
                tracker.onFailed(mContext, SmsManager.RESULT_SMS_SEND_RETRY_FAILED, NO_ERROR_CODE);
                notifySmsSentFailedToEmergencyStateTracker(
                        tracker.mDestAddress, tracker.mMessageId);
                        tracker.mDestAddress, tracker.mMessageId, !retryUsingImsService);
                return;
            }

@@ -859,7 +868,7 @@ public class SmsDispatchersController extends Handler {
                        + "destPort: %s", scAddr, map.get("destPort")));
                tracker.onFailed(mContext, SmsManager.RESULT_SMS_SEND_RETRY_FAILED, NO_ERROR_CODE);
                notifySmsSentFailedToEmergencyStateTracker(
                        tracker.mDestAddress, tracker.mMessageId);
                        tracker.mDestAddress, tracker.mMessageId, !retryUsingImsService);
                return;
            }
            // replace old smsc and pdu with newly encoded ones
@@ -1147,13 +1156,16 @@ public class SmsDispatchersController extends Handler {
     * @param destAddr The destination address for SMS.
     * @param messageId The message id for SMS.
     * @param success A flag specifying whether MO SMS is successfully sent or not.
     * @param isOverIms A flag specifying whether MO SMS is sent over IMS or not.
     */
    private void handleSmsSentCompletedUsingDomainSelection(@NonNull String destAddr,
            long messageId, boolean success) {
            long messageId, boolean success, boolean isOverIms) {
        if (mEmergencyStateTracker != null) {
            TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
            if (tm.isEmergencyNumber(destAddr)) {
                mEmergencyStateTracker.endSms(String.valueOf(messageId), success);
                mEmergencyStateTracker.endSms(String.valueOf(messageId), success,
                        isOverIms ? NetworkRegistrationInfo.DOMAIN_PS
                                  : NetworkRegistrationInfo.DOMAIN_CS);
            }
        }
    }
@@ -1161,13 +1173,15 @@ public class SmsDispatchersController extends Handler {
    /**
     * Called when MO SMS is successfully sent.
     */
    protected void notifySmsSentToEmergencyStateTracker(@NonNull String destAddr, long messageId) {
    protected void notifySmsSentToEmergencyStateTracker(@NonNull String destAddr, long messageId,
            boolean isOverIms) {
        if (isSmsDomainSelectionEnabled()) {
            // Run on main thread for interworking with EmergencyStateTracker.
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = destAddr;
            args.arg2 = Long.valueOf(messageId);
            args.arg3 = Boolean.TRUE;
            args.arg4 = Boolean.valueOf(isOverIms);
            sendMessage(obtainMessage(EVENT_SMS_SENT_COMPLETED_USING_DOMAIN_SELECTION, args));
        }
    }
@@ -1176,17 +1190,42 @@ public class SmsDispatchersController extends Handler {
     * Called when sending MO SMS is failed.
     */
    protected void notifySmsSentFailedToEmergencyStateTracker(@NonNull String destAddr,
            long messageId) {
            long messageId, boolean isOverIms) {
        if (isSmsDomainSelectionEnabled()) {
            // Run on main thread for interworking with EmergencyStateTracker.
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = destAddr;
            args.arg2 = Long.valueOf(messageId);
            args.arg3 = Boolean.FALSE;
            args.arg4 = Boolean.valueOf(isOverIms);
            sendMessage(obtainMessage(EVENT_SMS_SENT_COMPLETED_USING_DOMAIN_SELECTION, args));
        }
    }

    /**
     * Called when MT SMS is received via IMS.
     *
     * @param origAddr The originating address of MT SMS.
     */
    private void handleSmsReceivedViaIms(@Nullable String origAddr) {
        if (mEmergencyStateTracker != null) {
            TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
            if (origAddr != null && tm.isEmergencyNumber(origAddr)) {
                mEmergencyStateTracker.onEmergencySmsReceived();
            }
        }
    }

    /**
     * Called when MT SMS is received via IMS.
     */
    protected void notifySmsReceivedViaImsToEmergencyStateTracker(@Nullable String origAddr) {
        if (isSmsDomainSelectionEnabled()) {
            // Run on main thread for interworking with EmergencyStateTracker.
            sendMessage(obtainMessage(EVENT_SMS_RECEIVED_VIA_IMS, origAddr));
        }
    }

    private boolean isTestEmergencyNumber(String number) {
        try {
            TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
+1 −1
Original line number Diff line number Diff line
@@ -129,7 +129,7 @@ public class CdmaSMSDispatcher extends SMSDispatcher {
        // if sms over IMS is not supported on data and voice is not available...
        if (!isIms() && ss != ServiceState.STATE_IN_SERVICE) {
            tracker.onFailed(mContext, getNotInServiceError(ss), NO_ERROR_CODE);
            notifySmsSentFailedToEmergencyStateTracker(tracker);
            notifySmsSentFailedToEmergencyStateTracker(tracker, false);
            return;
        }

+297 −221

File changed.

Preview size limit exceeded, changes collapsed.

Loading