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

Commit da6bad26 authored by Thomas Nguyen's avatar Thomas Nguyen Committed by Automerger Merge Worker
Browse files

Fix for wrongly update satellite modem state in some race scenairos am: 764fccaf

parents bf1b8cf7 764fccaf
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();