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

Commit 764fccaf authored by Thomas Nguyen's avatar Thomas Nguyen
Browse files

Fix for wrongly update satellite modem state in some race scenairos

Bug: 283633381
Test: Call/SMS/MMS with live network. Ran the following tests 200 times
atest android.telephony.satellite.cts.SatelliteManagerTestOnMockService
atest android.telephony.satellite.cts.SatelliteManagerTest
atest com.android.internal.telephony.satellite.SatelliteControllerTest

Change-Id: Ie65354ad484f3d81bced0f64de335d7fe5ac81a7
parent 6f77b12b
Loading
Loading
Loading
Loading
+115 −73
Original line number Diff line number Diff line
@@ -28,9 +28,9 @@ import android.content.SharedPreferences;
import android.database.ContentObserver;
import android.net.wifi.WifiManager;
import android.nfc.NfcAdapter;
import android.nfc.NfcManager;
import android.os.AsyncResult;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.Handler;
@@ -41,6 +41,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.SystemProperties;
import android.provider.Settings;
import android.telephony.Rlog;
import android.telephony.SubscriptionManager;
@@ -79,6 +80,8 @@ public class SatelliteController extends Handler {
    private static final String TAG = "SatelliteController";
    /** Whether enabling verbose debugging message or not. */
    private static final boolean DBG = false;
    private static final String ALLOW_MOCK_MODEM_PROPERTY = "persist.radio.allow_mock_modem";
    private static final boolean DEBUG = !"user".equals(Build.TYPE);
    /** File used to store shared preferences related to satellite. */
    public static final String SATELLITE_SHARED_PREF = "satellite_shared_pref";
    /** Value to pass for the setting key SATELLITE_MODE_ENABLED, enabled = 1, disabled = 0 */
@@ -153,6 +156,9 @@ public class SatelliteController extends Handler {
    @GuardedBy("mSatelliteEnabledRequestLock")
    private boolean mWaitingForRadioDisabled = false;

    private boolean mWaitingForDisableSatelliteModemResponse = false;
    private boolean mWaitingForSatelliteModemOff = false;

    private final AtomicBoolean mRegisteredForProvisionStateChangedWithSatelliteService =
            new AtomicBoolean(false);
    private final AtomicBoolean mRegisteredForProvisionStateChangedWithPhone =
@@ -418,44 +424,50 @@ public class SatelliteController extends Handler {
                case BluetoothAdapter.ACTION_STATE_CHANGED:
                    int btState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
                            BluetoothAdapter.ERROR);
                    logd("Bluetooth state updated to " + btState);
                    synchronized (mRadioStateLock) {
                        boolean currentBTStateEnabled = mBTStateEnabled;
                        if (btState == BluetoothAdapter.STATE_OFF) {
                            mBTStateEnabled = false;
                            evaluateToSendSatelliteEnabledSuccess();
                        } else if (btState == BluetoothAdapter.STATE_ON) {
                            mBTStateEnabled = true;
                        }
                        logd("mBTStateEnabled: " + mBTStateEnabled);
                        if (currentBTStateEnabled != mBTStateEnabled) {
                            logd("mBTStateEnabled=" + mBTStateEnabled);
                        }
                    }
                    break;

                case NfcAdapter.ACTION_ADAPTER_STATE_CHANGED:
                    int nfcState = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, -1);
                    logd("Nfc state updated to " + nfcState);
                    synchronized (mRadioStateLock) {
                        boolean currentNfcStateEnabled = mNfcStateEnabled;
                        if (nfcState == NfcAdapter.STATE_ON) {
                            mNfcStateEnabled = true;
                        } else if (nfcState == NfcAdapter.STATE_OFF) {
                            mNfcStateEnabled = false;
                            evaluateToSendSatelliteEnabledSuccess();
                        }
                        logd("mNfcStateEnabled: " + mNfcStateEnabled);
                        if (currentNfcStateEnabled != mNfcStateEnabled) {
                            logd("mNfcStateEnabled=" + mNfcStateEnabled);
                        }
                    }
                    break;

                case WifiManager.WIFI_STATE_CHANGED_ACTION:
                    int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
                            WifiManager.WIFI_STATE_UNKNOWN);
                    logd("Wifi state updated to " + wifiState);
                    synchronized (mRadioStateLock) {
                        boolean currentWifiStateEnabled = mWifiStateEnabled;
                        if (wifiState == WifiManager.WIFI_STATE_ENABLED) {
                            mWifiStateEnabled = true;
                        } else if (wifiState == WifiManager.WIFI_STATE_DISABLED) {
                            mWifiStateEnabled = false;
                            evaluateToSendSatelliteEnabledSuccess();
                        }
                        logd("mWifiStateEnabled: " + mWifiStateEnabled);
                        if (currentWifiStateEnabled != mWifiStateEnabled) {
                            logd("mWifiStateEnabled=" + mWifiStateEnabled);
                        }
                    }
                    break;
                default:
