├── _config.yml ├── fastlane └── metadata │ └── android │ ├── zh-CN │ ├── short_description.txt │ └── full_description.txt │ ├── zh-TW │ ├── short_description.txt │ └── full_description.txt │ ├── es │ ├── short_description.txt │ └── full_description.txt │ ├── en-US │ ├── short_description.txt │ ├── images │ │ ├── icon.png │ │ └── featureGraphic.png │ ├── phoneScreenshots │ │ ├── 01.png │ │ ├── 02.png │ │ ├── 03.png │ │ ├── 04.png │ │ ├── 06.png │ │ ├── 07.png │ │ └── 08.png │ ├── sevenInchScreenshots │ │ ├── 01.png │ │ ├── 02.png │ │ ├── 03.png │ │ ├── 04.png │ │ ├── 06.png │ │ ├── 07.png │ │ ├── 08.png │ │ └── 09.png │ └── full_description.txt │ ├── fr │ ├── short_description.txt │ └── full_description.txt │ ├── it │ ├── short_description.txt │ └── full_description.txt │ ├── nl │ ├── short_description.txt │ └── full_description.txt │ ├── pt-BR │ ├── short_description.txt │ └── full_description.txt │ ├── pt │ ├── short_description.txt │ └── full_description.txt │ ├── uk │ ├── short_description.txt │ └── full_description.txt │ ├── bg │ ├── short_description.txt │ └── full_description.txt │ ├── de │ ├── short_description.txt │ └── full_description.txt │ ├── pl │ ├── short_description.txt │ └── full_description.txt │ ├── tr │ ├── short_description.txt │ └── full_description.txt │ ├── hu │ ├── short_description.txt │ └── full_description.txt │ └── ru │ ├── short_description.txt │ └── full_description.txt ├── .github ├── ISSUE_TEMPLATE │ └── config.yml ├── actions │ └── common-setup │ │ └── action.yml ├── workflows │ ├── stale.yml │ ├── codeql-analysis.yml │ └── android-test-ci.yml └── PULL_REQUEST_TEMPLATE.md ├── images ├── icon.png ├── ic_wifi_4.png ├── ic_wifi_5.png ├── ic_wifi_6.png ├── ic_wifi_7.png ├── ic_wifi_legacy.png ├── feature-graphic.png ├── ic_lock_black_18dp.png ├── feature-graphic-light.png ├── ic_lock_open_black_18dp.png ├── ic_lock_outline_black_18dp.png └── svg │ └── background.svg ├── codecov.yml ├── app ├── src │ ├── main │ │ ├── res │ │ │ ├── raw │ │ │ │ ├── data.zip │ │ │ │ └── contributors.txt │ │ │ ├── drawable-hdpi │ │ │ │ └── ic_app.png │ │ │ ├── drawable-mdpi │ │ │ │ └── ic_app.png │ │ │ ├── drawable-xhdpi │ │ │ │ └── ic_app.png │ │ │ ├── drawable-xxhdpi │ │ │ │ └── ic_app.png │ │ │ ├── drawable-xxxhdpi │ │ │ │ └── ic_app.png │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── xml │ │ │ │ └── test_attrs.xml │ │ │ ├── layout │ │ │ │ ├── separator_line.xml │ │ │ │ ├── access_point_view_hide.xml │ │ │ │ ├── info_permission.xml │ │ │ │ ├── info_throttling.xml │ │ │ │ ├── graph_content.xml │ │ │ │ ├── info_faq.xml │ │ │ │ ├── filter_popup.xml │ │ │ │ ├── main_toolbar.xml │ │ │ │ ├── access_points_content.xml │ │ │ │ ├── vendor_details.xml │ │ │ │ ├── filter_ssid.xml │ │ │ │ └── info_location.xml │ │ │ ├── drawable │ │ │ │ ├── menu_selector.xml │ │ │ │ ├── splash_inset.xml │ │ │ │ ├── ic_check.xml │ │ │ │ ├── ic_play_arrow.xml │ │ │ │ ├── ic_reset.xml │ │ │ │ ├── ic_close.xml │ │ │ │ ├── ic_menu.xml │ │ │ │ ├── ic_pause.xml │ │ │ │ ├── ic_fast_forward.xml │ │ │ │ ├── ic_sort.xml │ │ │ │ ├── ic_expand_less.xml │ │ │ │ ├── ic_expand_more.xml │ │ │ │ ├── ic_filter_list.xml │ │ │ │ ├── ic_view_carousel.xml │ │ │ │ ├── ic_show_chart.xml │ │ │ │ ├── ic_import_export.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_list.xml │ │ │ │ ├── ic_signal_wifi_4_bar.xml │ │ │ │ ├── ic_insert_chart.xml │ │ │ │ ├── ic_signal_wifi_0_bar.xml │ │ │ │ ├── ic_brightness_low.xml │ │ │ │ ├── ic_info_outline.xml │ │ │ │ ├── ic_location_on.xml │ │ │ │ ├── ic_signal_wifi_off.xml │ │ │ │ ├── ic_lock.xml │ │ │ │ ├── ic_lock_open.xml │ │ │ │ ├── ic_lock_outline.xml │ │ │ │ ├── ic_group.xml │ │ │ │ ├── ic_signal_wifi_2_bar.xml │ │ │ │ ├── ic_signal_wifi_1_bar.xml │ │ │ │ ├── ic_network_wifi.xml │ │ │ │ ├── ic_signal_wifi_3_bar.xml │ │ │ │ ├── ic_wifi_tethering.xml │ │ │ │ └── ic_color_lens.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── values │ │ │ │ ├── dimens.xml │ │ │ │ └── colors.xml │ │ │ └── menu │ │ │ │ └── nav_bottom_menu.xml │ │ └── kotlin │ │ │ └── com │ │ │ └── vrem │ │ │ ├── annotation │ │ │ └── OpenClass.kt │ │ │ ├── wifianalyzer │ │ │ ├── navigation │ │ │ │ ├── availability │ │ │ │ │ ├── NavigationOption.kt │ │ │ │ │ ├── BottomNav.kt │ │ │ │ │ ├── Filter.kt │ │ │ │ │ ├── ScannerSwitch.kt │ │ │ │ │ ├── WiFiSwitch.kt │ │ │ │ │ └── NavigationOptions.kt │ │ │ │ ├── items │ │ │ │ │ └── NavigationItem.kt │ │ │ │ ├── NavigationMenuControl.kt │ │ │ │ └── options │ │ │ │ │ └── OptionMenu.kt │ │ │ ├── wifi │ │ │ │ ├── graphutils │ │ │ │ │ ├── GraphDataPoint.kt │ │ │ │ │ ├── GraphViewNotifier.kt │ │ │ │ │ ├── GraphAdapter.kt │ │ │ │ │ ├── GraphConstants.kt │ │ │ │ │ └── GraphLegend.kt │ │ │ │ ├── model │ │ │ │ │ ├── WiFiAdditional.kt │ │ │ │ │ ├── ChannelAPCount.kt │ │ │ │ │ ├── WiFiVirtual.kt │ │ │ │ │ ├── GroupBy.kt │ │ │ │ │ ├── WiFiIdentifier.kt │ │ │ │ │ └── WiFiConnection.kt │ │ │ │ ├── accesspoint │ │ │ │ │ ├── AccessPointViewType.kt │ │ │ │ │ ├── ConnectionViewType.kt │ │ │ │ │ └── AccessPointPopup.kt │ │ │ │ ├── filter │ │ │ │ │ ├── adapter │ │ │ │ │ │ ├── WiFiBandAdapter.kt │ │ │ │ │ │ ├── SecurityAdapter.kt │ │ │ │ │ │ ├── BasicFilterAdapter.kt │ │ │ │ │ │ ├── StrengthAdapter.kt │ │ │ │ │ │ └── SSIDAdapter.kt │ │ │ │ │ ├── WiFiBandFilter.kt │ │ │ │ │ ├── StrengthFilter.kt │ │ │ │ │ └── SecurityFilter.kt │ │ │ │ ├── scanner │ │ │ │ │ └── ScannerCallback.kt │ │ │ │ └── band │ │ │ │ │ └── WiFiChannel.kt │ │ │ ├── settings │ │ │ │ ├── Data.kt │ │ │ │ ├── ThemeStyle.kt │ │ │ │ ├── LanguagePreference.kt │ │ │ │ ├── CountryPreference.kt │ │ │ │ └── CustomPreference.kt │ │ │ ├── Configuration.kt │ │ │ ├── vendor │ │ │ │ └── model │ │ │ │ │ └── VendorUtils.kt │ │ │ ├── MainActivityBackPressed.kt │ │ │ ├── permission │ │ │ │ └── PermissionService.kt │ │ │ └── export │ │ │ │ └── ExportIntent.kt │ │ │ └── util │ │ │ ├── StringUtils.kt │ │ │ ├── BuildUtils.kt │ │ │ ├── EnumUtils.kt │ │ │ └── FileUtils.kt │ ├── test │ │ ├── res │ │ │ └── xml │ │ │ │ └── test_attrs.xml │ │ └── kotlin │ │ │ └── com │ │ │ └── vrem │ │ │ └── wifianalyzer │ │ │ ├── wifi │ │ │ ├── graphutils │ │ │ │ └── GraphDataPointTest.kt │ │ │ ├── scanner │ │ │ │ └── SsidTestUtil.kt │ │ │ ├── model │ │ │ │ └── FastRoamingTest.kt │ │ │ ├── predicate │ │ │ │ ├── AllPredicateTest.kt │ │ │ │ ├── AnyPredicateTest.kt │ │ │ │ └── SSIDPredicateTest.kt │ │ │ └── accesspoint │ │ │ │ └── AccessPointViewTypeTest.kt │ │ │ ├── ConfigurationTest.kt │ │ │ ├── navigation │ │ │ └── items │ │ │ │ └── NavigationItemTest.kt │ │ │ └── RobolectricUtil.kt │ └── androidTest │ │ └── kotlin │ │ └── com │ │ └── vrem │ │ └── wifianalyzer │ │ ├── FilterInstrumentedTest.kt │ │ └── ScannerInstrumentedTest.kt ├── build.properties └── lint.xml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitattributes ├── .gitignore ├── gradle.properties ├── settings.gradle ├── .editorconfig └── dependencyUpdates.gradle /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/short_description.txt: -------------------------------------------------------------------------------- 1 | 优化您的 Wi-Fi 网络 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-TW/short_description.txt: -------------------------------------------------------------------------------- 1 | 最佳化您的 Wi-Fi 網路 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/es/short_description.txt: -------------------------------------------------------------------------------- 1 | Optimiza tu red Wi-Fi 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | Optimize your Wi-Fi network -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/short_description.txt: -------------------------------------------------------------------------------- 1 | Optimisez vos réseaux Wi-Fi 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/it/short_description.txt: -------------------------------------------------------------------------------- 1 | Ottimizza la tua rete Wi-Fi 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/nl/short_description.txt: -------------------------------------------------------------------------------- 1 | Optimaliseer uw Wifi netwerk 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt-BR/short_description.txt: -------------------------------------------------------------------------------- 1 | Otimize a sua rede Wi-Fi 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/short_description.txt: -------------------------------------------------------------------------------- 1 | Otimize a sua rede Wi-Fi 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/short_description.txt: -------------------------------------------------------------------------------- 1 | Оптимізація мережі Wi-Fi 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: [] 3 | -------------------------------------------------------------------------------- /fastlane/metadata/android/bg/short_description.txt: -------------------------------------------------------------------------------- 1 | Оптимизирайте своята Wi-Fi мрежа 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de/short_description.txt: -------------------------------------------------------------------------------- 1 | Verbesseren Sie Ihr WLAN-Netzwerk 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pl/short_description.txt: -------------------------------------------------------------------------------- 1 | Zoptymalizuj twoją sieć Wi-Fi 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/short_description.txt: -------------------------------------------------------------------------------- 1 | Wi-Fi ağınızı en iyi hale getirin 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/hu/short_description.txt: -------------------------------------------------------------------------------- 1 | Optimalizálja Wi‑Fi-hálózatát 2 | 3 | -------------------------------------------------------------------------------- /images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/short_description.txt: -------------------------------------------------------------------------------- 1 | Оптимизация сети Wi-Fi путем проверки состояния Wi-Fi 2 | -------------------------------------------------------------------------------- /images/ic_wifi_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/images/ic_wifi_4.png -------------------------------------------------------------------------------- /images/ic_wifi_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/images/ic_wifi_5.png -------------------------------------------------------------------------------- /images/ic_wifi_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/images/ic_wifi_6.png -------------------------------------------------------------------------------- /images/ic_wifi_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/images/ic_wifi_7.png -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | comment: 2 | layout: header, diff, changes, sunburst, uncovered 3 | coverage: 4 | status: { } 5 | 6 | -------------------------------------------------------------------------------- /images/ic_wifi_legacy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/images/ic_wifi_legacy.png -------------------------------------------------------------------------------- /images/feature-graphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/images/feature-graphic.png -------------------------------------------------------------------------------- /app/src/main/res/raw/data.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/raw/data.zip -------------------------------------------------------------------------------- /images/ic_lock_black_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/images/ic_lock_black_18dp.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /images/feature-graphic-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/images/feature-graphic-light.png -------------------------------------------------------------------------------- /images/ic_lock_open_black_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/images/ic_lock_open_black_18dp.png -------------------------------------------------------------------------------- /images/ic_lock_outline_black_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/images/ic_lock_outline_black_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/drawable-hdpi/ic_app.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/drawable-mdpi/ic_app.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/drawable-xhdpi/ic_app.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/drawable-xxhdpi/ic_app.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/drawable-xxxhdpi/ic_app.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/build.properties: -------------------------------------------------------------------------------- 1 | #Build Properties 2 | #Sun Dec 14 12:21:54 EST 2025 3 | version_build=37 4 | version_major=3 5 | version_minor=2 6 | version_patch=1 7 | version_store=70 8 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/phoneScreenshots/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/phoneScreenshots/01.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/phoneScreenshots/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/phoneScreenshots/02.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/phoneScreenshots/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/phoneScreenshots/03.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/phoneScreenshots/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/phoneScreenshots/04.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/phoneScreenshots/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/phoneScreenshots/06.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/phoneScreenshots/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/phoneScreenshots/07.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/phoneScreenshots/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/phoneScreenshots/08.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/images/featureGraphic.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/sevenInchScreenshots/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/sevenInchScreenshots/01.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/sevenInchScreenshots/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/sevenInchScreenshots/02.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/sevenInchScreenshots/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/sevenInchScreenshots/03.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/sevenInchScreenshots/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/sevenInchScreenshots/04.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/sevenInchScreenshots/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/sevenInchScreenshots/06.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/sevenInchScreenshots/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/sevenInchScreenshots/07.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/sevenInchScreenshots/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/sevenInchScreenshots/08.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/sevenInchScreenshots/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VREMSoftwareDevelopment/WiFiAnalyzer/HEAD/fastlane/metadata/android/en-US/sevenInchScreenshots/09.png -------------------------------------------------------------------------------- /app/src/main/res/xml/test_attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/test/res/xml/test_attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Set the default behavior, in case people don't have core.autocrlf set. 2 | * text eol=lf 3 | 4 | # Denote all files that are truly binary and should not be modified. 5 | *.png binary 6 | *.jpg binary 7 | *.ico binary 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | .idea 4 | .kotlin 5 | .run 6 | .navigation 7 | local.properties 8 | .DS_Store 9 | build 10 | coverage 11 | libs 12 | release 13 | *IntegrationTest.java 14 | *IntegrationTest.kt 15 | androidkeystore* -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Oct 15 16:36:01 EDT 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip 7 | -------------------------------------------------------------------------------- /.github/actions/common-setup/action.yml: -------------------------------------------------------------------------------- 1 | name: 'Setup Java and Gradle' 2 | description: 'Composite action to set up Java and Gradle for Android builds.' 3 | runs: 4 | using: 'composite' 5 | steps: 6 | - name: Set up JDK 7 | uses: actions/setup-java@v4 8 | with: 9 | distribution: zulu 10 | java-version: 21 11 | - name: Set up Gradle 12 | uses: gradle/actions/setup-gradle@v4 13 | 14 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/full_description.txt: -------------------------------------------------------------------------------- 1 | 使用 WiFiAnalyzer 检查 Wi-Fi 网络状态、信号强度以及识别拥挤信道,从而优化您的 Wi-Fi 网络。 2 | 3 | 功能: 4 | 5 | * 识别附近的接入点 6 | * 以图表形式显示信道信号强度 7 | * 以图表形式显示接入点信号强度随时间的变化 8 | * 分析 Wi-Fi 网络,对信道进行评级 9 | * HT/VHT 检测——40/80/160/320 MHz(需要硬件/软件支持) 10 | * 2.4 GHz、5 GHz 和 6 GHz Wi-Fi 频段(需要硬件/软件支持) 11 | * 完整或紧凑的接入点视图 12 | * 估算到接入点的距离 13 | * 导出接入点详细信息 14 | * 提供深色、浅色和系统主题 15 | * 暂停/恢复扫描 16 | * 可用筛选条件:Wi-Fi 频段、信号强度、安全性和 SSID 17 | * 制造商/OUI 数据库查询 18 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-TW/full_description.txt: -------------------------------------------------------------------------------- 1 | 使用本開放原始碼的 Android WiFiAnalyzer 應用程式來檢查 Wi-Fi 狀態、訊號強度並識別擁擠的頻道從而最佳化您的 Wi-Fi 網路 2 | 3 | 功能: 4 | 5 | * 識別附近的存取點 6 | * 頻道訊號強度圖表 7 | * 存取點訊號強度隨時間變化的圖表 8 | * 分析 Wi-Fi 網路以評估頻道 9 | * HT/VHT 偵測 - 40/80/160/320 MHz (需要硬體/軟體支援) 10 | * 2.4 GHz、5 GHz 和 6 GHz Wi-Fi 頻段 (需要硬體/軟體支援) 11 | * 完整或精簡的存取點視圖 12 | * 估計與存取點的距離 13 | * 匯出存取點詳細資訊 14 | * 提供深色、淺色和系統主題 15 | * 暫停/繼續掃描 16 | * 可用篩選器:Wi-Fi 頻段、訊號強度、安全性和 SSID 17 | * 供應商/OUI 資料庫查詢 -------------------------------------------------------------------------------- /app/src/test/kotlin/com/vrem/wifianalyzer/wifi/graphutils/GraphDataPointTest.kt: -------------------------------------------------------------------------------- 1 | package com.vrem.wifianalyzer.wifi.graphutils 2 | 3 | import org.assertj.core.api.Assertions.assertThat 4 | import org.junit.Test 5 | 6 | class GraphDataPointTest { 7 | private val fixture: GraphDataPoint = GraphDataPoint(111, 222) 8 | 9 | @Test 10 | fun getX() { 11 | // Validate 12 | assertThat(fixture.x).isEqualTo(111) 13 | } 14 | 15 | @Test 16 | fun getY() { 17 | // Validate 18 | assertThat(fixture.y).isEqualTo(222) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/lint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/raw/contributors.txt: -------------------------------------------------------------------------------- 1 | Abuzer Rafey 2 | Alex Orchard 3 | Alexei Guevara 4 | Andreas Ziegler 5 | Caren DesBrisay 6 | Dan Light 7 | David Jones 8 | Dmitriy Bershadskiy 9 | Gina Chaves 10 | Graham Foster 11 | Gordon Wallace 12 | Jean Bourgeois 13 | Karol Kosek 14 | Kendra Borutski 15 | Kevin Jiang 16 | Lee McCallum 17 | Lukas Winkler 18 | Marco Santinelli 19 | Mateus B. Cassiano 20 | Michael Melo 21 | Michael Pickard 22 | Nikolas Rimikis 23 | Peter Dave Hello 24 | Silviu Marcu 25 | Simon Doppler 26 | Steve Riddle 27 | Tomasz Wrobel 28 | Vadim Karantayer 29 | Wei McCallum 30 | William Gathoye 31 | Yuriy Timofeev 32 | 'Akira 33 | akillcool 34 | Dtorner 35 | Genghis 36 | Nam 37 | TaiXiong 38 | Tobaloidee 39 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Gradle settings 2 | 3 | # JVM arguments for Gradle 4 | org.gradle.jvmargs=-Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC -Dfile.encoding=UTF-8 5 | 6 | # Enable parallel task execution and Gradle daemon 7 | org.gradle.parallel=true 8 | org.gradle.daemon=true 9 | org.gradle.daemon.idletimeout=10800000 10 | 11 | # Configuration cache settings 12 | org.gradle.configuration-cache=true 13 | 14 | # Show all warnings 15 | org.gradle.warning.mode=all 16 | 17 | # AndroidX and Jetifier settings 18 | android.useAndroidX=true 19 | android.enableJetifier=true 20 | android.nonFinalResIds=true 21 | android.jetifier.ignorelist=bcprov-jdk15on 22 | 23 | # Kotlin code style 24 | kotlin.code.style=official -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | Optimize your Wi-Fi network, by checking Wi-Fi network status, signal strength and identifying crowded channels using WiFiAnalyzer 2 | 3 | Features: 4 | 5 | * Identify nearby Access Points 6 | * Graph channels signal strength 7 | * Graph Access Point signal strength over time 8 | * Analyze Wi-Fi networks to rate channels 9 | * HT/VHT Detection - 40/80/160/320 MHz (Requires hardware/software support) 10 | * 2.4 GHz, 5 GHz and 6 GHz Wi-Fi bands (Requires hardware/software support) 11 | * Access Point view complete or compact 12 | * Estimated Distance to the Access Points 13 | * Export access points details 14 | * Dark, Light and System theme available 15 | * Pause/Resume scanning 16 | * Available filters: Wi-Fi band, Signal strength, Security and SSID 17 | * Vendor/OUI Database Lookup 18 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2019 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | 19 | include ':app' 20 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt-BR/full_description.txt: -------------------------------------------------------------------------------- 1 | Otimize sua rede Wi-Fi ao conferir o estado da rede, a força do sinal, e ao identificar canais congestionados usando o WiFiAnalyzer 2 | 3 | Recursos: 4 | 5 | * Identifique redes por perto 6 | * Gráfico da força do sinal nos canais 7 | * Gráfico da força do sinal das redes ao longo do tempo 8 | * Analise as redes Wi-Fi para avaliar os canais 9 | * Detecção HT/VHT - 40/80/160/320 MHz (requer suporte pelo hardware) 10 | * Frequências de Wi-Fi 2.4 GHz, 5 GHz, e 6 GHz. (requer suporte pelo hardware) 11 | * Tela de redes completa ou compacta 12 | * Distância estimada até as redes 13 | * Exporte os detalhes das redes 14 | * Tema escuro, claro, e automático disponíveis 15 | * Pause ou retome a busca por redes 16 | * Filtros disponíveis: Frequência do Wi-Fi, força do sinal, segurança e SSID 17 | * Pesquisa no banco de dados de fabricantes/OUI 18 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pt/full_description.txt: -------------------------------------------------------------------------------- 1 | Otimize sua rede Wi-Fi ao conferir o estado da rede, a força do sinal, e ao identificar canais congestionados usando o WiFiAnalyzer 2 | 3 | Recursos: 4 | 5 | * Identifique redes por perto 6 | * Gráfico da intensidade do sinal nos canais 7 | * Gráfico da intensidade do sinal das redes ao longo do tempo 8 | * Analise as redes Wi-Fi para avaliar os canais 9 | * Detecção HT/VHT - 40/80/160/320 MHz (requer suporte pelo hardware) 10 | * Frequências de Wi-Fi 2.4 GHz, 5 GHz, e 6 GHz. (requer suporte pelo hardware) 11 | * Ecrã de redes completo ou compacto 12 | * Distância estimada até as redes 13 | * Exporte os detalhes das redes 14 | * Tema escuro, claro, e automático disponíveis 15 | * Pause ou retome a procura de redes 16 | * Filtros disponíveis: Frequência do Wi-Fi, intensidade do sinal, segurança e SSID 17 | * Pesquisa na base de dados de fabricantes/OUI 18 | -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/full_description.txt: -------------------------------------------------------------------------------- 1 | Оптимізація мережі Wi-Fi шляхом перевірки стану Wi-Fi, рівня сигналу і визначення переповнених каналів використовуючи WiFiAnalyzer для Android 2 | 3 | Функції: 4 | 5 | * Визначення найближчих точок доступу 6 | * Графік потужності сигналу каналів 7 | * Графік потужності сигналу точки доступу в часі 8 | * Аналіз мереж Wi-Fi для оцінки каналів 9 | * Виявлення HT/VHT - 40/80/160/320 МГц (Потребує апаратної/програмної підтримки) 10 | * Діапазони Wi-Fi 2,4 ГГц, 5 ГГц та 6 ГГц (Потребує апаратної/програмної підтримки) 11 | * Повний або компактний вигляд точки доступу 12 | * Орієнтовна відстань до точок доступу 13 | * Експорт деталей точок доступу 14 | * Доступні темна, світла та системна теми 15 | * Призупинити/відновити сканування 16 | * Доступні фільтри: діапазон Wi-Fi, потужність сигналу, безпека та SSID 17 | * Пошук у базі даних виробників/OUI -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/full_description.txt: -------------------------------------------------------------------------------- 1 | Оптимизация сети Wi-Fi путем проверки состояния Wi-Fi, уровня сигнала и определения переполненных каналов используя WiFiAnalyzer для Android 2 | 3 | Возможности: 4 | 5 | * Определить ближайшие точки доступа (Access Points, AP) 6 | * График уровня сигнала каналов 7 | * График уровня сигнала точки доступа с течением времени 8 | * Анализ сети Wi-Fi для оценки каналов 9 | * Обнаружение HT/VHT — 40/80/160/320 МГц (требуется аппаратная поддержка) 10 | * Диапазоны Wi-Fi 2,4 ГГц, 5 ГГц и 6 ГГц (требуется аппаратная поддержка) 11 | * Полное или компактное представление точки доступа 12 | * Предполагаемое расстояние до точек доступа 13 | * Экспортировать информацию точек доступа 14 | * Доступны темная, светлая и системная темы. 15 | * Пауза/возобновление сканирования 16 | * Доступные фильтры: диапазон Wi-Fi, уровень сигнала, безопасность и SSID. 17 | * Поиск в базе данных поставщиков/OUI 18 | -------------------------------------------------------------------------------- /fastlane/metadata/android/tr/full_description.txt: -------------------------------------------------------------------------------- 1 | WiFiAnalyzer ile Wi-Fi ağınızı optimize edin; Wi-Fi ağ durumu, sinyal gücü kontrolü yapın ve yoğun kanalları tespit edin 2 | 3 | Özellikler: 4 | 5 | * Yakındaki Erişim Noktalarını (Access Point) tanımlama 6 | * Kanalların sinyal gücünü grafikle gösterme 7 | * Erişim Noktalarının sinyal gücünü zaman içinde grafikle gösterme 8 | * Wi-Fi ağlarını analiz ederek kanalları derecelendirme 9 | * HT/VHT Algılama - 40/80/160/320 MHz (Donanım/yazılım desteği gerektirir) 10 | * 2.4 GHz, 5 GHz ve 6 GHz Wi-Fi bantları (Donanım/yazılım desteği gerektirir) 11 | * Erişim Noktası görünümü: tam veya kompakt 12 | * Erişim Noktalarına tahmini mesafe 13 | * Erişim noktası detaylarını dışa aktarma 14 | * Karanlık, Aydınlık ve Sistem temaları mevcut 15 | * Tarama işlemini duraklatma/devam ettirme 16 | * Mevcut filtreler: Wi-Fi bandı, Sinyal gücü, Güvenlik ve SSID 17 | * Satıcı/OUI veritabanı sorgulama 18 | -------------------------------------------------------------------------------- /fastlane/metadata/android/hu/full_description.txt: -------------------------------------------------------------------------------- 1 | Optimalizálja Wi‑Fi hálózatát: ellenőrizze a hálózat állapotát, a jelerősséget és azonosítsa a túlterhelt csatornákat a WiFiAnalyzer segítségével. 2 | 3 | Funkciók: 4 | 5 | * Közeli hozzáférési pontok (Access Point, AP) azonosítása 6 | * Csatornák jelerősségének grafikonja 7 | * Hozzáférési pontok jelerősségének ábrázolása az idő függvényében 8 | * Wi‑Fi hálózatok elemzése és csatornák értékelése 9 | * HT/VHT észlelés — 40/80/160/320 MHz (hardver/szoftver támogatást igényel) 10 | * 2,4 GHz, 5 GHz és 6 GHz Wi‑Fi sávok (hardver/szoftver támogatást igényel) 11 | * Hozzáférési pont nézet: részletes vagy tömör 12 | * Becsült távolság a hozzáférési pontoktól 13 | * Hozzáférési pontok adatainak exportálása 14 | * Sötét, világos és rendszer témák támogatása 15 | * Szkennelés szüneteltetése/folytatása 16 | * Elérhető szűrők: Wi‑Fi sáv, jelerősség, titkosítás és SSID 17 | * Gyártó/OUI adatbázis keresés 18 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pl/full_description.txt: -------------------------------------------------------------------------------- 1 | Zoptymalizuj twoją sieć Wi-Fi, poprzez sprawdzanie statusu sieci Wi-Fi, siłę sygnały i indentyfikowanie zatłoczonych kanałów używając otwartoźródłowej aplikacji WiFiAnalyzer dla Androida 2 | 3 | Funkcje: 4 | 5 | * Identyfikuj pobliskie punkty dostępowe 6 | * Wykres siły sygnału kanałów 7 | * Wykres siły sygnału punktu dostępowego w czasie 8 | * Analizuj sieci Wi-Fi, aby ocenić kanały 9 | * Wykrywanie HT/VHT - 40/80/160/320 MHz (Wymaga wsparcia sprzętowego/programowego) 10 | * Pasma Wi-Fi 2,4 GHz, 5 GHz i 6 GHz (Wymaga wsparcia sprzętowego/programowego) 11 | * Widok punktu dostępowego pełny lub kompaktowy 12 | * Szacowana odległość do punktów dostępowych 13 | * Eksportuj szczegóły punktów dostępowych 14 | * Dostępny motyw ciemny, jasny i systemowy 15 | * Wstrzymaj/Wznów skanowanie 16 | * Dostępne filtry: pasmo Wi-Fi, siła sygnału, zabezpieczenia i SSID 17 | * Wyszukiwanie w bazie danych dostawców/OUI -------------------------------------------------------------------------------- /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | name: Mark stale issues and pull requests 2 | on: 3 | schedule: 4 | - cron: '30 6 1 * *' 5 | jobs: 6 | stale: 7 | runs-on: ubuntu-latest 8 | permissions: 9 | issues: write 10 | pull-requests: write 11 | steps: 12 | - uses: actions/stale@v9 13 | with: 14 | repo-token: ${{ secrets.GITHUB_TOKEN }} 15 | stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.' 16 | stale-pr-message: 'This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.' 17 | stale-issue-label: 'stale' 18 | stale-pr-label: 'stale' 19 | exempt-issue-labels: 'bug,high-priority' 20 | days-before-stale: 365 21 | -------------------------------------------------------------------------------- /fastlane/metadata/android/bg/full_description.txt: -------------------------------------------------------------------------------- 1 | Оптимизирайте своята Wi-Fi мрежа, като проверите състоянието на Wi-Fi мрежата, силата на сигнала и идентифицирате пренаселените канали, използвайки WiFiAnalyzer с отворен код за Android 2 | 3 | Функции: 4 | 5 | * Идентифициране на близки точки за достъп 6 | * Графика на силата на сигнала по канали 7 | * Графика на силата на сигнала на точките за достъп във времето 8 | * Анализ на Wi-Fi мрежи за оценка на каналите 9 | * HT/VHT откриване - 40/80/160/320 MHz (Изисква хардуерна/софтуерна поддръжка) 10 | * 2.4 GHz, 5 GHz и 6 GHz Wi-Fi ленти (Изисква хардуерна/софтуерна поддръжка) 11 | * Пълен или компактен изглед на точките за достъп 12 | * Оценка на разстоянието до точките за достъп 13 | * Експортиране на детайли за точките за достъп 14 | * Тъмна, светла и системна тема 15 | * Пауза/възобновяване на сканирането 16 | * Налични филтри: Wi-Fi лента, сила на сигнала, сигурност и SSID 17 | * Търсене в база данни на производители/OUI -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/annotation/OpenClass.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | 19 | package com.vrem.annotation 20 | 21 | @Target(AnnotationTarget.CLASS) 22 | annotation class OpenClass 23 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de/full_description.txt: -------------------------------------------------------------------------------- 1 | Verbesseren Sie Ihr WLAN-Netzwerk, indem Sie den Netzwerkstatus und die Signalstärke Ihres WLANs messen und erkennnen Sie überlastete Kanäle mithilfe einer freien Open-Source App für Android 2 | 3 | Funktionen: 4 | * Identifizieren Sie nahegelegene Zugangspunkte 5 | * Grafische Darstellung der Signalstärke der Kanäle 6 | * Grafische Darstellung der Signalstärke des Zugangspunkts im Zeitverlauf 7 | * Analysieren Sie Wi-Fi-Netzwerke, um Kanäle zu bewerten 8 | * HT/VHT-Erkennung - 40/80/160/320 MHz (erfordert Hardware-/Software-Unterstützung) 9 | * 2,4-GHz-, 5-GHz- und 6-GHz-Wi-Fi-Bänder (erfordert Hardware-/Software-Unterstützung) 10 | * Zugangspunktansicht vollständig oder kompakt 11 | * Geschätzte Entfernung zu den Zugangspunkten 12 | * Details der Zugangspunkte exportieren 13 | * Dunkles, helles und System-Design verfügbar 14 | * Scannen anhalten/fortsetzen 15 | * Verfügbare Filter: Wi-Fi-Band, Signalstärke, Sicherheit und SSID 16 | * Hersteller/OUI-Datenbanksuche -------------------------------------------------------------------------------- /fastlane/metadata/android/it/full_description.txt: -------------------------------------------------------------------------------- 1 | Ottimizza la tua rete Wi-Fi, controllando lo stato, la potenza del segnale e identificando i canali affollati, usando un WiFiAnalyzer per Android 2 | 3 | Caratteristiche: 4 | 5 | * Identifica i punti di accesso vicini 6 | * Grafico della potenza del segnale dei canali 7 | * Grafico della potenza del segnale del punto di accesso nel tempo 8 | * Analizza le reti Wi-Fi per valutare i canali 9 | * Rilevamento HT/VHT - 40/80/160/320 MHz (Richiede Android OS 6+) 10 | * Bande Wi-Fi a 2,4 GHz, 5 GHz e 6 GHz (Richiede supporto hardware) 11 | * Visualizzazione completa o compatta dei punti di accesso 12 | * Distanza stimata dai punti di accesso 13 | * Esporta i dettagli dei punti di accesso 14 | * Tema Scuro, Chiaro e di Sistema disponibili 15 | * Metti in pausa/Riprendi la scansione 16 | * Filtri disponibili: banda Wi-Fi, potenza del segnale, sicurezza e SSID 17 | * Ricerca nel database dei fornitori/OUI 18 | * L'applicazione ha troppe funzionalità per menzionarle tutte -------------------------------------------------------------------------------- /fastlane/metadata/android/nl/full_description.txt: -------------------------------------------------------------------------------- 1 | Optimaliseer uw Wifi netwerk door het controleren van de Wifi netwerkstatus, signaalsterkte en het indentificeren van drukke kanalen met gebruik van een open-source WiFiAnalyzer voor Android. 2 | 3 | Functies: 4 | 5 | * Identificeer nabijgelegen Access Points 6 | * Grafiek van de signaalsterkte van kanalen 7 | * Grafiek van de signaalsterkte van een Access Point over tijd 8 | * Analyseer wifi-netwerken om kanalen te beoordelen 9 | * HT/VHT-detectie - 40/80/160/320 MHz (Vereist hardware-/softwareondersteuning) 10 | * 2,4 GHz, 5 GHz en 6 GHz wifi-banden (Vereist hardware-/softwareondersteuning) 11 | * Volledige of compacte weergave van Access Points 12 | * Geschatte afstand tot de Access Points 13 | * Exporteer details van Access Points 14 | * Donker, licht en systeemthema beschikbaar 15 | * Pauzeer/hervat scannen 16 | * Beschikbare filters: wifi-band, signaalsterkte, beveiliging en SSID 17 | * Opzoeken in de database van leveranciers/OUI -------------------------------------------------------------------------------- /fastlane/metadata/android/es/full_description.txt: -------------------------------------------------------------------------------- 1 | Optimiza tu red Wi-Fi, mediante la comprobación de estado de red, intensidad de señal e identificación de los canales llenos usando la aplicación de código abierto WiFiAnalyzer para Android 2 | 3 | Funciones: 4 | 5 | * Identifica los puntos de acceso cercanos 6 | * Grafica la intensidad de la señal por canales 7 | * Grafica la intensidad de la señal de los puntos de acceso a lo largo del tiempo 8 | * Analiza las redes Wi-Fi para calificar los canales 9 | * Detección HT/VHT - 40/80/160/320 MHz (requiere soporte de hardware/software) 10 | * Bandas Wi-Fi de 2.4 GHz, 5 GHz y 6 GHz (requiere soporte de hardware/software) 11 | * Vista de puntos de acceso completa o compacta 12 | * Distancia estimada a los puntos de acceso 13 | * Exporta los detalles de los puntos de acceso 14 | * Tema oscuro, claro y del sistema disponible 15 | * Pausar/reanudar el escaneo 16 | * Filtros disponibles: banda Wi-Fi, intensidad de la señal, seguridad y SSID 17 | * Búsqueda en la base de datos de fabricantes/OUI -------------------------------------------------------------------------------- /fastlane/metadata/android/fr/full_description.txt: -------------------------------------------------------------------------------- 1 | Optimisez vos réseaux Wi-Fi, en vérifiant l\'état du réseau, la force du signal et en identifiant les canaux surchargés grâce à WiFiAnalyzer pour Android. 2 | 3 | 4 | Fonctionnalités : 5 | 6 | * Identifier les points d'accès à proximité 7 | * Graphique de la force du signal des canaux 8 | * Graphique de la force du signal du point d'accès dans le temps 9 | * Analyser les réseaux Wi-Fi pour évaluer les canaux 10 | * Détection HT/VHT - 40/80/160/320 MHz (Nécessite Android OS 6+) 11 | * Bandes Wi-Fi 2,4 GHz, 5 GHz et 6 GHz (Nécessite un support matériel) 12 | * Vue des points d'accès complète ou compacte 13 | * Distance estimée aux points d'accès 14 | * Exporter les détails des points d'accès 15 | * Thèmes Sombre, Clair et Système disponibles 16 | * Mettre en pause/Reprendre l'analyse 17 | * Filtres disponibles : bande Wi-Fi, force du signal, sécurité et SSID 18 | * Recherche dans la base de données des vendeurs/OUI 19 | * L'application a trop de fonctionnalités pour toutes les mentionner -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Coding Conventions style guide 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 4 7 | tab_width = 4 8 | continuation_indent_size = 4 9 | insert_final_newline = true 10 | charset = utf-8 11 | trim_trailing_whitespace = true 12 | max_line_length = 120 13 | end_of_line = lf 14 | 15 | [*.{kt,kts}] 16 | indent_size = 4 17 | continuation_indent_size = 4 18 | insert_final_newline = true 19 | max_line_length = 120 20 | 21 | [*.java] 22 | indent_size = 4 23 | continuation_indent_size = 4 24 | max_line_length = 120 25 | 26 | [*.gradle] 27 | indent_size = 4 28 | 29 | [*.xml] 30 | indent_size = 4 31 | 32 | [*.md] 33 | indent_size = 2 34 | trim_trailing_whitespace = false 35 | insert_final_newline = true 36 | charset = utf-8 37 | 38 | [*.properties] 39 | charset = utf-8 40 | end_of_line = lf 41 | insert_final_newline = true 42 | trim_trailing_whitespace = true 43 | 44 | [*.json] 45 | indent_size = 2 46 | insert_final_newline = true 47 | charset = utf-8 48 | 49 | [*.{yml,yaml}] 50 | indent_size = 2 51 | insert_final_newline = true 52 | charset = utf-8 53 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/navigation/availability/NavigationOption.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.navigation.availability 19 | 20 | import com.vrem.wifianalyzer.MainActivity 21 | 22 | typealias NavigationOption = (mainActivity: MainActivity) -> Unit 23 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/graphutils/GraphDataPoint.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | 19 | package com.vrem.wifianalyzer.wifi.graphutils 20 | 21 | import com.jjoe64.graphview.series.DataPoint 22 | 23 | data class GraphDataPoint( 24 | val x: Int, 25 | val y: Int, 26 | ) : DataPoint(x.toDouble(), y.toDouble()) 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/separator_line.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/access_point_view_hide.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 24 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/settings/Data.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.settings 19 | 20 | data class Data( 21 | val code: String, 22 | val name: String, 23 | ) : Comparable { 24 | override fun compareTo(other: Data): Int = compareBy { it.name }.thenBy { it.code }.compare(this, other) 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/menu_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/graphutils/GraphViewNotifier.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.graphutils 19 | 20 | import com.jjoe64.graphview.GraphView 21 | import com.vrem.wifianalyzer.wifi.model.WiFiData 22 | 23 | interface GraphViewNotifier { 24 | fun graphView(): GraphView 25 | 26 | fun update(wiFiData: WiFiData) 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/splash_inset.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 25 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/model/WiFiAdditional.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.model 19 | 20 | import com.vrem.util.EMPTY 21 | 22 | class WiFiAdditional( 23 | val vendorName: String = String.EMPTY, 24 | val wiFiConnection: WiFiConnection = WiFiConnection.EMPTY, 25 | ) { 26 | companion object { 27 | val EMPTY = WiFiAdditional() 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/Configuration.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer 19 | 20 | import com.vrem.annotation.OpenClass 21 | 22 | const val SIZE_MIN = 1024 23 | const val SIZE_MAX = 4096 24 | 25 | @OpenClass 26 | class Configuration( 27 | val largeScreen: Boolean, 28 | ) { 29 | var size = SIZE_MAX 30 | 31 | val sizeAvailable: Boolean get() = size == SIZE_MAX 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/accesspoint/AccessPointViewType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.accesspoint 19 | 20 | import androidx.annotation.LayoutRes 21 | import com.vrem.wifianalyzer.R 22 | 23 | enum class AccessPointViewType( 24 | @LayoutRes val layout: Int, 25 | ) { 26 | COMPLETE(R.layout.access_point_view_complete), 27 | COMPACT(R.layout.access_point_view_compact), 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | name: "CodeQL Analyze" 2 | on: 3 | push: 4 | paths-ignore: 5 | - '.github/workflows/compare-src.yml' 6 | pull_request: 7 | paths-ignore: 8 | - '.github/workflows/compare-src.yml' 9 | jobs: 10 | analyze: 11 | if: "!contains(github.event.head_commit.message, 'skip ci')" 12 | runs-on: ubuntu-latest 13 | timeout-minutes: 360 14 | permissions: 15 | actions: read 16 | contents: read 17 | security-events: write 18 | strategy: 19 | fail-fast: false 20 | matrix: 21 | language: [ 'java-kotlin' ] 22 | steps: 23 | - name: Checkout repository 24 | uses: actions/checkout@v4 25 | - name: set up JDK 21 26 | uses: actions/setup-java@v4 27 | with: 28 | distribution: 'zulu' 29 | java-version: '21' 30 | - name: Initialize CodeQL 31 | uses: github/codeql-action/init@v3 32 | with: 33 | languages: ${{ matrix.language }} 34 | - name: Auto build 35 | uses: github/codeql-action/autobuild@v3 36 | - name: Perform CodeQL Analysis 37 | uses: github/codeql-action/analyze@v3 38 | with: 39 | category: "/language:${{matrix.language}}" 40 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_arrow.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /images/svg/background.svg: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/filter/adapter/WiFiBandAdapter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.filter.adapter 19 | 20 | import com.vrem.wifianalyzer.settings.Settings 21 | import com.vrem.wifianalyzer.wifi.band.WiFiBand 22 | 23 | class WiFiBandAdapter( 24 | values: Set, 25 | ) : EnumFilterAdapter(values, WiFiBand.entries) { 26 | override fun save(settings: Settings): Unit = settings.saveWiFiBands(selections) 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reset.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pause.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_fast_forward.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sort.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_expand_less.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_expand_more.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/filter/adapter/SecurityAdapter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.filter.adapter 19 | 20 | import com.vrem.wifianalyzer.settings.Settings 21 | import com.vrem.wifianalyzer.wifi.model.Security 22 | 23 | class SecurityAdapter( 24 | selections: Set, 25 | ) : EnumFilterAdapter(selections, Security.entries) { 26 | override fun save(settings: Settings) { 27 | settings.saveSecurities(selections) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_filter_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_view_carousel.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_show_chart.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/navigation/availability/BottomNav.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.navigation.availability 19 | 20 | import android.view.View 21 | import com.vrem.wifianalyzer.R 22 | 23 | internal val navigationOptionBottomNavOff: NavigationOption = { 24 | it.findViewById(R.id.nav_bottom).visibility = View.GONE 25 | } 26 | 27 | internal val navigationOptionBottomNavOn: NavigationOption = { 28 | it.findViewById(R.id.nav_bottom).visibility = View.VISIBLE 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/navigation/items/NavigationItem.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.navigation.items 19 | 20 | import com.vrem.wifianalyzer.MainActivity 21 | import com.vrem.wifianalyzer.navigation.NavigationMenu 22 | 23 | interface NavigationItem { 24 | fun activate( 25 | mainActivity: MainActivity, 26 | navigationMenu: NavigationMenu, 27 | ) 28 | 29 | val registered: Boolean get() = false 30 | val visibility: Int get() = android.view.View.GONE 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/model/ChannelAPCount.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.model 19 | 20 | import com.vrem.wifianalyzer.wifi.band.WiFiChannel 21 | 22 | data class ChannelAPCount( 23 | val wiFiChannel: WiFiChannel, 24 | val wiFiWidth: WiFiWidth, 25 | val count: Int, 26 | ) : Comparable { 27 | override fun compareTo(other: ChannelAPCount): Int = 28 | compareBy { it.count }.thenBy { it.wiFiChannel }.compare(this, other) 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_import_export.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/accesspoint/ConnectionViewType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.accesspoint 19 | 20 | import androidx.annotation.LayoutRes 21 | import com.vrem.wifianalyzer.R 22 | 23 | enum class ConnectionViewType( 24 | @LayoutRes val layout: Int, 25 | ) { 26 | COMPLETE(R.layout.access_point_view_complete), 27 | COMPACT(R.layout.access_point_view_compact), 28 | HIDE(R.layout.access_point_view_hide), 29 | ; 30 | 31 | val hide: Boolean get() = HIDE == this 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/util/StringUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.util 19 | 20 | import java.util.Locale 21 | 22 | val String.Companion.EMPTY: String get() = "" 23 | val String.Companion.SPACE_SEPARATOR: String get() = " " 24 | 25 | fun String.Companion.nullToEmpty(value: String?): String = value ?: String.EMPTY 26 | 27 | fun String.specialTrim(): String = this.trim { it <= ' ' }.replace(" +".toRegex(), String.SPACE_SEPARATOR) 28 | 29 | fun String.toCapitalize(locale: Locale): String = this.replaceFirstChar { word -> word.uppercase(locale) } 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_signal_wifi_4_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/util/BuildUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | 19 | package com.vrem.util 20 | 21 | import android.os.Build 22 | 23 | fun buildMinVersionT(): Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU 24 | 25 | fun buildMinVersionR(): Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R 26 | 27 | fun buildMinVersionQ(): Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q 28 | 29 | fun buildMinVersionP(): Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P 30 | 31 | fun buildVersionP(): Boolean = Build.VERSION.SDK_INT == Build.VERSION_CODES.P 32 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/scanner/ScannerCallback.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.scanner 19 | 20 | import com.vrem.annotation.OpenClass 21 | import com.vrem.wifianalyzer.wifi.manager.WiFiManagerWrapper 22 | 23 | @OpenClass 24 | internal class ScannerCallback( 25 | private val wiFiManagerWrapper: WiFiManagerWrapper, 26 | private val cache: Cache, 27 | ) : Callback { 28 | override fun onSuccess() { 29 | cache.add(wiFiManagerWrapper.scanResults()) 30 | cache.wifiInfo = wiFiManagerWrapper.wiFiInfo() 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/filter/adapter/BasicFilterAdapter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.filter.adapter 19 | 20 | import com.vrem.annotation.OpenClass 21 | import com.vrem.wifianalyzer.settings.Settings 22 | 23 | @OpenClass 24 | abstract class BasicFilterAdapter( 25 | var selections: Set, 26 | ) { 27 | fun selections(selections: Set) { 28 | this.selections = selections 29 | } 30 | 31 | abstract fun isActive(): Boolean 32 | 33 | abstract fun reset() 34 | 35 | abstract fun save(settings: Settings) 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_insert_chart.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_signal_wifi_0_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_brightness_low.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info_outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_location_on.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/band/WiFiChannel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.band 19 | 20 | private const val ALLOWED_RANGE = FREQUENCY_SPREAD / 2 21 | 22 | data class WiFiChannel( 23 | val channel: Int = 0, 24 | val frequency: Int = 0, 25 | ) : Comparable { 26 | fun inRange(value: Int): Boolean = value in frequency - ALLOWED_RANGE..frequency + ALLOWED_RANGE 27 | 28 | override fun compareTo(other: WiFiChannel): Int = 29 | compareBy { it.channel }.thenBy { it.frequency }.compare(this, other) 30 | 31 | companion object { 32 | val UNKNOWN = WiFiChannel() 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/filter/adapter/StrengthAdapter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.filter.adapter 19 | 20 | import com.vrem.wifianalyzer.R 21 | import com.vrem.wifianalyzer.settings.Settings 22 | import com.vrem.wifianalyzer.wifi.model.Strength 23 | 24 | class StrengthAdapter( 25 | selections: Set, 26 | ) : EnumFilterAdapter(selections, Strength.entries) { 27 | override fun color(selection: Strength): Int = 28 | if (selections.contains(selection)) selection.colorResource else R.color.regular 29 | 30 | override fun save(settings: Settings): Unit = settings.saveStrengths(selections) 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/vendor/model/VendorUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.vendor.model 19 | 20 | import com.vrem.util.EMPTY 21 | import java.util.Locale 22 | 23 | internal const val MAX_SIZE = 6 24 | private const val SEPARATOR = ":" 25 | 26 | internal fun String.clean(): String = 27 | orEmpty().replace(SEPARATOR, String.EMPTY).take(MAX_SIZE).uppercase(Locale.getDefault()) 28 | 29 | internal fun String.toMacAddress(): String = 30 | when { 31 | isEmpty() -> String.EMPTY 32 | length < MAX_SIZE -> "*$this*" 33 | else -> substring(0, 2) + SEPARATOR + substring(2, 4) + SEPARATOR + substring(4, 6) 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_signal_wifi_off.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/test/kotlin/com/vrem/wifianalyzer/wifi/scanner/SsidTestUtil.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.scanner 19 | 20 | import android.net.wifi.ScanResult 21 | import android.net.wifi.WifiSsid 22 | import com.vrem.util.buildMinVersionT 23 | import org.mockito.kotlin.mock 24 | import org.mockito.kotlin.whenever 25 | 26 | fun whenSsid( 27 | scanResult: ScanResult, 28 | ssid: String, 29 | ) { 30 | if (buildMinVersionT()) { 31 | val wifiSsid: WifiSsid = mock() 32 | whenever(scanResult.wifiSsid).thenReturn(wifiSsid) 33 | whenever(wifiSsid.toString()).thenReturn(ssid) 34 | } else { 35 | scanResult.SSID = ssid 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/graphutils/GraphAdapter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.graphutils 19 | 20 | import com.jjoe64.graphview.GraphView 21 | import com.vrem.wifianalyzer.wifi.model.WiFiData 22 | import com.vrem.wifianalyzer.wifi.scanner.UpdateNotifier 23 | 24 | open class GraphAdapter( 25 | private val graphViewNotifiers: List, 26 | ) : UpdateNotifier { 27 | fun graphViews(): List = graphViewNotifiers.map { it.graphView() } 28 | 29 | override fun update(wiFiData: WiFiData) = graphViewNotifiers.forEach { it.update(wiFiData) } 30 | 31 | fun graphViewNotifiers(): List = graphViewNotifiers 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock_open.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/graphutils/GraphConstants.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.graphutils 19 | 20 | const val AXIS_TEXT_SIZE_ADJUSTMENT = 0.90f 21 | const val TEXT_SIZE_ADJUSTMENT = 0.80f 22 | const val MAX_SCAN_COUNT = 200 23 | const val MAX_Y = 0 24 | const val MAX_Y_DEFAULT = -20 25 | const val MIN_Y = -100 26 | const val MIN_Y_OFFSET = -1 27 | const val MIN_Y_HALF = MIN_Y / 2 28 | const val MAX_NOT_SEEN_COUNT = 20 29 | const val THICKNESS_INVISIBLE = 0 30 | const val THICKNESS_REGULAR = 5 31 | const val THICKNESS_CONNECTED = THICKNESS_REGULAR * 2 32 | const val TYPE1 = 1147798476 33 | const val TYPE2 = 535509942 34 | const val TYPE3 = 1256180258 35 | const val TYPE4 = 1546740952 36 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock_outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/androidTest/kotlin/com/vrem/wifianalyzer/FilterInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer 19 | 20 | import androidx.test.espresso.Espresso.onView 21 | import androidx.test.espresso.action.ViewActions.click 22 | import androidx.test.espresso.action.ViewActions.scrollTo 23 | import androidx.test.espresso.matcher.ViewMatchers.isDisplayed 24 | import androidx.test.espresso.matcher.ViewMatchers.withId 25 | import org.hamcrest.Matchers.allOf 26 | 27 | internal class FilterInstrumentedTest : Runnable { 28 | override fun run() { 29 | onView(allOf(withId(R.id.action_filter), isDisplayed())).perform(click()) 30 | onView(allOf(withId(android.R.id.button3), isDisplayed())).perform(scrollTo(), click()) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/filter/adapter/SSIDAdapter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.filter.adapter 19 | 20 | import com.vrem.wifianalyzer.settings.Settings 21 | 22 | class SSIDAdapter( 23 | selections: Set, 24 | ) : BasicFilterAdapter(selections) { 25 | override var selections: Set 26 | get() = super.selections 27 | set(values) { 28 | super.selections = values.filter { it.isNotBlank() }.toSet() 29 | } 30 | 31 | override fun isActive(): Boolean = selections.isNotEmpty() 32 | 33 | override fun reset() { 34 | selections = setOf() 35 | } 36 | 37 | override fun save(settings: Settings): Unit = settings.saveSSIDs(selections) 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_group.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/info_permission.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 25 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/settings/ThemeStyle.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.settings 19 | 20 | import android.graphics.Color 21 | import androidx.annotation.ColorInt 22 | import androidx.annotation.StyleRes 23 | import com.vrem.wifianalyzer.R 24 | 25 | enum class ThemeStyle( 26 | @param:StyleRes val theme: Int, 27 | @param:StyleRes val themeNoActionBar: Int, 28 | @param:ColorInt val colorGraphText: Int, 29 | ) { 30 | DARK(R.style.ThemeDark, R.style.ThemeDarkNoActionBar, Color.WHITE), 31 | LIGHT(R.style.ThemeLight, R.style.ThemeLightNoActionBar, Color.BLACK), 32 | SYSTEM(R.style.ThemeSystem, R.style.ThemeSystemNoActionBar, Color.GRAY), 33 | BLACK(R.style.ThemeBlack, R.style.ThemeBlackNoActionBar, Color.WHITE), 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_signal_wifi_2_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 29 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_signal_wifi_1_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 29 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/filter/WiFiBandFilter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.filter 19 | 20 | import android.app.AlertDialog 21 | import com.vrem.wifianalyzer.R 22 | import com.vrem.wifianalyzer.wifi.band.WiFiBand 23 | import com.vrem.wifianalyzer.wifi.filter.adapter.WiFiBandAdapter 24 | 25 | internal class WiFiBandFilter( 26 | wiFiBandAdapter: WiFiBandAdapter, 27 | alertDialog: AlertDialog, 28 | ) : EnumFilter( 29 | mapOf( 30 | WiFiBand.GHZ2 to R.id.filterWifiBand2, 31 | WiFiBand.GHZ5 to R.id.filterWifiBand5, 32 | WiFiBand.GHZ6 to R.id.filterWifiBand6, 33 | ), 34 | wiFiBandAdapter, 35 | alertDialog, 36 | R.id.filterWiFiBand, 37 | ) 38 | -------------------------------------------------------------------------------- /app/src/test/kotlin/com/vrem/wifianalyzer/ConfigurationTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | 19 | package com.vrem.wifianalyzer 20 | 21 | import org.assertj.core.api.Assertions.assertThat 22 | import org.junit.Test 23 | 24 | class ConfigurationTest { 25 | private val fixture = Configuration(true) 26 | 27 | @Test 28 | fun sizeAvailable() { 29 | // execute & validate 30 | assertThat(fixture.sizeAvailable).isTrue 31 | } 32 | 33 | @Test 34 | fun sizeIsNotAvailable() { 35 | // execute 36 | fixture.size = SIZE_MIN 37 | // validate 38 | assertThat(fixture.sizeAvailable).isFalse 39 | } 40 | 41 | @Test 42 | fun largeScreen() { 43 | // execute & validate 44 | assertThat(fixture.largeScreen).isTrue 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_network_wifi.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 29 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_signal_wifi_3_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 29 | 32 | 33 | -------------------------------------------------------------------------------- /dependencyUpdates.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | 19 | apply plugin: "com.github.ben-manes.versions" 20 | 21 | // Determines if a version string is non-stable (alpha, beta, etc.) 22 | def STABLE_KEYWORDS = ['RELEASE', 'FINAL', 'GA'] 23 | def NON_STABLE_REGEX = /(?i)[.-](alpha|beta|rc|cr|m|preview|b|ea)[.\d-]*/ 24 | 25 | def isNonStable = { String version -> 26 | if (!version) return true // Treat null/empty as non-stable 27 | def upperVersion = version.toUpperCase() 28 | if (STABLE_KEYWORDS.any { upperVersion.contains(it) }) { 29 | return false 30 | } 31 | version ==~ NON_STABLE_REGEX 32 | } 33 | 34 | dependencyUpdates { 35 | revision = 'release' // Only show stable versions in the report 36 | rejectVersionIf { 37 | isNonStable(it.candidate.version) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/res/layout/info_throttling.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 25 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/settings/LanguagePreference.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.settings 19 | 20 | import android.content.Context 21 | import android.util.AttributeSet 22 | import com.vrem.util.defaultLanguageTag 23 | import com.vrem.util.supportedLanguages 24 | import com.vrem.util.toCapitalize 25 | import com.vrem.util.toLanguageTag 26 | import java.util.Locale 27 | 28 | private fun data(): List = 29 | supportedLanguages() 30 | .map { map(it) } 31 | .sorted() 32 | 33 | private fun map(it: Locale): Data = Data(toLanguageTag(it), it.getDisplayName(it).toCapitalize(Locale.getDefault())) 34 | 35 | class LanguagePreference( 36 | context: Context, 37 | attrs: AttributeSet, 38 | ) : CustomPreference(context, attrs, data(), defaultLanguageTag()) 39 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/util/EnumUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.util 19 | 20 | import kotlin.enums.EnumEntries 21 | 22 | fun > findSet( 23 | values: EnumEntries, 24 | indexes: Set, 25 | defaultValue: T, 26 | ): Set { 27 | val results: Set = indexes.map { findOne(values, it.toInt(), defaultValue) }.toSet() 28 | return results.ifEmpty { values.toSet() } 29 | } 30 | 31 | fun > findOne( 32 | values: EnumEntries, 33 | index: Int, 34 | defaultValue: T, 35 | ): T = if (index in values.indices) values[index] else defaultValue 36 | 37 | fun > ordinals(values: EnumEntries): Set = ordinals(values.toSet()) 38 | 39 | fun > ordinals(values: Set): Set = values.map { it.ordinal.toString() }.toSet() 40 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/MainActivityBackPressed.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | 19 | package com.vrem.wifianalyzer 20 | 21 | import androidx.activity.OnBackPressedCallback 22 | 23 | class MainActivityBackPressed( 24 | val mainActivity: MainActivity, 25 | ) : OnBackPressedCallback(true) { 26 | override fun handleOnBackPressed() { 27 | if (!mainActivity.closeDrawer()) { 28 | val selectedMenu = MainContext.INSTANCE.settings.selectedMenu() 29 | if (selectedMenu == mainActivity.currentNavigationMenu()) { 30 | mainActivity.finish() 31 | } else { 32 | mainActivity.currentNavigationMenu(selectedMenu) 33 | mainActivity.onNavigationItemSelected(mainActivity.currentMenuItem()) 34 | } 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/model/WiFiVirtual.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | 19 | package com.vrem.wifianalyzer.wifi.model 20 | 21 | private const val BSSID_LENGTH = 17 22 | 23 | data class WiFiVirtual( 24 | val bssid: String, 25 | val frequency: Int, 26 | ) { 27 | val key: String get() = "$bssid-$frequency" 28 | } 29 | 30 | val WiFiDetail.wiFiVirtual: WiFiVirtual 31 | get() = 32 | if (BSSID_LENGTH == wiFiIdentifier.bssid.length) { 33 | WiFiVirtual( 34 | this.wiFiIdentifier.bssid.substring(2, BSSID_LENGTH - 1), 35 | this.wiFiSignal.primaryFrequency, 36 | ) 37 | } else { 38 | WiFiVirtual( 39 | wiFiIdentifier.bssid, 40 | wiFiSignal.primaryFrequency, 41 | ) 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/settings/CountryPreference.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.settings 19 | 20 | import android.content.Context 21 | import android.util.AttributeSet 22 | import com.vrem.util.defaultCountryCode 23 | import com.vrem.wifianalyzer.MainContext 24 | import com.vrem.wifianalyzer.wifi.band.WiFiChannelCountry 25 | import java.util.Locale 26 | 27 | private fun data(): List { 28 | val currentLocale: Locale = MainContext.INSTANCE.settings.languageLocale() 29 | return WiFiChannelCountry 30 | .findAll() 31 | .map { Data(it.countryCode, it.countryName(currentLocale)) } 32 | .sorted() 33 | } 34 | 35 | class CountryPreference( 36 | context: Context, 37 | attrs: AttributeSet, 38 | ) : CustomPreference(context, attrs, data(), defaultCountryCode()) 39 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/settings/CustomPreference.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.settings 19 | 20 | import android.content.Context 21 | import android.util.AttributeSet 22 | import androidx.preference.ListPreference 23 | 24 | abstract class CustomPreference( 25 | context: Context, 26 | attrs: AttributeSet, 27 | values: List, 28 | defaultValue: String, 29 | ) : ListPreference(context, attrs) { 30 | init { 31 | this.entries = names(values) 32 | this.entryValues = codes(values) 33 | this.setDefaultValue(defaultValue) 34 | } 35 | 36 | private fun codes(data: List): Array = data.map { it.code }.toTypedArray() 37 | 38 | private fun names(data: List): Array = data.map { it.name }.toTypedArray() 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/model/GroupBy.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.model 19 | 20 | typealias GroupByKey = (T) -> String 21 | 22 | internal val groupByChannel: GroupByKey = { it.wiFiSignal.primaryFrequency.toString() } 23 | 24 | internal val groupBySSID: GroupByKey = { it.wiFiIdentifier.ssid } 25 | 26 | internal val groupByVirtual: GroupByKey = { it.wiFiVirtual.key } 27 | 28 | enum class GroupBy( 29 | val sort: Comparator, 30 | val group: GroupByKey, 31 | ) { 32 | NONE(sortByDefault(), groupBySSID), 33 | SSID(sortBySSID(), groupBySSID), 34 | CHANNEL(sortByChannel(), groupByChannel), 35 | VIRTUAL(sortBySSID(), groupByVirtual), 36 | ; 37 | 38 | val none: Boolean get() = NONE == this 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/navigation/NavigationMenuControl.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.navigation 19 | 20 | import android.view.MenuItem 21 | import android.view.View 22 | import androidx.annotation.IdRes 23 | import com.google.android.material.navigation.NavigationBarView 24 | import com.google.android.material.navigation.NavigationView 25 | 26 | interface NavigationMenuControl : 27 | NavigationView.OnNavigationItemSelectedListener, 28 | NavigationBarView.OnItemSelectedListener { 29 | fun currentMenuItem(): MenuItem 30 | 31 | fun currentNavigationMenu(): NavigationMenu 32 | 33 | fun currentNavigationMenu(navigationMenu: NavigationMenu) 34 | 35 | fun navigationView(): NavigationView 36 | 37 | fun findViewById( 38 | @IdRes id: Int, 39 | ): T 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/graph_content.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 23 | 24 | 29 | 30 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/navigation/availability/Filter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.navigation.availability 19 | 20 | import androidx.core.content.ContextCompat 21 | import com.vrem.wifianalyzer.MainContext 22 | import com.vrem.wifianalyzer.R 23 | 24 | internal val navigationOptionFilterOff: NavigationOption = { 25 | it.optionMenu.menu?.let { menu -> menu.findItem(R.id.action_filter).isVisible = false } 26 | } 27 | 28 | internal val navigationOptionFilterOn: NavigationOption = { 29 | it.optionMenu.menu?.let { menu -> 30 | val color = if (MainContext.INSTANCE.filtersAdapter.isActive()) R.color.selected else R.color.regular 31 | val menuItem = menu.findItem(R.id.action_filter) 32 | menuItem.isVisible = true 33 | menuItem.icon?.setTint(ContextCompat.getColor(it, color)) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/info_faq.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 24 | 25 | 31 | 32 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/filter/StrengthFilter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.filter 19 | 20 | import android.app.AlertDialog 21 | import com.vrem.wifianalyzer.R 22 | import com.vrem.wifianalyzer.wifi.filter.adapter.StrengthAdapter 23 | import com.vrem.wifianalyzer.wifi.model.Strength 24 | 25 | internal class StrengthFilter( 26 | strengthAdapter: StrengthAdapter, 27 | alertDialog: AlertDialog, 28 | ) : EnumFilter( 29 | mapOf( 30 | Strength.ZERO to R.id.filterStrength0, 31 | Strength.ONE to R.id.filterStrength1, 32 | Strength.TWO to R.id.filterStrength2, 33 | Strength.THREE to R.id.filterStrength3, 34 | Strength.FOUR to R.id.filterStrength4, 35 | ), 36 | strengthAdapter, 37 | alertDialog, 38 | R.id.filterStrength, 39 | ) 40 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_wifi_tethering.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/test/kotlin/com/vrem/wifianalyzer/navigation/items/NavigationItemTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.navigation.items 19 | 20 | import android.view.View 21 | import com.vrem.wifianalyzer.MainActivity 22 | import com.vrem.wifianalyzer.navigation.NavigationMenu 23 | import org.assertj.core.api.Assertions.assertThat 24 | import org.junit.Test 25 | 26 | class NavigationItemTest { 27 | private val fixture: NavigationItem = 28 | object : NavigationItem { 29 | override fun activate( 30 | mainActivity: MainActivity, 31 | navigationMenu: NavigationMenu, 32 | ) = Unit 33 | } 34 | 35 | @Test 36 | fun registered() { 37 | assertThat(fixture.registered).isFalse 38 | } 39 | 40 | @Test 41 | fun visibility() { 42 | assertThat(fixture.visibility).isEqualTo(View.GONE) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/res/layout/filter_popup.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 26 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/main_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/res/layout/access_points_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 24 | 25 | 30 | 31 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/layout/vendor_details.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 24 | 25 | 31 | 32 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/test/kotlin/com/vrem/wifianalyzer/wifi/model/FastRoamingTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.model 19 | 20 | import android.net.wifi.ScanResult 21 | import android.os.Build 22 | import androidx.test.ext.junit.runners.AndroidJUnit4 23 | import org.assertj.core.api.Assertions.assertThat 24 | import org.junit.Test 25 | import org.junit.runner.RunWith 26 | import org.mockito.kotlin.mock 27 | import org.mockito.kotlin.verifyNoMoreInteractions 28 | import org.robolectric.annotation.Config 29 | 30 | @RunWith(AndroidJUnit4::class) 31 | @Config(sdk = [Build.VERSION_CODES.Q]) 32 | class FastRoamingTest { 33 | @Test 34 | fun findLegacy() { 35 | // setup 36 | val scanResult: ScanResult = mock() 37 | // execute 38 | val actual = FastRoaming.find(scanResult) 39 | // validate 40 | assertThat(actual).isEmpty() 41 | verifyNoMoreInteractions(scanResult) 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/androidTest/kotlin/com/vrem/wifianalyzer/ScannerInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer 19 | 20 | import androidx.test.espresso.Espresso.onView 21 | import androidx.test.espresso.action.ViewActions.click 22 | import androidx.test.espresso.matcher.ViewMatchers.isDisplayed 23 | import androidx.test.espresso.matcher.ViewMatchers.withContentDescription 24 | import androidx.test.espresso.matcher.ViewMatchers.withId 25 | import com.vrem.wifianalyzer.R.id.action_scanner 26 | import org.hamcrest.Matchers.allOf 27 | 28 | private const val PAUSE = "Pause" 29 | private const val PLAY = "Play" 30 | 31 | internal class ScannerInstrumentedTest : Runnable { 32 | override fun run() { 33 | onView(allOf(withId(action_scanner), withContentDescription(PAUSE), isDisplayed())).perform(click()) 34 | onView(allOf(withId(action_scanner), withContentDescription(PLAY), isDisplayed())).perform(click()) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/graphutils/GraphLegend.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.graphutils 19 | 20 | import com.jjoe64.graphview.LegendRenderer 21 | 22 | internal typealias LegendDisplay = (legendRenderer: LegendRenderer) -> Unit 23 | 24 | internal val legendDisplayNone: LegendDisplay = { it.isVisible = false } 25 | 26 | internal val legendDisplayLeft: LegendDisplay = { 27 | it.isVisible = true 28 | it.setFixedPosition(0, 0) 29 | } 30 | 31 | internal val legendDisplayRight: LegendDisplay = { 32 | it.isVisible = true 33 | it.align = LegendRenderer.LegendAlign.TOP 34 | } 35 | 36 | enum class GraphLegend( 37 | val legendDisplay: LegendDisplay, 38 | ) { 39 | LEFT(legendDisplayLeft), 40 | RIGHT(legendDisplayRight), 41 | HIDE(legendDisplayNone), 42 | ; 43 | 44 | fun display(legendRenderer: LegendRenderer) { 45 | legendDisplay(legendRenderer) 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/test/kotlin/com/vrem/wifianalyzer/RobolectricUtil.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer 19 | 20 | import android.os.Looper 21 | import androidx.fragment.app.Fragment 22 | import org.robolectric.Robolectric 23 | import org.robolectric.Shadows 24 | 25 | enum class RobolectricUtil { 26 | INSTANCE, 27 | ; 28 | 29 | val activity: MainActivity = 30 | Robolectric 31 | .buildActivity(MainActivity::class.java) 32 | .create() 33 | .resume() 34 | .get() 35 | 36 | fun startFragment(fragment: Fragment) { 37 | val fragmentManager = activity.supportFragmentManager 38 | val fragmentTransaction = fragmentManager.beginTransaction() 39 | fragmentTransaction.add(fragment, null) 40 | fragmentTransaction.commit() 41 | clearLooper() 42 | } 43 | 44 | fun clearLooper() { 45 | Shadows.shadowOf(Looper.getMainLooper()).idle() 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/filter/SecurityFilter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.filter 19 | 20 | import android.app.AlertDialog 21 | import com.vrem.wifianalyzer.R 22 | import com.vrem.wifianalyzer.wifi.filter.adapter.SecurityAdapter 23 | import com.vrem.wifianalyzer.wifi.model.Security 24 | 25 | internal class SecurityFilter( 26 | securityAdapter: SecurityAdapter, 27 | alertDialog: AlertDialog, 28 | ) : EnumFilter( 29 | mapOf( 30 | Security.NONE to R.id.filterSecurityNone, 31 | Security.WPS to R.id.filterSecurityWPS, 32 | Security.WEP to R.id.filterSecurityWEP, 33 | Security.WPA to R.id.filterSecurityWPA, 34 | Security.WPA2 to R.id.filterSecurityWPA2, 35 | Security.WPA3 to R.id.filterSecurityWPA3, 36 | ), 37 | securityAdapter, 38 | alertDialog, 39 | R.id.filterSecurity, 40 | ) 41 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_color_lens.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/permission/PermissionService.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.permission 19 | 20 | import android.app.Activity 21 | import com.vrem.annotation.OpenClass 22 | 23 | @OpenClass 24 | class PermissionService( 25 | private val activity: Activity, 26 | private val locationPermission: LocationPermission = LocationPermission(activity), 27 | private val applicationPermission: ApplicationPermission = ApplicationPermission(activity), 28 | ) { 29 | fun enabled(): Boolean = locationEnabled() && permissionGranted() 30 | 31 | fun locationEnabled(): Boolean = locationPermission.enabled() 32 | 33 | fun check(): Unit = applicationPermission.check() 34 | 35 | fun granted( 36 | requestCode: Int, 37 | grantResults: IntArray, 38 | ): Boolean = applicationPermission.granted(requestCode, grantResults) 39 | 40 | fun permissionGranted(): Boolean = applicationPermission.granted() 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 21 | 0dp 22 | 23 | 16dp 24 | 16dp 25 | 26 | 8dp 27 | 28 | 4dp 29 | 24dp 30 | 31 | 110dp 32 | 33 | 12dp 34 | 36dp 35 | 36 | 10sp 37 | 38 | 12sp 39 | 12sp 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/util/FileUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.util 19 | 20 | import android.content.res.Resources 21 | import androidx.annotation.RawRes 22 | import java.util.zip.ZipInputStream 23 | 24 | fun readFile( 25 | resources: Resources, 26 | @RawRes id: Int, 27 | ): String = 28 | runCatching { 29 | resources 30 | .openRawResource(id) 31 | .bufferedReader() 32 | .use { it.readText() } 33 | .replace("\r", String.EMPTY) 34 | }.getOrDefault(String.EMPTY) 35 | 36 | fun readZipFile( 37 | resources: Resources, 38 | @RawRes id: Int, 39 | ): List = 40 | runCatching { 41 | resources.openRawResource(id).use { inputStream -> 42 | ZipInputStream(inputStream).use { zipInputStream -> 43 | zipInputStream.nextEntry 44 | zipInputStream.bufferedReader().readLines() 45 | } 46 | } 47 | }.getOrDefault(emptyList()) 48 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/export/ExportIntent.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | 19 | package com.vrem.wifianalyzer.export 20 | 21 | import android.content.Intent 22 | import com.vrem.annotation.OpenClass 23 | 24 | @OpenClass 25 | class ExportIntent { 26 | internal fun intent( 27 | title: String, 28 | data: String, 29 | ): Intent { 30 | val intentSend: Intent = intentSend() 31 | intentSend.flags = Intent.FLAG_ACTIVITY_NEW_TASK 32 | intentSend.type = "text/plain" 33 | intentSend.putExtra(Intent.EXTRA_TITLE, title) 34 | intentSend.putExtra(Intent.EXTRA_SUBJECT, title) 35 | intentSend.putExtra(Intent.EXTRA_TEXT, data) 36 | return intentChooser(intentSend, title) 37 | } 38 | 39 | internal fun intentSend(): Intent = Intent(Intent.ACTION_SEND) 40 | 41 | internal fun intentChooser( 42 | intent: Intent, 43 | title: String, 44 | ): Intent = Intent.createChooser(intent, title) 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/navigation/availability/ScannerSwitch.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.navigation.availability 19 | 20 | import com.vrem.wifianalyzer.MainContext 21 | import com.vrem.wifianalyzer.R 22 | 23 | internal val navigationOptionScannerSwitchOff: NavigationOption = { 24 | it.optionMenu.menu?.let { menu -> 25 | menu.findItem(R.id.action_scanner).isVisible = false 26 | } 27 | } 28 | 29 | internal val navigationOptionScannerSwitchOn: NavigationOption = { 30 | it.optionMenu.menu?.let { menu -> 31 | val menuItem = menu.findItem(R.id.action_scanner) 32 | menuItem.isVisible = true 33 | if (MainContext.INSTANCE.scannerService.running()) { 34 | menuItem.setTitle(R.string.scanner_pause) 35 | menuItem.setIcon(R.drawable.ic_pause) 36 | } else { 37 | menuItem.setTitle(R.string.scanner_play) 38 | menuItem.setIcon(R.drawable.ic_play_arrow) 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Thanks for sending a pull request! 2 | 3 | See CONTRIBUTING.md for details: https://github.com/VREMSoftwareDevelopment/WiFiAnalyzer/blob/main/CONTRIBUTING.md 4 | 5 | ## Summary 6 | - One-line summary of the change. 7 | - Brief explanation of why this change is needed. 8 | 9 | ## What does this implement/fix? 10 | - Describe the scope of the change (key files, classes, public API). 11 | - Mention if the change is small and focused or broad. 12 | 13 | ## Does this close any issues? 14 | - Closes # (if applicable) 15 | - Related to # (if applicable) 16 | 17 | ## How was this tested? 18 | - Devices / OS (e.g. Android 13 emulator, Pixel 6): 19 | - Platform / Build variant (e.g. debug/release): 20 | - Toolchain / Gradle / SDK version(s): 21 | - Steps to reproduce / test (provide exact steps so reviewers can verify): 22 | 23 | Example test commands: 24 | ```bash 25 | ./gradlew ktlintCheck 26 | ./gradlew lintDebug 27 | ./gradlew testDebugUnitTest 28 | ``` 29 | 30 | ## Checklist (required before marking ready) 31 | - [ ] I added or updated unit tests (see `app/src/test/`) 32 | - [ ] I followed the project's coding style (ktlint) and formatting 33 | - [ ] I ran lint and addressed or documented any warnings 34 | - [ ] CI checks pass (unit tests, coverage, lint) 35 | - [ ] No sensitive data, keys, or secrets are included 36 | 37 | ## Additional context 38 | - Screenshots, logs, or other context that helps reviewers understand the change. 39 | - Migration notes or compatibility considerations (if applicable). 40 | 41 | ## Reviewer notes 42 | - Call out anything reviewers should pay special attention to (performance, API changes, backwards compatibility, security). 43 | - Suggested reviewers or teams (optional): @maintainers 44 | 45 | Thank you for contributing! 46 | 47 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/navigation/options/OptionMenu.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.navigation.options 19 | 20 | import android.annotation.SuppressLint 21 | import android.app.Activity 22 | import android.view.Menu 23 | import android.view.MenuItem 24 | import androidx.appcompat.view.menu.MenuBuilder 25 | import com.vrem.annotation.OpenClass 26 | import com.vrem.wifianalyzer.R 27 | 28 | @OpenClass 29 | class OptionMenu { 30 | var menu: Menu? = null 31 | 32 | fun create( 33 | activity: Activity, 34 | menu: Menu, 35 | ) { 36 | activity.menuInflater.inflate(R.menu.optionmenu, menu) 37 | this.menu = menu 38 | iconsVisible(menu) 39 | } 40 | 41 | fun select(item: MenuItem): Unit = OptionAction.findOptionAction(item.itemId).action() 42 | 43 | @SuppressLint("RestrictedApi") 44 | private fun iconsVisible(menu: Menu): Result = 45 | runCatching { (menu as MenuBuilder).setOptionalIconsVisible(true) } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/navigation/availability/WiFiSwitch.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.navigation.availability 19 | 20 | import com.vrem.wifianalyzer.MainActivity 21 | import com.vrem.wifianalyzer.MainContext 22 | import com.vrem.wifianalyzer.R 23 | 24 | internal val navigationOptionWiFiSwitchOff: NavigationOption = { 25 | updateMenuItem(it, false) 26 | } 27 | 28 | internal val navigationOptionWiFiSwitchOn: NavigationOption = { 29 | updateMenuItem(it, true) 30 | } 31 | 32 | private fun updateMenuItem( 33 | mainActivity: MainActivity, 34 | visible: Boolean, 35 | ) { 36 | mainActivity.optionMenu.menu?.let { 37 | val menuItem = it.findItem(R.id.action_wifi_band) 38 | menuItem.isVisible = visible 39 | if (visible) { 40 | val wiFiBand = MainContext.INSTANCE.settings.wiFiBand() 41 | val title = mainActivity.getString(wiFiBand.textResource) 42 | menuItem.title = title.replace(' ', '\n') 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/accesspoint/AccessPointPopup.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.accesspoint 19 | 20 | import android.app.AlertDialog 21 | import android.view.View 22 | import com.vrem.annotation.OpenClass 23 | import com.vrem.wifianalyzer.wifi.model.WiFiDetail 24 | 25 | @OpenClass 26 | class AccessPointPopup { 27 | fun show(view: View): AlertDialog { 28 | val alertDialog: AlertDialog = 29 | AlertDialog 30 | .Builder(view.context) 31 | .setView(view) 32 | .setPositiveButton(android.R.string.ok) { dialog, _ -> 33 | dialog.cancel() 34 | }.create() 35 | alertDialog.show() 36 | return alertDialog 37 | } 38 | 39 | fun attach( 40 | view: View, 41 | wiFiDetail: WiFiDetail, 42 | ) { 43 | view.setOnClickListener { 44 | runCatching { show(AccessPointDetail().makeViewDetailed(wiFiDetail)) } 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/model/WiFiIdentifier.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.model 19 | 20 | import com.vrem.util.EMPTY 21 | 22 | typealias SSID = String 23 | typealias BSSID = String 24 | 25 | data class WiFiIdentifier( 26 | val ssidRaw: SSID = String.EMPTY, 27 | val bssid: BSSID = String.EMPTY, 28 | ) : Comparable { 29 | val ssid = 30 | when { 31 | ssidRaw.isEmpty() -> "*hidden*" 32 | else -> ssidRaw 33 | } 34 | 35 | val title: String get() = "$ssid ($bssid)" 36 | 37 | fun equals( 38 | other: WiFiIdentifier, 39 | ignoreCase: Boolean = false, 40 | ): Boolean = ssid.equals(other.ssidRaw, ignoreCase) && bssid.equals(other.bssid, ignoreCase) 41 | 42 | override fun compareTo(other: WiFiIdentifier): Int = 43 | compareBy { it.ssidRaw }.thenBy { it.bssid }.compare(this, other) 44 | 45 | companion object { 46 | val EMPTY = WiFiIdentifier() 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/res/layout/filter_ssid.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 27 | 28 | 32 | 33 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/test/kotlin/com/vrem/wifianalyzer/wifi/predicate/AllPredicateTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.predicate 19 | 20 | import com.vrem.wifianalyzer.wifi.model.WiFiDetail 21 | import org.assertj.core.api.Assertions.assertThat 22 | import org.junit.Test 23 | 24 | class AllPredicateTest { 25 | @Test 26 | fun allPredicateIsTrue() { 27 | // setup 28 | val wiFiDetail = WiFiDetail.EMPTY 29 | val fixture = listOf(truePredicate, truePredicate, truePredicate).allPredicate() 30 | // execute 31 | val actual = fixture(wiFiDetail) 32 | // validate 33 | assertThat(actual).isTrue 34 | } 35 | 36 | @Test 37 | fun allPredicateIsFalse() { 38 | // setup 39 | val wiFiDetail = WiFiDetail.EMPTY 40 | val fixture = listOf(falsePredicate, truePredicate, falsePredicate).allPredicate() 41 | // execute 42 | val actual = fixture(wiFiDetail) 43 | // validate 44 | assertThat(actual).isFalse 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/test/kotlin/com/vrem/wifianalyzer/wifi/predicate/AnyPredicateTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.predicate 19 | 20 | import com.vrem.wifianalyzer.wifi.model.WiFiDetail 21 | import org.assertj.core.api.Assertions.assertThat 22 | import org.junit.Test 23 | 24 | class AnyPredicateTest { 25 | @Test 26 | fun anyPredicateIsTrue() { 27 | // setup 28 | val wiFiDetail = WiFiDetail.EMPTY 29 | val fixture = listOf(falsePredicate, truePredicate, falsePredicate).anyPredicate() 30 | // execute 31 | val actual = fixture(wiFiDetail) 32 | // validate 33 | assertThat(actual).isTrue 34 | } 35 | 36 | @Test 37 | fun anyPredicateIsFalse() { 38 | // setup 39 | val wiFiDetail = WiFiDetail.EMPTY 40 | val fixture = listOf(falsePredicate, falsePredicate, falsePredicate).anyPredicate() 41 | // execute 42 | val actual = fixture(wiFiDetail) 43 | // validate 44 | assertThat(actual).isFalse 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 21 | 22 | #9E9E9E 23 | 24 | #2196F3 25 | 26 | @color/regular 27 | 28 | #00BCD4 29 | 30 | #0097A7 31 | 32 | #607D8B 33 | 34 | #009688 35 | 36 | #F44336 37 | 38 | #FFC107 39 | 40 | #4CAF50 41 | 42 | #757575 43 | 44 | #000000 45 | 46 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/wifi/model/WiFiConnection.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | 19 | package com.vrem.wifianalyzer.wifi.model 20 | 21 | import com.vrem.util.EMPTY 22 | 23 | data class WiFiConnection( 24 | val wiFiIdentifier: WiFiIdentifier = WiFiIdentifier.EMPTY, 25 | val ipAddress: String = String.EMPTY, 26 | val linkSpeed: Int = LINK_SPEED_INVALID, 27 | ) : Comparable { 28 | val connected: Boolean get() = EMPTY != this 29 | 30 | override fun equals(other: Any?): Boolean { 31 | if (this === other) return true 32 | if (javaClass != other?.javaClass) return false 33 | other as WiFiConnection 34 | return wiFiIdentifier == other.wiFiIdentifier 35 | } 36 | 37 | override fun hashCode(): Int = wiFiIdentifier.hashCode() 38 | 39 | override fun compareTo(other: WiFiConnection): Int = wiFiIdentifier.compareTo(other.wiFiIdentifier) 40 | 41 | companion object { 42 | const val LINK_SPEED_INVALID = -1 43 | val EMPTY = WiFiConnection() 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/test/kotlin/com/vrem/wifianalyzer/wifi/accesspoint/AccessPointViewTypeTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.accesspoint 19 | 20 | import com.vrem.wifianalyzer.R 21 | import org.assertj.core.api.Assertions.assertThat 22 | import org.junit.Test 23 | 24 | class AccessPointViewTypeTest { 25 | @Test 26 | fun accessPointViewType() { 27 | assertThat(AccessPointViewType.entries) 28 | .hasSize(2) 29 | .containsExactly(AccessPointViewType.COMPLETE, AccessPointViewType.COMPACT) 30 | } 31 | 32 | @Test 33 | fun accessPointViewTypeOrdinal() { 34 | assertThat(AccessPointViewType.COMPLETE.ordinal).isEqualTo(0) 35 | assertThat(AccessPointViewType.COMPACT.ordinal).isEqualTo(1) 36 | } 37 | 38 | @Test 39 | fun accessPointViewTypeLayout() { 40 | assertThat(AccessPointViewType.COMPLETE.layout).isEqualTo(R.layout.access_point_view_complete) 41 | assertThat(AccessPointViewType.COMPACT.layout).isEqualTo(R.layout.access_point_view_compact) 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/res/layout/info_location.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 25 | 26 | 31 | 32 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/test/kotlin/com/vrem/wifianalyzer/wifi/predicate/SSIDPredicateTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.wifi.predicate 19 | 20 | import com.vrem.wifianalyzer.wifi.model.WiFiDetail 21 | import com.vrem.wifianalyzer.wifi.model.WiFiIdentifier 22 | import com.vrem.wifianalyzer.wifi.model.WiFiSecurity 23 | import org.assertj.core.api.Assertions.assertThat 24 | import org.junit.Test 25 | 26 | class SSIDPredicateTest { 27 | @Test 28 | fun sSIDPredicate() { 29 | // setup 30 | val wiFiDetail = WiFiDetail(WiFiIdentifier("ssid", "bssid"), WiFiSecurity("wpa")) 31 | // execute & validate 32 | assertThat("ssid".predicate()(wiFiDetail)).isTrue 33 | assertThat("id".predicate()(wiFiDetail)).isTrue 34 | assertThat("ss".predicate()(wiFiDetail)).isTrue 35 | assertThat("s".predicate()(wiFiDetail)).isTrue 36 | assertThat("".predicate()(wiFiDetail)).isTrue 37 | assertThat("SSID".predicate()(wiFiDetail)).isFalse 38 | assertThat("B".predicate()(wiFiDetail)).isFalse 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /.github/workflows/android-test-ci.yml: -------------------------------------------------------------------------------- 1 | name: Android Instrumentation Tests 2 | on: 3 | push: 4 | branches: 5 | - release 6 | paths-ignore: 7 | - '**/*.md' 8 | - '.github/workflows/android-ci.yml' 9 | - '.github/workflows/codeql-analysis.yml' 10 | - '.github/workflows/close-empty-xml.yml' 11 | - '.github/workflows/stale.yml' 12 | - '.github/workflows/compare-src.yml' 13 | workflow_dispatch: {} 14 | 15 | jobs: 16 | build: 17 | runs-on: ubuntu-22.04 18 | steps: 19 | - uses: actions/checkout@v4 20 | - uses: ./.github/actions/common-setup 21 | - name: Build APKs 22 | run: ./gradlew assembleDebug assembleAndroidTest 23 | - name: Upload APKs 24 | uses: actions/upload-artifact@v4 25 | with: 26 | name: apks 27 | path: | 28 | app/build/outputs/apk/debug/app-debug.apk 29 | app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk 30 | 31 | test: 32 | runs-on: ubuntu-22.04 33 | needs: build 34 | steps: 35 | - uses: actions/checkout@v4 36 | - name: Download APKs 37 | uses: actions/download-artifact@v4 38 | with: 39 | name: apks 40 | - name: Run tests 41 | uses: emulator-wtf/run-tests@v0 42 | with: 43 | api-token: ${{ secrets.EW_API_TOKEN }} 44 | app: app-debug.apk 45 | test: app-debug-androidTest.apk 46 | outputs-dir: build/test-results 47 | - name: Upload test results 48 | uses: actions/upload-artifact@v4 49 | with: 50 | path: | 51 | build/test-results 52 | app/build/reports/androidTests 53 | - name: Publish test results 54 | uses: mikepenz/action-junit-report@v5 55 | if: always() 56 | with: 57 | report_paths: 'build/test-results/**/*.xml' 58 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/vrem/wifianalyzer/navigation/availability/NavigationOptions.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * WiFiAnalyzer 3 | * Copyright (C) 2015 - 2025 VREM Software Development 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see 17 | */ 18 | package com.vrem.wifianalyzer.navigation.availability 19 | 20 | val navigationOptionAp = 21 | listOf( 22 | navigationOptionWiFiSwitchOff, 23 | navigationOptionScannerSwitchOn, 24 | navigationOptionFilterOn, 25 | navigationOptionBottomNavOn, 26 | ) 27 | 28 | val navigationOptionOff = 29 | listOf( 30 | navigationOptionWiFiSwitchOff, 31 | navigationOptionScannerSwitchOff, 32 | navigationOptionFilterOff, 33 | navigationOptionBottomNavOff, 34 | ) 35 | 36 | val navigationOptionOther = 37 | listOf( 38 | navigationOptionWiFiSwitchOn, 39 | navigationOptionScannerSwitchOn, 40 | navigationOptionFilterOn, 41 | navigationOptionBottomNavOn, 42 | ) 43 | 44 | val navigationOptionRating = 45 | listOf( 46 | navigationOptionWiFiSwitchOn, 47 | navigationOptionScannerSwitchOn, 48 | navigationOptionFilterOff, 49 | navigationOptionBottomNavOn, 50 | ) 51 | -------------------------------------------------------------------------------- /app/src/main/res/menu/nav_bottom_menu.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 20 | 25 | 26 | 31 | 32 | 37 | 38 | 43 | 44 | --------------------------------------------------------------------------------