Skip to content

Commit 94e0ddc

Browse files
Add getWifiNetworkDetails() for SSID, IP, and MAC address
Expose a new getWifiNetworkDetails() JNI method that returns the current WiFi network's SSID, IP address, and MAC address as a newline-separated string. IP is decoded from WifiManager.getConnectionInfo(); MAC is read via NetworkInterface; SSID falls back to parsing 'dumpsys wifi' via root when WifiManager returns <unknown ssid> (location permission restriction). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 53f50b8 commit 94e0ddc

4 files changed

Lines changed: 51 additions & 0 deletions

File tree

app/src/main/java/org/koreader/launcher/LuaInterface.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ interface LuaInterface {
2929
fun getLightDialogState(): Int
3030
fun getName(): String
3131
fun getNetworkInfo(): String
32+
fun getWifiNetworkDetails(): String
3233
fun getPlatformName(): String
3334
fun getScreenAvailableHeight(): Int
3435
fun getScreenAvailableWidth(): Int

app/src/main/java/org/koreader/launcher/MainActivity.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,10 @@ class MainActivity : NativeActivity(), LuaInterface,
438438
return networkInfo()
439439
}
440440

441+
override fun getWifiNetworkDetails(): String {
442+
return wifiNetworkDetails()
443+
}
444+
441445
override fun getPlatformName(): String {
442446
return platform
443447
}

app/src/main/java/org/koreader/launcher/extensions/ActivityExtensions.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import android.view.Surface
1919
import android.view.View
2020
import androidx.appcompat.app.AlertDialog
2121
import androidx.core.content.ContextCompat
22+
import java.net.NetworkInterface
2223
import java.util.*
2324

2425
val Activity.platform: String
@@ -211,6 +212,40 @@ fun Activity.setWifiRadio(enable: Boolean): Boolean {
211212
}
212213
}
213214

215+
@Suppress("DEPRECATION")
216+
fun Activity.wifiNetworkDetails(): String {
217+
if (!wifiEnabled()) return ""
218+
val wifi = applicationContext.getSystemService(Context.WIFI_SERVICE) as? WifiManager ?: return ""
219+
val info = wifi.connectionInfo
220+
221+
val ipInt = info?.ipAddress ?: 0
222+
val ip = if (ipInt == 0) "" else "%d.%d.%d.%d".format(
223+
ipInt and 0xFF, (ipInt shr 8) and 0xFF,
224+
(ipInt shr 16) and 0xFF, (ipInt shr 24) and 0xFF
225+
)
226+
227+
val mac = try {
228+
NetworkInterface.getByName("wlan0")?.hardwareAddress
229+
?.joinToString(":") { "%02X".format(it) } ?: ""
230+
} catch (e: Exception) { "" }
231+
232+
var ssid = info?.ssid?.removeSurrounding("\"") ?: ""
233+
if (ssid.isEmpty() || ssid == "<unknown ssid>" || ssid.startsWith("0x")) {
234+
ssid = try {
235+
val proc = Runtime.getRuntime().exec(arrayOf("su", "-c",
236+
"dumpsys wifi 2>/dev/null | grep -m1 'extra:'"))
237+
val line = proc.inputStream.bufferedReader().readLine() ?: ""
238+
Regex("""extra: "([^"]*)"""").find(line)?.groupValues?.get(1) ?: ""
239+
} catch (e: Exception) { "" }
240+
}
241+
242+
return listOfNotNull(
243+
if (ssid.isNotEmpty()) "SSID: $ssid" else null,
244+
if (ip.isNotEmpty()) "IP: $ip" else null,
245+
if (mac.isNotEmpty()) "MAC: $mac" else null
246+
).joinToString("\n")
247+
}
248+
214249
fun Activity.pruneCacheDir() {
215250
try {
216251
getExternalFilesDir(null)?.let {

assets/android.lua

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2499,6 +2499,17 @@ local function run(android_app_state)
24992499
end)
25002500
end
25012501

2502+
android.getWifiNetworkDetails = function()
2503+
return JNI:context(android.app.activity.vm, function(jni)
2504+
local details = jni:callObjectMethod(
2505+
android.app.activity.clazz,
2506+
"getWifiNetworkDetails",
2507+
"()Ljava/lang/String;"
2508+
)
2509+
return jni:to_string(details)
2510+
end)
2511+
end
2512+
25022513
android.download = function(url, name)
25032514
return JNI:context(android.app.activity.vm, function(jni)
25042515
local uri_string = jni.env[0].NewStringUTF(jni.env, url)

0 commit comments

Comments
 (0)