@@ -686,17 +698,17 @@ public class SatelliteController extends Handler {
                                        SatelliteManager.SATELLITE_ERROR_NONE);
                            }
                        }
                        resetSatelliteEnabledRequest();

                        setSettingsKeyForSatelliteMode(SATELLITE_MODE_ENABLED_FALSE);
                        setDemoModeEnabled(argument.enableDemoMode);
                        synchronized (mIsSatelliteEnabledLock) {
                            mIsSatelliteEnabled = argument.enableSatellite;
                            if (!mWaitingForSatelliteModemOff) {
                                moveSatelliteToOffStateAndCleanUpResources(
                                        SatelliteManager.SATELLITE_ERROR_NONE, argument.callback);
                            } else {
                                logd("Wait for satellite modem off before updating satellite"
                                        + " modem state");
                            }
                            mWaitingForDisableSatelliteModemResponse = false;
                        }
                        // If satellite is disabled, send success to callback immediately
                        argument.callback.accept(error);
                        updateSatelliteEnabledState(
                                argument.enableSatellite, "EVENT_SET_SATELLITE_ENABLED_DONE");
                    }
                } else {
                    synchronized (mSatelliteEnabledRequestLock) {
@@ -728,6 +740,9 @@ public class SatelliteController extends Handler {
                            .reportSessionMetrics();
                } else {
                    mControllerMetricsStats.onSatelliteDisabled();
                    synchronized (mIsSatelliteEnabledLock) {
                        mWaitingForDisableSatelliteModemResponse = false;
                    }
                }
                break;
            }
@@ -951,6 +966,7 @@ public class SatelliteController extends Handler {
                        || mCi.getRadioState() == TelephonyManager.RADIO_POWER_UNAVAILABLE) {
                    mIsRadioOn = false;
                    logd("Radio State Changed to " + mCi.getRadioState());
                    if (isSatelliteEnabled()) {
                        IIntegerConsumer errorCallback = new IIntegerConsumer.Stub() {
                            @Override
                            public void accept(int result) {
@@ -964,6 +980,10 @@ public class SatelliteController extends Handler {
                                new RequestSatelliteEnabledArgument(false, false, result);
                        request = new SatelliteControllerHandlerRequest(message, phone);
                        handleSatelliteEnabled(request);
                    } else {
                        logd("EVENT_RADIO_STATE_CHANGED: Satellite modem is currently disabled."
                                + " Ignored the event");
                    }
                } else {
                    mIsRadioOn = true;
                    if (!mSatelliteModemInterface.isSatelliteServiceSupported()) {
@@ -1763,12 +1783,10 @@ public class SatelliteController extends Handler {
     * {@code false} otherwise.
     */
    public boolean setSatelliteServicePackageName(@Nullable String servicePackageName) {
        boolean result = mSatelliteModemInterface.setSatelliteServicePackageName(
                servicePackageName);
        if (result) {
            logd("setSatelliteServicePackageName: Resetting cached states");
        if (!isMockModemAllowed()) return false;

        // Cached states need to be cleared whenever switching satellite vendor services.
        logd("setSatelliteServicePackageName: Resetting cached states");
        synchronized (mIsSatelliteSupportedLock) {
            mIsSatelliteSupported = null;
        }
@@ -1781,15 +1799,8 @@ public class SatelliteController extends Handler {
        synchronized (mSatelliteCapabilitiesLock) {
            mSatelliteCapabilities = null;
        }
            ResultReceiver receiver = new ResultReceiver(this) {
                @Override
                protected void onReceiveResult(int resultCode, Bundle resultData) {
                    logd("requestIsSatelliteSupported: resultCode=" + resultCode);
                }
            };
            requestIsSatelliteSupported(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, receiver);
        }
        return result;
        mSatelliteModemInterface.setSatelliteServicePackageName(servicePackageName);
        return true;
    }

    /**
@@ -2045,13 +2056,23 @@ public class SatelliteController extends Handler {
    private void handleSatelliteEnabled(SatelliteControllerHandlerRequest request) {
        RequestSatelliteEnabledArgument argument =
                (RequestSatelliteEnabledArgument) request.argument;
        Phone phone = request.phone;

        if (!argument.enableSatellite && (mSatelliteModemInterface.isSatelliteServiceSupported()
                || phone != null)) {
            synchronized (mIsSatelliteEnabledLock) {
                mWaitingForDisableSatelliteModemResponse = true;
                mWaitingForSatelliteModemOff = true;
            }
        }

        Message onCompleted = obtainMessage(EVENT_SET_SATELLITE_ENABLED_DONE, request);
        if (mSatelliteModemInterface.isSatelliteServiceSupported()) {
            mSatelliteModemInterface.requestSatelliteEnabled(argument.enableSatellite,
                    argument.enableDemoMode, onCompleted);
            return;
        }
        Phone phone = request.phone;

        if (phone != null) {
            phone.setSatellitePower(onCompleted, argument.enableSatellite);
        } else {
@@ -2190,15 +2211,31 @@ public class SatelliteController extends Handler {
    private void handleEventSatelliteModemStateChanged(
            @SatelliteManager.SatelliteModemState int state) {
        logd("handleEventSatelliteModemStateChanged: state=" + state);
        if (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF
                || state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE) {
            setSettingsKeyForSatelliteMode(SATELLITE_MODE_ENABLED_FALSE);
            setDemoModeEnabled(false);
            updateSatelliteEnabledState(
                    false, "handleEventSatelliteModemStateChanged");
            cleanUpResources(state);
        if (state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE
                || state == SatelliteManager.SATELLITE_MODEM_STATE_OFF) {
            synchronized (mIsSatelliteEnabledLock) {
                if ((state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE)
                        || ((mIsSatelliteEnabled == null || isSatelliteEnabled())
                        && !mWaitingForDisableSatelliteModemResponse)) {
                    int error = (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF)
                            ? SatelliteManager.SATELLITE_ERROR_NONE
                            : SatelliteManager.SATELLITE_INVALID_MODEM_STATE;
                    Consumer<Integer> callback = null;
                    synchronized (mSatelliteEnabledRequestLock) {
                        if (mSatelliteEnabledRequest != null) {
                            callback = mSatelliteEnabledRequest.callback;
                        }
                    }
                    moveSatelliteToOffStateAndCleanUpResources(error, callback);
                } else {
                    logd("Either waiting for the response of disabling satellite modem or the event"
                            + " should be ignored because isSatelliteEnabled="
                            + isSatelliteEnabled()
                            + ", mIsSatelliteEnabled=" + mIsSatelliteEnabled);
                }
                mWaitingForSatelliteModemOff = false;
            }
        }

        mDatagramController.onSatelliteModemStateChanged(state);
    }

@@ -2252,16 +2289,17 @@ public class SatelliteController extends Handler {
        }
    }

    private void cleanUpResources(@SatelliteManager.SatelliteModemState int state) {
        logd("cleanUpResources");
        if (state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE) {
            synchronized (mSatelliteEnabledRequestLock) {
                if (mSatelliteEnabledRequest != null) {
                    mSatelliteEnabledRequest.callback.accept(
                            SatelliteManager.SATELLITE_INVALID_MODEM_STATE);
                }
            }
    private void moveSatelliteToOffStateAndCleanUpResources(
            @SatelliteManager.SatelliteError int error, @Nullable Consumer<Integer> callback) {
        logd("moveSatelliteToOffStateAndCleanUpResources");
        synchronized (mIsSatelliteEnabledLock) {
            resetSatelliteEnabledRequest();
            setDemoModeEnabled(false);
            mIsSatelliteEnabled = false;
            setSettingsKeyForSatelliteMode(SATELLITE_MODE_ENABLED_FALSE);
            if (callback != null) callback.accept(error);
            updateSatelliteEnabledState(
                    false, "moveSatelliteToOffStateAndCleanUpResources");
        }
    }

@@ -2270,6 +2308,10 @@ public class SatelliteController extends Handler {
        mDatagramController.setDemoMode(mIsDemoModeEnabled);
    }

    private boolean isMockModemAllowed() {
        return (DEBUG || SystemProperties.getBoolean(ALLOW_MOCK_MODEM_PROPERTY, false));
    }

    private static void logd(@NonNull String log) {
        Rlog.d(TAG, log);
    }
+1 −17
Original line number Diff line number Diff line
@@ -24,14 +24,12 @@ import android.content.Intent;
import android.content.ServiceConnection;
import android.os.AsyncResult;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.RegistrantList;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.telephony.Rlog;
import android.telephony.satellite.SatelliteCapabilities;
import android.telephony.satellite.SatelliteDatagram;
@@ -57,8 +55,6 @@ import java.util.Arrays;
 */
public class SatelliteModemInterface {
    private static final String TAG = "SatelliteModemInterface";
    private static final String ALLOW_MOCK_MODEM_PROPERTY = "persist.radio.allow_mock_modem";
    private static final boolean DEBUG = !"user".equals(Build.TYPE);
    private static final long REBIND_INITIAL_DELAY = 2 * 1000; // 2 seconds
    private static final long REBIND_MAXIMUM_DELAY = 64 * 1000; // 1 minute
    private static final int REBIND_MULTIPLIER = 2;
@@ -1016,13 +1012,7 @@ public class SatelliteModemInterface {
     * {@code false} otherwise.
     */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public boolean setSatelliteServicePackageName(@Nullable String servicePackageName) {
        if (!shouldAllowModifyingSatelliteServicePackageName()) {
            loge("setSatelliteServicePackageName: modifying satellite service package name "
                    + "is not allowed");
            return false;
        }

    public void setSatelliteServicePackageName(@Nullable String servicePackageName) {
        logd("setSatelliteServicePackageName: config_satellite_service_package is "
                + "updated, new packageName=" + servicePackageName);
        mExponentialBackoff.stop();
@@ -1042,8 +1032,6 @@ public class SatelliteModemInterface {
        mIsSatelliteServiceSupported = getSatelliteServiceSupport();
        bindService();
        mExponentialBackoff.start();

        return true;
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
@@ -1055,10 +1043,6 @@ public class SatelliteModemInterface {
        message.sendToTarget();
    }

    private boolean shouldAllowModifyingSatelliteServicePackageName() {
        return (DEBUG || SystemProperties.getBoolean(ALLOW_MOCK_MODEM_PROPERTY, false));
    }

    private static void logd(@NonNull String log) {
        Rlog.d(TAG, log);
    }
+42 −15
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
@@ -215,6 +216,7 @@ public class SatelliteControllerTest extends TelephonyTest {
    private ResultReceiver mIsSatelliteEnabledReceiver = new ResultReceiver(null) {
        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            logd("mIsSatelliteEnabledReceiver: resultCode=" + resultCode);
            mQueriedIsSatelliteEnabledResultCode = resultCode;
            if (resultCode == SATELLITE_ERROR_NONE) {
                if (resultData.containsKey(KEY_SATELLITE_ENABLED)) {
@@ -224,7 +226,6 @@ public class SatelliteControllerTest extends TelephonyTest {
                    mQueriedIsSatelliteEnabled = false;
                }
            } else {
                logd("mIsSatelliteEnableReceiver: resultCode=" + resultCode);
                mQueriedIsSatelliteEnabled = false;
            }
            try {
@@ -586,18 +587,39 @@ public class SatelliteControllerTest extends TelephonyTest {
        processAllMessages();
        verifySatelliteProvisioned(true, SATELLITE_ERROR_NONE);

        // Successfully enable satellite
        mIIntegerConsumerResults.clear();
        mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false;
        setUpResponseForRequestSatelliteEnabled(true, false, SATELLITE_ERROR_NONE);
        mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, mIIntegerConsumer);
        processAllMessages();
        assertTrue(waitForIIntegerConsumerResult(1));
        assertEquals(SATELLITE_ERROR_NONE, (long) mIIntegerConsumerResults.get(0));
        verifySatelliteEnabled(true, SATELLITE_ERROR_NONE);
        assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled);
        assertEquals(
                SATELLITE_MODE_ENABLED_TRUE, mSatelliteControllerUT.satelliteModeSettingValue);
        verify(mMockSatelliteSessionController, times(1)).onSatelliteEnabledStateChanged(eq(true));
        verify(mMockSatelliteSessionController, times(2)).setDemoMode(eq(false));
        verify(mMockDatagramController, times(2)).setDemoMode(eq(false));
        verify(mMockPointingAppController).startPointingUI(eq(false));
        verify(mMockControllerMetricsStats, times(1)).onSatelliteEnabled();
        verify(mMockControllerMetricsStats, times(1)).reportServiceEnablementSuccessCount();

        // Successfully disable satellite when radio is turned off.
        mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false;
        setUpResponseForRequestSatelliteEnabled(false, false, SATELLITE_ERROR_NONE);
        setRadioPower(false);
        processAllMessages();
        sendSatelliteModemStateChangedEvent(SATELLITE_MODEM_STATE_OFF, null);
        processAllMessages();
        verifySatelliteEnabled(false, SATELLITE_ERROR_NONE);
        assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled);
        assertEquals(
                SATELLITE_MODE_ENABLED_FALSE, mSatelliteControllerUT.satelliteModeSettingValue);
        verify(mMockSatelliteSessionController, times(2)).onSatelliteEnabledStateChanged(eq(false));
        verify(mMockSatelliteSessionController, times(2)).setDemoMode(eq(false));
        verify(mMockDatagramController, times(2)).setDemoMode(eq(false));
        verify(mMockSatelliteSessionController, times(3)).setDemoMode(eq(false));
        verify(mMockDatagramController, times(3)).setDemoMode(eq(false));
        verify(mMockControllerMetricsStats, times(1)).onSatelliteDisabled();

        // Fail to enable satellite when radio is off.
@@ -615,6 +637,7 @@ public class SatelliteControllerTest extends TelephonyTest {

        // Fail to enable satellite with an error response from modem when radio is on.
        mIIntegerConsumerResults.clear();
        clearInvocations(mMockPointingAppController);
        mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false;
        setUpResponseForRequestSatelliteEnabled(true, false, SATELLITE_INVALID_MODEM_STATE);
        mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, mIIntegerConsumer);
@@ -638,14 +661,14 @@ public class SatelliteControllerTest extends TelephonyTest {
        assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled);
        assertEquals(SATELLITE_MODE_ENABLED_TRUE, mSatelliteControllerUT.satelliteModeSettingValue);
        verify(mMockPointingAppController).startPointingUI(eq(false));
        verify(mMockSatelliteSessionController, times(1)).onSatelliteEnabledStateChanged(eq(true));
        verify(mMockSatelliteSessionController, times(3)).setDemoMode(eq(false));
        verify(mMockDatagramController, times(3)).setDemoMode(eq(false));
        verify(mMockControllerMetricsStats, times(1)).onSatelliteEnabled();
        verify(mMockControllerMetricsStats, times(1)).reportServiceEnablementSuccessCount();
        verify(mMockSessionMetricsStats, times(2)).setInitializationResult(anyInt());
        verify(mMockSessionMetricsStats, times(2)).setRadioTechnology(anyInt());
        verify(mMockSessionMetricsStats, times(2)).reportSessionMetrics();
        verify(mMockSatelliteSessionController, times(2)).onSatelliteEnabledStateChanged(eq(true));
        verify(mMockSatelliteSessionController, times(4)).setDemoMode(eq(false));
        verify(mMockDatagramController, times(4)).setDemoMode(eq(false));
        verify(mMockControllerMetricsStats, times(2)).onSatelliteEnabled();
        verify(mMockControllerMetricsStats, times(2)).reportServiceEnablementSuccessCount();
        verify(mMockSessionMetricsStats, times(3)).setInitializationResult(anyInt());
        verify(mMockSessionMetricsStats, times(3)).setRadioTechnology(anyInt());
        verify(mMockSessionMetricsStats, times(3)).reportSessionMetrics();

        // Successfully enable satellite when it is already enabled.
        mIIntegerConsumerResults.clear();
@@ -663,7 +686,7 @@ public class SatelliteControllerTest extends TelephonyTest {
        assertEquals(SATELLITE_INVALID_ARGUMENTS, (long) mIIntegerConsumerResults.get(0));
        verifySatelliteEnabled(true, SATELLITE_ERROR_NONE);

        // Disable satellite.
        // Successfully disable satellite.
        mIIntegerConsumerResults.clear();
        setUpResponseForRequestSatelliteEnabled(false, false, SATELLITE_ERROR_NONE);
        mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, false, false, mIIntegerConsumer);
@@ -1418,7 +1441,7 @@ public class SatelliteControllerTest extends TelephonyTest {
    private void resetSatelliteControllerUTEnabledState() {
        logd("resetSatelliteControllerUTEnabledState");
        setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RADIO_NOT_AVAILABLE);
        doReturn(true).when(mMockSatelliteModemInterface)
        doNothing().when(mMockSatelliteModemInterface)
                .setSatelliteServicePackageName(anyString());
        mSatelliteControllerUT.setSatelliteServicePackageName("TestSatelliteService");
        processAllMessages();
@@ -1438,7 +1461,7 @@ public class SatelliteControllerTest extends TelephonyTest {

        // Reset all cached states
        setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RADIO_NOT_AVAILABLE);
        doReturn(true).when(mMockSatelliteModemInterface)
        doNothing().when(mMockSatelliteModemInterface)
                .setSatelliteServicePackageName(anyString());
        mSatelliteControllerUT.setSatelliteServicePackageName("TestSatelliteService");
        processAllMessages();
@@ -1455,7 +1478,8 @@ public class SatelliteControllerTest extends TelephonyTest {

    private void resetSatelliteControllerUTToOffAndProvisionedState() {
        resetSatelliteControllerUTToSupportedAndProvisionedState();
        sendSatelliteModemStateChangedEvent(SATELLITE_MODEM_STATE_OFF, null);
        // Clean up pending resources and move satellite controller to OFF state.
        sendSatelliteModemStateChangedEvent(SATELLITE_MODEM_STATE_UNAVAILABLE, null);
        processAllMessages();
        verifySatelliteEnabled(false, SATELLITE_ERROR_NONE);
    }
@@ -1568,6 +1592,9 @@ public class SatelliteControllerTest extends TelephonyTest {
        SatelliteException exception = (error == SATELLITE_ERROR_NONE)
                ? null : new SatelliteException(error);
        doAnswer(invocation -> {
            if (exception == null && !enabled) {
                sendSatelliteModemStateChangedEvent(SATELLITE_MODEM_STATE_OFF, null);
            }
            Message message = (Message) invocation.getArguments()[2];
            AsyncResult.forMessage(message, null, exception);
            message.sendToTarget();