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

Commit 72b20dd5 authored by Daniel Banta's avatar Daniel Banta
Browse files

[NTN][VZW P2P] Account for all cases in DatagramDispatcher to allow Check...

[NTN][VZW P2P] Account for all cases in DatagramDispatcher to allow Check messages to be sent even if the device is in NOT_CONNECTED state.

Bug: 380927601
Change-Id: Idefea836e3b0a01a19d364dfcf9ab448ec345ffe
Test: atest
FLAG: com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn
parent 335cf795
Loading
Loading
Loading
Loading
+33 −6
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.telephony.satellite.SatelliteManager.DATAGRAM_TYPE_CHECK_P
import static android.telephony.satellite.SatelliteManager.DATAGRAM_TYPE_SMS;
import static android.telephony.satellite.SatelliteManager.DATAGRAM_TYPE_UNKNOWN;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_MODEM_TIMEOUT;
@@ -418,7 +419,7 @@ public class DatagramDispatcher extends Handler {
            case EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT: {
                synchronized (mLock) {
                    mIsMtSmsPollingThrottled = false;
                    if (mIsAligned && mModemState == SATELLITE_MODEM_STATE_CONNECTED) {
                    if (allowMtSmsPolling()) {
                        sendMtSmsPollingMessage();
                    }
                }
@@ -514,8 +515,7 @@ public class DatagramDispatcher extends Handler {
            mIsAligned = isAligned;
            plogd("setDeviceAlignedWithSatellite: " + mIsAligned);
            if (isAligned && mIsDemoMode) handleEventSatelliteAligned();
            if (isAligned && !mIsMtSmsPollingThrottled
                    && mModemState == SATELLITE_MODEM_STATE_CONNECTED) {
            if (allowMtSmsPolling()) {
                sendMtSmsPollingMessage();
            }
        }
@@ -810,9 +810,6 @@ public class DatagramDispatcher extends Handler {
                    stopDatagramWaitForConnectedStateTimer();
                    sendPendingMessages();
                }
                if (mIsAligned && !mIsMtSmsPollingThrottled) {
                    sendMtSmsPollingMessage();
                }
            }

            if (state == SATELLITE_MODEM_STATE_NOT_CONNECTED) {
@@ -821,6 +818,10 @@ public class DatagramDispatcher extends Handler {
                    mShouldPollMtSms = shouldPollMtSms();
                }
            }

            if (allowMtSmsPolling()) {
                sendMtSmsPollingMessage();
            }
        }
    }

@@ -1334,6 +1335,32 @@ public class DatagramDispatcher extends Handler {
        removeMessages(EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT);
    }

    @GuardedBy("mLock")
    private boolean allowMtSmsPolling() {
        if (!mFeatureFlags.carrierRoamingNbIotNtn()) return false;

        if (mIsMtSmsPollingThrottled) return false;

        if (!mIsAligned) return false;

        boolean isModemStateConnectedOrTransferring =
                mModemState == SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED
                        || mModemState
                                == SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING;
        if (!isModemStateConnectedOrTransferring && !allowCheckMessageInNotConnected()) {
            plogd("EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT:"
                    + " allow_check_message_in_not_connected is disabled");
            return false;
        }

        return true;
    }

    private boolean allowCheckMessageInNotConnected() {
        return mContext.getResources()
                .getBoolean(R.bool.config_satellite_allow_check_message_in_not_connected);
    }

    private static void logd(@NonNull String log) {
        Rlog.d(TAG, log);
    }
+161 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;

import com.android.internal.R;
import com.android.internal.os.SomeArgs;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.SmsDispatchersController;
@@ -1140,6 +1141,166 @@ public class DatagramDispatcherTest extends TelephonyTest {
        assertFalse(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
    }

   @Test
   public void testHandleMessage_eventMtSmsPollingThrottleTimedOut_sendsMtSmsPollInNotConnected() {
        setShouldPollMtSmsTrue();
        mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true);
        when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
        mContextFixture.putBooleanResource(
                R.bool.config_satellite_allow_check_message_in_not_connected, true);

        mDatagramDispatcherUT.handleMessage(
                mDatagramDispatcherUT.obtainMessage(10 /*EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT*/,
                        new AsyncResult(null, null, null)));

        verify(mMockSmsDispatchersController, times(1)).sendMtSmsPollingMessage();
   }

    @Test
    public void
            testHandleMessage_eventMtSmsPollingThrottleTimedOut_configDisabled_doesNotSendMtSmsPoll() {
        setShouldPollMtSmsTrue();
        mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true);
        when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
        // Set config_satellite_allow_check_message_in_not_connected to false
        mContextFixture.putBooleanResource(
                R.bool.config_satellite_allow_check_message_in_not_connected, false);

        mDatagramDispatcherUT.handleMessage(
                mDatagramDispatcherUT.obtainMessage(10 /*EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT*/,
                        new AsyncResult(null, null, null)));

        verifyZeroInteractions(mMockSmsDispatchersController);
   }

    @Test
    public void
            testHandleMessage_eventMtSmsPollingThrottleTimedOut_flagDisabled_doesNotSendMtSmsPoll() {
        setShouldPollMtSmsTrue();
        mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true);
        // Set flag to false
        when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(false);
        mContextFixture.putBooleanResource(
                R.bool.config_satellite_allow_check_message_in_not_connected, true);

        mDatagramDispatcherUT.handleMessage(
                mDatagramDispatcherUT.obtainMessage(10 /*EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT*/,
                        new AsyncResult(null, null, null)));

        verifyZeroInteractions(mMockSmsDispatchersController);
   }



    @Test
    public void testSetDeviceAlignedWithSatellite_isAligned_notConnected_sendsMtSmsPoll() {
        setShouldPollMtSmsTrue();
        when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
        mContextFixture.putBooleanResource(
                R.bool.config_satellite_allow_check_message_in_not_connected, true);

        mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true);

        verify(mMockSmsDispatchersController, times(1)).sendMtSmsPollingMessage();
    }

    @Test
    public void testSetDeviceAlignedWithSatellite_notAligned_doesNotSendsMtSmsPoll() {
        setShouldPollMtSmsTrue();
        when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
        mContextFixture.putBooleanResource(
                R.bool.config_satellite_allow_check_message_in_not_connected, true);

        mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);

        verifyZeroInteractions(mMockSmsDispatchersController);
    }

    @Test
    public void testOnSatelliteModemStateChanged_notConnected_sendsMtSmsPoll() {
        setShouldPollMtSmsTrue();
        mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true);
        when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
        mContextFixture.putBooleanResource(
                R.bool.config_satellite_allow_check_message_in_not_connected, true);

        mDatagramDispatcherUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED);

        verify(mMockSmsDispatchersController, times(1)).sendMtSmsPollingMessage();
    }

    @Test
    public void testOnSatelliteModemStateChanged_connected_sendsMtSmsPoll() {
        setShouldPollMtSmsTrue();
        mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true);
        when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);

        mDatagramDispatcherUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);

        verify(mMockSmsDispatchersController, times(1)).sendMtSmsPollingMessage();
    }

    @Test
    public void testOnSatelliteModemStateChanged_transferring_sendsMtSmsPoll() {
        setShouldPollMtSmsTrue();
        mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true);
        when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);

        mDatagramDispatcherUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING);

        verify(mMockSmsDispatchersController, times(1)).sendMtSmsPollingMessage();
    }

    @Test
    public void testOnSatelliteModemStateChanged_throttled_doesNotSendMtSmsPoll() {
        startMtSmsPollingThrottle();
        setShouldPollMtSmsTrue();
        mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true);
        when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
        mContextFixture.putBooleanResource(
                R.bool.config_satellite_allow_check_message_in_not_connected, true);

        mDatagramDispatcherUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED);

        verify(mMockSmsDispatchersController, times(0)).sendMtSmsPollingMessage();
    }

    private void setModemState(int state) {
        mDatagramDispatcherUT.onSatelliteModemStateChanged(state);
    }

    private void setShouldPollMtSmsTrue() {
        // Set mHasEnteredConnectedState true
        setModemState(SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
        // Set the following so shouldPollMtSms returns true
        mContextFixture.putBooleanResource(R.bool.config_enabled_mt_sms_polling, true);
        when(mMockSatelliteController.shouldSendSmsToDatagramDispatcher(any(Phone.class)))
                .thenReturn(true);
        // This will trigger mShouldPollMtSms = shouldPollMtSms
        setModemState(SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED);
    }

    private void startMtSmsPollingThrottle() {
        // Call sendSms to put message in mPendingSmsMap with isMtSmsPolling=true
        PendingRequest pendingRequest = new PendingRequest(
                SmsDispatchersController.PendingRequest.TYPE_TEXT, null, "test-app",
                Binder.getCallingUserHandle().getIdentifier(), "1111", "2222", asArrayList(null),
                asArrayList(null), false, null, 0, asArrayList("text"), null, false, 0, false,
                10, 100L, false, /* isMtSmsPolling= */ true);
        mDatagramDispatcherUT.sendSms(pendingRequest);
        SomeArgs args = SomeArgs.obtain();
        args.arg1 = mPhone.getSubId();
        args.arg2 = pendingRequest.uniqueMessageId;
        args.arg3 = true;
        // EVENT_SEND_SMS_DONE to trigger handleEventSendSmsDone which will start the throttle
        mDatagramDispatcherUT.handleMessage(
                mDatagramDispatcherUT.obtainMessage(9 /*EVENT_SEND_SMS_DONE*/, args));
    }

    private boolean waitForIntegerConsumerResult(int expectedNumberOfEvents) {
        for (int i = 0; i < expectedNumberOfEvents; i++) {
            try {