Skip to content

Commit 1716d09

Browse files
committed
fix/add SystemUI compatibility
1 parent d6fd31c commit 1716d09

4 files changed

Lines changed: 56 additions & 14 deletions

File tree

BetterVerboseWiFiLogging/src/main/java/de/binarynoise/betterVerboseWiFiLogging/Hook.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.os.Build
44
import de.binarynoise.betterVerboseWiFiLogging.StandardWifiEntry.newGetScanResultDescription
55
import de.binarynoise.betterVerboseWiFiLogging.Utils.wifiTrackerLibUtilsClass
66
import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.getNetworkCapabilityDescription
7+
import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.getNetworkCapabilityDescriptionFallback
78
import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.getNetworkSelectionDescription
89
import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.getWifiInfoDescription
910
import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.newGetWifiInfoDescription
@@ -20,13 +21,15 @@ class Hook : IXposedHookLoadPackage {
2021
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
2122
Wrapper.classLoader = lpparam.classLoader
2223

23-
XposedBridge.hookMethod(getWifiInfoDescription, object : MethodHook() {
24-
override fun beforeHookedMethod(param: MethodHookParam) {
25-
with(param) {
26-
result = newGetWifiInfoDescription(thisObject)
24+
if (getWifiInfoDescription != null) {
25+
XposedBridge.hookMethod(getWifiInfoDescription, object : MethodHook() {
26+
override fun beforeHookedMethod(param: MethodHookParam) {
27+
with(param) {
28+
result = newGetWifiInfoDescription(thisObject)
29+
}
2730
}
28-
}
29-
})
31+
})
32+
}
3033

3134
run {
3235
val hook = object : MethodHook() {
@@ -64,7 +67,8 @@ class Hook : IXposedHookLoadPackage {
6467

6568
result = listOf(
6669
newGetWifiInfoDescription(wifiEntry),
67-
getNetworkCapabilityDescription.invoke(wifiEntry)?.cast<String>()?.replace(":", ":\u00A0"), // can stay as is
70+
(getNetworkCapabilityDescription?.invoke(wifiEntry) ?: getNetworkCapabilityDescriptionFallback(wifiEntry))?.cast<String>()
71+
?.replace(":", ":\u00A0"), // can stay as is
6872
newGetScanResultDescription(wifiEntry),
6973
getNetworkSelectionDescription.invoke(wifiEntry)?.cast<String?>(), // TODO
7074
).filterNot { it.isNullOrBlank() }.joinToString(",\n").trim()

BetterVerboseWiFiLogging/src/main/java/de/binarynoise/betterVerboseWiFiLogging/Wrapper.kt

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package de.binarynoise.betterVerboseWiFiLogging
22

3+
import java.lang.reflect.Method
34
import android.net.wifi.ScanResult
45
import android.net.wifi.WifiConfiguration
56
import android.net.wifi.WifiInfo
@@ -8,6 +9,8 @@ import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.mWifiInfoField
89
import de.binarynoise.betterVerboseWiFiLogging.Wrapper.classLoader
910
import de.binarynoise.reflection.findDeclaredField
1011
import de.binarynoise.reflection.findDeclaredMethod
12+
import de.binarynoise.reflection.findDeclaredMethodOrNull
13+
import de.robv.android.xposed.XposedHelpers
1114
import org.lsposed.hiddenapibypass.HiddenApiBypass
1215

1316
const val wifitrackerlib = "com.android.wifitrackerlib"
@@ -17,11 +20,11 @@ object Wrapper {
1720
}
1821

1922
object BaseWifiTracker {
20-
val baseWiFiTrackerClass: Class<*> = classLoader.loadClass("$wifitrackerlib.BaseWifiTracker")
21-
2223
fun isVerboseLoggingEnabled(): Boolean {
23-
if (Build.VERSION.SDK_INT < 34) return baseWiFiTrackerClass.getDeclaredMethod("isVerboseLoggingEnabled").invoke(null) as Boolean
24-
else {
24+
if (Build.VERSION.SDK_INT < 34) {
25+
val baseWiFiTrackerClass: Class<*> = XposedHelpers.findClass("$wifitrackerlib.BaseWifiTracker", classLoader)
26+
return baseWiFiTrackerClass.getDeclaredMethod("isVerboseLoggingEnabled").invoke(null) as Boolean
27+
} else {
2528
// that actually is the fix, the original code doesn't check for this either anymore
2629
// https://cs.android.com/android/_/android/platform/frameworks/opt/net/wifi/+/main:libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java;l=529;bpv=0;bpt=0
2730
return true
@@ -201,8 +204,8 @@ val channelMap = mapOf(
201204
object WifiEntry {
202205
val wifiEntryClass: Class<*> = classLoader.loadClass("$wifitrackerlib.WifiEntry")
203206

204-
// TODO: check inline in SystemUI
205-
val getWifiInfoDescription = wifiEntryClass.findDeclaredMethod("getWifiInfoDescription")
207+
// inlined by r8 in SystemUI
208+
val getWifiInfoDescription: Method? = wifiEntryClass.findDeclaredMethodOrNull("getWifiInfoDescription")
206209

207210
private const val CONNECTED_STATE_CONNECTED = 2
208211
fun newGetWifiInfoDescription(wifiEntry: Any): String {
@@ -232,7 +235,29 @@ object WifiEntry {
232235
}
233236
}
234237

235-
val getNetworkCapabilityDescription = wifiEntryClass.findDeclaredMethod("getNetworkCapabilityDescription")
238+
val getNetworkCapabilityDescription = wifiEntryClass.findDeclaredMethodOrNull("getNetworkCapabilityDescription")
239+
240+
/**
241+
* Fallback for getNetworkCapabilityDescription when it is inlined by r8
242+
*/
243+
fun getNetworkCapabilityDescriptionFallback(wifiEntry: Any): String? {
244+
val getConnectedState = wifiEntryClass.findDeclaredMethodOrNull("getConnectedState") ?: return null
245+
val hasInternetAccess = wifiEntryClass.findDeclaredMethodOrNull("hasInternetAccess") ?: return null
246+
val isDefaultNetwork = wifiEntryClass.findDeclaredMethodOrNull("isDefaultNetwork") ?: return null
247+
val isLowQuality = wifiEntryClass.findDeclaredMethodOrNull("isLowQuality") ?: return null
248+
249+
return buildString {
250+
if (getConnectedState(wifiEntry) == CONNECTED_STATE_CONNECTED) {
251+
append("hasInternet:")
252+
append(hasInternetAccess(wifiEntry))
253+
append(", isDefaultNetwork:")
254+
append(isDefaultNetwork(wifiEntry))
255+
append(", isLowQuality:")
256+
append(isLowQuality(wifiEntry))
257+
}
258+
}
259+
}
260+
236261
val getNetworkSelectionDescription = wifiEntryClass.findDeclaredMethod("getNetworkSelectionDescription")
237262

238263
val getScanResultDescription = wifiEntryClass.findDeclaredMethod("getScanResultDescription") // -> StandardWifiEntry

BetterVerboseWiFiLogging/src/main/res/values/arrays.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
<resources>
33
<string-array name="scope">
44
<item>com.android.settings</item>
5+
<item>com.android.systemui</item>
56
</string-array>
67
</resources>

reflection/src/main/java/de/binarynoise/reflection/Reflection.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@ fun <T> Class<T>.findDeclaredMethod(name: String, vararg params: Class<*>): Meth
1818
throw NoSuchMethodException("$name(${params.joinToString { it.simpleName }})")
1919
}
2020

21+
fun <T> Class<T>.findDeclaredMethodOrNull(name: String, vararg params: Class<*>): Method? {
22+
var c: Class<*>? = this
23+
while (c != null) {
24+
c.declaredMethods.filter { it.name == name }
25+
.firstOrNull { params.isEmpty() || (it.parameterTypes.map { t -> t.name }) == (params.map { p -> p.name }) }
26+
?.let { return it.makeAccessible() }
27+
c = c.superclass
28+
}
29+
30+
return null
31+
}
32+
2133
fun <T> Class<T>.findDeclaredField(name: String): Field {
2234
var c: Class<*>? = this
2335
while (c != null) {

0 commit comments

Comments
 (0)