Add WEP warning dialog disconnect.

Test: Unit Test
Fix: 318797664
Change-Id: I48dd4ad2783ea4b1f03f2b7c7e0f8716cbb59224
This commit is contained in:
Charlotte Lu
2024-02-22 17:55:04 +08:00
parent 429291b70a
commit 7755dc53b9
3 changed files with 93 additions and 10 deletions

View File

@@ -2044,6 +2044,10 @@
<string name="wifi_settings_wep_networks_button_allow">Allow WEP</string> <string name="wifi_settings_wep_networks_button_allow">Allow WEP</string>
<!-- Wi-Fi settings dialog. Button text of dialog displayed when WEP network toggle is blocked. [CHAR LIMIT=NONE] --> <!-- Wi-Fi settings dialog. Button text of dialog displayed when WEP network toggle is blocked. [CHAR LIMIT=NONE] -->
<string name="wifi_settings_ssid_block_button_close">Close</string> <string name="wifi_settings_ssid_block_button_close">Close</string>
<!-- Wi-Fi settings dialog. Title of dialog displayed when the user turns off “Allow WEP networks” while connected to a WEP network. [CHAR LIMIT=NONE] -->
<string name="wifi_settings_wep_networks_disconnect_title">Disconnect from <xliff:g id="name">%1$s</xliff:g>?</string>
<!-- Wi-Fi settings dialog. Summary text of dialog displayed when the user turns off “Allow WEP networks” while connected to a WEP network. [CHAR LIMIT=NONE] -->
<string name="wifi_settings_wep_networks_disconnect_summary">You\u0027re connected to a WEP network. If you block these networks, you\u0027ll be disconnected.</string>
<!-- Dialog for Access Points --> <skip /> <!-- Dialog for Access Points --> <skip />
<!-- Label to show/hide advanced options [CHAR LIMIT=40] --> <!-- Label to show/hide advanced options [CHAR LIMIT=40] -->

View File

