From ec88c4dac2fa373e1a7ba2f38d91c581a64855c7 Mon Sep 17 00:00:00 2001 From: Mygod Date: Sat, 29 May 2021 19:07:41 -0400 Subject: [PATCH] Support new SACC fields in Android 12 --- README.md | 10 ++++ .../net/wifi/SoftApConfigurationCompat.kt | 57 +++++++++++++++++++ .../mygod/vpnhotspot/util/UnblockCentral.kt | 7 ++- 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8806f789..fc16ada5 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,7 @@ Greylisted/blacklisted APIs or internal constants: (some constants are hardcoded * (since API 30) `Landroid/net/ConnectivityModuleConnector;->IN_PROCESS_SUFFIX:Ljava/lang/String;` * (since API 30) `Landroid/net/TetheringManager$TetheringEventCallback;->onTetherableInterfaceRegexpsChanged(Landroid/net/TetheringManager$TetheringInterfaceRegexps;)V,blocked` * (since API 30) `Landroid/net/TetheringManager;->TETHERING_WIGIG:I,blocked` +* (since API 31) `Landroid/net/wifi/SoftApConfiguration$Builder;->setUserConfiguration(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,blocked` * (since API 31) `Landroid/net/wifi/SoftApConfiguration;->BAND_TYPES:[I,blocked` * (since API 31) `Landroid/net/wifi/SoftApInfo;->getApInstanceIdentifier()Ljava/lang/String;,blocked` * (since API 31) `Landroid/net/wifi/WifiClient;->getApInstanceIdentifier()Ljava/lang/String;,blocked` @@ -244,11 +245,14 @@ Greylisted/blacklisted APIs or internal constants: (some constants are hardcoded * (since API 30) `Landroid/net/wifi/SoftApConfiguration$Builder;->setAutoShutdownEnabled(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` * (on API 30) `Landroid/net/wifi/SoftApConfiguration$Builder;->setBand(I)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration$Builder;->setBlockedClientList(Ljava/util/List;)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` +* (since API 31) `Landroid/net/wifi/SoftApConfiguration$Builder;->setBridgedModeOpportunisticShutdownEnabled(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration$Builder;->setBssid(Landroid/net/MacAddress;)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` * (on API 30) `Landroid/net/wifi/SoftApConfiguration$Builder;->setChannel(II)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` * (since API 31) `Landroid/net/wifi/SoftApConfiguration$Builder;->setChannels(Landroid/util/SparseIntArray;)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration$Builder;->setClientControlByUserEnabled(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration$Builder;->setHiddenSsid(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` +* (since API 31) `Landroid/net/wifi/SoftApConfiguration$Builder;->setIeee80211axEnabled(Z)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` +* (since API 31) `Landroid/net/wifi/SoftApConfiguration$Builder;->setMacRandomizationSetting(I)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration$Builder;->setMaxNumberOfClients(I)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration$Builder;->setPassphrase(Ljava/lang/String;I)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration$Builder;->setShutdownTimeoutMillis(J)Landroid/net/wifi/SoftApConfiguration$Builder;,sdk,system-api,test-api` @@ -259,15 +263,21 @@ Greylisted/blacklisted APIs or internal constants: (some constants are hardcoded * (since API 30) `Landroid/net/wifi/SoftApConfiguration;->BAND_6GHZ:I,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration;->BAND_ANY:I,sdk,system-api,test-api` * (since API 31) `Landroid/net/wifi/SoftApConfiguration;->BAND_*:I,sdk,system-api,test-api` +* (since API 31) `Landroid/net/wifi/SoftApConfiguration;->RANDOMIZATION_NONE:I,sdk,system-api,test-api` +* (since API 31) `Landroid/net/wifi/SoftApConfiguration;->RANDOMIZATION_PERSISTENT:I,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration;->getAllowedClientList()Ljava/util/List;,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration;->getBand()I,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration;->getBlockedClientList()Ljava/util/List;,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration;->getChannel()I,sdk,system-api,test-api` * (since API 31) `Landroid/net/wifi/SoftApConfiguration;->getChannels()Landroid/util/SparseIntArray;,sdk,system-api,test-api` +* (since API 31) `Landroid/net/wifi/SoftApConfiguration;->getMacRandomizationSetting()I,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration;->getMaxNumberOfClients()I,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration;->getShutdownTimeoutMillis()J,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration;->isAutoShutdownEnabled()Z,sdk,system-api,test-api` +* (since API 31) `Landroid/net/wifi/SoftApConfiguration;->isBridgedModeOpportunisticShutdownEnabled()Z,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApConfiguration;->isClientControlByUserEnabled()Z,sdk,system-api,test-api` +* (since API 31) `Landroid/net/wifi/SoftApConfiguration;->isIeee80211axEnabled()Z,sdk,system-api,test-api` +* (since API 31) `Landroid/net/wifi/SoftApConfiguration;->isUserConfiguration()Z,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApInfo;->CHANNEL_WIDTH_*:I,sdk,system-api,test-api` * (since API 30) `Landroid/net/wifi/SoftApInfo;->CHANNEL_WIDTH_INVALID:I,sdk,system-api,test-api` * (since API 31) `Landroid/net/wifi/SoftApInfo;->getAutoShutdownTimeoutMillis()J,sdk,system-api,test-api` diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/net/wifi/SoftApConfigurationCompat.kt b/mobile/src/main/java/be/mygod/vpnhotspot/net/wifi/SoftApConfigurationCompat.kt index fdb3ec8d..8096c6dd 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/net/wifi/SoftApConfigurationCompat.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/net/wifi/SoftApConfigurationCompat.kt @@ -39,6 +39,14 @@ data class SoftApConfigurationCompat( var blockedClientList: List = emptyList(), @RequiresApi(30) var allowedClientList: List = emptyList(), + @TargetApi(31) + var macRandomizationSetting: Int = RANDOMIZATION_PERSISTENT, + @TargetApi(31) + var isBridgedModeOpportunisticShutdownEnabled: Boolean = true, + @TargetApi(31) + var isIeee80211axEnabled: Boolean = true, + @TargetApi(31) + var isUserConfiguration: Boolean = true, var underlying: Parcelable? = null) : Parcelable { companion object { const val BAND_2GHZ = 1 @@ -59,6 +67,11 @@ data class SoftApConfigurationCompat( } val bandLookup = ConstantLookup("BAND_", null, "2GHZ", "5GHZ") + @TargetApi(31) + const val RANDOMIZATION_NONE = 0 + @TargetApi(31) + const val RANDOMIZATION_PERSISTENT = 1 + fun isLegacyEitherBand(band: Int) = band and BAND_LEGACY == BAND_LEGACY /** @@ -151,6 +164,10 @@ data class SoftApConfigurationCompat( private val getChannels by lazy @TargetApi(31) { SoftApConfiguration::class.java.getDeclaredMethod("getChannels") } + @get:RequiresApi(31) + private val getMacRandomizationSetting by lazy @TargetApi(31) { + SoftApConfiguration::class.java.getDeclaredMethod("getMacRandomizationSetting") + } @get:RequiresApi(30) private val getMaxNumberOfClients by lazy @TargetApi(30) { SoftApConfiguration::class.java.getDeclaredMethod("getMaxNumberOfClients") @@ -163,10 +180,22 @@ data class SoftApConfigurationCompat( private val isAutoShutdownEnabled by lazy @TargetApi(30) { SoftApConfiguration::class.java.getDeclaredMethod("isAutoShutdownEnabled") } + @get:RequiresApi(31) + private val isBridgedModeOpportunisticShutdownEnabled by lazy @TargetApi(31) { + SoftApConfiguration::class.java.getDeclaredMethod("isBridgedModeOpportunisticShutdownEnabled") + } @get:RequiresApi(30) private val isClientControlByUserEnabled by lazy @TargetApi(30) { SoftApConfiguration::class.java.getDeclaredMethod("isClientControlByUserEnabled") } + @get:RequiresApi(31) + private val isIeee80211axEnabled by lazy @TargetApi(31) { + SoftApConfiguration::class.java.getDeclaredMethod("isIeee80211axEnabled") + } + @get:RequiresApi(31) + private val isUserConfiguration by lazy @TargetApi(31) { + SoftApConfiguration::class.java.getDeclaredMethod("isUserConfiguration") + } @get:RequiresApi(30) private val classBuilder by lazy { Class.forName("android.net.wifi.SoftApConfiguration\$Builder") } @@ -188,6 +217,10 @@ data class SoftApConfigurationCompat( private val setBlockedClientList by lazy { classBuilder.getDeclaredMethod("setBlockedClientList", java.util.List::class.java) } + @get:RequiresApi(31) + private val setBridgedModeOpportunisticShutdownEnabled by lazy { + classBuilder.getDeclaredMethod("setBridgedModeOpportunisticShutdownEnabled", Boolean::class.java) + } @get:RequiresApi(30) private val setBssid by lazy @TargetApi(30) { classBuilder.getDeclaredMethod("setBssid", MacAddress::class.java) @@ -206,6 +239,14 @@ data class SoftApConfigurationCompat( } @get:RequiresApi(30) private val setHiddenSsid by lazy { classBuilder.getDeclaredMethod("setHiddenSsid", Boolean::class.java) } + @get:RequiresApi(31) + private val setIeee80211axEnabled by lazy { + classBuilder.getDeclaredMethod("setIeee80211axEnabled", Boolean::class.java) + } + @get:RequiresApi(31) + private val setMacRandomizationSetting by lazy { + classBuilder.getDeclaredMethod("setMacRandomizationSetting", Int::class.java) + } @get:RequiresApi(30) private val setMaxNumberOfClients by lazy { classBuilder.getDeclaredMethod("setMaxNumberOfClients", Int::class.java) @@ -220,6 +261,8 @@ data class SoftApConfigurationCompat( } @get:RequiresApi(30) private val setSsid by lazy { classBuilder.getDeclaredMethod("setSsid", String::class.java) } + @get:RequiresApi(31) + private val setUserConfiguration by lazy @TargetApi(31) { UnblockCentral.setUserConfiguration(classBuilder) } @Deprecated("Class deprecated in framework") @Suppress("DEPRECATION") @@ -277,6 +320,10 @@ data class SoftApConfigurationCompat( isClientControlByUserEnabled(this) as Boolean, getBlockedClientList(this) as List, getAllowedClientList(this) as List, + getMacRandomizationSetting(this) as Int, + isBridgedModeOpportunisticShutdownEnabled(this) as Boolean, + isIeee80211axEnabled(this) as Boolean, + isUserConfiguration(this) as Boolean, this) } @@ -366,6 +413,16 @@ data class SoftApConfigurationCompat( setHiddenSsid(builder, isHiddenSsid) setAllowedClientList(builder, allowedClientList) setBlockedClientList(builder, blockedClientList) + if (BuildCompat.isAtLeastS()) { + setMacRandomizationSetting(builder, macRandomizationSetting) + setBridgedModeOpportunisticShutdownEnabled(builder, isBridgedModeOpportunisticShutdownEnabled) + setIeee80211axEnabled(builder, isIeee80211axEnabled) + if (sac?.let { isUserConfiguration(it) as Boolean } != false != isUserConfiguration) try { + setUserConfiguration(builder, isUserConfiguration) + } catch (e: ReflectiveOperationException) { + Timber.w(e) // as far as we are concerned, this field is not used anywhere so ignore for now + } + } return build(builder) as SoftApConfiguration } diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/util/UnblockCentral.kt b/mobile/src/main/java/be/mygod/vpnhotspot/util/UnblockCentral.kt index 81e776a7..0a9a7daa 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/util/UnblockCentral.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/util/UnblockCentral.kt @@ -29,9 +29,14 @@ object UnblockCentral { } } + @RequiresApi(31) + fun setUserConfiguration(clazz: Class<*>) = init.let { + clazz.getDeclaredMethod("setUserConfiguration", Boolean::class.java) + } + @get:RequiresApi(31) val SoftApConfiguration_BAND_TYPES get() = init.let { - SoftApConfiguration::class.java.getField("BAND_TYPES").get(null) as IntArray + SoftApConfiguration::class.java.getDeclaredField("BAND_TYPES").get(null) as IntArray } @RequiresApi(31)