Merge "To gray out the next button if the user does not select two sim" into main
This commit is contained in:
committed by
Android (Google) Code Review
commit
a3b28762cb
@@ -56,12 +56,12 @@ fun SimOnboardingLabelSimImpl(
|
|||||||
imageVector = Icons.Outlined.SignalCellularAlt,
|
imageVector = Icons.Outlined.SignalCellularAlt,
|
||||||
title = stringResource(R.string.sim_onboarding_label_sim_title),
|
title = stringResource(R.string.sim_onboarding_label_sim_title),
|
||||||
actionButton = BottomAppBarButton(
|
actionButton = BottomAppBarButton(
|
||||||
stringResource(R.string.sim_onboarding_next),
|
text = stringResource(R.string.sim_onboarding_next),
|
||||||
nextAction
|
onClick = nextAction
|
||||||
),
|
),
|
||||||
dismissButton = BottomAppBarButton(
|
dismissButton = BottomAppBarButton(
|
||||||
stringResource(R.string.cancel),
|
text = stringResource(R.string.cancel),
|
||||||
cancelAction
|
onClick = cancelAction
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
LabelSimBody(onboardingService)
|
LabelSimBody(onboardingService)
|
||||||
|
@@ -59,12 +59,12 @@ fun SimOnboardingPrimarySimImpl(
|
|||||||
imageVector = Icons.Outlined.SignalCellularAlt,
|
imageVector = Icons.Outlined.SignalCellularAlt,
|
||||||
title = stringResource(id = R.string.sim_onboarding_primary_sim_title),
|
title = stringResource(id = R.string.sim_onboarding_primary_sim_title),
|
||||||
actionButton = BottomAppBarButton(
|
actionButton = BottomAppBarButton(
|
||||||
stringResource(id = R.string.done),
|
text = stringResource(id = R.string.done),
|
||||||
nextAction
|
onClick = nextAction
|
||||||
),
|
),
|
||||||
dismissButton = BottomAppBarButton(
|
dismissButton = BottomAppBarButton(
|
||||||
stringResource(id = R.string.cancel),
|
text = stringResource(id = R.string.cancel),
|
||||||
cancelAction
|
onClick = cancelAction
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
val callsSelectedId = rememberSaveable {
|
val callsSelectedId = rememberSaveable {
|
||||||
|
@@ -16,12 +16,12 @@
|
|||||||
|
|
||||||
package com.android.settings.spa.network
|
package com.android.settings.spa.network
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.outlined.SignalCellularAlt
|
import androidx.compose.material.icons.outlined.SignalCellularAlt
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.MutableState
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
@@ -29,7 +29,6 @@ import androidx.compose.ui.Modifier
|
|||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import com.android.settings.R
|
import com.android.settings.R
|
||||||
import com.android.settings.network.SimOnboardingService
|
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.framework.theme.SettingsDimension
|
||||||
import com.android.settingslib.spa.widget.preference.CheckboxPreference
|
import com.android.settingslib.spa.widget.preference.CheckboxPreference
|
||||||
import com.android.settingslib.spa.widget.preference.CheckboxPreferenceModel
|
import com.android.settingslib.spa.widget.preference.CheckboxPreferenceModel
|
||||||
@@ -46,44 +45,47 @@ fun SimOnboardingSelectSimImpl(
|
|||||||
cancelAction: () -> Unit,
|
cancelAction: () -> Unit,
|
||||||
onboardingService: SimOnboardingService
|
onboardingService: SimOnboardingService
|
||||||
) {
|
) {
|
||||||
|
var actionButtonController = rememberSaveable { mutableStateOf(false) }
|
||||||
|
|
||||||
SuwScaffold(
|
SuwScaffold(
|
||||||
imageVector = Icons.Outlined.SignalCellularAlt,
|
imageVector = Icons.Outlined.SignalCellularAlt,
|
||||||
title = stringResource(id = R.string.sim_onboarding_select_sim_title),
|
title = stringResource(id = R.string.sim_onboarding_select_sim_title),
|
||||||
actionButton = BottomAppBarButton(
|
actionButton = BottomAppBarButton(
|
||||||
stringResource(id = R.string.sim_onboarding_next),
|
text = stringResource(id = R.string.sim_onboarding_next),
|
||||||
nextAction
|
enabled = actionButtonController.value,
|
||||||
|
onClick = nextAction
|
||||||
),
|
),
|
||||||
dismissButton = BottomAppBarButton(
|
dismissButton = BottomAppBarButton(
|
||||||
stringResource(id = R.string.cancel),
|
text = stringResource(id = R.string.cancel),
|
||||||
cancelAction
|
onClick = cancelAction
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
selectSimBody(onboardingService)
|
SelectSimBody(onboardingService, actionButtonController)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun selectSimBody(onboardingService: SimOnboardingService) {
|
private fun SelectSimBody(
|
||||||
|
onboardingService: SimOnboardingService,
|
||||||
|
isFinished: MutableState<Boolean>
|
||||||
|
) {
|
||||||
Column(Modifier.padding(SettingsDimension.itemPadding)) {
|
Column(Modifier.padding(SettingsDimension.itemPadding)) {
|
||||||
SettingsBody(stringResource(id = R.string.sim_onboarding_select_sim_msg))
|
SettingsBody(stringResource(id = R.string.sim_onboarding_select_sim_msg))
|
||||||
}
|
}
|
||||||
var isFinished = rememberSaveable { mutableStateOf(false) }
|
|
||||||
isFinished.value = onboardingService.isSimSelectionFinished
|
isFinished.value = onboardingService.isSimSelectionFinished
|
||||||
for (subInfo in onboardingService.getSelectableSubscriptionInfoList()) {
|
for (subInfo in onboardingService.getSelectableSubscriptionInfoList()) {
|
||||||
var title = onboardingService.getSubscriptionInfoDisplayName(subInfo)
|
var title = onboardingService.getSubscriptionInfoDisplayName(subInfo)
|
||||||
var summaryNumber =
|
val phoneNumber = phoneNumber(subInfo)
|
||||||
subInfo.number // TODO using the SubscriptionUtil.getFormattedPhoneNumber
|
|
||||||
var checked = rememberSaveable {
|
var checked = rememberSaveable {
|
||||||
mutableStateOf(
|
mutableStateOf(
|
||||||
onboardingService.getSelectedSubscriptionInfoList().contains(subInfo)
|
onboardingService.getSelectedSubscriptionInfoList().contains(subInfo)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckboxPreference(remember {
|
CheckboxPreference(remember {
|
||||||
object : CheckboxPreferenceModel {
|
object : CheckboxPreferenceModel {
|
||||||
override val title = title
|
override val title = title
|
||||||
override val summary: () -> String
|
override val summary: () -> String
|
||||||
get() = { summaryNumber }
|
get() = { phoneNumber.value ?: "" }
|
||||||
override val checked = { checked.value }
|
override val checked = { checked.value }
|
||||||
override val onCheckedChange = { newChecked: Boolean ->
|
override val onCheckedChange = { newChecked: Boolean ->
|
||||||
checked.value = newChecked
|
checked.value = newChecked
|
||||||
|
@@ -18,19 +18,31 @@ package com.android.settings.spa.network
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.telephony.SubscriptionInfo
|
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.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.junit4.createComposeRule
|
||||||
import androidx.compose.ui.test.onNodeWithText
|
import androidx.compose.ui.test.onNodeWithText
|
||||||
import androidx.compose.ui.test.performClick
|
import androidx.compose.ui.test.performClick
|
||||||
|
import androidx.lifecycle.testing.TestLifecycleOwner
|
||||||
import androidx.test.core.app.ApplicationProvider
|
import androidx.test.core.app.ApplicationProvider
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
import com.android.settings.R
|
import com.android.settings.R
|
||||||
import com.android.settings.network.SimOnboardingService
|
import com.android.settings.network.SimOnboardingService
|
||||||
|
import com.android.settingslib.spa.testutils.waitUntilExists
|
||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
|
import org.mockito.kotlin.any
|
||||||
|
import org.mockito.kotlin.doAnswer
|
||||||
import org.mockito.kotlin.doReturn
|
import org.mockito.kotlin.doReturn
|
||||||
import org.mockito.kotlin.mock
|
import org.mockito.kotlin.mock
|
||||||
|
import org.mockito.kotlin.spy
|
||||||
import org.mockito.kotlin.stub
|
import org.mockito.kotlin.stub
|
||||||
import org.mockito.kotlin.verify
|
import org.mockito.kotlin.verify
|
||||||
|
|
||||||
@@ -38,8 +50,20 @@ import org.mockito.kotlin.verify
|
|||||||
class SimOnboardingSelectSimTest {
|
class SimOnboardingSelectSimTest {
|
||||||
@get:Rule
|
@get:Rule
|
||||||
val composeTestRule = createComposeRule()
|
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 = spy(ApplicationProvider.getApplicationContext()) {
|
||||||
|
on { getSystemService(SubscriptionManager::class.java) } doReturn mockSubscriptionManager
|
||||||
|
}
|
||||||
|
|
||||||
private val context: Context = ApplicationProvider.getApplicationContext()
|
|
||||||
private var mockSimOnboardingService = mock<SimOnboardingService> {
|
private var mockSimOnboardingService = mock<SimOnboardingService> {
|
||||||
on { targetSubId }.doReturn(-1)
|
on { targetSubId }.doReturn(-1)
|
||||||
on { targetSubInfo }.doReturn(null)
|
on { targetSubInfo }.doReturn(null)
|
||||||
@@ -78,6 +102,24 @@ class SimOnboardingSelectSimTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun simOnboardingSelectSimImpl_clickNextAction_verifyNextAction() {
|
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 {
|
composeTestRule.setContent {
|
||||||
SimOnboardingSelectSimImpl(nextAction, cancelAction, mockSimOnboardingService)
|
SimOnboardingSelectSimImpl(nextAction, cancelAction, mockSimOnboardingService)
|
||||||
}
|
}
|
||||||
@@ -85,7 +127,7 @@ class SimOnboardingSelectSimTest {
|
|||||||
composeTestRule.onNodeWithText(context.getString(R.string.sim_onboarding_next))
|
composeTestRule.onNodeWithText(context.getString(R.string.sim_onboarding_next))
|
||||||
.performClick()
|
.performClick()
|
||||||
|
|
||||||
verify(nextAction)
|
verify(nextAction)()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -97,7 +139,7 @@ class SimOnboardingSelectSimTest {
|
|||||||
composeTestRule.onNodeWithText(context.getString(R.string.cancel))
|
composeTestRule.onNodeWithText(context.getString(R.string.cancel))
|
||||||
.performClick()
|
.performClick()
|
||||||
|
|
||||||
verify(cancelAction)
|
verify(cancelAction)()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -120,15 +162,23 @@ class SimOnboardingSelectSimTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
composeTestRule.setContent {
|
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(DISPLAY_NAME_1).assertIsDisplayed()
|
||||||
composeTestRule.onNodeWithText(NUMBER_1).assertIsDisplayed()
|
composeTestRule.waitUntilExists(hasText(NUMBER_1))
|
||||||
composeTestRule.onNodeWithText(DISPLAY_NAME_2).assertIsDisplayed()
|
composeTestRule.onNodeWithText(DISPLAY_NAME_2).assertIsDisplayed()
|
||||||
composeTestRule.onNodeWithText(NUMBER_2).assertIsDisplayed()
|
composeTestRule.waitUntilExists(hasText(NUMBER_2))
|
||||||
composeTestRule.onNodeWithText(DISPLAY_NAME_3).assertIsDisplayed()
|
composeTestRule.onNodeWithText(DISPLAY_NAME_3).assertIsDisplayed()
|
||||||
composeTestRule.onNodeWithText(NUMBER_3).assertIsDisplayed()
|
composeTestRule.waitUntilExists(hasText(NUMBER_3))
|
||||||
}
|
}
|
||||||
|
|
||||||
private companion object {
|
private companion object {
|
||||||
@@ -141,24 +191,28 @@ class SimOnboardingSelectSimTest {
|
|||||||
const val NUMBER_1 = "000000001"
|
const val NUMBER_1 = "000000001"
|
||||||
const val NUMBER_2 = "000000002"
|
const val NUMBER_2 = "000000002"
|
||||||
const val NUMBER_3 = "000000003"
|
const val NUMBER_3 = "000000003"
|
||||||
|
const val MCC = "310"
|
||||||
const val PRIMARY_SIM_ASK_EVERY_TIME = -1
|
const val PRIMARY_SIM_ASK_EVERY_TIME = -1
|
||||||
|
|
||||||
val SUB_INFO_1: SubscriptionInfo = SubscriptionInfo.Builder().apply {
|
val SUB_INFO_1: SubscriptionInfo = SubscriptionInfo.Builder().apply {
|
||||||
setId(SUB_ID_1)
|
setId(SUB_ID_1)
|
||||||
setDisplayName(DISPLAY_NAME_1)
|
setDisplayName(DISPLAY_NAME_1)
|
||||||
setNumber(NUMBER_1)
|
setNumber(NUMBER_1)
|
||||||
|
setMcc(MCC)
|
||||||
}.build()
|
}.build()
|
||||||
|
|
||||||
val SUB_INFO_2: SubscriptionInfo = SubscriptionInfo.Builder().apply {
|
val SUB_INFO_2: SubscriptionInfo = SubscriptionInfo.Builder().apply {
|
||||||
setId(SUB_ID_2)
|
setId(SUB_ID_2)
|
||||||
setDisplayName(DISPLAY_NAME_2)
|
setDisplayName(DISPLAY_NAME_2)
|
||||||
setNumber(NUMBER_2)
|
setNumber(NUMBER_2)
|
||||||
|
setMcc(MCC)
|
||||||
}.build()
|
}.build()
|
||||||
|
|
||||||
val SUB_INFO_3: SubscriptionInfo = SubscriptionInfo.Builder().apply {
|
val SUB_INFO_3: SubscriptionInfo = SubscriptionInfo.Builder().apply {
|
||||||
setId(SUB_ID_3)
|
setId(SUB_ID_3)
|
||||||
setDisplayName(DISPLAY_NAME_3)
|
setDisplayName(DISPLAY_NAME_3)
|
||||||
setNumber(NUMBER_3)
|
setNumber(NUMBER_3)
|
||||||
|
setMcc(MCC)
|
||||||
}.build()
|
}.build()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user