Merge "Fix mobile data in Settings is not disable under satellite session" into main

This commit is contained in:
Treehugger Robot
2025-02-20 20:05:18 -08:00
committed by Android (Google) Code Review
2 changed files with 89 additions and 7 deletions

View File

@@ -26,6 +26,7 @@ import androidx.compose.ui.res.stringResource
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settings.R import com.android.settings.R
import com.android.settings.network.telephony.MobileDataRepository import com.android.settings.network.telephony.MobileDataRepository
import com.android.settings.network.telephony.SubscriptionActivationRepository
import com.android.settings.network.telephony.subscriptionManager import com.android.settings.network.telephony.subscriptionManager
import com.android.settingslib.spa.framework.compose.rememberContext import com.android.settingslib.spa.framework.compose.rememberContext
import com.android.settingslib.spa.widget.preference.SwitchPreference import com.android.settingslib.spa.widget.preference.SwitchPreference
@@ -38,6 +39,7 @@ fun MobileDataSwitchPreference(subId: Int) {
MobileDataSwitchPreference( MobileDataSwitchPreference(
subId = subId, subId = subId,
mobileDataRepository = rememberContext(::MobileDataRepository), mobileDataRepository = rememberContext(::MobileDataRepository),
subscriptionActivationRepository = rememberContext(::SubscriptionActivationRepository),
setMobileData = setMobileDataImpl(subId), setMobileData = setMobileDataImpl(subId),
) )
} }
@@ -47,19 +49,24 @@ fun MobileDataSwitchPreference(subId: Int) {
fun MobileDataSwitchPreference( fun MobileDataSwitchPreference(
subId: Int, subId: Int,
mobileDataRepository: MobileDataRepository, mobileDataRepository: MobileDataRepository,
subscriptionActivationRepository: SubscriptionActivationRepository,
setMobileData: (newChecked: Boolean) -> Unit, setMobileData: (newChecked: Boolean) -> Unit,
) { ) {
val mobileDataSummary = stringResource(id = R.string.mobile_data_settings_summary) val mobileDataSummary = stringResource(id = R.string.mobile_data_settings_summary)
val isMobileDataEnabled by val isMobileDataEnabled by
remember(subId) { mobileDataRepository.isMobileDataEnabledFlow(subId) } remember(subId) { mobileDataRepository.isMobileDataEnabledFlow(subId) }
.collectAsStateWithLifecycle(initialValue = null) .collectAsStateWithLifecycle(initialValue = null)
val changeable by remember {
subscriptionActivationRepository.isActivationChangeableFlow()
}.collectAsStateWithLifecycle(initialValue = true)
SwitchPreference( SwitchPreference(
object : SwitchPreferenceModel { object : SwitchPreferenceModel {
override val title = stringResource(id = R.string.mobile_data_settings_title) override val title = stringResource(id = R.string.mobile_data_settings_title)
override val summary = { mobileDataSummary } override val summary = { mobileDataSummary }
override val checked = { isMobileDataEnabled } override val checked = { isMobileDataEnabled }
override val onCheckedChange = setMobileData override val onCheckedChange = setMobileData
override val changeable: () -> Boolean
get() = { changeable }
} }
) )
} }

View File

@@ -20,6 +20,8 @@ import android.content.Context
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsEnabled
import androidx.compose.ui.test.assertIsNotEnabled
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
@@ -27,6 +29,7 @@ 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.telephony.MobileDataRepository import com.android.settings.network.telephony.MobileDataRepository
import com.android.settings.network.telephony.SubscriptionActivationRepository
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOf
@@ -41,18 +44,30 @@ import org.mockito.kotlin.stub
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class MobileDataSwitchPreferenceTest { class MobileDataSwitchPreferenceTest {
@get:Rule val composeTestRule = createComposeRule() @get:Rule
val composeTestRule = createComposeRule()
private val context: Context = spy(ApplicationProvider.getApplicationContext()) {} private val context: Context = spy(ApplicationProvider.getApplicationContext()) {}
private val mockMobileDataRepository = private val mockMobileDataRepository =
mock<MobileDataRepository> { on { isMobileDataEnabledFlow(any()) } doReturn emptyFlow() } mock<MobileDataRepository> { on { isMobileDataEnabledFlow(any()) } doReturn emptyFlow() }
private val mockSubscriptionActivationRepository =
mock<SubscriptionActivationRepository> {
on { isActivationChangeableFlow() } doReturn flowOf(
true
)
}
@Test @Test
fun title_displayed() { fun title_displayed() {
composeTestRule.setContent { composeTestRule.setContent {
CompositionLocalProvider(LocalContext provides context) { CompositionLocalProvider(LocalContext provides context) {
MobileDataSwitchPreference(SUB_ID, mockMobileDataRepository) {} MobileDataSwitchPreference(
SUB_ID,
mockMobileDataRepository,
mockSubscriptionActivationRepository
) {}
} }
} }
@@ -65,7 +80,11 @@ class MobileDataSwitchPreferenceTest {
fun summary_displayed() { fun summary_displayed() {
composeTestRule.setContent { composeTestRule.setContent {
CompositionLocalProvider(LocalContext provides context) { CompositionLocalProvider(LocalContext provides context) {
MobileDataSwitchPreference(SUB_ID, mockMobileDataRepository) {} MobileDataSwitchPreference(
SUB_ID,
mockMobileDataRepository,
mockSubscriptionActivationRepository
) {}
} }
} }
@@ -82,7 +101,11 @@ class MobileDataSwitchPreferenceTest {
var newCheckedCalled: Boolean? = null var newCheckedCalled: Boolean? = null
composeTestRule.setContent { composeTestRule.setContent {
CompositionLocalProvider(LocalContext provides context) { CompositionLocalProvider(LocalContext provides context) {
MobileDataSwitchPreference(SUB_ID, mockMobileDataRepository) { MobileDataSwitchPreference(
SUB_ID,
mockMobileDataRepository,
mockSubscriptionActivationRepository
) {
newCheckedCalled = it newCheckedCalled = it
} }
} }
@@ -95,6 +118,58 @@ class MobileDataSwitchPreferenceTest {
assertThat(newCheckedCalled).isTrue() assertThat(newCheckedCalled).isTrue()
} }
@Test
fun changeable_activationIsNotChangeable_notEnabled() {
mockMobileDataRepository.stub {
on { isMobileDataEnabledFlow(SUB_ID) } doReturn flowOf(true)
}
mockSubscriptionActivationRepository.stub {
on { isActivationChangeableFlow() } doReturn flowOf(false)
}
composeTestRule.setContent {
CompositionLocalProvider(LocalContext provides context) {
MobileDataSwitchPreference(
SUB_ID,
mockMobileDataRepository,
mockSubscriptionActivationRepository
) {
}
}
}
composeTestRule
.onNodeWithText(context.getString(R.string.mobile_data_settings_title))
.assertIsNotEnabled()
}
@Test
fun changeable_activationIsChangeable_enabled() {
mockMobileDataRepository.stub {
on { isMobileDataEnabledFlow(SUB_ID) } doReturn flowOf(true)
}
mockSubscriptionActivationRepository.stub {
on { isActivationChangeableFlow() } doReturn flowOf(true)
}
composeTestRule.setContent {
CompositionLocalProvider(LocalContext provides context) {
MobileDataSwitchPreference(
SUB_ID,
mockMobileDataRepository,
mockSubscriptionActivationRepository
) {
}
}
}
composeTestRule
.onNodeWithText(context.getString(R.string.mobile_data_settings_title))
.assertIsEnabled()
}
private companion object { private companion object {
const val SUB_ID = 12 const val SUB_ID = 12
} }