Skip to content

Commit db65250

Browse files
Refactor channel rating
1 parent 1cd3c47 commit db65250

File tree

15 files changed

+352
-190
lines changed

15 files changed

+352
-190
lines changed

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-
#Wed Apr 02 19:13:56 EDT 2025
3-
version_build=5
2+
#Sat Apr 05 08:08:52 EDT 2025
3+
version_build=6
44
version_major=3
55
version_minor=2
66
version_patch=0

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/band/WiFiInfo.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,7 @@ private val countriesNA = listOf("AS", "CA", "CO", "DO", "FM", "GT", "GU", "MP",
6161

6262
private val countriesGHZ6 = listOf("JP", "RU", "NZ", "AU", "GL", "AE", "GB", "MX", "SG", "HK", "MO", "PH")
6363

64-
private val channelsWorldGHZ2 = listOf(1, 3, 5, 9, 13)
65-
private val channelsNAGHZ2 = listOf(1, 3, 6, 9, 11)
64+
private val excludeGHZ2: List<Map<String, List<Int>>> = countriesNA.map { mapOf(it to listOf(12, 13)) }
6665

6766
private val excludeGHZ5: List<Map<String, List<Int>>> =
6867
countriesETSI.map { mapOf(it to listOf(177)) } +
@@ -92,8 +91,8 @@ private val excludeGHZ6: List<Map<String, List<Int>>> =
9291
(countriesETSI + countriesGHZ6).map { mapOf(it to (97..223).toList()) }
9392

9493
private val ratingChannelsGHZ2: RatingChannels = { wiFiBand, countryCode ->
95-
val channels = if (countriesNA.contains(countryCode)) channelsNAGHZ2 else channelsWorldGHZ2
96-
wiFiBand.wiFiChannels.availableChannels.filter { it in channels }
94+
val excludedChannels = excludeGHZ2.flatMap { it[countryCode] ?: emptyList() }
95+
wiFiBand.wiFiChannels.availableChannels.filterNot { it in excludedChannels }
9796
}
9897

9998
private val ratingChannelsGHZ5: RatingChannels = { wiFiBand, countryCode ->
@@ -110,11 +109,11 @@ internal val wiFiChannelsGHZ2 = WiFiChannels(
110109
WiFiChannelPair(WiFiChannel(-1, 2402), WiFiChannel(15, 2482)),
111110
1,
112111
mapOf(
113-
WiFiWidth.MHZ_20 to listOf(1, 5, 6, 9, 13).toList(),
114-
WiFiWidth.MHZ_40 to listOf(3, 11).toList(),
112+
WiFiWidth.MHZ_20 to (1..13).toList(),
113+
WiFiWidth.MHZ_40 to listOf(3, 7, 11),
115114
),
116115
(1..13).associateWith { "$it" },
117-
listOf(1, 3, 5, 6, 9, 11, 13),
116+
(1..13).toList(),
118117
ratingChannelsGHZ2
119118
)
120119

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/channelrating/ChannelRatingAdapter.kt

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,11 @@ import android.view.View
2323
import android.view.ViewGroup
2424
import android.widget.ArrayAdapter
2525
import android.widget.RatingBar
26-
import android.widget.TextView
27-
import androidx.annotation.ColorRes
2826
import androidx.core.content.ContextCompat
2927
import com.vrem.util.EMPTY
3028
import com.vrem.wifianalyzer.MainContext
3129
import com.vrem.wifianalyzer.R
30+
import com.vrem.wifianalyzer.databinding.ChannelRatingBestBinding
3231
import com.vrem.wifianalyzer.databinding.ChannelRatingDetailsBinding
3332
import com.vrem.wifianalyzer.wifi.band.WiFiBand
3433
import com.vrem.wifianalyzer.wifi.band.WiFiChannel
@@ -40,13 +39,18 @@ import com.vrem.wifianalyzer.wifi.scanner.UpdateNotifier
4039

4140
class ChannelRatingAdapter(
4241
context: Context,
43-
private val bestChannels: TextView,
44-
private val channelRating: ChannelRating = ChannelRating()
42+
val channelRatingBest: ChannelRatingBestBinding,
43+
val channelRating: ChannelRating = ChannelRating()
4544
) :
46-
ArrayAdapter<WiFiChannel>(context, R.layout.channel_rating_details, mutableListOf()),
47-
UpdateNotifier {
45+
ArrayAdapter<WiFiChannel>(context, R.layout.channel_rating_details, mutableListOf()), UpdateNotifier {
4846

49-
private val maxChannelsToDisplay = 11
47+
private val bindingMap = mapOf(
48+
WiFiWidth.MHZ_20 to Pair(channelRatingBest.channelRating20, channelRatingBest.channelRatingRatingChannel20),
49+
WiFiWidth.MHZ_40 to Pair(channelRatingBest.channelRating40, channelRatingBest.channelRatingRatingChannel40),
50+
WiFiWidth.MHZ_80 to Pair(channelRatingBest.channelRating80, channelRatingBest.channelRatingRatingChannel80),
51+
WiFiWidth.MHZ_160 to Pair(channelRatingBest.channelRating160, channelRatingBest.channelRatingRatingChannel160),
52+
WiFiWidth.MHZ_320 to Pair(channelRatingBest.channelRating320, channelRatingBest.channelRatingRatingChannel320)
53+
)
5054

5155
override fun update(wiFiData: WiFiData) {
5256
val settings = MainContext.INSTANCE.settings
@@ -56,9 +60,7 @@ class ChannelRatingAdapter(
5660
val predicate: Predicate = wiFiBand.predicate()
5761
val wiFiDetails: List<WiFiDetail> = wiFiData.wiFiDetails(predicate, SortBy.STRENGTH)
5862
channelRating.wiFiDetails(wiFiDetails)
59-
val bestChannel = bestChannels(wiFiBand, wiFiChannels)
60-
bestChannels.text = bestChannel.message
61-
bestChannels.setTextColor(ContextCompat.getColor(context, bestChannel.color))
63+
bestChannels(wiFiBand, wiFiChannels)
6264
notifyDataSetChanged()
6365
}
6466

@@ -70,14 +72,13 @@ class ChannelRatingAdapter(
7072
}
7173

7274
override fun getView(position: Int, view: View?, parent: ViewGroup): View {
73-
val mainContext = MainContext.INSTANCE
74-
val wiFiBand = mainContext.settings.wiFiBand()
75+
val wiFiBand = MainContext.INSTANCE.settings.wiFiBand()
7576
val binding = view?.let { ChannelRatingAdapterBinding(it) } ?: ChannelRatingAdapterBinding(create(parent))
7677
getItem(position)?.let { wiFiChannel ->
7778
val wiFiWidth = wiFiBand.wiFiChannels.wiFiWidthByChannel(wiFiChannel.channel)
7879
binding.channelRatingChannel.text = wiFiChannel.channel.toString()
7980
binding.channelRatingAPCount.text = channelRating.count(wiFiChannel).toString()
80-
binding.channelRatingWidth.text = ContextCompat.getString(mainContext.context, wiFiWidth.textResource)
81+
binding.channelRatingWidth.text = ContextCompat.getString(context, wiFiWidth.textResource)
8182
ratingBar(wiFiChannel, binding.channelRating)
8283
}
8384
return binding.root
@@ -93,16 +94,32 @@ class ChannelRatingAdapter(
9394
ratingBar.progressTintList = ColorStateList.valueOf(color)
9495
}
9596

96-
internal fun bestChannels(wiFiBand: WiFiBand, wiFiChannels: List<WiFiChannel>): Message {
97-
val bestChannels: List<Int> = channelRating.bestChannels(wiFiChannels).map { it.wiFiChannel.channel }
98-
return if (bestChannels.isNotEmpty()) {
99-
Message(bestChannels.joinToString(separator = ", ", limit = maxChannelsToDisplay), R.color.success)
97+
internal fun bestChannels(wiFiBand: WiFiBand, wiFiChannels: List<WiFiChannel>) {
98+
val channels = channelRating.bestChannels(wiFiBand, wiFiChannels)
99+
val channelRatingMessage = channelRatingBest.channelRatingMessage
100+
if (channels.isEmpty()) {
101+
channelRatingMessage.text = errorMessage(wiFiBand)
102+
channelRatingMessage.setTextColor(ContextCompat.getColor(context, R.color.error))
100103
} else {
101-
Message(errorMessage(wiFiBand), R.color.error)
104+
channelRatingMessage.text = String.EMPTY
105+
channelRatingMessage.setTextColor(ContextCompat.getColor(context, R.color.success))
102106
}
107+
updateChannelRatings(channels)
103108
}
104109

105-
internal class Message(val message: String, @ColorRes val color: Int)
110+
private fun updateChannelRatings(channelAPCounts: List<ChannelAPCount>) {
111+
WiFiWidth.entries.forEach { wiFiWidth ->
112+
val channels = channelAPCounts
113+
.filter { it.wiFiWidth == wiFiWidth }
114+
.map { it.wiFiChannel.channel }
115+
.joinToString(",")
116+
val visibility = if (channels.isEmpty()) View.GONE else View.VISIBLE
117+
bindingMap[wiFiWidth]?.let { (channelRatingView, channelRatingTextView) ->
118+
channelRatingView.visibility = visibility
119+
channelRatingTextView.text = channels
120+
}
121+
}
122+
}
106123

107124
private fun errorMessage(wiFiBand: WiFiBand): String = with(context.resources) {
108125
getText(R.string.channel_rating_best_none).toString() +

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/channelrating/ChannelRatingFragment.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import android.view.LayoutInflater
2222
import android.view.View
2323
import android.view.ViewGroup
2424
import android.widget.ListView
25-
import android.widget.TextView
2625
import androidx.fragment.app.Fragment
2726
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
2827
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener
@@ -44,8 +43,7 @@ class ChannelRatingFragment : Fragment(), OnRefreshListener {
4443
swipeRefreshLayout.isRefreshing = false
4544
swipeRefreshLayout.isEnabled = false
4645
}
47-
val bestChannels: TextView = binding.channelRatingBest.channelRatingBestChannels
48-
channelRatingAdapter = ChannelRatingAdapter(requireActivity(), bestChannels)
46+
channelRatingAdapter = ChannelRatingAdapter(requireActivity(), binding.channelRatingBest)
4947
val listView: ListView = binding.channelRatingRefresh.findViewById(R.id.channelRatingView)
5048
listView.adapter = channelRatingAdapter
5149
return binding.root

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package com.vrem.wifianalyzer.wifi.model
1919

2020
import com.vrem.wifianalyzer.wifi.band.WiFiChannel
2121

22-
data class ChannelAPCount(val wiFiChannel: WiFiChannel, val count: Int) : Comparable<ChannelAPCount> {
22+
data class ChannelAPCount(val wiFiChannel: WiFiChannel, val wiFiWidth: WiFiWidth, val count: Int) : Comparable<ChannelAPCount> {
2323
override fun compareTo(other: ChannelAPCount): Int =
2424
compareBy<ChannelAPCount> { it.count }.thenBy { it.wiFiChannel }.compare(this, other)
2525
}

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package com.vrem.wifianalyzer.wifi.model
1919

2020
import com.vrem.annotation.OpenClass
21+
import com.vrem.wifianalyzer.wifi.band.WiFiBand
2122
import com.vrem.wifianalyzer.wifi.band.WiFiChannel
2223

2324
@OpenClass
@@ -37,21 +38,20 @@ class ChannelRating(val wiFiDetails: MutableList<WiFiDetail> = mutableListOf())
3738
wiFiDetails.addAll(removeSame(newWiFiDetails))
3839
}
3940

40-
fun bestChannels(wiFiChannels: List<WiFiChannel>): List<ChannelAPCount> =
41+
fun bestChannels(wiFiBand: WiFiBand, wiFiChannels: List<WiFiChannel>): List<ChannelAPCount> =
4142
wiFiChannels
4243
.filter { bestChannel(it) }
43-
.map { ChannelAPCount(it, count(it)) }
44+
.map { ChannelAPCount(it, wiFiBand.wiFiChannels.wiFiWidthByChannel(it.channel), count(it)) }
4445
.sorted()
4546

46-
private fun removeSame(wiFiDetails: List<WiFiDetail>): List<WiFiDetail> {
47-
return wiFiDetails.distinctBy { it.wiFiVirtual }.sortedWith(SortBy.STRENGTH.sort)
48-
}
47+
private fun removeSame(wiFiDetails: List<WiFiDetail>): List<WiFiDetail> =
48+
wiFiDetails.distinctBy { it.wiFiVirtual }.sortedWith(SortBy.STRENGTH.sort)
4949

5050
private fun collectOverlapping(wiFiChannel: WiFiChannel): List<WiFiDetail> =
5151
wiFiDetails.filter { it.wiFiSignal.inRange(wiFiChannel.frequency) }
5252

53-
private fun bestChannel(it: WiFiChannel): Boolean {
54-
val strength: Strength = strength(it)
53+
private fun bestChannel(wiFiChannel: WiFiChannel): Boolean {
54+
val strength: Strength = strength(wiFiChannel)
5555
return Strength.ZERO == strength || Strength.ONE == strength
5656
}
5757

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

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import kotlin.math.abs
2525

2626
private val CHANNEL_WIDTH_320MHZ = if (buildMinVersionT()) ScanResult.CHANNEL_WIDTH_320MHZ else 5
2727

28-
typealias ChannelWidth = Int
2928
typealias CalculateCenter = (primary: Int, center0: Int, center1: Int) -> Int
3029

3130
internal val calculateCenter40: CalculateCenter = { primary, center0, _ ->
@@ -37,7 +36,7 @@ internal val calculateCenterUsingCenter1: CalculateCenter = { _, _, center1 -> c
3736

3837
enum class WiFiWidth(
3938
@StringRes val textResource: Int,
40-
val channelWidth: ChannelWidth,
39+
val channelWidth: Int,
4140
val frequencyWidth: Int,
4241
val guardBand: Int,
4342
val calculateCenter: CalculateCenter,
@@ -47,20 +46,13 @@ enum class WiFiWidth(
4746
MHZ_40(R.string.wifi_width_40mhz, ScanResult.CHANNEL_WIDTH_40MHZ, 40, 3, calculateCenter40, 8),
4847
MHZ_80(R.string.wifi_width_80mhz, ScanResult.CHANNEL_WIDTH_80MHZ, 80, 3, calculateCenterUsingCenter0, 16),
4948
MHZ_160(R.string.wifi_width_160mhz, ScanResult.CHANNEL_WIDTH_160MHZ, 160, 3, calculateCenterUsingCenter1, 32),
50-
MHZ_80_PLUS(
51-
R.string.wifi_width_80mhz,
52-
ScanResult.CHANNEL_WIDTH_80MHZ_PLUS_MHZ,
53-
80,
54-
3,
55-
calculateCenterUsingCenter1,
56-
16
57-
),
49+
MHZ_80_PLUS(R.string.wifi_width_80mhz, ScanResult.CHANNEL_WIDTH_80MHZ_PLUS_MHZ, 80, 3, calculateCenterUsingCenter1, 16),
5850
MHZ_320(R.string.wifi_width_320mhz, CHANNEL_WIDTH_320MHZ, 320, 3, calculateCenterUsingCenter1, 32);
5951

6052
val frequencyWidthHalf: Int = frequencyWidth / 2
6153

6254
companion object {
63-
fun findOne(channelWidth: ChannelWidth): WiFiWidth =
55+
fun findOne(channelWidth: Int): WiFiWidth =
6456
WiFiWidth.entries.firstOrNull { it.channelWidth == channelWidth } ?: MHZ_20
6557
}
6658
}

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/scanner/Transformer.kt

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,7 @@ import android.net.wifi.WifiInfo
2121
import com.vrem.annotation.OpenClass
2222
import com.vrem.util.nullToEmpty
2323
import com.vrem.util.ssid
24-
import com.vrem.wifianalyzer.wifi.model.FastRoaming
25-
import com.vrem.wifianalyzer.wifi.model.WiFiConnection
26-
import com.vrem.wifianalyzer.wifi.model.WiFiData
27-
import com.vrem.wifianalyzer.wifi.model.WiFiDetail
28-
import com.vrem.wifianalyzer.wifi.model.WiFiIdentifier
29-
import com.vrem.wifianalyzer.wifi.model.WiFiSecurity
30-
import com.vrem.wifianalyzer.wifi.model.WiFiSecurityType
31-
import com.vrem.wifianalyzer.wifi.model.WiFiSignal
32-
import com.vrem.wifianalyzer.wifi.model.WiFiSignalExtra
33-
import com.vrem.wifianalyzer.wifi.model.WiFiStandard
34-
import com.vrem.wifianalyzer.wifi.model.WiFiWidth
35-
import com.vrem.wifianalyzer.wifi.model.convertIpV4Address
36-
import com.vrem.wifianalyzer.wifi.model.convertSSID
24+
import com.vrem.wifianalyzer.wifi.model.*
3725

3826
@Suppress("DEPRECATION")
3927
fun WifiInfo.ipV4Address(): Int = ipAddress
@@ -52,26 +40,23 @@ internal class Transformer(private val cache: Cache) {
5240
}
5341
}
5442

55-
internal fun transformCacheResults(): List<WiFiDetail> =
56-
cache.scanResults().map { transform(it) }
43+
internal fun transformCacheResults(): List<WiFiDetail> = cache.scanResults().map { transform(it) }
5744

58-
internal fun transformToWiFiData(): WiFiData =
59-
WiFiData(transformCacheResults(), transformWifiInfo())
45+
internal fun transformToWiFiData(): WiFiData = WiFiData(transformCacheResults(), transformWifiInfo())
6046

6147
private fun transform(cacheResult: CacheResult): WiFiDetail {
6248
val scanResult = cacheResult.scanResult
63-
6449
val wiFiWidth = WiFiWidth.findOne(scanResult.channelWidth)
65-
val centerFrequency =
66-
wiFiWidth.calculateCenter(scanResult.frequency, scanResult.centerFreq0, scanResult.centerFreq1)
67-
val mc80211 = scanResult.is80211mcResponder
68-
val wiFiStandard = WiFiStandard.findOne(scanResult)
69-
val fastRoaming = FastRoaming.find(scanResult)
70-
val securityTypes = WiFiSecurityType.find(scanResult)
71-
val extra = WiFiSignalExtra(mc80211, wiFiStandard, fastRoaming)
72-
val wiFiSignal = WiFiSignal(scanResult.frequency, centerFrequency, wiFiWidth, cacheResult.average, extra)
73-
val wiFiIdentifier = WiFiIdentifier(scanResult.ssid(), String.nullToEmpty(scanResult.BSSID))
74-
val wiFiSecurity = WiFiSecurity(String.nullToEmpty(scanResult.capabilities), securityTypes)
75-
return WiFiDetail(wiFiIdentifier, wiFiSecurity, wiFiSignal)
50+
return WiFiDetail(
51+
WiFiIdentifier(scanResult.ssid(), String.nullToEmpty(scanResult.BSSID)),
52+
WiFiSecurity(String.nullToEmpty(scanResult.capabilities), WiFiSecurityType.find(scanResult)),
53+
WiFiSignal(
54+
scanResult.frequency,
55+
wiFiWidth.calculateCenter(scanResult.frequency, scanResult.centerFreq0, scanResult.centerFreq1),
56+
wiFiWidth,
57+
cacheResult.average,
58+
WiFiSignalExtra(scanResult.is80211mcResponder, WiFiStandard.findOne(scanResult), FastRoaming.find(scanResult))
59+
)
60+
)
7661
}
7762
}

0 commit comments

Comments
 (0)