From 17bc9de8ca648f8d30fc960e3c3283a1b21adaf3 Mon Sep 17 00:00:00 2001 From: Hossain Khan Date: Sat, 31 Jan 2026 21:10:59 -0500 Subject: [PATCH] feat: Add WiFi signal strength (RSSI) reporting for BYOD devices - Add getWifiSignalStrength() method to AndroidDeviceInfoProvider to retrieve WiFi RSSI in dBm - Add RSSI header parameter to TrmnlApiService.getNextDisplayData() API call - Update TrmnlDisplayRepository to fetch and send WiFi signal strength to TRMNL API for BYOD devices - Add ACCESS_WIFI_STATE permission to AndroidManifest.xml - RSSI values match firmware implementation (dBm scale, -100 to 0) - Only sends RSSI for BYOD device type to match firmware behavior This enables the TRMNL API to receive WiFi signal strength data from Android devices for monitoring and diagnostics, matching the functionality of the TRMNL firmware devices. --- app/src/main/AndroidManifest.xml | 1 + .../android/data/TrmnlDisplayRepository.kt | 7 +++++ .../trmnl/android/network/TrmnlApiService.kt | 6 ++++ .../android/util/AndroidDeviceInfoProvider.kt | 30 ++++++++++++++++++- 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f020645..6c78770 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + /** @@ -107,6 +111,8 @@ interface TrmnlApiService { * * NOTE: This API always loads the current plugin image from the playlist. * + * See [API Doc](https://docs.trmnl.com/go/private-api/screens) for additional details. + * * @see getNextDisplayData */ @GET diff --git a/app/src/main/java/ink/trmnl/android/util/AndroidDeviceInfoProvider.kt b/app/src/main/java/ink/trmnl/android/util/AndroidDeviceInfoProvider.kt index 933fb34..610a199 100644 --- a/app/src/main/java/ink/trmnl/android/util/AndroidDeviceInfoProvider.kt +++ b/app/src/main/java/ink/trmnl/android/util/AndroidDeviceInfoProvider.kt @@ -1,6 +1,7 @@ package ink.trmnl.android.util import android.content.Context +import android.net.wifi.WifiManager import android.os.BatteryManager import com.squareup.anvil.annotations.optional.SingleIn import ink.trmnl.android.di.AppScope @@ -12,7 +13,7 @@ import javax.inject.Inject * Provider class for accessing Android device information. * * This class provides utility methods to retrieve device-specific information - * such as battery level, which can be used for reporting to the TRMNL API. + * such as battery level and WiFi signal strength, which can be used for reporting to the TRMNL API. */ @SingleIn(AppScope::class) class AndroidDeviceInfoProvider @@ -36,4 +37,31 @@ class AndroidDeviceInfoProvider Timber.e(e, "Failed to get battery level") null } + + /** + * Gets the current WiFi signal strength (RSSI) of the Android device. + * + * RSSI (Received Signal Strength Indicator) is measured in dBm and typically + * ranges from -100 (weakest) to 0 (strongest). + * + * @return WiFi signal strength in dBm, or null if unable to retrieve or WiFi is not connected + */ + @Suppress("DEPRECATION") // WifiInfo.rssi is still the standard way to get signal strength + fun getWifiSignalStrength(): Int? = + try { + val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as? WifiManager + val wifiInfo = wifiManager?.connectionInfo + val rssi = wifiInfo?.rssi + + if (rssi != null && rssi != -127) { // -127 (`INVALID_RSSI`) indicates no signal + Timber.i("Current WiFi signal strength (RSSI): $rssi dBm") + rssi + } else { + Timber.d("WiFi not connected or signal unavailable") + null + } + } catch (e: Exception) { + Timber.e(e, "Failed to get WiFi signal strength") + null + } }