To gray out the next button if the user does not select two sim

- gray out the next button
- add the format for phone number

Bug: 329535069
Test: manual test. To verify the UI
atest SimOnboardingSelectSimTest

Change-Id: I8dd62e3da9567a518d22d615f6974659900ef1bb
diff --git a/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt b/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt
index 94e4a88..f702894 100644
--- a/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt
+++ b/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt
@@ -56,12 +56,12 @@
         imageVector = Icons.Outlined.SignalCellularAlt,
         title = stringResource(R.string.sim_onboarding_label_sim_title),
         actionButton = BottomAppBarButton(
-            stringResource(R.string.sim_onboarding_next),
-            nextAction
+            text = stringResource(R.string.sim_onboarding_next),
+            onClick = nextAction
         ),
         dismissButton = BottomAppBarButton(
-            stringResource(R.string.cancel),
-            cancelAction
+            text = stringResource(R.string.cancel),
+            onClick = cancelAction
         ),
     ) {
         LabelSimBody(onboardingService)
diff --git a/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt b/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt
index 4fad332..0306aad 100644
--- a/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt
+++ b/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt
@@ -59,12 +59,12 @@
         imageVector = Icons.Outlined.SignalCellularAlt,
         title = stringResource(id = R.string.sim_onboarding_primary_sim_title),
         actionButton = BottomAppBarButton(
-            stringResource(id = R.string.done),
-            nextAction
+            text = stringResource(id = R.string.done),
+            onClick = nextAction
         ),
         dismissButton = BottomAppBarButton(
-            stringResource(id = R.string.cancel),
-            cancelAction
+            text = stringResource(id = R.string.cancel),
+            onClick = cancelAction
         ),
     ) {
         val callsSelectedId = rememberSaveable {
diff --git a/src/com/android/settings/spa/network/SimOnboardingSelectSim.kt b/src/com/android/settings/spa/network/SimOnboardingSelectSim.kt
index 5e71b12..b033a28 100644
--- a/src/com/android/settings/spa/network/SimOnboardingSelectSim.kt
+++ b/src/com/android/settings/spa/network/SimOnboardingSelectSim.kt
@@ -16,12 +16,12 @@
 
 package com.android.settings.spa.network
 
-import android.util.Log
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.padding
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.outlined.SignalCellularAlt
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.saveable.rememberSaveable
@@ -29,7 +29,6 @@
 import androidx.compose.ui.res.stringResource
 import com.android.settings.R
 import com.android.settings.network.SimOnboardingService
-import com.android.settings.sim.SimDialogActivity
 import com.android.settingslib.spa.framework.theme.SettingsDimension
 import com.android.settingslib.spa.widget.preference.CheckboxPreference
 import com.android.settingslib.spa.widget.preference.CheckboxPreferenceModel
@@ -46,44 +45,47 @@
     cancelAction: () -> Unit,
     onboardingService: SimOnboardingService
 ) {
+    var actionButtonController = rememberSaveable { mutableStateOf(false) }
+
     SuwScaffold(
         imageVector = Icons.Outlined.SignalCellularAlt,
         title = stringResource(id = R.string.sim_onboarding_select_sim_title),
         actionButton = BottomAppBarButton(
-            stringResource(id = R.string.sim_onboarding_next),
-            nextAction
+            text = stringResource(id = R.string.sim_onboarding_next),
+            enabled = actionButtonController.value,
+            onClick = nextAction
         ),
         dismissButton = BottomAppBarButton(
-            stringResource(id = R.string.cancel),
-            cancelAction
+            text = stringResource(id = R.string.cancel),
+            onClick = cancelAction
         ),
     ) {
-        selectSimBody(onboardingService)
+        SelectSimBody(onboardingService, actionButtonController)
     }
 }
 
 @Composable
-private fun selectSimBody(onboardingService: SimOnboardingService) {
+private fun SelectSimBody(
+    onboardingService: SimOnboardingService,
+    isFinished: MutableState<Boolean>
+) {
     Column(Modifier.padding(SettingsDimension.itemPadding)) {
         SettingsBody(stringResource(id = R.string.sim_onboarding_select_sim_msg))
     }
-    var isFinished = rememberSaveable { mutableStateOf(false) }
     isFinished.value = onboardingService.isSimSelectionFinished
     for (subInfo in onboardingService.getSelectableSubscriptionInfoList()) {
         var title = onboardingService.getSubscriptionInfoDisplayName(subInfo)
-        var summaryNumber =
-            subInfo.number // TODO using the SubscriptionUtil.getFormattedPhoneNumber
+        val phoneNumber = phoneNumber(subInfo)
         var checked = rememberSaveable {
             mutableStateOf(
                 onboardingService.getSelectedSubscriptionInfoList().contains(subInfo)
             )
         }
-
         CheckboxPreference(remember {
             object : CheckboxPreferenceModel {
                 override val title = title
                 override val summary: () -> String
-                    get() = { summaryNumber }
+                    get() = { phoneNumber.value ?: "" }
                 override val checked = { checked.value }
                 override val onCheckedChange = { newChecked: Boolean ->
                     checked.value = newChecked
diff --git a/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingSelectSimTest.kt b/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingSelectSimTest.kt
index e063f69..5b7778e 100644
--- a/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingSelectSimTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/network/SimOnboardingSelectSimTest.kt
@@ -18,19 +18,31 @@
 
 import android.content.Context
 import android.telephony.SubscriptionInfo
+import android.telephony.SubscriptionManager
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.compose.ui.test.assertHasClickAction
 import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.assertIsOn
+import androidx.compose.ui.test.hasText
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performClick
+import androidx.lifecycle.testing.TestLifecycleOwner
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.android.settings.R
 import com.android.settings.network.SimOnboardingService
+import com.android.settingslib.spa.testutils.waitUntilExists
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doAnswer
 import org.mockito.kotlin.doReturn
 import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
 import org.mockito.kotlin.stub
 import org.mockito.kotlin.verify
 
@@ -38,8 +50,20 @@
 class SimOnboardingSelectSimTest {
     @get:Rule
     val composeTestRule = createComposeRule()
+    private val mockSubscriptionManager = mock<SubscriptionManager> {
+        on { addOnSubscriptionsChangedListener(any(), any()) } doAnswer {
+            val listener = it.arguments[1] as SubscriptionManager.OnSubscriptionsChangedListener
+            listener.onSubscriptionsChanged()
+        }
+        on { getPhoneNumber(SUB_ID_1) } doReturn NUMBER_1
+        on { getPhoneNumber(SUB_ID_2) } doReturn NUMBER_2
+        on { getPhoneNumber(SUB_ID_3) } doReturn NUMBER_3
+    }
 
-    private val context: Context = ApplicationProvider.getApplicationContext()
+    private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
+        on { getSystemService(SubscriptionManager::class.java) } doReturn mockSubscriptionManager
+    }
+
     private var mockSimOnboardingService = mock<SimOnboardingService> {
         on { targetSubId }.doReturn(-1)
         on { targetSubInfo }.doReturn(null)
@@ -78,6 +102,24 @@
 
     @Test
     fun simOnboardingSelectSimImpl_clickNextAction_verifyNextAction() {
+        mockSimOnboardingService.stub {
+            on { targetSubId }.doReturn(SUB_ID_1)
+            on { targetSubInfo }.doReturn(SUB_INFO_1)
+            on { availableSubInfoList }.doReturn(listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_3))
+            on { activeSubInfoList }.doReturn(listOf(SUB_INFO_2, SUB_INFO_3))
+            on { getSelectableSubscriptionInfoList() }.doReturn(
+                listOf(
+                    SUB_INFO_1,
+                    SUB_INFO_2,
+                    SUB_INFO_3
+                )
+            )
+            on { getSubscriptionInfoDisplayName(SUB_INFO_1) }.doReturn(DISPLAY_NAME_1)
+            on { getSubscriptionInfoDisplayName(SUB_INFO_2) }.doReturn(DISPLAY_NAME_2)
+            on { getSubscriptionInfoDisplayName(SUB_INFO_3) }.doReturn(DISPLAY_NAME_3)
+            on {isSimSelectionFinished}.doReturn(true)
+        }
+
         composeTestRule.setContent {
             SimOnboardingSelectSimImpl(nextAction, cancelAction, mockSimOnboardingService)
         }
@@ -85,7 +127,7 @@
         composeTestRule.onNodeWithText(context.getString(R.string.sim_onboarding_next))
             .performClick()
 
-        verify(nextAction)
+        verify(nextAction)()
     }
 
     @Test
@@ -97,7 +139,7 @@
         composeTestRule.onNodeWithText(context.getString(R.string.cancel))
             .performClick()
 
-        verify(cancelAction)
+        verify(cancelAction)()
     }
 
     @Test
@@ -120,15 +162,23 @@
         }
 
         composeTestRule.setContent {
-            SimOnboardingSelectSimImpl(nextAction, cancelAction, mockSimOnboardingService)
+            CompositionLocalProvider(
+                LocalContext provides context,
+                LocalLifecycleOwner provides TestLifecycleOwner(),
+            ) {
+                SimOnboardingSelectSimImpl(nextAction, cancelAction, mockSimOnboardingService)
+            }
         }
+//        composeTestRule.setContent {
+//            SimOnboardingSelectSimImpl(nextAction, cancelAction, mockSimOnboardingService)
+//        }
 
         composeTestRule.onNodeWithText(DISPLAY_NAME_1).assertIsDisplayed()
-        composeTestRule.onNodeWithText(NUMBER_1).assertIsDisplayed()
+        composeTestRule.waitUntilExists(hasText(NUMBER_1))
         composeTestRule.onNodeWithText(DISPLAY_NAME_2).assertIsDisplayed()
-        composeTestRule.onNodeWithText(NUMBER_2).assertIsDisplayed()
+        composeTestRule.waitUntilExists(hasText(NUMBER_2))
         composeTestRule.onNodeWithText(DISPLAY_NAME_3).assertIsDisplayed()
-        composeTestRule.onNodeWithText(NUMBER_3).assertIsDisplayed()
+        composeTestRule.waitUntilExists(hasText(NUMBER_3))
     }
 
     private companion object {
@@ -141,24 +191,28 @@
         const val NUMBER_1 = "000000001"
         const val NUMBER_2 = "000000002"
         const val NUMBER_3 = "000000003"
+        const val MCC = "310"
         const val PRIMARY_SIM_ASK_EVERY_TIME = -1
 
         val SUB_INFO_1: SubscriptionInfo = SubscriptionInfo.Builder().apply {
             setId(SUB_ID_1)
             setDisplayName(DISPLAY_NAME_1)
             setNumber(NUMBER_1)
+            setMcc(MCC)
         }.build()
 
         val SUB_INFO_2: SubscriptionInfo = SubscriptionInfo.Builder().apply {
             setId(SUB_ID_2)
             setDisplayName(DISPLAY_NAME_2)
             setNumber(NUMBER_2)
+            setMcc(MCC)
         }.build()
 
         val SUB_INFO_3: SubscriptionInfo = SubscriptionInfo.Builder().apply {
             setId(SUB_ID_3)
             setDisplayName(DISPLAY_NAME_3)
             setNumber(NUMBER_3)
+            setMcc(MCC)
         }.build()
     }
 }