Skip to content

Commit 8c3c795

Browse files
Update WiFi signal strength handling and tests
1 parent 2691b50 commit 8c3c795

9 files changed

Lines changed: 71 additions & 11 deletions

File tree

app/build.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#Build Properties
2-
#Sat Oct 18 08:20:48 EDT 2025
3-
version_build=33
2+
#Sun Nov 02 08:13:02 EST 2025
3+
version_build=34
44
version_major=3
55
version_minor=2
66
version_patch=1

app/jacoco.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
*/
1818

1919
jacoco {
20-
toolVersion = "0.8.13"
20+
toolVersion = "0.8.14"
2121
}
2222

2323
def executionPath = 'outputs/unit_test_code_coverage/debugUnitTest/testDebugUnitTest.exec'

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/accesspoint/AccessPointDetail.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class AccessPointDetail {
131131
wiFiSignal: WiFiSignal,
132132
) = view.findViewById<TextView>(R.id.level)?.let {
133133
it.text = "${wiFiSignal.level}dBm"
134-
it.setTextColor(ContextCompat.getColor(view.context, wiFiSignal.strength.colorResource))
134+
it.setTextColor(ContextCompat.getColor(view.context, wiFiSignal.strengthColor))
135135
}
136136

137137
private fun setLevelImage(
@@ -141,7 +141,7 @@ class AccessPointDetail {
141141
val strength = wiFiSignal.strength
142142
it.tag = strength.imageResource
143143
it.setImageResource(strength.imageResource)
144-
it.setColorFilter(ContextCompat.getColor(view.context, strength.colorResource))
144+
it.setColorFilter(ContextCompat.getColor(view.context, wiFiSignal.strengthColor))
145145
}
146146

147147
private fun setViewVendorShort(

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/model/Strength.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,21 @@ enum class Strength(
3535
fun weak(): Boolean = ZERO == this
3636

3737
companion object {
38-
fun calculate(level: Int): Strength = entries[calculateSignalLevel(level, entries.size)]
38+
fun fromRssi(rssi: Int): Strength = entries[calculateSignalLevel(rssi, entries.size)]
3939

4040
fun reverse(strength: Strength): Strength = entries[entries.size - strength.ordinal - 1]
41+
42+
/**
43+
* RSSI thresholds are based on common Wi-Fi signal quality guidelines:
44+
* - -67 dBm or higher: Excellent signal (mapped to [R.color.success])
45+
* - -70 dBm to -68 dBm: Good signal (mapped to [R.color.warning])
46+
* - Below -70 dBm: Weak or poor signal (mapped to [R.color.error])
47+
*/
48+
fun colorForRssi(rssi: Int): Int =
49+
when {
50+
rssi >= -67 -> R.color.success
51+
rssi >= -70 -> R.color.warning
52+
else -> R.color.error
53+
}
4154
}
4255
}

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/model/WiFiSignal.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ data class WiFiSignal(
6464

6565
val centerWiFiChannel: WiFiChannel get() = wiFiBand.wiFiChannels.wiFiChannelByFrequency(centerFrequency)
6666

67-
val strength: Strength get() = Strength.calculate(level)
67+
val strength: Strength get() = Strength.fromRssi(level)
68+
69+
val strengthColor: Int get() = Strength.colorForRssi(level)
6870

6971
val distance: String get() =
7072
String.format(Locale.getDefault(), "~%.1fm", calculateDistance(primaryFrequency, level))

app/src/test/kotlin/com/vrem/wifianalyzer/wifi/accesspoint/AccessPointDetailTest.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import android.view.View
2222
import android.widget.ImageView
2323
import android.widget.TextView
2424
import androidx.annotation.DrawableRes
25+
import androidx.core.content.ContextCompat
2526
import androidx.test.ext.junit.runners.AndroidJUnit4
2627
import com.vrem.util.EMPTY
2728
import com.vrem.wifianalyzer.MainContextHelper.INSTANCE
@@ -340,6 +341,18 @@ class AccessPointDetailTest {
340341
validateTextViewValue(actual, expectedFastRoaming, R.id.fastRoaming)
341342
}
342343

344+
@Test
345+
fun makeViewSetsCorrectLevelTextColor() {
346+
// Arrange
347+
val wiFiDetail = withWiFiDetail()
348+
val expectedColor = ContextCompat.getColor(mainActivity, wiFiDetail.wiFiSignal.strengthColor)
349+
// Act
350+
val view = fixture.makeView(null, null, wiFiDetail)
351+
val levelTextView = view.findViewById<TextView>(R.id.level)
352+
// Assert
353+
assertThat(levelTextView.currentTextColor).isEqualTo(expectedColor)
354+
}
355+
343356
private fun withWiFiDetail(
344357
ssid: String = "SSID",
345358
wiFiAdditional: WiFiAdditional = WiFiAdditional.EMPTY,

app/src/test/kotlin/com/vrem/wifianalyzer/wifi/model/StrengthTest.kt

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class StrengthTest {
7878
}
7979

8080
@Test
81-
fun calculate() {
81+
fun fromRssi() {
8282
val testCases =
8383
listOf(
8484
-89 to Strength.ZERO,
@@ -92,7 +92,7 @@ class StrengthTest {
9292
0 to Strength.FOUR,
9393
)
9494
testCases.forEach { (input, expected) ->
95-
assertThat(Strength.calculate(input)).isEqualTo(expected)
95+
assertThat(Strength.fromRssi(input)).isEqualTo(expected)
9696
}
9797
}
9898

@@ -103,4 +103,26 @@ class StrengthTest {
103103
assertThat(Strength.reverse(strength)).isEqualTo(expected[i])
104104
}
105105
}
106+
107+
@Test
108+
fun colorForRssi() {
109+
// rssi >= -67 (success)
110+
assertThat(Strength.colorForRssi(-67)).isEqualTo(R.color.success)
111+
assertThat(Strength.colorForRssi(0)).isEqualTo(R.color.success)
112+
assertThat(Strength.colorForRssi(-66)).isEqualTo(R.color.success)
113+
// -70 <= rssi < -67 (warning)
114+
assertThat(Strength.colorForRssi(-68)).isEqualTo(R.color.warning)
115+
assertThat(Strength.colorForRssi(-69)).isEqualTo(R.color.warning)
116+
assertThat(Strength.colorForRssi(-70)).isEqualTo(R.color.warning)
117+
// rssi < -70 (error)
118+
assertThat(Strength.colorForRssi(-71)).isEqualTo(R.color.error)
119+
assertThat(Strength.colorForRssi(-100)).isEqualTo(R.color.error)
120+
}
121+
122+
@Test
123+
fun fromRssiLevelBoundaries() {
124+
assertThat(Strength.fromRssi(-200)).isEqualTo(Strength.ZERO)
125+
assertThat(Strength.fromRssi(200)).isEqualTo(Strength.FOUR)
126+
}
127+
106128
}

app/src/test/kotlin/com/vrem/wifianalyzer/wifi/model/WiFiSignalTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,16 @@ class WiFiSignalTest {
108108
assertThat(fixture.strength).isEqualTo(Strength.THREE)
109109
}
110110

111+
@Test
112+
fun strengthColor() {
113+
// Arrange
114+
val expectedColor = Strength.colorForRssi(level)
115+
// Act
116+
val actualColor = fixture.strengthColor
117+
// Assert
118+
assertThat(actualColor).isEqualTo(expectedColor)
119+
}
120+
111121
@Test
112122
fun distance() {
113123
// setup

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
buildscript {
2222
ext {
23-
kotlin_version = '2.2.20'
23+
kotlin_version = '2.2.21'
2424
}
2525
repositories {
2626
google()
@@ -31,7 +31,7 @@ buildscript {
3131
classpath 'com.android.tools.build:gradle:8.13.0'
3232
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
3333
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
34-
classpath "com.github.ben-manes:gradle-versions-plugin:0.52.0"
34+
classpath "com.github.ben-manes:gradle-versions-plugin:0.53.0"
3535
}
3636
}
3737

0 commit comments

Comments
 (0)