Skip to content

Commit d367960

Browse files
improve Wi-Fi channel handling
1 parent 6555dcf commit d367960

27 files changed

+594
-471
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-
#Sun Mar 30 17:46:54 EDT 2025
3-
version_build=2
2+
#Mon Mar 31 19:38:42 EDT 2025
3+
version_build=3
44
version_major=3
55
version_minor=2
66
version_patch=0

app/src/main/kotlin/com/vrem/util/CompatUtils.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@
1717
*/
1818
package com.vrem.util
1919

20-
import android.annotation.TargetApi
2120
import android.content.Context
2221
import android.content.pm.PackageInfo
2322
import android.content.pm.PackageManager.PackageInfoFlags
2423
import android.content.res.Configuration
2524
import android.content.res.Resources
2625
import android.net.wifi.ScanResult
2726
import android.os.Build
28-
import java.util.*
27+
import androidx.annotation.RequiresApi
28+
import java.util.Locale
2929

3030
fun Context.createContext(newLocale: Locale): Context {
3131
val resources: Resources = resources
@@ -41,7 +41,7 @@ fun Context.packageInfo(): PackageInfo =
4141
packageInfoLegacy()
4242
}
4343

44-
@TargetApi(Build.VERSION_CODES.TIRAMISU)
44+
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
4545
private fun Context.packageInfoAndroidT(): PackageInfo =
4646
packageManager.getPackageInfo(packageName, PackageInfoFlags.of(0))
4747

@@ -55,7 +55,7 @@ fun ScanResult.ssid(): String =
5555
ssidLegacy()
5656
}.removeSurrounding("\"")
5757

58-
@TargetApi(Build.VERSION_CODES.TIRAMISU)
58+
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
5959
private fun ScanResult.ssidAndroidT(): String = String.nullToEmpty(wifiSsid?.toString())
6060

6161
@Suppress("DEPRECATION")

app/src/main/kotlin/com/vrem/wifianalyzer/ActivityUtils.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
*/
1818
package com.vrem.wifianalyzer
1919

20-
import android.annotation.TargetApi
2120
import android.content.Intent
2221
import android.os.Build
2322
import android.provider.Settings
2423
import android.view.WindowManager
24+
import androidx.annotation.RequiresApi
2525
import androidx.appcompat.widget.Toolbar
2626

