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

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

Early check for SIM EID availability based on telephony or user admin

The SIM EID field was already not being shown if the
PackageManger.FEATURE_TELEPHONY_DATA feature flag was not set, per the
check in getIsAvailableAndUpdateEid().

The async availability update was introduced in the context of bug
304560734, because the UI could block until the EID value was ready.
The config_show_sim_info check was left in getAvailabilityStatus() as
that cannot block.

This change moves to getAvailabilityStatus() the availability check
based on the PackageManager feature flags (which are set on system
boot and not changed during runtime) and also based on whether the
user is admin or not, as with any other telephony related setting.
None of these two checks would lead to ANR state.

Bug: 395714454
Flag: EXEMPT bugfix
Test: atest SimEidPreferenceControllerTest

Change-Id: I3447091670345285132a2acaf45cd129c2b84c00
parent 9fb0e28b
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -64,8 +64,12 @@ class SimEidPreferenceController(context: Context, preferenceKey: String) :
     * Also check [getIsAvailableAndUpdateEid] for other availability check which retrieved
     * asynchronously later.
     */
    override fun getAvailabilityStatus() =
        if (SubscriptionUtil.isSimHardwareVisible(mContext)) AVAILABLE else UNSUPPORTED_ON_DEVICE
    override fun getAvailabilityStatus() = when {
        !SubscriptionUtil.isSimHardwareVisible(mContext)
            || Utils.isWifiOnly(mContext) -> UNSUPPORTED_ON_DEVICE
        !mContext.userManager.isAdminUser -> DISABLED_FOR_USER
        else -> AVAILABLE
    }

    override fun displayPreference(screen: PreferenceScreen) {
        super.displayPreference(screen)
@@ -98,7 +102,6 @@ class SimEidPreferenceController(context: Context, preferenceKey: String) :
    }

    private fun getIsAvailableAndUpdateEid(): Boolean {
        if (!mContext.userManager.isAdminUser || Utils.isWifiOnly(mContext)) return false
        eid = eidStatus?.eid ?: ""
        return eid.isNotEmpty()
    }
+40 −6
Original line number Diff line number Diff line
@@ -17,17 +17,23 @@
package com.android.settings.deviceinfo.simstatus

import android.content.Context
import android.os.UserManager
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.dx.mockito.inline.extended.ExtendedMockito
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.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

@@ -35,7 +41,12 @@ import org.mockito.quality.Strictness
class SimEidPreferenceControllerTest {
    private lateinit var mockSession: MockitoSession

    private val context: Context = ApplicationProvider.getApplicationContext()
    private val mockUserManager = mock<UserManager>()

    private val context: Context =
        spy(ApplicationProvider.getApplicationContext()) {
            on { getSystemService(UserManager::class.java) } doReturn mockUserManager
        }

    private val controller = SimEidPreferenceController(context, TEST_KEY)

@@ -44,8 +55,16 @@ class SimEidPreferenceControllerTest {
        mockSession = ExtendedMockito.mockitoSession()
            .initMocks(this)
            .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)
        mockUserManager.stub {
            on { isAdminUser } doReturn true
        }
    }

    @After
@@ -54,20 +73,35 @@ class SimEidPreferenceControllerTest {
    }

    @Test
    fun getAvailabilityStatus_isSimHardwareVisible() {
        whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(true)

    fun getAvailabilityStatus_simHardwareVisible_userAdmin_notWifiOnly_displayed() {
        // Use defaults from setup()
        val availabilityStatus = controller.availabilityStatus

        assertThat(availabilityStatus).isEqualTo(BasePreferenceController.AVAILABLE)
    }

    @Test
    fun getAvailabilityStatus_notSimHardwareVisible() {
    fun getAvailabilityStatus_notSimHardwareVisible_userAdmin_notWifiOnly_notDisplayed() {
        whenever(SubscriptionUtil.isSimHardwareVisible(context)).thenReturn(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
        }

        val availabilityStatus = controller.availabilityStatus
        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)
    }