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

Commit d86dec7d authored by joonhunshin's avatar joonhunshin Committed by Joonhun Shin
Browse files

Restart P2P_SMS inactivity timer when device receives SMS

Bug: 372562118
Test: atest SatelliteControllerTest, SatelliteSessionControllerTest, DatagramControllerTest, DatagramReceiverTest
      atest SatelliteManagerTestOnMockService
      regression test b/373573836
Flag: com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn
Change-Id: Id901a58a635dca53b02fa8e8c9c1ff9abd24cf9a
parent 585848bc
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ import com.android.internal.telephony.analytics.TelephonyAnalytics.SmsMmsAnalyti
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.flags.Flags;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.satellite.SatelliteController;
import com.android.internal.telephony.satellite.metrics.CarrierRoamingSatelliteSessionStats;
import com.android.internal.telephony.util.NotificationChannelController;
import com.android.internal.telephony.util.TelephonyUtils;
@@ -687,6 +688,17 @@ public abstract class InboundSmsHandler extends StateMachine {
            result = RESULT_SMS_DISPATCH_FAILURE;
        }

        if (mFeatureFlags.carrierRoamingNbIotNtn()) {
            if (result == Intents.RESULT_SMS_HANDLED) {
                SatelliteController satelliteController = SatelliteController.getInstance();
                if (satelliteController == null) {
                    log("SatelliteController is not initialized");
                    return;
                }
                satelliteController.onSmsReceived(mPhone.getSubId());
            }
        }

        // RESULT_OK means that the SMS will be acknowledged by special handling,
        // e.g. for SMS-PP data download. Any other result, we should ack here.
        if (result != Activity.RESULT_OK) {
+28 −16
Original line number Diff line number Diff line
@@ -282,7 +282,7 @@ public class DatagramController {
            mSendDatagramTransferState = datagramTransferState;
            mSendPendingCount = sendPendingCount;
            mSendErrorCode = errorCode;
            notifyDatagramTransferStateChangedToSessionController();
            notifyDatagramTransferStateChangedToSessionController(mDatagramType);
            mPointingAppController.updateSendDatagramTransferState(mSendSubId, mDatagramType,
                    mSendDatagramTransferState, mSendPendingCount, mSendErrorCode);
            retryPollPendingDatagramsInDemoMode();
@@ -311,21 +311,23 @@ public class DatagramController {
     * @param receivePendingCount The number of datagrams that are currently pending to be received.
     * @param errorCode If datagram transfer failed, the reason for failure.
     */
    public void updateReceiveStatus(int subId,
    public void updateReceiveStatus(int subId, @SatelliteManager.DatagramType int datagramType,
            @SatelliteManager.SatelliteDatagramTransferState int datagramTransferState,
            int receivePendingCount, int errorCode) {
        synchronized (mLock) {
            plogd("updateReceiveStatus"
                    + " subId: " + subId
                    + " datagramType: " + datagramType
                    + " datagramTransferState: " + datagramTransferState
                    + " receivePendingCount: " + receivePendingCount + " errorCode: " + errorCode);

            mReceiveSubId = subId;
            mDatagramType = datagramType;
            mReceiveDatagramTransferState = datagramTransferState;
            mReceivePendingCount = receivePendingCount;
            mReceiveErrorCode = errorCode;

            notifyDatagramTransferStateChangedToSessionController();
            notifyDatagramTransferStateChangedToSessionController(mDatagramType);
            mPointingAppController.updateReceiveDatagramTransferState(mReceiveSubId,
                    mReceiveDatagramTransferState, mReceivePendingCount, mReceiveErrorCode);
            retryPollPendingDatagramsInDemoMode();
@@ -364,6 +366,24 @@ public class DatagramController {
        mDatagramReceiver.onSatelliteModemStateChanged(state);
    }

    /**
     * Notify SMS received.
     *
     * @param subId The subId of the subscription used to receive SMS
     */
    public void onSmsReceived(int subId) {
        // To keep exist notification flow, need to call with each state.
        updateReceiveStatus(subId, SatelliteManager.DATAGRAM_TYPE_SMS,
                SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVING,
                getReceivePendingCount(), SatelliteManager.SATELLITE_RESULT_SUCCESS);
        updateReceiveStatus(subId, SatelliteManager.DATAGRAM_TYPE_SMS,
                SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_SUCCESS,
                getReceivePendingCount(), SatelliteManager.SATELLITE_RESULT_SUCCESS);
        updateReceiveStatus(subId, SatelliteManager.DATAGRAM_TYPE_SMS,
                SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE,
                getReceivePendingCount(), SatelliteManager.SATELLITE_RESULT_SUCCESS);
    }

    /**
     * Set whether the device is aligned with the satellite.
     */
@@ -490,16 +510,6 @@ public class DatagramController {
        }
    }

    /** Return the datagram type indicating that the message to be sent or received.
     * {@link SatelliteManager.DatagramType}
     */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public int getDatagramType() {
        synchronized (mLock) {
            return mDatagramType;
        }
    }

    /**
     * This API can be used by only CTS to timeout durations used by DatagramController module.
     *
@@ -575,14 +585,16 @@ public class DatagramController {
        return (DEBUG || SystemProperties.getBoolean(ALLOW_MOCK_MODEM_PROPERTY, false));
    }

    private void notifyDatagramTransferStateChangedToSessionController() {
    private void notifyDatagramTransferStateChangedToSessionController(int datagramType) {
        SatelliteSessionController sessionController = SatelliteSessionController.getInstance();
        if (sessionController == null) {
            ploge("notifyDatagramTransferStateChangeToSessionController: SatelliteSessionController"
                    + " is not initialized yet");
        } else {
            synchronized (mLock) {
                sessionController.onDatagramTransferStateChanged(
                    mSendDatagramTransferState, mReceiveDatagramTransferState);
                        mSendDatagramTransferState, mReceiveDatagramTransferState, datagramType);
            }
        }
    }

+11 −0
Original line number Diff line number Diff line
@@ -352,10 +352,12 @@ public class DatagramReceiver extends Handler {

                    if (pendingCount <= 0 && satelliteDatagram == null) {
                        sInstance.mDatagramController.updateReceiveStatus(mSubId,
                                SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE,
                                SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_NONE,
                                pendingCount, SatelliteManager.SATELLITE_RESULT_SUCCESS);
                    } else if (satelliteDatagram != null) {
                        sInstance.mDatagramController.updateReceiveStatus(mSubId,
                                SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE,
                                SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_SUCCESS,
                                pendingCount, SatelliteManager.SATELLITE_RESULT_SUCCESS);

@@ -376,6 +378,7 @@ public class DatagramReceiver extends Handler {

                    if (pendingCount <= 0) {
                        sInstance.mDatagramController.updateReceiveStatus(mSubId,
                                SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE,
                                SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE,
                                pendingCount, SatelliteManager.SATELLITE_RESULT_SUCCESS);
                    } else {
@@ -473,10 +476,12 @@ public class DatagramReceiver extends Handler {
                plogd("EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE error: " + error);
                if (error != SatelliteManager.SATELLITE_RESULT_SUCCESS) {
                    mDatagramController.updateReceiveStatus(request.subId,
                            SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE,
                            SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_FAILED,
                            mDatagramController.getReceivePendingCount(), error);

                    mDatagramController.updateReceiveStatus(request.subId,
                            SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE,
                            SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE,
                            mDatagramController.getReceivePendingCount(),
                            SatelliteManager.SATELLITE_RESULT_SUCCESS);
@@ -615,6 +620,7 @@ public class DatagramReceiver extends Handler {
                mPendingPollSatelliteDatagramsRequest = new DatagramReceiverHandlerRequest(
                        callback, SatelliteServiceUtils.getPhone(), subId);
                mDatagramController.updateReceiveStatus(subId,
                        SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE,
                        SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_WAITING_TO_CONNECT,
                        mDatagramController.getReceivePendingCount(),
                        SatelliteManager.SATELLITE_RESULT_SUCCESS);
@@ -624,6 +630,7 @@ public class DatagramReceiver extends Handler {
        }

        mDatagramController.updateReceiveStatus(subId,
                SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE,
                SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVING,
                mDatagramController.getReceivePendingCount(),
                SatelliteManager.SATELLITE_RESULT_SUCCESS);
@@ -699,11 +706,13 @@ public class DatagramReceiver extends Handler {
        int subId = SatelliteController.getInstance().getHighestPrioritySubscrption();
        if (mDatagramController.isReceivingDatagrams()) {
            mDatagramController.updateReceiveStatus(subId,
                    SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE,
                    SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_FAILED,
                    mDatagramController.getReceivePendingCount(),
                    SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED);
        }
        mDatagramController.updateReceiveStatus(subId,
                SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE,
                SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE, 0,
                SatelliteManager.SATELLITE_RESULT_SUCCESS);
        cleanupDemoModeResources();
@@ -857,11 +866,13 @@ public class DatagramReceiver extends Handler {

            plogw("Timed out to wait for satellite connected before polling datagrams");
            mDatagramController.updateReceiveStatus(mPendingPollSatelliteDatagramsRequest.subId,
                    SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE,
                    SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_FAILED,
                    mDatagramController.getReceivePendingCount(),
                    SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);

            mDatagramController.updateReceiveStatus(mPendingPollSatelliteDatagramsRequest.subId,
                    SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE,
                    SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE,
                    mDatagramController.getReceivePendingCount(),
                    SatelliteManager.SATELLITE_RESULT_SUCCESS);
+30 −0
Original line number Diff line number Diff line
@@ -3256,6 +3256,36 @@ public class SatelliteController extends Handler {
        }
    }

    /**
     * Notify SMS received.
     *
     * @param subId The subId of the subscription used to receive SMS
     */
    public void onSmsReceived(int subId) {
        if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
            logd("onSmsReceived: carrierRoamingNbIotNtn is disabled");
            return;
        }

        if (!isSatelliteEnabled()) {
            logd("onSmsReceived: satellite is not enabled");
            return;
        }

        int satelliteSubId = getHighestPrioritySubscrption();
        if (subId != satelliteSubId) {
            logd("onSmsReceived: SMS received " + subId
                    + ", but not satellite subscription " + satelliteSubId);
            return;
        }

        if (mDatagramController != null) {
            mDatagramController.onSmsReceived(subId);
        } else {
            logd("onSmsReceived: DatagramController is not initialized");
        }
    }

    /**
     * @return {@code true} if satellite is supported via OEM on the device,
     * {@code  false} otherwise.
+8 −5
Original line number Diff line number Diff line
@@ -334,9 +334,10 @@ public class SatelliteSessionController extends StateMachine {
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public void onDatagramTransferStateChanged(
            @SatelliteManager.SatelliteDatagramTransferState int sendState,
            @SatelliteManager.SatelliteDatagramTransferState int receiveState) {
            @SatelliteManager.SatelliteDatagramTransferState int receiveState,
            @SatelliteManager.DatagramType int datagramType) {
        sendMessage(EVENT_DATAGRAM_TRANSFER_STATE_CHANGED,
                new DatagramTransferState(sendState, receiveState));
                new DatagramTransferState(sendState, receiveState, datagramType));
        if (sendState == SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING) {
            mIsSendingTriggeredDuringTransferringState.set(true);
        }
@@ -627,11 +628,14 @@ public class SatelliteSessionController extends StateMachine {
    private static class DatagramTransferState {
        @SatelliteManager.SatelliteDatagramTransferState public int sendState;
        @SatelliteManager.SatelliteDatagramTransferState public int receiveState;
        @SatelliteManager.DatagramType public int datagramType;

        DatagramTransferState(@SatelliteManager.SatelliteDatagramTransferState int sendState,
                @SatelliteManager.SatelliteDatagramTransferState int receiveState) {
                @SatelliteManager.SatelliteDatagramTransferState int receiveState,
                @SatelliteManager.DatagramType int datagramType) {
            this.sendState = sendState;
            this.receiveState = receiveState;
            this.datagramType = datagramType;
        }
    }

@@ -1292,8 +1296,7 @@ public class SatelliteSessionController extends StateMachine {
                    || isReceiving(datagramTransferState.receiveState)) {
                stopNbIotInactivityTimer();

                DatagramController datagramController = DatagramController.getInstance();
                int datagramType = datagramController.getDatagramType();
                int datagramType = datagramTransferState.datagramType;
                if (datagramType == DATAGRAM_TYPE_SOS_MESSAGE) {
                    stopEsosInactivityTimer();
                } else if (datagramType == DATAGRAM_TYPE_SMS) {
Loading