2727
internal fun MainActivity.keepScreenOn() =
@@ -43,7 +43,7 @@ internal fun MainActivity.setupToolbar(): Toolbar {
4343

4444
internal fun makeIntent(action: String): Intent = Intent(action)
4545

46-
@TargetApi(Build.VERSION_CODES.Q)
46+
@RequiresApi(Build.VERSION_CODES.Q)
4747
internal fun MainActivity.startWiFiSettings() =
4848
this.startActivity(makeIntent(Settings.Panel.ACTION_WIFI))
4949

app/src/main/kotlin/com/vrem/wifianalyzer/about/AboutFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import android.content.ActivityNotFoundException
2323
import android.content.Intent
2424
import android.content.pm.PackageInfo
2525
import android.content.pm.PackageManager.NameNotFoundException
26-
import android.net.Uri
2726
import android.os.Build
2827
import android.os.Bundle
2928
import android.view.LayoutInflater
@@ -32,6 +31,7 @@ import android.view.ViewGroup
3231
import android.widget.TextView
3332
import android.widget.Toast
3433
import androidx.core.content.pm.PackageInfoCompat
34+
import androidx.core.net.toUri
3535
import androidx.fragment.app.Fragment
3636
import androidx.fragment.app.FragmentActivity
3737
import com.vrem.util.EMPTY
@@ -129,7 +129,7 @@ class AboutFragment : Fragment() {
129129
private class WriteReviewClickListener(private val activity: Activity) : View.OnClickListener {
130130
override fun onClick(view: View) {
131131
val url = "market://details?id=" + activity.applicationContext.packageName
132-
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
132+
val intent = Intent(Intent.ACTION_VIEW, url.toUri())
133133
try {
134134
activity.startActivity(intent)
135135
} catch (e: ActivityNotFoundException) {

app/src/main/kotlin/com/vrem/wifianalyzer/export/Export.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class Export(private val exportIntent: ExportIntent = ExportIntent()) {
7878
"${wiFiSignal.primaryFrequency}$FREQUENCY_UNITS|" +
7979
"${wiFiSignal.centerWiFiChannel.channel}|" +
8080
"${wiFiSignal.centerFrequency}$FREQUENCY_UNITS|" +
81-
"${wiFiSignal.wiFiWidth.frequencyWidth}$FREQUENCY_UNITS (${wiFiSignal.wiFiChannelStart.frequency} - ${wiFiSignal.wiFiChannelEnd.frequency})|" +
81+
"${wiFiSignal.wiFiWidth.frequencyWidth}$FREQUENCY_UNITS (${wiFiSignal.wiFiChannelStart.frequency} - ${wiFiSignal.wiFiChannelEnd.frequency})|" +
8282
"${wiFiSignal.distance}|" +
8383
"${wiFiSignal.extra.is80211mc}|" +
8484
wiFiSecurity.capabilities + "|" +

app/src/main/kotlin/com/vrem/wifianalyzer/navigation/NavigationMenuController.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ package com.vrem.wifianalyzer.navigation
1919

2020
import android.view.Menu
2121
import android.view.MenuItem
22+
import androidx.core.view.get
23+
import androidx.core.view.size
2224
import com.google.android.material.bottomnavigation.BottomNavigationView
2325
import com.google.android.material.navigation.NavigationView
2426
import com.vrem.annotation.OpenClass
@@ -33,7 +35,7 @@ class NavigationMenuController(
3335

3436
private lateinit var currentNavigationMenu: NavigationMenu
3537

36-
fun currentMenuItem(): MenuItem = navigationView.menu.getItem(currentNavigationMenu.ordinal)
38+
fun currentMenuItem(): MenuItem = navigationView.menu[currentNavigationMenu.ordinal]
3739

3840
fun currentNavigationMenu(): NavigationMenu = currentNavigationMenu
3941

@@ -44,8 +46,8 @@ class NavigationMenuController(
4446
}
4547

4648
private fun selectCurrentMenuItem(navigationMenu: NavigationMenu, menu: Menu) {
47-
for (i in 0 until menu.size()) {
48-
val menuItem: MenuItem = menu.getItem(i)
49+
for (i in 0 until menu.size) {
50+
val menuItem: MenuItem = menu[i]
4951
menuItem.isCheckable = false
5052
menuItem.isChecked = false
5153
}

app/src/main/kotlin/com/vrem/wifianalyzer/permission/LocationPermission.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
*/
1818
package com.vrem.wifianalyzer.permission
1919

20-
import android.annotation.TargetApi
2120
import android.app.Activity
2221
import android.location.LocationManager
2322
import android.os.Build
23+
import androidx.annotation.RequiresApi
2424
import com.vrem.annotation.OpenClass
2525
import com.vrem.util.buildMinVersionP
2626

@@ -54,7 +54,7 @@ class LocationPermission(private val activity: Activity) {
5454
false
5555
}
5656

57-
@TargetApi(Build.VERSION_CODES.P)
57+
@RequiresApi(Build.VERSION_CODES.P)
5858
private fun locationEnabled(locationManager: LocationManager): Boolean =
5959
try {
6060
locationManager.isLocationEnabled

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import android.net.wifi.WifiInfo
2121
import android.view.View
2222
import android.view.ViewGroup
2323
import android.widget.TextView
24+
import androidx.core.view.isEmpty
2425
import com.vrem.wifianalyzer.MainActivity
2526
import com.vrem.wifianalyzer.MainContext
2627
import com.vrem.wifianalyzer.R
@@ -64,7 +65,7 @@ class ConnectionView(
6465
val parent = connectionView.findViewById<ViewGroup>(R.id.connectionDetail)
6566
val view =
6667
accessPointDetail.makeView(parent.getChildAt(0), parent, connection, layout = connectionViewType.layout)
67-
if (parent.childCount == 0) {
68+
if (parent.isEmpty()) {
6869
parent.addView(view)
6970
}
7071
setViewConnection(connectionView, wiFiConnection)

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

Lines changed: 9 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -20,145 +20,6 @@ package com.vrem.wifianalyzer.wifi.band
2020
import com.vrem.util.EMPTY
2121
import com.vrem.wifianalyzer.wifi.model.WiFiWidth
2222

23-
internal const val FREQUENCY_SPREAD = 5
24-
25-
typealias WiFiRange = Pair<Int, Int>
26-
typealias WiFiChannelPair = Pair<WiFiChannel, WiFiChannel>
27-
28-
private val countriesETSI = listOf(
29-
"AT",
30-
"BE",
31-
"CH",
32-
"CY",
33-
"CZ",
34-
"DE",
35-
"DK",
36-
"EE",
37-
"ES",
38-
"FI",
39-
"FR",
40-
"GR",
41-
"HU",
42-
"IE",
43-
"IS",
44-
"IT",
45-
"LI",
46-
"LT",
47-
"LU",
48-
"LV",
49-
"MT",
50-
"NL",
51-
"NO",
52-
"PL",
53-
"PT",
54-
"RO",
55-
"SE",
56-
"SI",
57-
"SK",
58-
"IL"
59-
)
60-
61-
private fun excludeGHZ6(): List<Map<String, List<Int>>> {
62-
val exclude = (97..223).toList()
63-
val additional = listOf("JP", "RU", "NZ", "AU", "GL", "AE", "GB", "MX", "SG", "HK", "MO", "PH")
64-
return (countriesETSI + additional).map { mapOf(it to exclude) }
65-
}
66-
67-
private fun excludeGHZ5(): List<Map<String, List<Int>>> {
68-
val exclude1 = listOf(177)
69-
val exclude2 = (120..128).toList()
70-
val exclude3 = (169..177).toList()
71-
val exclude4 = (96..128).toList()
72-
val exclude5 = (173..177).toList()
73-
val exclude6 = (149..177).toList()
74-
val exclude7 = (96..144).toList()
75-
val exclude8 = listOf(144)
76-
val exclude9 = (165..177).toList()
77-
val additional = listOf(
78-
"AU" to exclude2 + exclude1,
79-
"CA" to exclude2 + exclude3,
80-
"UK" to exclude2 + exclude1,
81-
"RU" to exclude4 + exclude5,
82-
"JP" to exclude4 + exclude6,
83-
"IN" to exclude1,
84-
"SG" to exclude3,
85-
"CH" to exclude7 + exclude3,
86-
"IL" to exclude1,
87-
"KR" to exclude3,
88-
"TR" to exclude8 + exclude6,
89-
"ZA" to exclude8 + exclude6,
90-
"BR" to exclude3,
91-
"TW" to exclude3,
92-
"NZ" to exclude3,
93-
"BH" to exclude7 + exclude3,
94-
"VN" to exclude3,
95-
"ID" to exclude7 + exclude9,
96-
"PH" to exclude5
97-
)
98-
return countriesETSI.map { mapOf(it to exclude1) } + additional.map { mapOf(it.first to it.second) }
99-
}
100-
101-
102-
val wiFiChannelsGHZ2: WiFiChannels = WiFiChannels(
103-
WiFiChannelPair(WiFiChannel(-1, 2402), WiFiChannel(15, 2482)),
104-
1,
105-
mapOf(
106-
(WiFiWidth.MHZ_20 to listOf(1, 2, 3, 6, 7, 8, 11, 12, 13)),
107-
(WiFiWidth.MHZ_40 to listOf(3, 7, 11))
108-
),
109-
(1..13).associate { it to "$it" },
110-
listOf(1, 2, 3, 6, 7, 8, 11, 12, 13)
111-
)
112-
113-
val wiFiChannelsGHZ5: WiFiChannels = WiFiChannels(
114-
WiFiChannelPair(WiFiChannel(30, 5150), WiFiChannel(184, 5920)),
115-
2,
116-
mapOf(
117-
(WiFiWidth.MHZ_20 to ((32..144 step WiFiWidth.MHZ_20.step) + (149..177 step WiFiWidth.MHZ_20.step))),
118-
(WiFiWidth.MHZ_40 to ((38..142 step WiFiWidth.MHZ_40.step) + (151..175 step WiFiWidth.MHZ_40.step))),
119-
(WiFiWidth.MHZ_80 to ((42..138 step WiFiWidth.MHZ_80.step) + (155..171 step WiFiWidth.MHZ_80.step))),
120-
(WiFiWidth.MHZ_160 to ((50..114 step WiFiWidth.MHZ_160.step) + 163))
121-
),
122-
listOf(34, 50, 66, 82, 98, 113, 129, 147, 163, 178).associateWith {
123-
when (it) {
124-
113 -> "114"
125-
129 -> "130"
126-
178 -> "179"
127-
else -> "$it"
128-
}
129-
},
130-
((42..138 step WiFiWidth.MHZ_80.step) + (155..171 step WiFiWidth.MHZ_80.step) +
131-
(50..114 step WiFiWidth.MHZ_160.step) + 163)
132-
.toSortedSet()
133-
.toList(),
134-
excludeGHZ5()
135-
)
136-
137-
val wiFiChannelsGHZ6: WiFiChannels = WiFiChannels(
138-
WiFiChannelPair(WiFiChannel(-5, 5925), WiFiChannel(235, 7125)),
139-
2,
140-
mapOf(
141-
(WiFiWidth.MHZ_20 to (1..233 step WiFiWidth.MHZ_20.step).toList()),
142-
(WiFiWidth.MHZ_40 to (3..227 step WiFiWidth.MHZ_40.step).toList()),
143-
(WiFiWidth.MHZ_80 to (7..215 step WiFiWidth.MHZ_80.step).toList()),
144-
(WiFiWidth.MHZ_160 to (15..207 step WiFiWidth.MHZ_160.step).toList()),
145-
(WiFiWidth.MHZ_320 to (31..191 step WiFiWidth.MHZ_320.step).toList())
146-
),
147-
listOf(1, 31, 63, 95, 128, 160, 192, 222).associateWith {
148-
when (it) {
149-
128 -> "127"
150-
160 -> "159"
151-
192 -> "191"
152-
222 -> "223"
153-
else -> "$it"
154-
}
155-
},
156-
((15..207 step WiFiWidth.MHZ_160.step) + (31..191 step WiFiWidth.MHZ_320.step))
157-
.toSortedSet()
158-
.toList(),
159-
excludeGHZ6()
160-
)
161-
16223
class WiFiChannels(
16324
val channelRange: WiFiChannelPair,
16425
val offset: Int,
@@ -171,6 +32,12 @@ class WiFiChannels(
17132
fun availableChannels(wiFiBand: WiFiBand, countryCode: String): List<WiFiChannel> =
17233
WiFiChannelCountry.find(countryCode).channels(wiFiBand).map { wiFiChannelByChannel(it) }
17334

35+
fun availableChannels(wiFiWidth: WiFiWidth, countryCode: String): List<Int> =
36+
activeChannels[wiFiWidth]
37+
.orEmpty()
38+
.subtract(excludeChannels.flatMap { it[countryCode] ?: emptyList() })
39+
.toList()
40+
17441
fun inRange(frequency: Int): Boolean = frequency in channelRange.first.frequency..channelRange.second.frequency
17542

17643
fun wiFiChannelByFrequency(frequency: Int): WiFiChannel =
@@ -183,6 +50,9 @@ class WiFiChannels(
18350
WiFiChannel.UNKNOWN
18451
}
18552

53+
fun wiFiWidthByChannel(channel: Int): WiFiWidth =
54+
activeChannels.entries.firstOrNull { it.value.contains(channel) }?.key ?: WiFiWidth.MHZ_20
55+
18656
fun graphChannelCount(): Int = (channelRange.second.channel - channelRange.first.channel + 1) / offset
18757

18858
fun graphChannelByFrequency(frequency: Int): String =

0 commit comments

Comments
 (0)