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

Commit aa94fa6e authored by Daniel Banta's avatar Daniel Banta Committed by Android Build Coastguard Worker
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
Test: atest GsmSmsDispatcherTest, DatagramDispatcherTest
FLAG: com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:99126fdf5fd8623287f0d9b381b5f78355b8a8e4)
Merged-In: I6f685138fd15db486ac6341b39be457949e6305d
Change-Id: I6f685138fd15db486ac6341b39be457949e6305d
parent e37a4725
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
@@ -1254,6 +1254,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
@@ -1295,7 +1296,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);
    }
}