From e9979495e48b62e6a39f5f0544417ce4fd446b32 Mon Sep 17 00:00:00 2001 From: Mygod Date: Fri, 11 Jun 2021 02:41:29 -0400 Subject: [PATCH] Check wifi ap state everywhere --- README.md | 8 ++++---- .../java/be/mygod/vpnhotspot/LocalOnlyHotspotService.kt | 3 ++- .../java/be/mygod/vpnhotspot/manage/TetherManager.kt | 9 +++------ .../java/be/mygod/vpnhotspot/net/wifi/WifiApManager.kt | 9 ++++++++- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index f9e95913..0c80287a 100644 --- a/README.md +++ b/README.md @@ -301,10 +301,10 @@ Greylisted/blacklisted APIs or internal constants: (some constants are hardcoded * (since API 30) `Landroid/net/wifi/WifiManager;->SAP_CLIENT_BLOCK_REASON_CODE_*:I,sdk,system-api,test-api` * (since API 23) `Landroid/net/wifi/WifiManager;->SAP_START_FAILURE_*:I,sdk,system-api,test-api` * (since API 23) `Landroid/net/wifi/WifiManager;->WIFI_AP_STATE_CHANGED_ACTION:Ljava/lang/String;,sdk,system-api,test-api` -* (since API 28) `Landroid/net/wifi/WifiManager;->WIFI_AP_STATE_DISABLED:I,sdk,system-api,test-api` -* (since API 28) `Landroid/net/wifi/WifiManager;->WIFI_AP_STATE_DISABLING:I,sdk,system-api,test-api` -* (since API 26) `Landroid/net/wifi/WifiManager;->WIFI_AP_STATE_ENABLED:I,sdk,system-api,test-api` -* (since API 28) `Landroid/net/wifi/WifiManager;->WIFI_AP_STATE_ENABLING:I,sdk,system-api,test-api` +* (since API 23) `Landroid/net/wifi/WifiManager;->WIFI_AP_STATE_DISABLED:I,sdk,system-api,test-api` +* (since API 23) `Landroid/net/wifi/WifiManager;->WIFI_AP_STATE_DISABLING:I,sdk,system-api,test-api` +* (since API 23) `Landroid/net/wifi/WifiManager;->WIFI_AP_STATE_ENABLED:I,sdk,system-api,test-api` +* (since API 23) `Landroid/net/wifi/WifiManager;->WIFI_AP_STATE_ENABLING:I,sdk,system-api,test-api` * (since API 23) `Landroid/net/wifi/WifiManager;->WIFI_AP_STATE_FAILED:I,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/WifiManager;->getSoftApConfiguration()Landroid/net/wifi/SoftApConfiguration;,sdk,system-api,test-api` * (prior to API 30) `Landroid/net/wifi/WifiManager;->getWifiApConfiguration()Landroid/net/wifi/WifiConfiguration;,sdk,system-api,test-api` diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/LocalOnlyHotspotService.kt b/mobile/src/main/java/be/mygod/vpnhotspot/LocalOnlyHotspotService.kt index ee6d3352..95ead806 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/LocalOnlyHotspotService.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/LocalOnlyHotspotService.kt @@ -10,6 +10,7 @@ import be.mygod.vpnhotspot.net.monitor.IpNeighbourMonitor import be.mygod.vpnhotspot.net.monitor.TetherTimeoutMonitor import be.mygod.vpnhotspot.net.wifi.SoftApConfigurationCompat.Companion.toCompat import be.mygod.vpnhotspot.net.wifi.WifiApManager +import be.mygod.vpnhotspot.net.wifi.WifiApManager.wifiApState import be.mygod.vpnhotspot.util.Services import be.mygod.vpnhotspot.util.StickyEvent1 import be.mygod.vpnhotspot.widget.SmartSnackbar @@ -73,7 +74,7 @@ class LocalOnlyHotspotService : IpNeighbourMonitoringService(), CoroutineScope { } // based on: https://android.googlesource.com/platform/packages/services/Car/+/df5cd06/service/src/com/android/car/CarProjectionService.java#160 val sticky = registerReceiver(null, IntentFilter(WifiApManager.WIFI_AP_STATE_CHANGED_ACTION))!! - val apState = sticky.getIntExtra(WifiApManager.EXTRA_WIFI_AP_STATE, 0) + val apState = sticky.wifiApState val iface = sticky.getStringExtra(WifiApManager.EXTRA_WIFI_AP_INTERFACE_NAME) if (apState != WifiApManager.WIFI_AP_STATE_ENABLED || iface.isNullOrEmpty()) { if (apState == WifiApManager.WIFI_AP_STATE_FAILED) { diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetherManager.kt b/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetherManager.kt index 738c188a..93caf1c3 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetherManager.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetherManager.kt @@ -27,6 +27,7 @@ import be.mygod.vpnhotspot.databinding.ListitemInterfaceBinding import be.mygod.vpnhotspot.net.TetherType import be.mygod.vpnhotspot.net.TetheringManager import be.mygod.vpnhotspot.net.wifi.* +import be.mygod.vpnhotspot.net.wifi.WifiApManager.wifiApState import be.mygod.vpnhotspot.root.WifiApCommands import be.mygod.vpnhotspot.util.* import be.mygod.vpnhotspot.widget.SmartSnackbar @@ -143,8 +144,7 @@ sealed class TetherManager(protected val parent: TetheringFragment) : Manager(), class Wifi(parent: TetheringFragment) : TetherManager(parent), DefaultLifecycleObserver, WifiApManager.SoftApCallbackCompat { private val receiver = broadcastReceiver { _, intent -> - failureReason = if (intent.getIntExtra(WifiApManager.EXTRA_WIFI_AP_STATE, 0) == - WifiApManager.WIFI_AP_STATE_FAILED) { + failureReason = if (intent.wifiApState == WifiApManager.WIFI_AP_STATE_FAILED) { intent.getIntExtra(WifiApManager.EXTRA_WIFI_AP_FAILURE_REASON, 0) } else null data.notifyChange() @@ -171,10 +171,7 @@ sealed class TetherManager(protected val parent: TetheringFragment) : Manager(), } override fun onStateChanged(state: Int, failureReason: Int) { - if (state < WifiApManager.WIFI_AP_STATE_DISABLING || state > WifiApManager.WIFI_AP_STATE_FAILED) { - Timber.w(Exception("Unknown state $state, $failureReason")) - return - } + if (!WifiApManager.checkWifiApState(state)) return this.failureReason = if (state == WifiApManager.WIFI_AP_STATE_FAILED) failureReason else null data.notifyChange() } diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/net/wifi/WifiApManager.kt b/mobile/src/main/java/be/mygod/vpnhotspot/net/wifi/WifiApManager.kt index 811f9d2c..03e86367 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/net/wifi/WifiApManager.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/net/wifi/WifiApManager.kt @@ -74,7 +74,7 @@ object WifiApManager { * @see WIFI_AP_STATE_ENABLING * @see WIFI_AP_STATE_FAILED */ - const val EXTRA_WIFI_AP_STATE = "wifi_state" + private const val EXTRA_WIFI_AP_STATE = "wifi_state" /** * An extra containing the int error code for Soft AP start failure. * Can be obtained from the [WIFI_AP_STATE_CHANGED_ACTION] using [Intent.getIntExtra]. @@ -101,6 +101,13 @@ object WifiApManager { @get:RequiresApi(26) val EXTRA_WIFI_AP_INTERFACE_NAME get() = if (Build.VERSION.SDK_INT >= 30) "android.net.wifi.extra.WIFI_AP_INTERFACE_NAME" else "wifi_ap_interface_name" + + fun checkWifiApState(state: Int) = if (state < WIFI_AP_STATE_DISABLING || state > WIFI_AP_STATE_FAILED) { + Timber.w(Exception("Unknown state $state")) + false + } else true + val Intent.wifiApState get() = + getIntExtra(EXTRA_WIFI_AP_STATE, WIFI_AP_STATE_DISABLED).also { checkWifiApState(it) } /** * Wi-Fi AP is currently being disabled. The state will change to * [WIFI_AP_STATE_DISABLED] if it finishes successfully.