diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5af29f9c53f..b8ba1684ce6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -12768,6 +12768,10 @@ Data usage charges may apply.
see all apps
Supported apps on your phone
+
+ Can\u2019t add a SIM
+
+ End the satellite connection before you add a SIM
Access Point Names
diff --git a/src/com/android/settings/network/MobileNetworkListScreen.kt b/src/com/android/settings/network/MobileNetworkListScreen.kt
index 18dc8970123..ebbe9758999 100644
--- a/src/com/android/settings/network/MobileNetworkListScreen.kt
+++ b/src/com/android/settings/network/MobileNetworkListScreen.kt
@@ -25,6 +25,7 @@ import androidx.preference.Preference.OnPreferenceClickListener
import com.android.settings.R
import com.android.settings.flags.Flags
import com.android.settings.network.AirplaneModePreference.Companion.isAirplaneModeOn
+import com.android.settings.network.SatelliteRepository.Companion.isSatelliteOn
import com.android.settings.network.SubscriptionUtil.getUniqueSubscriptionDisplayName
import com.android.settings.network.telephony.SimRepository
import com.android.settings.network.telephony.SubscriptionRepository
@@ -32,6 +33,7 @@ import com.android.settings.network.telephony.euicc.EuiccRepository
import com.android.settings.restriction.PreferenceRestrictionMixin
import com.android.settings.spa.network.getAddSimIntent
import com.android.settings.spa.network.startAddSimFlow
+import com.android.settings.spa.network.startSatelliteWarningDialogFlow
import com.android.settingslib.RestrictedPreference
import com.android.settingslib.datastore.HandlerExecutor
import com.android.settingslib.datastore.KeyedObserver
@@ -120,7 +122,11 @@ class MobileNetworkListScreen :
val summary = preference.summary ?: return true // no-op
val context = preference.context
if (summary == context.getString(R.string.mobile_network_summary_add_a_network)) {
- startAddSimFlow(context) // start intent
+ if (isSatelliteOn(context, 3000)) {
+ startSatelliteWarningDialogFlow(context) // start intent
+ } else {
+ startAddSimFlow(context) // start intent
+ }
return true
}
return false // start fragment
diff --git a/src/com/android/settings/network/MobileNetworkSummaryController.kt b/src/com/android/settings/network/MobileNetworkSummaryController.kt
index 62c57661809..850a08dc0c7 100644
--- a/src/com/android/settings/network/MobileNetworkSummaryController.kt
+++ b/src/com/android/settings/network/MobileNetworkSummaryController.kt
@@ -27,6 +27,7 @@ import com.android.settings.dashboard.DashboardFragment
import com.android.settings.network.telephony.SimRepository
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settings.spa.network.startAddSimFlow
+import com.android.settings.spa.network.startSatelliteWarningDialogFlow
import com.android.settingslib.RestrictedPreference
import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
import com.android.settingslib.spaprivileged.settingsprovider.settingsGlobalBooleanFlow
@@ -51,11 +52,13 @@ constructor(
MobileNetworkSummaryRepository(context),
private val airplaneModeOnFlow: Flow =
context.settingsGlobalBooleanFlow(Settings.Global.AIRPLANE_MODE_ON),
+ private val satelliteIsStartedFlow: Flow = SatelliteRepository(context).getIsSessionStartedFlow()
) : BasePreferenceController(context, preferenceKey) {
private val metricsFeatureProvider = featureFactory.metricsFeatureProvider
private var preference: RestrictedPreference? = null
private var isAirplaneModeOn = false
+ private var isSatelliteOn = false
override fun getAvailabilityStatus() =
if (SimRepository(mContext).showMobileNetworkPageEntrance()) AVAILABLE
@@ -74,6 +77,9 @@ constructor(
isAirplaneModeOn = it
updateEnabled()
}
+ satelliteIsStartedFlow.collectLatestWithLifecycle(viewLifecycleOwner) {
+ isSatelliteOn = it
+ }
}
private fun update(state: MobileNetworkSummaryRepository.SubscriptionsState) {
@@ -87,7 +93,10 @@ constructor(
preference.onPreferenceClickListener =
Preference.OnPreferenceClickListener {
logPreferenceClick()
- startAddSimFlow(context)
+ if (isSatelliteOn)
+ startSatelliteWarningDialogFlow(context)
+ else
+ startAddSimFlow(context)
true
}
}
diff --git a/src/com/android/settings/network/SatelliteWarningDialogActivity.kt b/src/com/android/settings/network/SatelliteWarningDialogActivity.kt
index 3f1d416951d..b86e4f1210e 100644
--- a/src/com/android/settings/network/SatelliteWarningDialogActivity.kt
+++ b/src/com/android/settings/network/SatelliteWarningDialogActivity.kt
@@ -32,11 +32,20 @@ import com.android.settingslib.wifi.WifiUtils
/** A dialog to show the warning message when device is under satellite mode. */
class SatelliteWarningDialogActivity : SpaDialogWindowTypeActivity() {
private var warningType = TYPE_IS_UNKNOWN
-
+ private var customizedContent: HashMap = HashMap()
+ private var isCustomizedContent = false
override fun onCreate(savedInstanceState: Bundle?) {
- warningType = intent.getIntExtra(EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG, TYPE_IS_UNKNOWN)
- if (warningType == TYPE_IS_UNKNOWN) {
- finish()
+ isCustomizedContent = intent.hasExtra(EXTRA_TYPE_OF_SATELLITE_CUSTOMIZED_CONTENT)
+ if (isCustomizedContent) {
+ customizedContent =
+ intent.getSerializableExtra(EXTRA_TYPE_OF_SATELLITE_CUSTOMIZED_CONTENT)
+ as HashMap
+ } else {
+ warningType =
+ intent.getIntExtra(EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG, TYPE_IS_UNKNOWN)
+ if (warningType == TYPE_IS_UNKNOWN) {
+ finish()
+ }
}
super.onCreate(savedInstanceState)
}
@@ -48,23 +57,52 @@ class SatelliteWarningDialogActivity : SpaDialogWindowTypeActivity() {
)
}
+ fun getBodyString(): String {
+ if (isCustomizedContent) {
+ // For customized content
+ return customizedContent.get(CUSTOM_CONTENT_DESCRIPTION).toString()
+ } else {
+ // For wifi, bluetooth, airplane mode
+ return String.format(
+ getString(R.string.satellite_warning_dialog_content),
+ getTypeString(warningType)
+ )
+ }
+ }
+
+ fun getButtonString(): String {
+ if (isCustomizedContent)
+ // For customized content
+ return customizedContent.get(CUSTOM_CONTENT_BUTTON_NAME).toString()
+ else
+ // For wifi, bluetooth, airplane mode
+ return getString(com.android.settingslib.R.string.okay)
+ }
+
+ fun getTitleString(): String {
+ if (isCustomizedContent)
+ // For customized content
+ return customizedContent.get(CUSTOM_CONTENT_TITLE).toString()
+ else
+ // For wifi, bluetooth, airplane mode
+ return String.format(
+ getString(R.string.satellite_warning_dialog_title),
+ getTypeString(warningType)
+ )
+
+ }
+
@Composable
override fun Content() {
SettingsAlertDialogContent(
dismissButton = null,
confirmButton = AlertDialogButton(
- getString(com.android.settingslib.R.string.okay)
+ getButtonString()
) { finish() },
- title = String.format(
- getString(R.string.satellite_warning_dialog_title),
- getTypeString(warningType)
- ),
+ title = getTitleString(),
text = {
Text(
- String.format(
- getString(R.string.satellite_warning_dialog_content),
- getTypeString(warningType)
- ),
+ getBodyString(),
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center
)
@@ -83,9 +121,14 @@ class SatelliteWarningDialogActivity : SpaDialogWindowTypeActivity() {
companion object {
const val EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG: String =
"extra_type_of_satellite_warning_dialog"
+ const val EXTRA_TYPE_OF_SATELLITE_CUSTOMIZED_CONTENT: String =
+ "extra_type_of_satellite_customized_content"
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
+ const val CUSTOM_CONTENT_TITLE = 0
+ const val CUSTOM_CONTENT_DESCRIPTION = 1
+ const val CUSTOM_CONTENT_BUTTON_NAME = 2
}
}
\ No newline at end of file
diff --git a/src/com/android/settings/spa/network/SimsSection.kt b/src/com/android/settings/spa/network/SimsSection.kt
index fa7fa448950..cd1541fb4a1 100644
--- a/src/com/android/settings/spa/network/SimsSection.kt
+++ b/src/com/android/settings/spa/network/SimsSection.kt
@@ -35,6 +35,10 @@ import androidx.compose.ui.res.stringResource
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settings.R
import com.android.settings.Utils
+import com.android.settings.network.SatelliteWarningDialogActivity
+import com.android.settings.network.SatelliteWarningDialogActivity.Companion.CUSTOM_CONTENT_BUTTON_NAME
+import com.android.settings.network.SatelliteWarningDialogActivity.Companion.CUSTOM_CONTENT_DESCRIPTION
+import com.android.settings.network.SatelliteWarningDialogActivity.Companion.CUSTOM_CONTENT_TITLE
import com.android.settings.network.SubscriptionUtil
import com.android.settings.network.telephony.MobileNetworkUtils
import com.android.settings.network.telephony.SubscriptionActivationRepository
@@ -143,3 +147,14 @@ fun getAddSimIntent() = Intent(EuiccManager.ACTION_PROVISION_EMBEDDED_SUBSCRIPTI
setPackage(Utils.PHONE_PACKAGE_NAME)
putExtra(EuiccManager.EXTRA_FORCE_PROVISION, true)
}
+
+fun startSatelliteWarningDialogFlow(context: Context) = context.startActivity(getSatelliteWarningDialogIntent(context))
+
+fun getSatelliteWarningDialogIntent(context: Context) = Intent(context,
+ SatelliteWarningDialogActivity::class.java).apply {
+ val content = HashMap()
+ content.put(CUSTOM_CONTENT_TITLE, context.getString(R.string.title_satellite_dialog_for_sim_restriction))
+ content.put(CUSTOM_CONTENT_DESCRIPTION, context.getString(R.string.description_satellite_dialog_for_sim_restriction))
+ content.put(CUSTOM_CONTENT_BUTTON_NAME, context.getString(R.string.okay))
+ putExtra(SatelliteWarningDialogActivity.EXTRA_TYPE_OF_SATELLITE_CUSTOMIZED_CONTENT, content)
+}
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
index 04e83f5daf8..8defdb1ae05 100644
--- a/tests/spa_unit/src/com/android/settings/spa/network/SatelliteWarningDialogActivityTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/network/SatelliteWarningDialogActivityTest.kt
@@ -28,6 +28,10 @@ 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.CUSTOM_CONTENT_BUTTON_NAME
+import com.android.settings.network.SatelliteWarningDialogActivity.Companion.CUSTOM_CONTENT_DESCRIPTION
+import com.android.settings.network.SatelliteWarningDialogActivity.Companion.CUSTOM_CONTENT_TITLE
+import com.android.settings.network.SatelliteWarningDialogActivity.Companion.EXTRA_TYPE_OF_SATELLITE_CUSTOMIZED_CONTENT
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
@@ -74,6 +78,33 @@ class SatelliteWarningDialogActivityTest {
scenario.close()
}
+ @Test
+ fun launchActivity_checkCustomizedContent_hasContentIntent() {
+ val scenario = launchCustomizedDialogActivity()
+
+ scenario.onActivity { activity ->
+ assert(activity.intent.hasExtra(EXTRA_TYPE_OF_SATELLITE_CUSTOMIZED_CONTENT))
+ }
+ scenario.close()
+ }
+
+ @Test
+ fun testCustomizedDialogIsExisted() {
+ val scenario = launchCustomizedDialogActivity()
+
+ composeTestRule.onNodeWithText(
+ getSatelliteTestContent().get(CUSTOM_CONTENT_BUTTON_NAME).toString()
+ ).assertIsDisplayed()
+ composeTestRule.onNodeWithText(
+ getSatelliteTestContent().get(CUSTOM_CONTENT_TITLE).toString()
+ ).assertIsDisplayed()
+ composeTestRule.onNodeWithText(
+ getSatelliteTestContent().get(CUSTOM_CONTENT_DESCRIPTION).toString()
+ ).assertIsDisplayed()
+
+ scenario.close()
+ }
+
@Test
fun launchActivity_unknownType_destroyActivity() {
val scenario = launchDialogActivity(TYPE_IS_UNKNOWN)
@@ -117,10 +148,31 @@ class SatelliteWarningDialogActivityTest {
scenario.close()
}
- private fun launchDialogActivity(type: Int): ActivityScenario = launch(
- Intent(
+ private fun launchDialogActivity(type: Int): ActivityScenario =
+ launch(Intent(
context,
SatelliteWarningDialogActivity::class.java
).putExtra(EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG, type)
)
+
+ private fun launchCustomizedDialogActivity(): ActivityScenario =
+ launch(Intent(
+ context,
+ SatelliteWarningDialogActivity::class.java
+ ).putExtra(EXTRA_TYPE_OF_SATELLITE_CUSTOMIZED_CONTENT, getSatelliteTestContent())
+ )
+
+ private fun getSatelliteTestContent(): HashMap {
+ val content = HashMap()
+ content.put(CUSTOM_CONTENT_TITLE, TEST_TITLE)
+ content.put(CUSTOM_CONTENT_DESCRIPTION, TEST_DESCRIPTION)
+ content.put(CUSTOM_CONTENT_BUTTON_NAME, TEST_BUTTON_NAME)
+ return content
+ }
+
+ companion object {
+ const val TEST_TITLE = "TEST_TITLE"
+ const val TEST_DESCRIPTION = "TEST_DESCRIPTION"
+ const val TEST_BUTTON_NAME = "TEST_BUTTON_NAME"
+ }
}