Phone number only available if telephony capable

The Phone Number field in either the about or network details pages
should not be shown if the device does not have telephony
capabilities.

Bug: 392808943
Flag: EXEMPT bugfix
Test: atest PhoneNumberPreferenceControllerTest
Test: atest MobileNetworkPhoneNumberPreferenceControllerTest

Change-Id: I04f682cc829d5dc7879e6cdacdaebc55a3b6fd2c
This commit is contained in:
Aleksander Morgado
2025-02-06 18:14:32 +00:00
parent 571103b891
commit 731df0fa98
4 changed files with 33 additions and 8 deletions

View File

@@ -31,6 +31,7 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.network.SubscriptionUtil; import com.android.settings.network.SubscriptionUtil;
import com.android.settingslib.Utils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -52,7 +53,7 @@ public class PhoneNumberPreferenceController extends BasePreferenceController {
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
if (!SubscriptionUtil.isSimHardwareVisible(mContext)) { if (!SubscriptionUtil.isSimHardwareVisible(mContext) || Utils.isWifiOnly(mContext)) {
return UNSUPPORTED_ON_DEVICE; return UNSUPPORTED_ON_DEVICE;
} }
if (!mContext.getSystemService(UserManager.class).isAdminUser()) { if (!mContext.getSystemService(UserManager.class).isAdminUser()) {

View File

@@ -26,6 +26,7 @@ import com.android.settings.flags.Flags
import com.android.settings.network.SubscriptionUtil import com.android.settings.network.SubscriptionUtil
import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
import com.android.settingslib.spaprivileged.framework.common.userManager import com.android.settingslib.spaprivileged.framework.common.userManager
import com.android.settingslib.Utils
/** Preference controller for "Phone number" */ /** Preference controller for "Phone number" */
class MobileNetworkPhoneNumberPreferenceController class MobileNetworkPhoneNumberPreferenceController
@@ -45,7 +46,8 @@ constructor(
override fun getAvailabilityStatus(subId: Int): Int = when { override fun getAvailabilityStatus(subId: Int): Int = when {
!Flags.isDualSimOnboardingEnabled() !Flags.isDualSimOnboardingEnabled()
|| !SubscriptionManager.isValidSubscriptionId(subId) || !SubscriptionManager.isValidSubscriptionId(subId)
|| !SubscriptionUtil.isSimHardwareVisible(mContext) -> CONDITIONALLY_UNAVAILABLE || !SubscriptionUtil.isSimHardwareVisible(mContext)
|| Utils.isWifiOnly(mContext) -> CONDITIONALLY_UNAVAILABLE
!mContext.userManager.isAdminUser -> DISABLED_FOR_USER !mContext.userManager.isAdminUser -> DISABLED_FOR_USER
else -> AVAILABLE else -> AVAILABLE
} }

View File

@@ -30,6 +30,7 @@ import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.settings.R import com.android.settings.R
import com.android.settings.core.BasePreferenceController import com.android.settings.core.BasePreferenceController
import com.android.settings.network.SubscriptionUtil import com.android.settings.network.SubscriptionUtil
import com.android.settingslib.Utils
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
@@ -73,11 +74,13 @@ class PhoneNumberPreferenceControllerTest {
mockSession = mockSession =
ExtendedMockito.mockitoSession() ExtendedMockito.mockitoSession()
.mockStatic(SubscriptionUtil::class.java) .mockStatic(SubscriptionUtil::class.java)
.mockStatic(Utils::class.java)
.strictness(Strictness.LENIENT) .strictness(Strictness.LENIENT)
.startMocking() .startMocking()
// By default, available // By default, available
whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true) whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true)
whenever(Utils.isWifiOnly(context)).thenReturn(false)
mockUserManager.stub { mockUserManager.stub {
on { isAdminUser } doReturn true on { isAdminUser } doReturn true
} }
@@ -160,14 +163,14 @@ class PhoneNumberPreferenceControllerTest {
} }
@Test @Test
fun getAvailabilityStatus_simHardwareVisible_userAdmin_displayed() { fun getAvailabilityStatus_simHardwareVisible_userAdmin_notWifiOnly_displayed() {
// Use defaults from setup() // Use defaults from setup()
val availabilityStatus = controller.availabilityStatus val availabilityStatus = controller.availabilityStatus
assertThat(availabilityStatus).isEqualTo(BasePreferenceController.AVAILABLE) assertThat(availabilityStatus).isEqualTo(BasePreferenceController.AVAILABLE)
} }
@Test @Test
fun getAvailabilityStatus_notSimHardwareVisible_userAdmin_notDisplayed() { fun getAvailabilityStatus_notSimHardwareVisible_userAdmin_notWifiOnly_notDisplayed() {
whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(false) whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(false)
val availabilityStatus = controller.availabilityStatus val availabilityStatus = controller.availabilityStatus
@@ -175,7 +178,7 @@ class PhoneNumberPreferenceControllerTest {
} }
@Test @Test
fun getAvailabilityStatus_simHardwareVisible_notUserAdmin_notDisplayed() { fun getAvailabilityStatus_simHardwareVisible_notUserAdmin_notWifiOnly_notDisplayed() {
mockUserManager.stub { mockUserManager.stub {
on { isAdminUser } doReturn false on { isAdminUser } doReturn false
} }
@@ -183,4 +186,12 @@ class PhoneNumberPreferenceControllerTest {
val availabilityStatus = controller.availabilityStatus val availabilityStatus = controller.availabilityStatus
assertThat(availabilityStatus).isEqualTo(BasePreferenceController.DISABLED_FOR_USER) assertThat(availabilityStatus).isEqualTo(BasePreferenceController.DISABLED_FOR_USER)
} }
@Test
fun getAvailabilityStatus_simHardwareVisible_userAdmin_wifiOnly_notDisplayed() {
whenever(Utils.isWifiOnly(context)).thenReturn(true)
val availabilityStatus = controller.availabilityStatus
assertThat(availabilityStatus).isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE)
}
} }

View File

@@ -27,6 +27,7 @@ import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.settings.R import com.android.settings.R
import com.android.settings.core.BasePreferenceController import com.android.settings.core.BasePreferenceController
import com.android.settings.network.SubscriptionUtil import com.android.settings.network.SubscriptionUtil
import com.android.settingslib.Utils
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOf
@@ -65,11 +66,13 @@ class MobileNetworkPhoneNumberPreferenceControllerTest {
mockSession = mockSession =
ExtendedMockito.mockitoSession() ExtendedMockito.mockitoSession()
.mockStatic(SubscriptionUtil::class.java) .mockStatic(SubscriptionUtil::class.java)
.mockStatic(Utils::class.java)
.strictness(Strictness.LENIENT) .strictness(Strictness.LENIENT)
.startMocking() .startMocking()
// By default, available // By default, available
whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true) whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true)
whenever(Utils.isWifiOnly(context)).thenReturn(false)
mockUserManager.stub { mockUserManager.stub {
on { isAdminUser } doReturn true on { isAdminUser } doReturn true
} }
@@ -109,14 +112,14 @@ class MobileNetworkPhoneNumberPreferenceControllerTest {
} }
@Test @Test
fun getAvailabilityStatus_simHardwareVisible_userAdmin_displayed() { fun getAvailabilityStatus_simHardwareVisible_userAdmin_notWifiOnly_displayed() {
// Use defaults from setup() // Use defaults from setup()
val availabilityStatus = controller.availabilityStatus val availabilityStatus = controller.availabilityStatus
assertThat(availabilityStatus).isEqualTo(BasePreferenceController.AVAILABLE) assertThat(availabilityStatus).isEqualTo(BasePreferenceController.AVAILABLE)
} }
@Test @Test
fun getAvailabilityStatus_notSimHardwareVisible_userAdmin_notDisplayed() { fun getAvailabilityStatus_notSimHardwareVisible_userAdmin_notWifiOnly_notDisplayed() {
whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(false) whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(false)
val availabilityStatus = controller.availabilityStatus val availabilityStatus = controller.availabilityStatus
@@ -124,7 +127,7 @@ class MobileNetworkPhoneNumberPreferenceControllerTest {
} }
@Test @Test
fun getAvailabilityStatus_simHardwareVisible_notUserAdmin_notDisplayed() { fun getAvailabilityStatus_simHardwareVisible_notUserAdmin_notWifiOnly_notDisplayed() {
mockUserManager.stub { mockUserManager.stub {
on { isAdminUser } doReturn false on { isAdminUser } doReturn false
} }
@@ -133,6 +136,14 @@ class MobileNetworkPhoneNumberPreferenceControllerTest {
assertThat(availabilityStatus).isEqualTo(BasePreferenceController.DISABLED_FOR_USER) assertThat(availabilityStatus).isEqualTo(BasePreferenceController.DISABLED_FOR_USER)
} }
@Test
fun getAvailabilityStatus_simHardwareVisible_userAdmin_wifiOnly_notDisplayed() {
whenever(Utils.isWifiOnly(context)).thenReturn(true)
val availabilityStatus = controller.availabilityStatus
assertThat(availabilityStatus).isEqualTo(BasePreferenceController.CONDITIONALLY_UNAVAILABLE)
}
private companion object { private companion object {
const val TEST_KEY = "test_key" const val TEST_KEY = "test_key"
const val SUB_ID = 10 const val SUB_ID = 10