Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4de0dcd0 authored by Aleksander Morgado's avatar Aleksander Morgado
Browse files

Use isMobileDataCapable/isVoiceCapable helpers in deviceinfo/phonenumber

Disabling telephony support may be done either with the
config_show_sim_info config option, or based on whether
TelephonyManager reports data capabilities. The isMobileDataCapable()
helper method ensures both ways are supported.

Additionally, the logic is also updated to explicitly check for voice
support, so that disabling this telephony element happens only when
both mobile data and voice are unsupported.

The unit tests are updated to consider both no-data and no-voice
cases, by mocking both Resources and TelephonyManager.

Bug: 395714454
Test: mm && atest PhoneNumberPreferenceControllerTest
Flag: EXEMPT bugfix
Change-Id: I661fa8b8135c44dea907f59951bb0820bcf27262
parent b173a2e7
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -29,9 +29,9 @@ import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;

import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.network.SubscriptionUtil;
import com.android.settingslib.Utils;

import java.util.ArrayList;
import java.util.List;
@@ -53,7 +53,7 @@ public class PhoneNumberPreferenceController extends BasePreferenceController {

    @Override
    public int getAvailabilityStatus() {
        if (!SubscriptionUtil.isSimHardwareVisible(mContext) || Utils.isWifiOnly(mContext)) {
        if (!Utils.isMobileDataCapable(mContext) && !Utils.isVoiceCapable(mContext)) {
            return UNSUPPORTED_ON_DEVICE;
        }
        if (!mContext.getSystemService(UserManager.class).isAdminUser()) {
+47 −28
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.settings.deviceinfo

import android.content.Context
import android.content.res.Resources
import android.os.UserManager
import android.telephony.SubscriptionInfo
import android.telephony.SubscriptionManager
@@ -29,14 +30,11 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.settings.R
import com.android.settings.core.BasePreferenceController
import com.android.settings.network.SubscriptionUtil
import com.android.settingslib.Utils
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.MockitoSession
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
@@ -44,21 +42,22 @@ 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

@RunWith(AndroidJUnit4::class)
class PhoneNumberPreferenceControllerTest {
    private lateinit var mockSession: MockitoSession

    private val mockUserManager = mock<UserManager>()
    private val mockTelephonyManager = mock<TelephonyManager>()
    private val mockSubscriptionManager = mock<SubscriptionManager>()
    private val mockResources = mock<Resources>()

    private val context: Context =
        spy(ApplicationProvider.getApplicationContext()) {
            on { getSystemService(SubscriptionManager::class.java) } doReturn mockSubscriptionManager
            on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager
	    on { getSystemService(Context.TELEPHONY_SERVICE) } doReturn mockTelephonyManager
            on { getSystemService(UserManager::class.java) } doReturn mockUserManager
            on { resources } doReturn mockResources
        }

    private val subscriptionInfo = mock<SubscriptionInfo>()
@@ -71,16 +70,14 @@ class PhoneNumberPreferenceControllerTest {

    @Before
    fun setup() {
        mockSession =
            ExtendedMockito.mockitoSession()
                .mockStatic(SubscriptionUtil::class.java)
                .mockStatic(Utils::class.java)
                .strictness(Strictness.LENIENT)
                .startMocking()

        // By default, available
        whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true)
        whenever(Utils.isWifiOnly(context)).thenReturn(false)
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn true
            on { isDeviceVoiceCapable } doReturn true
        }
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockUserManager.stub {
            on { isAdminUser } doReturn true
        }
@@ -94,11 +91,6 @@ class PhoneNumberPreferenceControllerTest {
        doReturn(secondPreference).whenever(controller).createNewPreference(context)
    }

    @After
    fun teardown() {
        mockSession.finishMocking()
    }

    @Test
    fun displayPreference_multiSim_shouldAddSecondPreference() {
        whenever(mockTelephonyManager.phoneCount).thenReturn(2)
@@ -163,35 +155,62 @@ class PhoneNumberPreferenceControllerTest {
    }

    @Test
    fun getAvailabilityStatus_simHardwareVisible_userAdmin_notWifiOnly_displayed() {
    fun getAvailabilityStatus_default_displayed() {
        // Use defaults from setup()
        val availabilityStatus = controller.availabilityStatus
        assertThat(availabilityStatus).isEqualTo(BasePreferenceController.AVAILABLE)
    }

    @Test
    fun getAvailabilityStatus_notSimHardwareVisible_userAdmin_notWifiOnly_notDisplayed() {
        whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(false)
    fun getAvailabilityStatus_noShowSimInfo_notDisplayed() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn false
        }

        val availabilityStatus = controller.availabilityStatus
        assertThat(availabilityStatus).isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE)
    }

    @Test
    fun getAvailabilityStatus_simHardwareVisible_notUserAdmin_notWifiOnly_notDisplayed() {
        mockUserManager.stub {
            on { isAdminUser } doReturn false
    fun getAvailabilityStatus_voiceCapable_notDataCapable_displayed() {
        mockTelephonyManager.stub {
            on { isDeviceVoiceCapable } doReturn true
            on { isDataCapable } doReturn false
        }

        val availabilityStatus = controller.availabilityStatus
        assertThat(availabilityStatus).isEqualTo(BasePreferenceController.DISABLED_FOR_USER)
        assertThat(availabilityStatus).isEqualTo(BasePreferenceController.AVAILABLE)
    }

    @Test
    fun getAvailabilityStatus_simHardwareVisible_userAdmin_wifiOnly_notDisplayed() {
        whenever(Utils.isWifiOnly(context)).thenReturn(true)
    fun getAvailabilityStatus_notVoiceCapable_dataCapable_displayed() {
        mockTelephonyManager.stub {
            on { isDeviceVoiceCapable } doReturn false
            on { isDataCapable } doReturn true
        }

        val availabilityStatus = controller.availabilityStatus
        assertThat(availabilityStatus).isEqualTo(BasePreferenceController.AVAILABLE)
    }

    @Test
    fun getAvailabilityStatus_notVoiceCapable_notDataCapable_notDisplayed() {
        mockTelephonyManager.stub {
            on { isDeviceVoiceCapable } doReturn false
            on { isDataCapable } doReturn false
        }

        val availabilityStatus = controller.availabilityStatus
        assertThat(availabilityStatus).isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE)
    }

    @Test
    fun getAvailabilityStatus_notUserAdmin_notDisplayed() {
        mockUserManager.stub {
            on { isAdminUser } doReturn false
        }

        val availabilityStatus = controller.availabilityStatus
        assertThat(availabilityStatus).isEqualTo(BasePreferenceController.DISABLED_FOR_USER)
    }
}