diff --git a/src/com/android/settings/network/telephony/CarrierConfigRepository.kt b/src/com/android/settings/network/telephony/CarrierConfigRepository.kt index 99683a8671a..77f4e1c277a 100644 --- a/src/com/android/settings/network/telephony/CarrierConfigRepository.kt +++ b/src/com/android/settings/network/telephony/CarrierConfigRepository.kt @@ -224,7 +224,10 @@ class CarrierConfigRepository(private val context: Context) { } private val BooleanKeysWhichNotFollowingsNamingConventions = - listOf(CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS) + listOf( + CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS, + CarrierConfigManager.KEY_MMS_MMS_ENABLED_BOOL, + ) private fun checkBooleanKey(key: String) { check(key.endsWith("_bool") || key in BooleanKeysWhichNotFollowingsNamingConventions) { diff --git a/src/com/android/settings/network/telephony/MmsMessagePreferenceController.kt b/src/com/android/settings/network/telephony/MmsMessagePreferenceController.kt index 220218c9473..a37a12b2dee 100644 --- a/src/com/android/settings/network/telephony/MmsMessagePreferenceController.kt +++ b/src/com/android/settings/network/telephony/MmsMessagePreferenceController.kt @@ -17,6 +17,7 @@ package com.android.settings.network.telephony import android.content.Context +import android.telephony.CarrierConfigManager import android.telephony.SubscriptionManager import android.telephony.TelephonyManager import android.telephony.data.ApnSetting @@ -45,7 +46,7 @@ constructor( private var subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID private var telephonyManager: TelephonyManager = context.getSystemService(TelephonyManager::class.java)!! - + private val carrierConfigRepository = CarrierConfigRepository(context) private var preferenceScreen: PreferenceScreen? = null fun init(subId: Int) { @@ -54,7 +55,13 @@ constructor( } override fun getAvailabilityStatus() = - if (getAvailabilityStatus(telephonyManager, subId, getDefaultDataSubId)) AVAILABLE + if (getAvailabilityStatus( + telephonyManager, + subId, + getDefaultDataSubId, + carrierConfigRepository + ) + ) AVAILABLE else CONDITIONALLY_UNAVAILABLE override fun displayPreference(screen: PreferenceScreen) { @@ -92,11 +99,14 @@ constructor( telephonyManager: TelephonyManager, subId: Int, getDefaultDataSubId: () -> Int, + carrierConfigRepository: CarrierConfigRepository, ): Boolean { return SubscriptionManager.isValidSubscriptionId(subId) && !telephonyManager.isDataEnabled && telephonyManager.isApnMetered(ApnSetting.TYPE_MMS) && - !isFallbackDataEnabled(telephonyManager, subId, getDefaultDataSubId()) + !isFallbackDataEnabled(telephonyManager, subId, getDefaultDataSubId()) && + carrierConfigRepository.getBoolean( + subId, CarrierConfigManager.KEY_MMS_MMS_ENABLED_BOOL) } private fun isFallbackDataEnabled( @@ -118,11 +128,16 @@ constructor( ) : MobileNetworkSettingsSearchItem { private var telephonyManager: TelephonyManager = context.getSystemService(TelephonyManager::class.java)!! + private val carrierConfigRepository = CarrierConfigRepository(context) @VisibleForTesting fun isAvailable(subId: Int): Boolean = getAvailabilityStatus( - telephonyManager.createForSubscriptionId(subId), subId, getDefaultDataSubId) + telephonyManager.createForSubscriptionId(subId), + subId, + getDefaultDataSubId, + carrierConfigRepository + ) override fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? { if (!isAvailable(subId)) return null diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.kt index 4d532604205..75c19135b9c 100644 --- a/tests/spa_unit/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.kt +++ b/tests/spa_unit/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.kt @@ -17,6 +17,7 @@ package com.android.settings.network.telephony import android.content.Context +import android.telephony.CarrierConfigManager import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID import android.telephony.TelephonyManager import android.telephony.data.ApnSetting @@ -26,6 +27,7 @@ import com.android.settings.core.BasePreferenceController.AVAILABLE import com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE import com.android.settings.network.telephony.MmsMessagePreferenceController.Companion.MmsMessageSearchItem import com.google.common.truth.Truth.assertThat +import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.doReturn @@ -63,6 +65,21 @@ class MmsMessagePreferenceControllerTest { getDefaultDataSubId = { defaultDataSubId }, ) + @Before + fun setUp() { + CarrierConfigRepository.resetForTest() + CarrierConfigRepository.setBooleanForTest( + subId = SUB_1_ID, + key = CarrierConfigManager.KEY_MMS_MMS_ENABLED_BOOL, + value = true, + ) + CarrierConfigRepository.setBooleanForTest( + subId = SUB_2_ID, + key = CarrierConfigManager.KEY_MMS_MMS_ENABLED_BOOL, + value = true, + ) + } + @Test fun getAvailabilityStatus_invalidSubscription_unavailable() { controller.init(INVALID_SUBSCRIPTION_ID) @@ -164,6 +181,27 @@ class MmsMessagePreferenceControllerTest { assertThat(availabilityStatus).isEqualTo(AVAILABLE) } + @Test + fun getAvailabilityStatus_carrierConfigEnabledMmsFalse_unavailable() { + defaultDataSubId = SUB_2_ID + mockTelephonyManager2.stub { + on { isDataEnabled } doReturn false + on { + isMobileDataPolicyEnabled(TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH) + } doReturn true + } + CarrierConfigRepository.setBooleanForTest( + subId = SUB_2_ID, + key = CarrierConfigManager.KEY_MMS_MMS_ENABLED_BOOL, + value = false, + ) + controller.init(SUB_2_ID) + + val availabilityStatus = controller.getAvailabilityStatus() + + assertThat(availabilityStatus).isEqualTo(CONDITIONALLY_UNAVAILABLE) + } + @Test fun searchIsAvailable_notDefaultDataAndDataOnAndAutoDataSwitchOn_unavailable() { mockTelephonyManager1.stub { @@ -200,6 +238,27 @@ class MmsMessagePreferenceControllerTest { assertThat(isAvailable).isTrue() } + @Test + fun searchIsAvailable_carrierConfigEnabledMmsFalse_unavailable() { + defaultDataSubId = SUB_2_ID + mockTelephonyManager2.stub { + on { isDataEnabled } doReturn false + on { + isMobileDataPolicyEnabled(TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH) + } doReturn true + } + CarrierConfigRepository.setBooleanForTest( + subId = SUB_2_ID, + key = CarrierConfigManager.KEY_MMS_MMS_ENABLED_BOOL, + value = false, + ) + controller.init(SUB_2_ID) + + val availabilityStatus = controller.getAvailabilityStatus() + + assertThat(availabilityStatus).isEqualTo(CONDITIONALLY_UNAVAILABLE) + } + @Test fun isChecked_whenMmsNotAlwaysAllowed_returnFalse() { mockTelephonyManager2.stub {