diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a4ac2d7..2282cdb 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -5142,6 +5142,14 @@
             android:permission="android.permission.NETWORK_SETTINGS">
         </activity>
 
+        <activity
+            android:name="com.android.settings.network.SatelliteWarningDialogActivity"
+            android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|smallestScreenSize"
+            android:excludeFromRecents="true"
+            android:exported="false"
+            android:theme="@style/Theme.SpaLib.Dialog">
+        </activity>
+
         <!-- This is the longest AndroidManifest.xml ever. -->
     </application>
 </manifest>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1e76855..6099549 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -11559,6 +11559,11 @@
     <string name="satellite_setting_summary_more_information">Satellite messaging may take longer and is available only in some areas. Weather and certain structures may affect your satellite connection. Calling by satellite isn\u2019t available. Emergency calls may still connect.\n\nIt may take some time for account changes to show in Settings. Contact your carrier for details.</string>
     <!-- more about satellite messaging [CHAR_LIMIT=NONE] -->
     <string name="more_about_satellite_messaging">More about satellite messaging</string>
+    <!-- Title for satellite warning dialog to avoid user using wifi/bluetooth/airplane mode [CHAR_LIMIT=NONE] -->
+    <string name="satellite_warning_dialog_title">Can’t turn on <xliff:g id="function" example="bluetooth">%1$s</xliff:g></string>
+    <!-- Content for satellite warning dialog to avoid user using wifi/bluetooth/airplane mode [CHAR_LIMIT=NONE] -->
+    <string name="satellite_warning_dialog_content">To turn on <xliff:g id="function" example="bluetooth">%1$s</xliff:g>, first end the satellite connection</string>
+
 
     <!-- Title for Apn settings in mobile network settings [CHAR LIMIT=60] -->
     <string name="mobile_network_apn_title">Access Point Names</string>
