1
1
package de.binarynoise.openWifiOnTop
2
2
3
+ import de.binarynoise.logger.Logger.log
3
4
import de.binarynoise.reflection.cast
4
- import de.binarynoise.reflection.findDeclaredField
5
5
import de.binarynoise.reflection.findDeclaredMethod
6
6
import de.robv.android.xposed.IXposedHookLoadPackage
7
7
import de.robv.android.xposed.XposedBridge
@@ -14,30 +14,59 @@ class Hook : IXposedHookLoadPackage {
14
14
override fun handleLoadPackage (lpparam : XC_LoadPackage .LoadPackageParam ) {
15
15
val WifiEntryClass = lpparam.classLoader.loadClass(" com.android.wifitrackerlib.WifiEntry" )
16
16
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
+ }
17
47
18
48
val WifiPickerTrackerClass = lpparam.classLoader.loadClass(" com.android.wifitrackerlib.WifiPickerTracker" )
19
49
20
50
try {
21
51
XposedHelpers .findAndHookMethod(WifiPickerTrackerClass , " getWifiEntries" , object : MethodHook () {
22
52
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)
26
54
}
27
55
})
28
- } catch (_: Throwable ) {
56
+ log(" handleLoadPackage: hooked getWifiEntries" )
57
+ } catch (t: Throwable ) {
58
+ XposedBridge .log(t)
29
59
}
30
60
31
61
try {
32
62
XposedBridge .hookAllMethods(WifiPickerTrackerClass , " updateWifiEntries" , object : MethodHook () {
33
63
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)
38
65
}
39
66
})
40
- } catch (_: Throwable ) {
67
+ log(" handleLoadPackage: hooked updateWifiEntries" )
68
+ } catch (t: Throwable ) {
69
+ XposedBridge .log(t)
41
70
}
42
71
}
43
72
}
0 commit comments