diff --git a/packages/SettingsLib/src/com/android/settingslib/satellite/SatelliteDialogUtils.kt b/packages/SettingsLib/src/com/android/settingslib/satellite/SatelliteDialogUtils.kt
index 2dc2650..d69c87b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/satellite/SatelliteDialogUtils.kt
+++ b/packages/SettingsLib/src/com/android/settingslib/satellite/SatelliteDialogUtils.kt
@@ -21,7 +21,6 @@
 import android.content.Intent
 import android.os.OutcomeReceiver
 import android.telephony.satellite.SatelliteManager
-import android.telephony.satellite.SatelliteModemStateCallback
 import android.util.Log
 import android.view.WindowManager
 import androidx.lifecycle.LifecycleOwner
@@ -32,19 +31,12 @@
 import kotlinx.coroutines.Dispatchers.Default
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.asExecutor
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.callbackFlow
-import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.withContext
 import java.util.concurrent.ExecutionException
 import java.util.concurrent.TimeoutException
 import kotlin.coroutines.resume
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.conflate
-import kotlinx.coroutines.flow.first
-import kotlinx.coroutines.flow.flowOn
 
 /** A util for Satellite dialog */
 object SatelliteDialogUtils {
@@ -78,7 +70,7 @@
             coroutineScope.launch {
                 var isSatelliteModeOn = false
                 try {
-                    isSatelliteModeOn = requestIsSessionStarted(context)
+                    isSatelliteModeOn = requestIsEnabled(context)
                 } catch (e: InterruptedException) {
                     Log.w(TAG, "Error to get satellite status : $e")
                 } catch (e: ExecutionException) {
@@ -142,70 +134,6 @@
         }
     }
 
-    private suspend fun requestIsSessionStarted(
-            context: Context
-    ): Boolean = withContext(Default) {
-        getIsSessionStartedFlow(context).conflate().first()
-    }
-
-    /**
-     * Provides a Flow that emits the session state of the satellite modem. Updates are triggered
-     * when the modem state changes.
-     *
-     * @param defaultDispatcher The CoroutineDispatcher to use (Defaults to `Dispatchers.Default`).
-     * @return A Flow emitting `true` when the session is started and `false` otherwise.
-     */
-    private fun getIsSessionStartedFlow(
-            context: Context
-    ): Flow<Boolean> {
-        val satelliteManager: SatelliteManager? =
-                context.getSystemService(SatelliteManager::class.java)
-        if (satelliteManager == null) {
-            Log.w(TAG, "SatelliteManager is null")
-            return flowOf(false)
-        }
-
-        return callbackFlow {
-            val callback = SatelliteModemStateCallback { state ->
-                val isSessionStarted = isSatelliteSessionStarted(state)
-                Log.i(TAG, "Satellite modem state changed: state=$state"
-                        + ", isSessionStarted=$isSessionStarted")
-                trySend(isSessionStarted)
-            }
-
-            val registerResult = satelliteManager.registerForModemStateChanged(
-                    Default.asExecutor(),
-                    callback
-            )
-
-            if (registerResult != SatelliteManager.SATELLITE_RESULT_SUCCESS) {
-                // If the registration failed (e.g., device doesn't support satellite),
-                // SatelliteManager will not emit the current state by callback.
-                // We send `false` value by ourself to make sure the flow has initial value.
-                Log.w(TAG, "Failed to register for satellite modem state change: $registerResult")
-                trySend(false)
-            }
-
-            awaitClose { satelliteManager.unregisterForModemStateChanged(callback) }
-        }.flowOn(Default)
-    }
-
-
-    /**
-     * Check if the modem is in a satellite session.
-     *
-     * @param state The SatelliteModemState provided by the SatelliteManager.
-     * @return `true` if the modem is in a satellite session, `false` otherwise.
-     */
-    fun isSatelliteSessionStarted(@SatelliteManager.SatelliteModemState state: Int): Boolean {
-        return when (state) {
-            SatelliteManager.SATELLITE_MODEM_STATE_OFF,
-            SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE,
-            SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN -> false
-            else -> true
-        }
-    }
-
     const val TAG = "SatelliteDialogUtils"
 
     const val EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG: String =
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/satellite/SatelliteDialogUtilsTest.kt b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/satellite/SatelliteDialogUtilsTest.kt
index 31d7130..aeda1ed6 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/satellite/SatelliteDialogUtilsTest.kt
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/satellite/SatelliteDialogUtilsTest.kt
@@ -17,12 +17,11 @@
 package com.android.settingslib.satellite
 
 import android.content.Context
+import android.content.Intent
+import android.os.OutcomeReceiver
 import android.platform.test.annotations.RequiresFlagsEnabled
 import android.telephony.satellite.SatelliteManager
-import android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_ENABLING_SATELLITE
-import android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_OFF
-import android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_MODEM_ERROR
-import android.telephony.satellite.SatelliteModemStateCallback
+import android.telephony.satellite.SatelliteManager.SatelliteException
 import android.util.AndroidRuntimeException
 import androidx.test.core.app.ApplicationProvider
 import com.android.internal.telephony.flags.Flags
@@ -68,21 +67,26 @@
     @Test
     @RequiresFlagsEnabled(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
     fun mayStartSatelliteWarningDialog_satelliteIsOn_showWarningDialog() = runBlocking {
-        `when`(satelliteManager.registerForModemStateChanged(any(), any()))
+        `when`(
+                satelliteManager.requestIsEnabled(
+                        any(), any<OutcomeReceiver<Boolean, SatelliteManager.SatelliteException>>()
+                )
+        )
                 .thenAnswer { invocation ->
-                    val callback = invocation
-                            .getArgument<SatelliteModemStateCallback>(
+                    val receiver = invocation
+                            .getArgument<
+                                    OutcomeReceiver<Boolean, SatelliteManager.SatelliteException>>(
                                     1
                             )
-                    callback.onSatelliteModemStateChanged(SATELLITE_MODEM_STATE_ENABLING_SATELLITE)
+                    receiver.onResult(true)
                     null
                 }
 
         try {
             SatelliteDialogUtils.mayStartSatelliteWarningDialog(
                     context, coroutineScope, TYPE_IS_WIFI, allowClick = {
-                assertTrue(it)
-            })
+                        assertTrue(it)
+                })
         } catch (e: AndroidRuntimeException) {
             // Catch exception of starting activity .
         }
@@ -91,49 +95,68 @@
     @Test
     @RequiresFlagsEnabled(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
     fun mayStartSatelliteWarningDialog_satelliteIsOff_notShowWarningDialog() = runBlocking {
-        `when`(satelliteManager.registerForModemStateChanged(any(), any()))
+        `when`(
+                satelliteManager.requestIsEnabled(
+                        any(), any<OutcomeReceiver<Boolean, SatelliteManager.SatelliteException>>()
+                )
+        )
                 .thenAnswer { invocation ->
-                    val callback = invocation
-                            .getArgument<SatelliteModemStateCallback>(
+                    val receiver = invocation
+                            .getArgument<
+                                    OutcomeReceiver<Boolean, SatelliteManager.SatelliteException>>(
                                     1
                             )
-                    callback.onSatelliteModemStateChanged(SATELLITE_MODEM_STATE_OFF)
+                    receiver.onResult(false)
                     null
                 }
 
 
         SatelliteDialogUtils.mayStartSatelliteWarningDialog(
-                context, coroutineScope, TYPE_IS_WIFI, allowClick = {
-            assertFalse(it)
-        })
+            context, coroutineScope, TYPE_IS_WIFI, allowClick = {
+                assertFalse(it)
+            })
 
-        verify(context, Times(0)).startActivity(any())
+        verify(context, Times(0)).startActivity(any<Intent>())
     }
 
     @Test
     @RequiresFlagsEnabled(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
     fun mayStartSatelliteWarningDialog_noSatelliteManager_notShowWarningDialog() = runBlocking {
-        `when`(context.getSystemService(SatelliteManager::class.java)).thenReturn(null)
+        `when`(context.getSystemService(SatelliteManager::class.java))
+                .thenReturn(null)
 
         SatelliteDialogUtils.mayStartSatelliteWarningDialog(
-                context, coroutineScope, TYPE_IS_WIFI, allowClick = {
-            assertFalse(it)
-        })
+            context, coroutineScope, TYPE_IS_WIFI, allowClick = {
+                assertFalse(it)
+            })
 
-        verify(context, Times(0)).startActivity(any())
+        verify(context, Times(0)).startActivity(any<Intent>())
     }
 
     @Test
     @RequiresFlagsEnabled(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
     fun mayStartSatelliteWarningDialog_satelliteErrorResult_notShowWarningDialog() = runBlocking {
-        `when`(satelliteManager.registerForModemStateChanged(any(), any()))
-                .thenReturn(SATELLITE_RESULT_MODEM_ERROR)
+        `when`(
+                satelliteManager.requestIsEnabled(
+                        any(), any<OutcomeReceiver<Boolean, SatelliteManager.SatelliteException>>()
+                )
+        )
+                .thenAnswer { invocation ->
+                    val receiver = invocation
+                            .getArgument<
+                                    OutcomeReceiver<Boolean, SatelliteManager.SatelliteException>>(
+                                    1
+                            )
+                    receiver.onError(SatelliteException(SatelliteManager.SATELLITE_RESULT_ERROR))
+                    null
+                }
+
 
         SatelliteDialogUtils.mayStartSatelliteWarningDialog(
-                context, coroutineScope, TYPE_IS_WIFI, allowClick = {
-            assertFalse(it)
-        })
+            context, coroutineScope, TYPE_IS_WIFI, allowClick = {
+                assertFalse(it)
+            })
 
-        verify(context, Times(0)).startActivity(any())
+        verify(context, Times(0)).startActivity(any<Intent>())
     }
 }
