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

Commit 99126fdf authored by Daniel Banta's avatar Daniel Banta
Browse files

Allow GsmSMSDispatcher to send MtSmsPollingMessage while not in service.

The CL includes:
- Remove the state in-service check for MT SMS poll messages GsmSMSDispatcher.
- Fix the logic for mShouldPollMtSms to allow retry sending check message if sending fails.


Bug: 385011293
Change-Id: I6f685138fd15db486ac6341b39be457949e6305d
Test: atest GsmSmsDispatcherTest, DatagramDispatcherTest
FLAG: com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn
parent 578bb132
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -2626,7 +2626,7 @@ public abstract class SMSDispatcher extends Handler {
        }

        @VisibleForTesting
        public SmsTracker(String destAddr, long messageId) {
        public SmsTracker(String destAddr, long messageId, String messageText) {
            mData = null;
            mSentIntent = null;
            mDeliveryIntent = null;
@@ -2643,6 +2643,7 @@ public abstract class SMSDispatcher extends Handler {
            mSkipShortCodeDestAddrCheck = false;
            mUniqueMessageId = 0;
            mResultCodeFromCarrierMessagingService = CarrierMessagingService.SEND_STATUS_OK;
            mFullMessageText = messageText;
        }

        public HashMap<String, Object> getData() {
@@ -2682,6 +2683,22 @@ public abstract class SMSDispatcher extends Handler {
            return mIsFromDefaultSmsApplication;
        }

        /**
         * Check if the message is a MT SMS polling message.
         *
         * @param context The Context
         * @return true if the message is a MT SMS polling message, false otherwise.
         */
        public boolean isMtSmsPollingMessage(Context context) {
            if (mFullMessageText == null) {
                return false;
            }

            String mtSmsPollingText =
                    context.getResources().getString(R.string.config_mt_sms_polling_text);
            return mFullMessageText.equals(mtSmsPollingText);
        }

        /**
         * Update the status of this message if we persisted it
         */
+7 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.os.Build;
import android.os.Message;
import android.telephony.ServiceState;

import com.android.internal.R;
import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails;
import com.android.internal.telephony.InboundSmsHandler;
import com.android.internal.telephony.Phone;
@@ -165,8 +166,13 @@ public final class GsmSMSDispatcher extends SMSDispatcher {
                + " SS=" + ss
                + " " + SmsController.formatCrossStackMessageId(tracker.mMessageId));

        boolean allowCheckMessageInNotConnected =
                mContext.getResources()
                        .getBoolean(R.bool.config_satellite_allow_check_message_in_not_connected);
        boolean mtPollingMessageThatsAllowedInOOS =
                tracker.isMtSmsPollingMessage(mContext) && allowCheckMessageInNotConnected;
        // if sms over IMS is not supported on data and voice is not available...
        if (!isIms() && ss != ServiceState.STATE_IN_SERVICE) {
        if (!isIms() && ss != ServiceState.STATE_IN_SERVICE && !mtPollingMessageThatsAllowedInOOS) {
        //In 5G case only Data Rat is reported.
            if(mPhone.getServiceState().getRilDataRadioTechnology()
                    != ServiceState.RIL_RADIO_TECHNOLOGY_NR) {
+4 −1
Original line number Diff line number Diff line
@@ -1255,6 +1255,7 @@ public class DatagramDispatcher extends Handler {
                        getPendingMessagesCount(), SATELLITE_RESULT_SUCCESS);
                if (datagramType == DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS) {
                    startMtSmsPollingThrottle();
                    mShouldPollMtSms = false;
                }
            } else {
                // Update send status
@@ -1296,7 +1297,9 @@ public class DatagramDispatcher extends Handler {
        }

        plogd("sendMtSmsPollingMessage");
        if (!allowCheckMessageInNotConnected()) {
            mShouldPollMtSms = false;
        }

        for (Entry<Long, PendingRequest> entry : mPendingSmsMap.entrySet()) {
            PendingRequest pendingRequest = entry.getValue();
+1 −1
Original line number Diff line number Diff line
@@ -132,7 +132,7 @@ public class SmsDispatchersControllerTest extends TelephonyTest {
        }

        private SMSDispatcher.SmsTracker getSmsTracker(String destAddr, long messageId) {
            return new SMSDispatcher.SmsTracker(destAddr, messageId);
            return new SMSDispatcher.SmsTracker(destAddr, messageId, "testMessage");
        }
    }

+53 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static com.android.internal.telephony.SmsUsageMonitor.PREMIUM_SMS_PERMISS
import static com.android.internal.telephony.TelephonyTestUtils.waitForMs;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
@@ -45,6 +46,7 @@ import android.content.IntentFilter;
import android.content.pm.ServiceInfo;
import android.location.Country;
import android.location.CountryDetector;
import android.net.Uri;
import android.os.Binder;
import android.os.HandlerThread;
import android.os.Message;
@@ -54,6 +56,7 @@ import android.provider.Settings;
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.ICarrierMessagingCallback;
import android.service.carrier.ICarrierMessagingService;
import android.telephony.ServiceState;
import android.telephony.SmsManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -63,6 +66,7 @@ import androidx.test.filters.FlakyTest;
import androidx.test.filters.MediumTest;
import androidx.test.filters.SmallTest;

import com.android.internal.R;
import com.android.internal.telephony.ContextFixture;
import com.android.internal.telephony.ISub;
import com.android.internal.telephony.SMSDispatcher;
@@ -643,4 +647,53 @@ public class GsmSmsDispatcherTest extends TelephonyTest {
        byte[] pdu = IccUtils.hexStringToBytes(pduCaptor.getValue());
        assertEquals(0, pdu[1]);
    }

    @Test
    public void testSendRawPdu_isMtSmsPollingMessage_doesNotCallOnFailed() throws Exception {
        setupMockPackagePermissionChecks();
        mContextFixture.addCallingOrSelfPermission(ContextFixture.PERMISSION_ENABLE_ALL);
        // return a fake value to pass getData()
        HashMap data = new HashMap<String, String>();
        data.put("pdu", new byte[1]);
        when(mSmsTracker.getData()).thenReturn(data);
        when(mSmsTracker.getAppPackageName()).thenReturn("");
        Settings.Global.putInt(mContext.getContentResolver(),
                Settings.Global.DEVICE_PROVISIONED, 1);
        // Set isIms() false
        doReturn(false).when(mSmsDispatchersController).isIms();
        mContextFixture.putBooleanResource(
                R.bool.config_satellite_allow_check_message_in_not_connected, true);
        // Set ServiceState to OOS
        doReturn(new ServiceState()).when(mPhone).getServiceState();
        // Set isMtSmsPollingMessage to true
        when(mSmsTracker.isMtSmsPollingMessage(any())).thenReturn(true);

        mGsmSmsDispatcher.sendRawPdu(new SMSDispatcher.SmsTracker[] {mSmsTracker});
        processAllMessages();

        verify(mSmsTracker, times(0)).onFailed(any(), anyInt(), anyInt());
    }

    @Test
    public void testSmsTracker_isMtSmsPollingMessage_returnsTrue() throws Exception {
        String mtSmsPollingText = "mt_sms_polling_text";
        mContextFixture.putResource(R.string.config_mt_sms_polling_text, mtSmsPollingText);
        SMSDispatcher.SmsTracker tracker =
                new SMSDispatcher.SmsTracker("destAddr", 0L, mtSmsPollingText);

        boolean isMtSmsPollingMessage = tracker.isMtSmsPollingMessage(mContext);

        assertTrue(isMtSmsPollingMessage);
    }

    @Test
    public void testSmsTracker_isMtSmsPollingMessage_returnsFalse() throws Exception {
        mContextFixture.putResource(R.string.config_mt_sms_polling_text, "mt_sms_polling_text");
        SMSDispatcher.SmsTracker tracker =
                new SMSDispatcher.SmsTracker("destAddr", 0L, "wrong_text");

        boolean isMtSmsPollingMessage = tracker.isMtSmsPollingMessage(mContext);

        assertFalse(isMtSmsPollingMessage);
    }
}