diff --git a/src/com/android/settings/network/SatelliteWarningDialogActivity.kt b/src/com/android/settings/network/SatelliteWarningDialogActivity.kt
new file mode 100644
index 0000000..a0d494c
--- /dev/null
+++ b/src/com/android/settings/network/SatelliteWarningDialogActivity.kt
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network
+
+import android.os.Bundle
+import android.view.WindowManager
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.text.style.TextAlign
+import com.android.settings.R
+import com.android.settingslib.spa.SpaDialogWindowTypeActivity
+import com.android.settingslib.spa.widget.dialog.AlertDialogButton
+import com.android.settingslib.spa.widget.dialog.SettingsAlertDialogContent
+
+/** A dialog to show the warning message when device is under satellite mode. */
+class SatelliteWarningDialogActivity : SpaDialogWindowTypeActivity() {
+    private var warningType = TYPE_IS_UNKNOWN
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        warningType = intent.getIntExtra(EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG, TYPE_IS_UNKNOWN)
+        if (warningType == TYPE_IS_UNKNOWN) {
+            finish()
+        }
+        super.onCreate(savedInstanceState)
+    }
+
+    override fun getDialogWindowType(): Int {
+        return WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW
+    }
+
+    @Composable
+    override fun Content() {
+        SettingsAlertDialogContent(
+            dismissButton = null,
+            confirmButton = AlertDialogButton(
+                getString(com.android.settingslib.R.string.okay)
+            ) { finish() },
+            title = String.format(
+                getString(R.string.satellite_warning_dialog_title),
+                getTypeString(warningType)
+            ),
+            text = {
+                Text(
+                    String.format(
+                        getString(R.string.satellite_warning_dialog_content),
+                        getTypeString(warningType)
+                    ),
+                    modifier = Modifier.fillMaxWidth(),
+                    textAlign = TextAlign.Center
+                )
+            })
+    }
+
+    private fun getTypeString(num: Int): String {
+        return when (num) {
+            TYPE_IS_WIFI -> getString(R.string.wifi)
+            TYPE_IS_BLUETOOTH -> getString(R.string.bluetooth)
+            TYPE_IS_AIRPLANE_MODE -> getString(R.string.airplane_mode)
+            else -> ""
+        }
+    }
+
+    companion object {
+        const val EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG: String =
+            "extra_type_of_satellite_warning_dialog"
+        const val TYPE_IS_UNKNOWN = -1
+        const val TYPE_IS_WIFI = 0
+        const val TYPE_IS_BLUETOOTH = 1
+        const val TYPE_IS_AIRPLANE_MODE = 2
+    }
+}
\ No newline at end of file
diff --git a/tests/spa_unit/src/com/android/settings/spa/network/SatelliteWarningDialogActivityTest.kt b/tests/spa_unit/src/com/android/settings/spa/network/SatelliteWarningDialogActivityTest.kt
new file mode 100644
index 0000000..04e83f5
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/spa/network/SatelliteWarningDialogActivityTest.kt
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.spa.network
+
+import android.content.Context
+import android.content.Intent
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onNodeWithText
+import androidx.lifecycle.Lifecycle
+import androidx.test.core.app.ActivityScenario
+import androidx.test.core.app.ActivityScenario.launch
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.R
+import com.android.settings.network.SatelliteWarningDialogActivity
+import com.android.settings.network.SatelliteWarningDialogActivity.Companion.EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG
+import com.android.settings.network.SatelliteWarningDialogActivity.Companion.TYPE_IS_AIRPLANE_MODE
+import com.android.settings.network.SatelliteWarningDialogActivity.Companion.TYPE_IS_BLUETOOTH
+import com.android.settings.network.SatelliteWarningDialogActivity.Companion.TYPE_IS_UNKNOWN
+import com.android.settings.network.SatelliteWarningDialogActivity.Companion.TYPE_IS_WIFI
+import org.junit.Assert.assertTrue
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class SatelliteWarningDialogActivityTest {
+    @get:Rule
+    val composeTestRule = createAndroidComposeRule<SatelliteWarningDialogActivity>()
+    val context: Context = ApplicationProvider.getApplicationContext()
+
+    @Test
+    fun launchActivity_checkExtraValue_typeIsWifi() {
+        val scenario = launchDialogActivity(TYPE_IS_WIFI)
+
+        scenario.onActivity { activity ->
+            assert(
+                activity.intent.getIntExtra(
+                    EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG,
+                    TYPE_IS_UNKNOWN
+                ) == TYPE_IS_WIFI
+            )
+        }
+        scenario.close()
+    }
+
+    @Test
+    fun launchActivity_checkExtraValue_typeIsBluetooth() {
+        val scenario = launchDialogActivity(TYPE_IS_BLUETOOTH)
+
+        scenario.onActivity { activity ->
+            assert(
+                activity.intent.getIntExtra(
+                    EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG,
+                    TYPE_IS_UNKNOWN
+                ) == TYPE_IS_BLUETOOTH
+            )
+        }
+        scenario.close()
+    }
+
+    @Test
+    fun launchActivity_unknownType_destroyActivity() {
+        val scenario = launchDialogActivity(TYPE_IS_UNKNOWN)
+
+        assertTrue(scenario.state.isAtLeast(Lifecycle.State.DESTROYED))
+        scenario.close()
+    }
+
+    @Test
+    fun testDialogIsExisted() {
+        val scenario = launchDialogActivity(TYPE_IS_WIFI)
+
+        composeTestRule.onNodeWithText(context.getString(com.android.settingslib.R.string.okay))
+            .assertIsDisplayed()
+        scenario.close()
+    }
+
+    @Test
+    fun testDialogTitle_titleIsIncludeWifi() {
+        val scenario = launchDialogActivity(TYPE_IS_WIFI)
+
+        composeTestRule.onNodeWithText(
+            String.format(
+                context.getString(R.string.satellite_warning_dialog_title),
+                context.getString(R.string.wifi),
+            )
+        ).assertIsDisplayed()
+        scenario.close()
+    }
+
+    @Test
+    fun testDialogTitle_titleIsIncludeAirplaneMode() {
+        val scenario = launchDialogActivity(TYPE_IS_AIRPLANE_MODE)
+
+        composeTestRule.onNodeWithText(
+            String.format(
+                context.getString(R.string.satellite_warning_dialog_title),
+                context.getString(R.string.airplane_mode),
+            )
+        ).assertIsDisplayed()
+        scenario.close()
+    }
+
+    private fun launchDialogActivity(type: Int): ActivityScenario<SatelliteWarningDialogActivity> = launch(
+        Intent(
+            context,
+            SatelliteWarningDialogActivity::class.java
+        ).putExtra(EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG, type)
+    )
+}