@@ -18,24 +18,33 @@ package com.android.settings.wifi
import android.content.Context import android.content.Context
import android.net.wifi.WifiManager import android.net.wifi.WifiManager
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.fragment.app.Fragment
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.preference.Preference
import androidx.preference.PreferenceScreen
import com.android.settings.R import com.android.settings.R
import com.android.settings.spa.preference.ComposePreferenceController import com.android.settings.spa.preference.ComposePreferenceController
import com.android.settingslib.spa.framework.compose.OverridableFlow import com.android.settingslib.spa.framework.compose.OverridableFlow
import com.android.settingslib.spa.widget.dialog.AlertDialogButton
import com.android.settingslib.spa.widget.dialog.SettingsAlertDialogWithIcon
import com.android.settingslib.spa.widget.preference.SwitchPreference import com.android.settingslib.spa.widget.preference.SwitchPreference
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
import com.android.wifi.flags.Flags import com.android.wifi.flags.Flags
import com.android.wifitrackerlib.WifiEntry
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.asExecutor import kotlinx.coroutines.asExecutor
import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.callbackFlow
/** Controller that controls whether the Wi-Fi Wakeup feature should be enabled. */ /** Controller that controls whether the WEP network can be connected. */
class WepNetworksPreferenceController(context: Context, preferenceKey: String) : class WepNetworksPreferenceController(context: Context, preferenceKey: String) :
ComposePreferenceController(context, preferenceKey) { ComposePreferenceController(context, preferenceKey) {
@@ -47,6 +56,8 @@ class WepNetworksPreferenceController(context: Context, preferenceKey: String) :
@Composable @Composable
override fun Content() { override fun Content() {
val checked by wepAllowedFlow.flow.collectAsStateWithLifecycle(initialValue = null) val checked by wepAllowedFlow.flow.collectAsStateWithLifecycle(initialValue = null)
var openDialog by rememberSaveable { mutableStateOf(false) }
val wifiInfo = wifiManager.connectionInfo
SwitchPreference(object : SwitchPreferenceModel { SwitchPreference(object : SwitchPreferenceModel {
override val title = stringResource(R.string.wifi_allow_wep_networks) override val title = stringResource(R.string.wifi_allow_wep_networks)
override val summary = { getSummary() } override val summary = { getSummary() }
@@ -54,10 +65,40 @@ class WepNetworksPreferenceController(context: Context, preferenceKey: String) :
override val changeable: () -> Boolean override val changeable: () -> Boolean
get() = { carrierAllowed } get() = { carrierAllowed }
override val onCheckedChange: (Boolean) -> Unit = { newChecked -> override val onCheckedChange: (Boolean) -> Unit = { newChecked ->
wifiManager.setWepAllowed(newChecked) if (!newChecked && wifiInfo.currentSecurityType == WifiEntry.SECURITY_WEP) {
wepAllowedFlow.override(newChecked) openDialog = true
} else {
wifiManager.setWepAllowed(newChecked)
wepAllowedFlow.override(newChecked)
}
} }
}) })
if (openDialog) {
SettingsAlertDialogWithIcon(
onDismissRequest = { openDialog = false },
confirmButton = AlertDialogButton(
stringResource(R.string.wifi_disconnect_button_text)
) {
wifiManager.setWepAllowed(false)
wepAllowedFlow.override(false)
openDialog = false
},
dismissButton =
AlertDialogButton(
stringResource(R.string.wifi_cancel)
) { openDialog = false },
title = String.format(
stringResource(R.string.wifi_settings_wep_networks_disconnect_title),
wifiInfo.ssid.removeSurrounding("\"")
),
text = {
Text(
stringResource(R.string.wifi_settings_wep_networks_disconnect_summary),
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center
)
})
}
} }
override fun getSummary(): String = mContext.getString( override fun getSummary(): String = mContext.getString(

View File

@@ -20,6 +20,8 @@ import android.content.Context
import android.net.wifi.WifiManager import android.net.wifi.WifiManager
import androidx.compose.ui.test.assertIsOff import androidx.compose.ui.test.assertIsOff
import androidx.compose.ui.test.assertIsOn import androidx.compose.ui.test.assertIsOn
import androidx.compose.ui.test.isDisplayed
import androidx.compose.ui.test.isNotDisplayed
import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.onRoot import androidx.compose.ui.test.onRoot
@@ -28,12 +30,16 @@ import androidx.preference.PreferenceManager
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.R import com.android.settings.R
import com.android.settings.dashboard.DashboardFragment
import com.android.settings.spa.preference.ComposePreference import com.android.settings.spa.preference.ComposePreference
import com.android.settingslib.spa.testutils.onDialogText
import com.android.wifitrackerlib.WifiEntry
import java.util.function.Consumer import java.util.function.Consumer
import org.junit.Before import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.Mockito
import org.mockito.kotlin.any import org.mockito.kotlin.any
import org.mockito.kotlin.doAnswer import org.mockito.kotlin.doAnswer
import org.mockito.kotlin.doReturn import org.mockito.kotlin.doReturn
@@ -48,25 +54,30 @@ class WepNetworksPreferenceControllerTest {
private var wepAllowed = true private var wepAllowed = true
private val mockWifiManager = mock<WifiManager> { private var mockWifiInfo = mock<android.net.wifi.WifiInfo> {
on { it.currentSecurityType } doReturn WifiEntry.SECURITY_EAP
on { it.ssid } doReturn SSID
}
private var mockWifiManager = mock<WifiManager> {
on { queryWepAllowed(any(), any()) } doAnswer { on { queryWepAllowed(any(), any()) } doAnswer {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val consumer = it.arguments[1] as Consumer<Boolean> val consumer = it.arguments[1] as Consumer<Boolean>
consumer.accept(wepAllowed) consumer.accept(wepAllowed)
} }
on { it.isWepSupported } doReturn true on { it.isWepSupported } doReturn true
on { it.connectionInfo } doReturn mockWifiInfo
} }
private var context: Context = private var context: Context =
spy(ApplicationProvider.getApplicationContext()) { spy(ApplicationProvider.getApplicationContext()) {
on { getSystemService(WifiManager::class.java) } doReturn mockWifiManager on { getSystemService(WifiManager::class.java) } doReturn mockWifiManager
} }
private var controller = WepNetworksPreferenceController(context, TEST_KEY)
private var controller = WepNetworksPreferenceController(context, TEST_KEY)
private val preference = ComposePreference(context).apply { key = TEST_KEY } private val preference = ComposePreference(context).apply { key = TEST_KEY }
private val preferenceScreen = PreferenceManager(context).createPreferenceScreen(context) private val preferenceScreen = PreferenceManager(context).createPreferenceScreen(context)
@Before @Before
fun setUp() { fun setUp() {
preferenceScreen.addPreference(preference) preferenceScreen.addPreference(preference)
@@ -79,6 +90,7 @@ class WepNetworksPreferenceControllerTest {
composeTestRule.setContent { composeTestRule.setContent {
controller.Content() controller.Content()
} }
composeTestRule.onNodeWithText(context.getString(R.string.wifi_allow_wep_networks)) composeTestRule.onNodeWithText(context.getString(R.string.wifi_allow_wep_networks))
.assertIsOn() .assertIsOn()
} }
@@ -89,6 +101,7 @@ class WepNetworksPreferenceControllerTest {
composeTestRule.setContent { composeTestRule.setContent {
controller.Content() controller.Content()
} }
composeTestRule.onNodeWithText(context.getString(R.string.wifi_allow_wep_networks)) composeTestRule.onNodeWithText(context.getString(R.string.wifi_allow_wep_networks))
.assertIsOff() .assertIsOff()
} }
@@ -101,7 +114,6 @@ class WepNetworksPreferenceControllerTest {
} }
composeTestRule.onRoot().performClick() composeTestRule.onRoot().performClick()
composeTestRule.onNodeWithText(context.getString(R.string.wifi_allow_wep_networks)) composeTestRule.onNodeWithText(context.getString(R.string.wifi_allow_wep_networks))
.assertIsOn() .assertIsOn()
} }
@@ -114,12 +126,38 @@ class WepNetworksPreferenceControllerTest {
} }
composeTestRule.onRoot().performClick() composeTestRule.onRoot().performClick()
composeTestRule.onNodeWithText(context.getString(R.string.wifi_allow_wep_networks)) composeTestRule.onNodeWithText(context.getString(R.string.wifi_allow_wep_networks))
.assertIsOff() .assertIsOff()
} }
@Test
fun whenClick_wepAllowed_openDialog() {
wepAllowed = true
Mockito.`when`(mockWifiInfo.currentSecurityType).thenReturn(WifiEntry.SECURITY_WEP)
composeTestRule.setContent {
controller.Content()
}
composeTestRule.onRoot().performClick()
composeTestRule.onDialogText(context.getString(R.string.wifi_disconnect_button_text))
.isDisplayed()
}
@Test
fun whenClick_wepDisallowed_openDialog() {
wepAllowed = false
Mockito.`when`(mockWifiInfo.currentSecurityType).thenReturn(WifiEntry.SECURITY_WEP)
composeTestRule.setContent {
controller.Content()
}
composeTestRule.onRoot().performClick()
composeTestRule.onDialogText(context.getString(R.string.wifi_disconnect_button_text))
.isNotDisplayed()
}
private companion object { private companion object {
const val TEST_KEY = "test_key" const val TEST_KEY = "test_key"
const val SSID = "ssid"
} }
} }