[Catalyst] Migrate SIMs entry point
NO_IFTTT=Catalyst only
Bug: 368355368
Flag: com.android.settings.flags.catalyst_network_provider_and_internet_screen
Test: Manual
Change-Id: I2f3526c1ccb50490b955ad5f98c19d9ce2f5f21d
diff --git a/src/com/android/settings/network/AirplaneModePreference.kt b/src/com/android/settings/network/AirplaneModePreference.kt
index d9d1bd8..0899add 100644
--- a/src/com/android/settings/network/AirplaneModePreference.kt
+++ b/src/com/android/settings/network/AirplaneModePreference.kt
@@ -28,8 +28,7 @@
// LINT.IfChange
class AirplaneModePreference :
- SwitchPreference(KEY, R.string.airplane_mode),
- PreferenceAvailabilityProvider {
+ SwitchPreference(KEY, R.string.airplane_mode), PreferenceAvailabilityProvider {
override val icon: Int
@DrawableRes get() = R.drawable.ic_airplanemode_active
@@ -40,11 +39,13 @@
get() = SensitivityLevel.HIGH_SENSITIVITY
override fun isAvailable(context: Context) =
- (context.resources.getBoolean(R.bool.config_show_toggle_airplane)
- && !context.packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK))
+ (context.resources.getBoolean(R.bool.config_show_toggle_airplane) &&
+ !context.packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK))
companion object {
const val KEY = Settings.Global.AIRPLANE_MODE_ON
+
+ fun Context.isAirplaneModeOn() = SettingsGlobalStore.get(this).getBoolean(KEY) == true
}
}
// LINT.ThenChange(AirplaneModePreferenceController.java)
diff --git a/src/com/android/settings/network/MobileNetworkListScreen.kt b/src/com/android/settings/network/MobileNetworkListScreen.kt
index 2e05e3a..9f629c7 100644
--- a/src/com/android/settings/network/MobileNetworkListScreen.kt
+++ b/src/com/android/settings/network/MobileNetworkListScreen.kt
@@ -17,15 +17,49 @@
import android.content.Context
import android.os.UserManager
+import android.telephony.SubscriptionInfo
+import android.telephony.SubscriptionManager
+import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener
+import androidx.preference.Preference
+import androidx.preference.Preference.OnPreferenceClickListener
import com.android.settings.PreferenceRestrictionMixin
import com.android.settings.R
import com.android.settings.flags.Flags
+import com.android.settings.network.AirplaneModePreference.Companion.isAirplaneModeOn
+import com.android.settings.network.SubscriptionUtil.getUniqueSubscriptionDisplayName
+import com.android.settings.network.telephony.SimRepository
+import com.android.settings.network.telephony.SubscriptionRepository
+import com.android.settings.network.telephony.euicc.EuiccRepository
+import com.android.settings.spa.network.getAddSimIntent
+import com.android.settings.spa.network.startAddSimFlow
+import com.android.settingslib.RestrictedPreference
+import com.android.settingslib.datastore.HandlerExecutor
+import com.android.settingslib.datastore.KeyedObserver
+import com.android.settingslib.datastore.SettingsGlobalStore
+import com.android.settingslib.metadata.PreferenceAvailabilityProvider
+import com.android.settingslib.metadata.PreferenceLifecycleContext
+import com.android.settingslib.metadata.PreferenceLifecycleProvider
+import com.android.settingslib.metadata.PreferenceMetadata
+import com.android.settingslib.metadata.PreferenceSummaryProvider
import com.android.settingslib.metadata.ProvidePreferenceScreen
import com.android.settingslib.metadata.preferenceHierarchy
+import com.android.settingslib.preference.PreferenceScreenBinding
import com.android.settingslib.preference.PreferenceScreenCreator
@ProvidePreferenceScreen
-class MobileNetworkListScreen : PreferenceScreenCreator, PreferenceRestrictionMixin {
+class MobileNetworkListScreen :
+ PreferenceScreenCreator,
+ PreferenceScreenBinding,
+ PreferenceAvailabilityProvider,
+ PreferenceSummaryProvider,
+ PreferenceLifecycleProvider,
+ PreferenceRestrictionMixin,
+ OnPreferenceClickListener {
+
+ private var airplaneModeObserver: KeyedObserver<String>? = null
+ private var subscriptionInfoList: List<SubscriptionInfo>? = null
+ private var onSubscriptionsChangedListener: OnSubscriptionsChangedListener? = null
+
override val key: String
get() = KEY
@@ -38,11 +72,87 @@
override val keywords: Int
get() = R.string.keywords_more_mobile_networks
- override fun isEnabled(context: Context) = super<PreferenceRestrictionMixin>.isEnabled(context)
+ override fun intent(context: Context) = getAddSimIntent()
+
+ override fun getSummary(context: Context): CharSequence? {
+ val list = getSelectableSubscriptionInfoList(context)
+ return when {
+ list.isNotEmpty() ->
+ list
+ .map { getUniqueSubscriptionDisplayName(it, context).toString() }
+ .distinct()
+ .joinToString(", ")
+ EuiccRepository(context).showEuiccSettings() ->
+ context.getString(R.string.mobile_network_summary_add_a_network)
+ else -> null
+ }
+ }
+
+ override fun isAvailable(context: Context) =
+ SimRepository(context).showMobileNetworkPageEntrance()
+
+ override fun isEnabled(context: Context) =
+ super<PreferenceRestrictionMixin>.isEnabled(context) &&
+ !context.isAirplaneModeOn() &&
+ (getSelectableSubscriptionInfoList(context).isNotEmpty() ||
+ EuiccRepository(context).showEuiccSettings())
+
+ private fun getSelectableSubscriptionInfoList(context: Context): List<SubscriptionInfo> =
+ subscriptionInfoList
+ ?: SubscriptionRepository(context).getSelectableSubscriptionInfoList().also {
+ subscriptionInfoList = it
+ }
override val restrictionKeys
get() = arrayOf(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)
+ override val useAdminDisabledSummary
+ get() = true
+
+ override fun createWidget(context: Context) = RestrictedPreference(context)
+
+ override fun bind(preference: Preference, metadata: PreferenceMetadata) {
+ super.bind(preference, metadata)
+ preference.onPreferenceClickListener = this
+ }
+
+ override fun onPreferenceClick(preference: Preference): Boolean {
+ 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
+ return true
+ }
+ return false // start fragment
+ }
+
+ override fun onCreate(context: PreferenceLifecycleContext) {
+ val executor = HandlerExecutor.main
+ val observer = KeyedObserver<String> { _, _ -> context.notifyPreferenceChange(KEY) }
+ airplaneModeObserver = observer
+ SettingsGlobalStore.get(context).addObserver(AirplaneModePreference.KEY, observer, executor)
+ context.getSystemService(SubscriptionManager::class.java)?.let {
+ val listener =
+ object : OnSubscriptionsChangedListener() {
+ override fun onSubscriptionsChanged() {
+ subscriptionInfoList = null // invalid cache
+ context.notifyPreferenceChange(KEY)
+ }
+ }
+ it.addOnSubscriptionsChangedListener(executor, listener)
+ onSubscriptionsChangedListener = listener
+ }
+ }
+
+ override fun onDestroy(context: PreferenceLifecycleContext) {
+ airplaneModeObserver?.let {
+ SettingsGlobalStore.get(context).removeObserver(AirplaneModePreference.KEY, it)
+ }
+ context.getSystemService(SubscriptionManager::class.java)?.apply {
+ onSubscriptionsChangedListener?.let { removeOnSubscriptionsChangedListener(it) }
+ }
+ }
+
override fun isFlagEnabled(context: Context) = Flags.catalystMobileNetworkList()
override fun hasCompleteHierarchy() = false
diff --git a/src/com/android/settings/network/MobileNetworkSummaryController.kt b/src/com/android/settings/network/MobileNetworkSummaryController.kt
index 8cf9bec..62c5766 100644
--- a/src/com/android/settings/network/MobileNetworkSummaryController.kt
+++ b/src/com/android/settings/network/MobileNetworkSummaryController.kt
@@ -41,6 +41,7 @@
* - Has subscriptions: click action takes you to a page listing the subscriptions, and the summary
* text gives the count of SIMs
*/
+// LINT.IfChange
class MobileNetworkSummaryController
@JvmOverloads
constructor(
@@ -119,3 +120,4 @@
)
}
}
+// LINT.ThenChange(MobileNetworkListScreen.kt)
diff --git a/src/com/android/settings/network/NetworkDashboardScreen.kt b/src/com/android/settings/network/NetworkDashboardScreen.kt
index 3fb2cbe..5dadcaf 100644
--- a/src/com/android/settings/network/NetworkDashboardScreen.kt
+++ b/src/com/android/settings/network/NetworkDashboardScreen.kt
@@ -46,6 +46,7 @@
override fun getPreferenceHierarchy(context: Context) =
preferenceHierarchy(this) {
+ +MobileNetworkListScreen.KEY order -15
+DataSaverScreen.KEY order 10
}
diff --git a/src/com/android/settings/spa/network/SimsSection.kt b/src/com/android/settings/spa/network/SimsSection.kt
index 7d88748..fa7fa44 100644
--- a/src/com/android/settings/spa/network/SimsSection.kt
+++ b/src/com/android/settings/spa/network/SimsSection.kt
@@ -137,9 +137,9 @@
}
}
-fun startAddSimFlow(context: Context) {
- val intent = Intent(EuiccManager.ACTION_PROVISION_EMBEDDED_SUBSCRIPTION)
- intent.setPackage(Utils.PHONE_PACKAGE_NAME)
- intent.putExtra(EuiccManager.EXTRA_FORCE_PROVISION, true)
- context.startActivity(intent)
+fun startAddSimFlow(context: Context) = context.startActivity(getAddSimIntent())
+
+fun getAddSimIntent() = Intent(EuiccManager.ACTION_PROVISION_EMBEDDED_SUBSCRIPTION).apply {
+ setPackage(Utils.PHONE_PACKAGE_NAME)
+ putExtra(EuiccManager.EXTRA_FORCE_PROVISION, true)
}