11package de.binarynoise.openWifiOnTop
22
3+ import de.binarynoise.logger.Logger.log
34import de.binarynoise.reflection.cast
4- import de.binarynoise.reflection.findDeclaredField
55import de.binarynoise.reflection.findDeclaredMethod
66import de.robv.android.xposed.IXposedHookLoadPackage
77import 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