diff --git a/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt b/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt index 94e4a88ae5e..f7028941597 100644 --- a/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt +++ b/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt @@ -56,12 +56,12 @@ fun SimOnboardingLabelSimImpl( 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 4fad3325b11..0306aad5ea0 100644 --- a/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt +++ b/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt @@ -59,12 +59,12 @@ fun SimOnboardingPrimarySimImpl( 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 5e71b12ed79..b033a28e094 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.Modifier 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 @@ fun SimOnboardingSelectSimImpl( 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 +) { 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 e063f69717d..5b7778e3431 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 @@ package com.android.settings.spa.network 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 @@ import org.mockito.kotlin.verify class SimOnboardingSelectSimTest { @get:Rule val composeTestRule = createComposeRule() + private val mockSubscriptionManager = mock { + 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 = spy(ApplicationProvider.getApplicationContext()) { + on { getSystemService(SubscriptionManager::class.java) } doReturn mockSubscriptionManager + } - private val context: Context = ApplicationProvider.getApplicationContext() private var mockSimOnboardingService = mock { on { targetSubId }.doReturn(-1) on { targetSubInfo }.doReturn(null) @@ -78,6 +102,24 @@ class SimOnboardingSelectSimTest { @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 @@ class SimOnboardingSelectSimTest { composeTestRule.onNodeWithText(context.getString(R.string.sim_onboarding_next)) .performClick() - verify(nextAction) + verify(nextAction)() } @Test @@ -97,7 +139,7 @@ class SimOnboardingSelectSimTest { composeTestRule.onNodeWithText(context.getString(R.string.cancel)) .performClick() - verify(cancelAction) + verify(cancelAction)() } @Test @@ -120,15 +162,23 @@ class SimOnboardingSelectSimTest { } 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 @@ class SimOnboardingSelectSimTest { 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() } }