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

Commit 161c7896 authored by Aleksander Morgado's avatar Aleksander Morgado
Browse files

Use isMobileDataCapable/isVoiceCapable helpers in network/BluetoothWiFiResetPreferenceController

Instead of relying exclusively on the config_show_sim_info config
option to disable telephony support, use both isMobileDataCapable()
and isVoiceCapable() helper methods to check for the telephony support
on runtime, based on the TelephonyManager capabilities.

Bug: 395714454
Test: mm && atest BluetoothWiFiResetPreferenceControllerTest
Flag: EXEMPT bugfix

Change-Id: Ic09e6aa2da6430989c386d367e94ac905f72b67b
parent d098dccf
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.res.stringResource
import com.android.settings.R
import com.android.settings.ResetNetworkRequest
import com.android.settings.Utils
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settings.spa.preference.ComposePreferenceController
import com.android.settingslib.spa.widget.dialog.AlertDialogButton
@@ -101,14 +102,15 @@ class BluetoothWiFiResetPreferenceController(context: Context, preferenceKey: St
    }

    @VisibleForTesting
    fun resetOperation(): Runnable = if (SubscriptionUtil.isSimHardwareVisible(mContext)) {
    fun resetOperation(): Runnable = if (Utils.isMobileDataCapable(mContext)
                                             || Utils.isVoiceCapable(mContext)) {
        ResetNetworkRequest(
            ResetNetworkRequest.RESET_WIFI_MANAGER or
                ResetNetworkRequest.RESET_WIFI_P2P_MANAGER or
                ResetNetworkRequest.RESET_BLUETOOTH_MANAGER
        )
            .toResetNetworkOperationBuilder(mContext, Looper.getMainLooper())
    } else {  // For device without SIMs visible to the user
    } else {  // For device without telephony capabilities
        ResetNetworkRequest(
            ResetNetworkRequest.RESET_CONNECTIVITY_MANAGER or
                ResetNetworkRequest.RESET_VPN_MANAGER or
+222 −3
Original line number Diff line number Diff line
@@ -24,14 +24,17 @@ import android.net.ConnectivityManager
import android.net.NetworkPolicyManager
import android.net.VpnManager
import android.os.UserManager
import android.telephony.TelephonyManager
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.R
import com.android.settings.core.BasePreferenceController.AVAILABLE
import com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
@@ -51,6 +54,9 @@ class BluetoothWiFiResetPreferenceControllerTest {
    private val mockNetworkPolicyManager = mock<NetworkPolicyManager>()
    private val mockVpnManager = mock<VpnManager>()
    private val mockResources = mock<Resources>()
    private val mockTelephonyManager = mock<TelephonyManager> {
        on { createForSubscriptionId(any()) } doReturn mock
    }

    private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
        on { getSystemService(Context.USER_SERVICE) } doReturn mockUserManager
@@ -58,6 +64,8 @@ class BluetoothWiFiResetPreferenceControllerTest {
        on { getSystemService(Context.CONNECTIVITY_SERVICE) } doReturn mockConnectivityManager
        on { getSystemService(Context.NETWORK_POLICY_SERVICE) } doReturn mockNetworkPolicyManager
        on { getSystemService(Context.VPN_MANAGEMENT_SERVICE) } doReturn mockVpnManager
        on { getSystemService(Context.TELEPHONY_SERVICE) } doReturn mockTelephonyManager
        on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager
        on { resources } doReturn mockResources
    }

@@ -86,29 +94,240 @@ class BluetoothWiFiResetPreferenceControllerTest {
    }

    @Test
    fun resetOperation_resetBluetooth() {
    fun resetOperation_showSimInfo_dataCapable_voiceCapable_resetBluetooth() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn true
            on { isDeviceVoiceCapable } doReturn true
        }

        // Regardless of telephony capabilities, always reset bluetooth
        controller.resetOperation().run()

        verify(mockBluetoothAdapter).clearBluetooth()
    }

    @Test
    fun resetOperation_showSimInfo_notDataCapable_voiceCapable_resetBluetooth() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn false
            on { isDeviceVoiceCapable } doReturn true
        }

        // Regardless of telephony capabilities, always reset bluetooth
        controller.resetOperation().run()

        verify(mockBluetoothAdapter).clearBluetooth()
    }

    @Test
    fun resetOperation_showSimInfo_dataCapable_notVoiceCapable_resetBluetooth() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn true
            on { isDeviceVoiceCapable } doReturn false
        }

        // Regardless of telephony capabilities, always reset bluetooth
        controller.resetOperation().run()

        verify(mockBluetoothAdapter).clearBluetooth()
    }

    @Test
    fun resetOperation_notShowSimInfo_dataCapable_voiceCapable_resetBluetooth() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn false
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn true
            on { isDeviceVoiceCapable } doReturn true
        }

        // Regardless of telephony capabilities, always reset bluetooth
        controller.resetOperation().run()

        verify(mockBluetoothAdapter).clearBluetooth()
    }

    @Test
    fun resetOperation_onDeviceWithSimVisible_notResetConnectivity() {
    fun resetOperation_showSimInfo_notDataCapable_notVoiceCapable_resetBluetooth() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn false
            on { isDeviceVoiceCapable } doReturn false
        }

        // Regardless of telephony capabilities, always reset bluetooth
        controller.resetOperation().run()

        verify(mockBluetoothAdapter).clearBluetooth()
    }

    @Test
    fun resetOperation_showSimInfo_dataCapable_voiceCapable_notResetConnectivity() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn true
            on { isDeviceVoiceCapable } doReturn true
        }

        // Don't reset connectivity if telephony capable
        controller.resetOperation().run()

        verify(mockConnectivityManager, never()).factoryReset()
    }

    @Test
    fun resetOperation_showSimInfo_notDataCapable_voiceCapable_notResetConnectivity() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn false
            on { isDeviceVoiceCapable } doReturn true
        }

        // Don't reset connectivity if telephony capable
        controller.resetOperation().run()

        verify(mockConnectivityManager, never()).factoryReset()
    }

    @Test
    fun resetOperation_onDeviceWithSimInvisible_resetVpn() {
    fun resetOperation_showSimInfo_dataCapable_notVoiceCapable_notResetConnectivity() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn true
            on { isDeviceVoiceCapable } doReturn false
        }

        // Don't reset connectivity if telephony capable
        controller.resetOperation().run()

        verify(mockConnectivityManager, never()).factoryReset()
    }

    @Test
    fun resetOperation_notShowSimInfo_dataCapable_voiceCapable_resetConnectivity() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn false
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn true
            on { isDeviceVoiceCapable } doReturn true
        }

        // Reset connectivity if not telephony capable
        controller.resetOperation().run()

        verify(mockConnectivityManager).factoryReset()
    }

    @Test
    fun resetOperation_showSimInfo_notDataCapable_notVoiceCapable_resetConnectivity() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn false
            on { isDeviceVoiceCapable } doReturn false
        }

        // Reset connectivity if not telephony capable
        controller.resetOperation().run()

        verify(mockConnectivityManager).factoryReset()
    }

    @Test
    fun resetOperation_showSimInfo_dataCapable_voiceCapable_notResetVpn() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn true
            on { isDeviceVoiceCapable } doReturn true
        }

        // Don't reset VPN if telephony capable
        controller.resetOperation().run()

        verify(mockVpnManager, never()).factoryReset()
    }

    @Test
    fun resetOperation_showSimInfo_notDataCapable_voiceCapable_notResetVpn() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn false
            on { isDeviceVoiceCapable } doReturn true
        }

        // Don't reset VPN if telephony capable
        controller.resetOperation().run()

        verify(mockVpnManager, never()).factoryReset()
    }

    @Test
    fun resetOperation_showSimInfo_dataCapable_notVoiceCapable_notResetVpn() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn true
            on { isDeviceVoiceCapable } doReturn false
        }

        // Don't reset VPN if telephony capable
        controller.resetOperation().run()

        verify(mockVpnManager, never()).factoryReset()
    }

    @Test
    fun resetOperation_notShowSimInfo_dataCapable_voiceCapable_resetVpn() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn false
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn true
            on { isDeviceVoiceCapable } doReturn true
        }

        // Reset VPN if not telephony capable
        controller.resetOperation().run()

        verify(mockVpnManager).factoryReset()
    }

    @Test
    fun resetOperation_showSimInfo_notDataCapable_notVoiceCapable_resetVpn() {
        mockResources.stub {
            on { getBoolean(R.bool.config_show_sim_info) } doReturn true
        }
        mockTelephonyManager.stub {
            on { isDataCapable } doReturn false
            on { isDeviceVoiceCapable } doReturn false
        }

        // Reset VPN if not telephony capable
        controller.resetOperation().run()

        verify(mockVpnManager).factoryReset()