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" + } }