diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 854d4099fc1..0241a299415 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -5056,6 +5056,12 @@ android:authorities="${applicationId}.androidx-startup" tools:node="remove" /> + + + diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java index f14c32c5381..0da1034994c 100644 --- a/src/com/android/settings/network/NetworkProviderSettings.java +++ b/src/com/android/settings/network/NetworkProviderSettings.java @@ -89,6 +89,7 @@ import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.wifi.WifiEnterpriseRestrictionUtils; import com.android.settingslib.wifi.WifiSavedConfigUtils; +import com.android.wifi.flags.Flags; import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiEntry.ConnectCallback; import com.android.wifitrackerlib.WifiPickerTracker; @@ -1257,8 +1258,19 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment // If it's an unsaved secure WifiEntry, it will callback // ConnectCallback#onConnectResult with ConnectCallback#CONNECT_STATUS_FAILURE_NO_CONFIG - wifiEntry.connect(new WifiEntryConnectCallback(wifiEntry, editIfNoConfig, - fullScreenEdit)); + WifiEntryConnectCallback callback = + new WifiEntryConnectCallback(wifiEntry, editIfNoConfig, fullScreenEdit); + + if (Flags.wepUsage() && wifiEntry.getSecurityTypes().contains(WifiEntry.SECURITY_WEP)) { + WepNetworkDialogActivity.checkWepAllowed( + getContext(), getViewLifecycleOwner(), wifiEntry.getSsid(), () -> { + wifiEntry.connect(callback); + return null; + }); + return; + } + + wifiEntry.connect(callback); } private class WifiConnectActionListener implements WifiManager.ActionListener { diff --git a/src/com/android/settings/network/WepNetworkDialogActivity.kt b/src/com/android/settings/network/WepNetworkDialogActivity.kt new file mode 100644 index 00000000000..2fa87849ef1 --- /dev/null +++ b/src/com/android/settings/network/WepNetworkDialogActivity.kt @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.network + +import android.app.settings.SettingsEnums +import android.content.Context +import android.content.Intent +import android.net.wifi.WifiManager +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.style.TextAlign +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope +import com.android.settings.R +import com.android.settings.core.SubSettingLauncher +import com.android.settings.wifi.ConfigureWifiSettings +import com.android.settingslib.spa.SpaBaseDialogActivity +import com.android.settingslib.spa.widget.dialog.AlertDialogButton +import com.android.settingslib.spa.widget.dialog.SettingsAlertDialogWithIcon +import kotlin.coroutines.resume +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.asExecutor +import kotlinx.coroutines.launch +import kotlinx.coroutines.suspendCancellableCoroutine +import kotlinx.coroutines.withContext + +class WepNetworkDialogActivity : SpaBaseDialogActivity() { + @Composable + override fun Content() { + val context = LocalContext.current + val wifiManager = context.getSystemService(WifiManager::class.java) + SettingsAlertDialogWithIcon( + onDismissRequest = { finish() }, + confirmButton = AlertDialogButton( + getString(R.string.wifi_settings_ssid_block_button_close) + ) { finish() }, + dismissButton = AlertDialogButton( + getString(R.string.wifi_settings_wep_networks_button_allow) + ) { + SubSettingLauncher(context) + .setTitleText(context.getText(R.string.network_and_internet_preferences_title)) + .setSourceMetricsCategory(SettingsEnums.CONFIGURE_WIFI) + .setDestination(ConfigureWifiSettings::class.java.getName()) + .launch() + finish() + }, + title = String.format( + getString(R.string.wifi_settings_wep_networks_blocked_title), + intent.getStringExtra(SSID) ?: SSID + ), + text = { + Text( + if (wifiManager?.isWepSupported == false) + getString(R.string.wifi_settings_wep_networks_summary_toggle_off) + else getString(R.string.wifi_settings_wep_networks_summary_blocked_by_carrier), + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center + ) + }) + } + + companion object { + @JvmStatic + fun checkWepAllowed( + context: Context, + lifecycleOwner: LifecycleOwner, + ssid: String, + onAllowed: () -> Unit, + ) { + lifecycleOwner.lifecycleScope.launch { + val wifiManager = context.getSystemService(WifiManager::class.java) ?: return@launch + if (wifiManager.queryWepAllowed()) { + onAllowed() + } else { + val intent = Intent(context, WepNetworkDialogActivity::class.java).apply { + putExtra(SSID, ssid) + } + context.startActivity(intent) + } + } + } + + private suspend fun WifiManager.queryWepAllowed(): Boolean = + withContext(Dispatchers.Default) { + suspendCancellableCoroutine { continuation -> + queryWepAllowed(Dispatchers.Default.asExecutor()) { + continuation.resume(it) + } + } + } + + const val SSID = "ssid" + } +} \ No newline at end of file