Skip to content

Commit 44c2e90

Browse files
committed
improve OpenWifiOnTop
now sorted in this order: - currently connected - saved && !open - saved && open - !saved && open - !saved && !open - others, sorted by default
1 parent e221e4b commit 44c2e90

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

OpenWifiOnTop/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ android {
1414

1515
dependencies {
1616
implementation(project(":reflection"))
17+
implementation(project(":logger"))
1718
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package de.binarynoise.openWifiOnTop
22

3+
import de.binarynoise.logger.Logger.log
34
import de.binarynoise.reflection.cast
4-
import de.binarynoise.reflection.findDeclaredField
55
import de.binarynoise.reflection.findDeclaredMethod
66
import de.robv.android.xposed.IXposedHookLoadPackage
77
import de.robv.android.xposed.XposedBridge
@@ -14,30 +14,59 @@ class Hook : IXposedHookLoadPackage {
1414
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
1515
val WifiEntryClass = lpparam.classLoader.loadClass("com.android.wifitrackerlib.WifiEntry")
1616
val getSecurityTypes = WifiEntryClass.findDeclaredMethod("getSecurityTypes")
17+
val isSaved = WifiEntryClass.findDeclaredMethod("isSaved")
18+
val isPrimary = WifiEntryClass.findDeclaredMethod("isPrimaryNetwork")
19+
val WIFI_PICKER_COMPARATOR = XposedHelpers.getStaticObjectField(WifiEntryClass, "WIFI_PICKER_COMPARATOR").cast<Comparator<Any>>()
20+
21+
val comparator: (Any, Any) -> Int = { a, b ->
22+
val aPrimary = isPrimary.invoke(a) as Boolean
23+
val bPrimary = isPrimary.invoke(b) as Boolean
24+
25+
val aSaved = isSaved.invoke(a) as Boolean
26+
val bSaved = isSaved.invoke(b) as Boolean
27+
28+
val aOpen = getSecurityTypes.invoke(a)!!.cast<List<Int>>().minOrNull() == 0 // SECURITY_TYPE_OPEN
29+
val bOpen = getSecurityTypes.invoke(b)!!.cast<List<Int>>().minOrNull() == 0
30+
31+
// we want
32+
// - primary
33+
// - saved && !open
34+
// - saved && open
35+
// - !saved && open
36+
// - !saved && !open
37+
38+
val resultPrimary = aPrimary.compareTo(bPrimary)
39+
val resultSaved = aSaved.compareTo(bSaved)
40+
val resultOpen = aOpen.compareTo(bOpen)
41+
42+
if (resultPrimary != 0) -resultPrimary // primary before !primary
43+
else if (resultSaved != 0) -resultSaved // saved before !saved
44+
else if (resultOpen != 0) if (aSaved) resultOpen else -resultOpen // saved != open before saved == open
45+
else WIFI_PICKER_COMPARATOR.compare(a, b)
46+
}
1747

1848
val WifiPickerTrackerClass = lpparam.classLoader.loadClass("com.android.wifitrackerlib.WifiPickerTracker")
1949

2050
try {
2151
XposedHelpers.findAndHookMethod(WifiPickerTrackerClass, "getWifiEntries", object : MethodHook() {
2252
override fun afterHookedMethod(param: MethodHookParam) = with(param) {
23-
result = result.cast<List<*>>().sortedByDescending {
24-
getSecurityTypes.invoke(it)!!.cast<List<Int>>().minOrNull() == 0
25-
}
53+
result.cast<MutableList<*>>().sortWith(comparator)
2654
}
2755
})
28-
} catch (_: Throwable) {
56+
log("handleLoadPackage: hooked getWifiEntries")
57+
} catch (t: Throwable) {
58+
XposedBridge.log(t)
2959
}
3060

3161
try {
3262
XposedBridge.hookAllMethods(WifiPickerTrackerClass, "updateWifiEntries", object : MethodHook() {
3363
override fun afterHookedMethod(param: MethodHookParam): Unit = with(param) {
34-
val mWifiEntries = WifiPickerTrackerClass.findDeclaredField("mWifiEntries")
35-
mWifiEntries.set(param.thisObject, mWifiEntries.get(thisObject)!!.cast<List<*>>().sortedByDescending {
36-
getSecurityTypes.invoke(it)?.cast<List<Int>>()?.minOrNull() == 0
37-
}.let(::ArrayList)) // convert java.util.Arrays$ArrayList to java.util.ArrayList
64+
XposedHelpers.getObjectField(thisObject, "mWifiEntries").cast<MutableList<*>>().sortWith(comparator)
3865
}
3966
})
40-
} catch (_: Throwable) {
67+
log("handleLoadPackage: hooked updateWifiEntries")
68+
} catch (t: Throwable) {
69+
XposedBridge.log(t)
4170
}
4271
}
4372
}

0 commit comments

Comments
 (0)