From 571103b8913f7864647c9d2768c6ba2dc21029fa Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Thu, 6 Feb 2025 17:49:40 +0000 Subject: [PATCH] Phone number only available for admin users The phone number is hidden to non-admin users, following the same reasoning that exists for other telephony-specific fields like the baseband IMEI. Bug: 392808943 Flag: EXEMPT bugfix Test: atest PhoneNumberPreferenceControllerTest Test: atest MobileNetworkPhoneNumberPreferenceControllerTest Change-Id: I4e612219d0c7439930e91b3e1d6e368a0dfd073e --- .../PhoneNumberPreferenceController.java | 10 +++++-- ...eNetworkPhoneNumberPreferenceController.kt | 15 ++++++----- .../PhoneNumberPreferenceControllerTest.kt | 25 ++++++++++++++---- ...workPhoneNumberPreferenceControllerTest.kt | 26 ++++++++++++++++--- 4 files changed, 59 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java index 421963eb31c..12a45dea79c 100644 --- a/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java +++ b/src/com/android/settings/deviceinfo/PhoneNumberPreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.deviceinfo; import android.content.Context; +import android.os.UserManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -51,8 +52,13 @@ public class PhoneNumberPreferenceController extends BasePreferenceController { @Override public int getAvailabilityStatus() { - return SubscriptionUtil.isSimHardwareVisible(mContext) ? - AVAILABLE : UNSUPPORTED_ON_DEVICE; + if (!SubscriptionUtil.isSimHardwareVisible(mContext)) { + return UNSUPPORTED_ON_DEVICE; + } + if (!mContext.getSystemService(UserManager.class).isAdminUser()) { + return DISABLED_FOR_USER; + } + return AVAILABLE; } @Override diff --git a/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceController.kt b/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceController.kt index db16acdfc59..c62599969dc 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceController.kt +++ b/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceController.kt @@ -25,6 +25,7 @@ import com.android.settings.R import com.android.settings.flags.Flags import com.android.settings.network.SubscriptionUtil import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle +import com.android.settingslib.spaprivileged.framework.common.userManager /** Preference controller for "Phone number" */ class MobileNetworkPhoneNumberPreferenceController @@ -41,13 +42,13 @@ constructor( mSubId = subId } - override fun getAvailabilityStatus(subId: Int): Int = - when { - !Flags.isDualSimOnboardingEnabled() -> CONDITIONALLY_UNAVAILABLE - SubscriptionManager.isValidSubscriptionId(subId) && - SubscriptionUtil.isSimHardwareVisible(mContext) -> AVAILABLE - else -> CONDITIONALLY_UNAVAILABLE - } + override fun getAvailabilityStatus(subId: Int): Int = when { + !Flags.isDualSimOnboardingEnabled() + || !SubscriptionManager.isValidSubscriptionId(subId) + || !SubscriptionUtil.isSimHardwareVisible(mContext) -> CONDITIONALLY_UNAVAILABLE + !mContext.userManager.isAdminUser -> DISABLED_FOR_USER + else -> AVAILABLE + } override fun displayPreference(screen: PreferenceScreen) { super.displayPreference(screen) diff --git a/tests/spa_unit/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.kt index bde92507dc3..d9470469401 100644 --- a/tests/spa_unit/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.kt +++ b/tests/spa_unit/src/com/android/settings/deviceinfo/PhoneNumberPreferenceControllerTest.kt @@ -17,6 +17,7 @@ package com.android.settings.deviceinfo import android.content.Context +import android.os.UserManager import android.telephony.SubscriptionInfo import android.telephony.SubscriptionManager import android.telephony.TelephonyManager @@ -39,6 +40,7 @@ import org.mockito.kotlin.any 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 import org.mockito.kotlin.whenever import org.mockito.quality.Strictness @@ -47,15 +49,15 @@ import org.mockito.quality.Strictness class PhoneNumberPreferenceControllerTest { private lateinit var mockSession: MockitoSession + private val mockUserManager = mock() private val mockTelephonyManager = mock() private val mockSubscriptionManager = mock() private val context: Context = spy(ApplicationProvider.getApplicationContext()) { - on { getSystemService(SubscriptionManager::class.java) } doReturn - mockSubscriptionManager - + on { getSystemService(SubscriptionManager::class.java) } doReturn mockSubscriptionManager on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager + on { getSystemService(UserManager::class.java) } doReturn mockUserManager } private val subscriptionInfo = mock() @@ -76,6 +78,9 @@ class PhoneNumberPreferenceControllerTest { // By default, available whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true) + mockUserManager.stub { + on { isAdminUser } doReturn true + } preference.setKey(controller.preferenceKey) preference.isVisible = true @@ -155,17 +160,27 @@ class PhoneNumberPreferenceControllerTest { } @Test - fun getAvailabilityStatus_simHardwareVisible_displayed() { + fun getAvailabilityStatus_simHardwareVisible_userAdmin_displayed() { // Use defaults from setup() val availabilityStatus = controller.availabilityStatus assertThat(availabilityStatus).isEqualTo(BasePreferenceController.AVAILABLE) } @Test - fun getAvailabilityStatus_notSimHardwareVisible_notDisplayed() { + fun getAvailabilityStatus_notSimHardwareVisible_userAdmin_notDisplayed() { whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(false) val availabilityStatus = controller.availabilityStatus assertThat(availabilityStatus).isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE) } + + @Test + fun getAvailabilityStatus_simHardwareVisible_notUserAdmin_notDisplayed() { + mockUserManager.stub { + on { isAdminUser } doReturn false + } + + val availabilityStatus = controller.availabilityStatus + assertThat(availabilityStatus).isEqualTo(BasePreferenceController.DISABLED_FOR_USER) + } } diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceControllerTest.kt index a7a87380c8d..c6bd0bdcc85 100644 --- a/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceControllerTest.kt +++ b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceControllerTest.kt @@ -17,6 +17,7 @@ package com.android.settings.network.telephony import android.content.Context +import android.os.UserManager import androidx.lifecycle.testing.TestLifecycleOwner import androidx.preference.Preference import androidx.preference.PreferenceManager @@ -37,6 +38,7 @@ import org.junit.runner.RunWith import org.mockito.MockitoSession import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock +import org.mockito.kotlin.spy import org.mockito.kotlin.stub import org.mockito.kotlin.whenever import org.mockito.quality.Strictness @@ -45,9 +47,14 @@ import org.mockito.quality.Strictness class MobileNetworkPhoneNumberPreferenceControllerTest { private lateinit var mockSession: MockitoSession - private val context: Context = ApplicationProvider.getApplicationContext() + private val mockUserManager = mock() private val mockSubscriptionRepository = mock() + private val context: Context = + spy(ApplicationProvider.getApplicationContext()) { + on { getSystemService(UserManager::class.java) } doReturn mockUserManager + } + private val controller = MobileNetworkPhoneNumberPreferenceController(context, TEST_KEY, mockSubscriptionRepository) private val preference = Preference(context).apply { key = TEST_KEY } @@ -63,6 +70,9 @@ class MobileNetworkPhoneNumberPreferenceControllerTest { // By default, available whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true) + mockUserManager.stub { + on { isAdminUser } doReturn true + } preferenceScreen.addPreference(preference) controller.init(SUB_ID) @@ -99,20 +109,30 @@ class MobileNetworkPhoneNumberPreferenceControllerTest { } @Test - fun getAvailabilityStatus_simHardwareVisible_displayed() { + fun getAvailabilityStatus_simHardwareVisible_userAdmin_displayed() { // Use defaults from setup() val availabilityStatus = controller.availabilityStatus assertThat(availabilityStatus).isEqualTo(BasePreferenceController.AVAILABLE) } @Test - fun getAvailabilityStatus_notSimHardwareVisible_notDisplayed() { + fun getAvailabilityStatus_notSimHardwareVisible_userAdmin_notDisplayed() { whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(false) val availabilityStatus = controller.availabilityStatus assertThat(availabilityStatus).isEqualTo(BasePreferenceController.CONDITIONALLY_UNAVAILABLE) } + @Test + fun getAvailabilityStatus_simHardwareVisible_notUserAdmin_notDisplayed() { + mockUserManager.stub { + on { isAdminUser } doReturn false + } + + val availabilityStatus = controller.availabilityStatus + assertThat(availabilityStatus).isEqualTo(BasePreferenceController.DISABLED_FOR_USER) + } + private companion object { const val TEST_KEY = "test_key" const val SUB_ID = 10