{"owner":"VREMSoftwareDevelopment","repo":"WiFiAnalyzer","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"# AI Assistant Instructions for WiFiAnalyzer\n\n## Project Overview\n\nWiFiAnalyzer is an Android application for analyzing WiFi networks. It helps users:\n- Identify nearby Access Points\n- Graph channel signal strength\n- Analyze Wi-Fi networks to rate channels\n- Support 2.4 GHz, 5 GHz and 6 GHz Wi-Fi bands\n- Export access point details\n\n**Important**: WiFiAnalyzer is NOT a Wi-Fi password cracking or phishing tool.\n\n## Technology Stack\n\n| Component | Technology |\n|-----------|------------|\n| Language | Kotlin |\n| Platform | Android |\n| Build Tool | Gradle |\n| Testing | JUnit, Mockito, Robolectric, Espresso |\n| Code Style | ktlint |\n| License | GNU General Public License v3.0 (GPLv3) |\n\nclearAdditional repository-specific versions and toolchain (source-of-truth files shown):\n\n- Kotlin: 2.3.20 (top-level `build.gradle` ext.kotlin_version)\n- Android Gradle Plugin (AGP): 9.1.1 (top-level `build.gradle` classpath `com.android.tools.build:gradle:9.1.1`)\n - Note: the top-level `build.gradle` also adds `gradlePluginPortal()` to repositories and includes additional classpath entries used by the build:\n   - `org.jetbrains.kotlin:kotlin-allopen:$kotlin_version`\n   - `com.github.ben-manes:gradle-versions-plugin:0.53.0`\n- Gradle wrapper: 9.4.1 (`gradle/wrapper/gradle-wrapper.properties` distributionUrl)\n- JDK: 21 is used in CI and repository setup (`.github/actions/common-setup/action.yml` and `.github/workflows/*` use setup-java with `java-version: 21`). Note: project `compileOptions` and `kotlinOptions.jvmTarget` are set to Java 17 in `app/build.gradle`.\n- Android compile/target SDK: compileSdk = 36, minSdk = 24 (see `app/build.gradle`).\n\n## Project Structure\n\n```\napp/src/main/kotlin/         # Main application source code\napp/src/test/kotlin/         # Unit tests\napp/src/androidTest/kotlin/  # Android instrumentation tests\n```\n\n## Coding Standards\n\n### File Headers\n\nAll source files must include the GPLv3 license header:\n\n```kotlin\n/*\n * WiFiAnalyzer\n * Copyright (C) 2015 - {current_year} VREM Software Development <VREMSoftwareDevelopment@gmail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n```\n\n### Naming Conventions\n\n- Use descriptive names for classes, methods, and variables\n- Follow Kotlin naming conventions: camelCase for variables/methods, PascalCase for classes\n\n### Code Formatting\n\nUse ktlint for code formatting:\n- Check: `./gradlew ktlintCheck`\n- Format: `./gradlew ktlintFormat`\n \nRepository-specific ktlint notes:\n- Plugin configured in `app/build.gradle` as `org.jlleitschuh.gradle.ktlint` (version `14.2.0`).\n- Baseline and rules: see `app/config/ktlint/baseline.xml` and project `.editorconfig` for formatting rules.\n\n## Communication Philosophy\n\n**Be direct and honest**: In all interactions — code reviews, technical discussions, architectural decisions, and general conversation — point out code smells, anti-patterns, SOLID/DRY violations, magic values, poor naming, and flawed reasoning without sugar-coating. Focus on actionable criticism with specific alternatives. Do not hedge or soften feedback unnecessarily.\n\n## Testing Requirements\n\n### Mandatory Testing\n\nAll new features and bug fixes MUST include unit tests.\n\n### Test File Naming\n\nTest files use several patterns, including but not limited to:\n- `[ClassName]Test.kt`\n- `[ClassName]InstrumentedTest.kt`\n- `[ClassName]IntegrationTest.kt`\n- `[ClassName]ParameterizedTest.kt`\n- `[ClassName]TestUtil.kt`\n\nUse the pattern that best describes the test's purpose. Document any deviations from these patterns in your code or pull request to maintain clarity.\n\n### Test Structure (AAA Pattern)\n\n```kotlin\n@Test\nfun shouldReturnCorrectVersionNumber() {\n    // Arrange: Set up test data and mocks\n    // Act: Execute the code being tested\n    // Assert: Verify the results\n}\n```\n\n### Testing Patterns Used\n\n// Example imports for test files:\n```kotlin\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.verify\nimport org.mockito.kotlin.whenever\n```\n\n// Example imports for assertions:\n```kotlin\nimport org.assertj.core.api.Assertions.assertThat\n\nassertThat(actual).isEqualTo(expected)\nassertThat(actual).isTrue\nassertThat(actual).isNotNull()\n```\n\n**Test teardown pattern:**\n```kotlin\n@After\nfun tearDown() {\n    verifyNoMoreInteractions(dependency1, dependency2)\n}\n```\n\n**Robolectric for Android components (use RobolectricUtil helper):**\n```kotlin\nimport com.vrem.wifianalyzer.RobolectricUtil\n\nprivate val mainActivity = RobolectricUtil.INSTANCE.activity\n\n// For fragments:\nRobolectricUtil.INSTANCE.startFragment(fragment)\n```\n\n## Android Instrumentation Test Conventions\n\n- Instrumentation test files are located in `app/src/androidTest/kotlin/`.\n- File names typically follow the pattern `[ClassName]InstrumentedTest.kt`.\n- Use the `@RunWith(AndroidJUnit4::class)` annotation for instrumentation tests.\n- Access UI components using Espresso or Robolectric as appropriate.\n- Example instrumentation test structure:\n\n```kotlin\n@RunWith(AndroidJUnit4::class)\nclass MainActivityInstrumentedTest {\n    @Test\n    fun shouldDisplayMainScreen() {\n        // Arrange: Launch activity\n        // Act: Interact with UI\n        // Assert: Verify UI state\n    }\n}\n```\n\n## Build Commands\n\n| Task | Command |\n|------|---------|\n| Check code style | `./gradlew ktlintCheck` |\n| Format code | `./gradlew ktlintFormat` |\n| Run lint | `./gradlew lintDebug` |\n| Run unit tests | `./gradlew testDebugUnitTest` |\n| Run tests with coverage | `./gradlew jacocoTestCoverageVerification` |\n| Run instrumented tests | `./gradlew connectedDebugAndroidTest` |\n\n### CI / GitHub Actions (what the repo runs)\n\n- Workflows:\n  - `.github/workflows/android-ci.yml` — main Android CI pipeline (jobs: ktlint, lint, test, coverage, build-apk, emulator-test). Runners use `ubuntu-24.04` / `ubuntu-latest` and a composite action `.github/actions/common-setup` to install JDK 21 and Gradle.\n  - `.github/workflows/codeql-analysis.yml` — CodeQL analysis (language: `java-kotlin`, uses JDK 21).\n\n- Important CI details and artifact/report locations (useful for reproducing or debugging locally):\n  - ktlint report: `app/build/reports/ktlint` (CI uploads as `ktlint-report`).\n  - lint report: `app/build/reports/lint-results*.*` (CI uploads as `lint-report`).\n  - unit test reports: `app/build/reports/tests` (CI uploads as `test-results`). The unit test task invoked is `:app:testDebugUnitTest` / `./gradlew testDebugUnitTest`.\n  - JaCoCo report (CI expects the XML): `app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml` (uploaded to Codecov using `secrets.CODECOV_TOKEN`).\n  - APK artifact: `app/build/outputs/apk/debug` (uploaded as `artifact-apk`).\n  - Instrumentation / emulator test outputs: `app/build/reports/androidTests` and `app/build/outputs/androidTest-results/connected/**/*.xml` for JUnit XMLs.\n\n- Emulator job notes: the GitHub Action enables KVM, caches AVD (`~/.android/avd/*`) and runs `./gradlew connectedDebugAndroidTest`. Emulator caching and KVM are required for the `emulator-test` job in `android-ci.yml`.\n\n## Privacy and Security Guidelines\n\n1. **No Data Collection**: WiFiAnalyzer does not collect any personal/device information\n2. **No Internet**: The app does not require internet access\n3. **Minimal Permissions**: Use only necessary Android permissions\n4. **No Secrets**: Never commit API keys, passwords, or other secrets\n"},"files":{"AGENTS.md":"# AI Assistant Instructions for WiFiAnalyzer\n\n## Project Overview\n\nWiFiAnalyzer is an Android application for analyzing WiFi networks. It helps users:\n- Identify nearby Access Points\n- Graph channel signal strength\n- Analyze Wi-Fi networks to rate channels\n- Support 2.4 GHz, 5 GHz and 6 GHz Wi-Fi bands\n- Export access point details\n\n**Important**: WiFiAnalyzer is NOT a Wi-Fi password cracking or phishing tool.\n\n## Technology Stack\n\n| Component | Technology |\n|-----------|------------|\n| Language | Kotlin |\n| Platform | Android |\n| Build Tool | Gradle |\n| Testing | JUnit, Mockito, Robolectric, Espresso |\n| Code Style | ktlint |\n| License | GNU General Public License v3.0 (GPLv3) |\n\nclearAdditional repository-specific versions and toolchain (source-of-truth files shown):\n\n- Kotlin: 2.3.20 (top-level `build.gradle` ext.kotlin_version)\n- Android Gradle Plugin (AGP): 9.1.1 (top-level `build.gradle` classpath `com.android.tools.build:gradle:9.1.1`)\n - Note: the top-level `build.gradle` also adds `gradlePluginPortal()` to repositories and includes additional classpath entries used by the build:\n   - `org.jetbrains.kotlin:kotlin-allopen:$kotlin_version`\n   - `com.github.ben-manes:gradle-versions-plugin:0.53.0`\n- Gradle wrapper: 9.4.1 (`gradle/wrapper/gradle-wrapper.properties` distributionUrl)\n- JDK: 21 is used in CI and repository setup (`.github/actions/common-setup/action.yml` and `.github/workflows/*` use setup-java with `java-version: 21`). Note: project `compileOptions` and `kotlinOptions.jvmTarget` are set to Java 17 in `app/build.gradle`.\n- Android compile/target SDK: compileSdk = 36, minSdk = 24 (see `app/build.gradle`).\n\n## Project Structure\n\n```\napp/src/main/kotlin/         # Main application source code\napp/src/test/kotlin/         # Unit tests\napp/src/androidTest/kotlin/  # Android instrumentation tests\n```\n\n## Coding Standards\n\n### File Headers\n\nAll source files must include the GPLv3 license header:\n\n```kotlin\n/*\n * WiFiAnalyzer\n * Copyright (C) 2015 - {current_year} VREM Software Development <VREMSoftwareDevelopment@gmail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n```\n\n### Naming Conventions\n\n- Use descriptive names for classes, methods, and variables\n- Follow Kotlin naming conventions: camelCase for variables/methods, PascalCase for classes\n\n### Code Formatting\n\nUse ktlint for code formatting:\n- Check: `./gradlew ktlintCheck`\n- Format: `./gradlew ktlintFormat`\n \nRepository-specific ktlint notes:\n- Plugin configured in `app/build.gradle` as `org.jlleitschuh.gradle.ktlint` (version `14.2.0`).\n- Baseline and rules: see `app/config/ktlint/baseline.xml` and project `.editorconfig` for formatting rules.\n\n## Communication Philosophy\n\n**Be direct and honest**: In all interactions — code reviews, technical discussions, architectural decisions, and general conversation — point out code smells, anti-patterns, SOLID/DRY violations, magic values, poor naming, and flawed reasoning without sugar-coating. Focus on actionable criticism with specific alternatives. Do not hedge or soften feedback unnecessarily.\n\n## Testing Requirements\n\n### Mandatory Testing\n\nAll new features and bug fixes MUST include unit tests.\n\n### Test File Naming\n\nTest files use several patterns, including but not limited to:\n- `[ClassName]Test.kt`\n- `[ClassName]InstrumentedTest.kt`\n- `[ClassName]IntegrationTest.kt`\n- `[ClassName]ParameterizedTest.kt`\n- `[ClassName]TestUtil.kt`\n\nUse the pattern that best describes the test's purpose. Document any deviations from these patterns in your code or pull request to maintain clarity.\n\n### Test Structure (AAA Pattern)\n\n```kotlin\n@Test\nfun shouldReturnCorrectVersionNumber() {\n    // Arrange: Set up test data and mocks\n    // Act: Execute the code being tested\n    // Assert: Verify the results\n}\n```\n\n### Testing Patterns Used\n\n// Example imports for test files:\n```kotlin\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.verify\nimport org.mockito.kotlin.whenever\n```\n\n// Example imports for assertions:\n```kotlin\nimport org.assertj.core.api.Assertions.assertThat\n\nassertThat(actual).isEqualTo(expected)\nassertThat(actual).isTrue\nassertThat(actual).isNotNull()\n```\n\n**Test teardown pattern:**\n```kotlin\n@After\nfun tearDown() {\n    verifyNoMoreInteractions(dependency1, dependency2)\n}\n```\n\n**Robolectric for Android components (use RobolectricUtil helper):**\n```kotlin\nimport com.vrem.wifianalyzer.RobolectricUtil\n\nprivate val mainActivity = RobolectricUtil.INSTANCE.activity\n\n// For fragments:\nRobolectricUtil.INSTANCE.startFragment(fragment)\n```\n\n## Android Instrumentation Test Conventions\n\n- Instrumentation test files are located in `app/src/androidTest/kotlin/`.\n- File names typically follow the pattern `[ClassName]InstrumentedTest.kt`.\n- Use the `@RunWith(AndroidJUnit4::class)` annotation for instrumentation tests.\n- Access UI components using Espresso or Robolectric as appropriate.\n- Example instrumentation test structure:\n\n```kotlin\n@RunWith(AndroidJUnit4::class)\nclass MainActivityInstrumentedTest {\n    @Test\n    fun shouldDisplayMainScreen() {\n        // Arrange: Launch activity\n        // Act: Interact with UI\n        // Assert: Verify UI state\n    }\n}\n```\n\n## Build Commands\n\n| Task | Command |\n|------|---------|\n| Check code style | `./gradlew ktlintCheck` |\n| Format code | `./gradlew ktlintFormat` |\n| Run lint | `./gradlew lintDebug` |\n| Run unit tests | `./gradlew testDebugUnitTest` |\n| Run tests with coverage | `./gradlew jacocoTestCoverageVerification` |\n| Run instrumented tests | `./gradlew connectedDebugAndroidTest` |\n\n### CI / GitHub Actions (what the repo runs)\n\n- Workflows:\n  - `.github/workflows/android-ci.yml` — main Android CI pipeline (jobs: ktlint, lint, test, coverage, build-apk, emulator-test). Runners use `ubuntu-24.04` / `ubuntu-latest` and a composite action `.github/actions/common-setup` to install JDK 21 and Gradle.\n  - `.github/workflows/codeql-analysis.yml` — CodeQL analysis (language: `java-kotlin`, uses JDK 21).\n\n- Important CI details and artifact/report locations (useful for reproducing or debugging locally):\n  - ktlint report: `app/build/reports/ktlint` (CI uploads as `ktlint-report`).\n  - lint report: `app/build/reports/lint-results*.*` (CI uploads as `lint-report`).\n  - unit test reports: `app/build/reports/tests` (CI uploads as `test-results`). The unit test task invoked is `:app:testDebugUnitTest` / `./gradlew testDebugUnitTest`.\n  - JaCoCo report (CI expects the XML): `app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml` (uploaded to Codecov using `secrets.CODECOV_TOKEN`).\n  - APK artifact: `app/build/outputs/apk/debug` (uploaded as `artifact-apk`).\n  - Instrumentation / emulator test outputs: `app/build/reports/androidTests` and `app/build/outputs/androidTest-results/connected/**/*.xml` for JUnit XMLs.\n\n- Emulator job notes: the GitHub Action enables KVM, caches AVD (`~/.android/avd/*`) and runs `./gradlew connectedDebugAndroidTest`. Emulator caching and KVM are required for the `emulator-test` job in `android-ci.yml`.\n\n## Privacy and Security Guidelines\n\n1. **No Data Collection**: WiFiAnalyzer does not collect any personal/device information\n2. **No Internet**: The app does not require internet access\n3. **Minimal Permissions**: Use only necessary Android permissions\n4. **No Secrets**: Never commit API keys, passwords, or other secrets\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# AI Assistant Instructions for WiFiAnalyzer\n\n## Project Overview\n\nWiFiAnalyzer is an Android application for analyzing WiFi networks. It helps users:\n- Identify nearby Access Points\n- Graph channel signal strength\n- Analyze Wi-Fi networks to rate channels\n- Support 2.4 GHz, 5 GHz and 6 GHz Wi-Fi bands\n- Export access point details\n\n**Important**: WiFiAnalyzer is NOT a Wi-Fi password cracking or phishing tool.\n\n## Technology Stack\n\n| Component | Technology |\n|-----------|------------|\n| Language | Kotlin |\n| Platform | Android |\n| Build Tool | Gradle |\n| Testing | JUnit, Mockito, Robolectric, Espresso |\n| Code Style | ktlint |\n| License | GNU General Public License v3.0 (GPLv3) |\n\nclearAdditional repository-specific versions and toolchain (source-of-truth files shown):\n\n- Kotlin: 2.3.20 (top-level `build.gradle` ext.kotlin_version)\n- Android Gradle Plugin (AGP): 9.1.1 (top-level `build.gradle` classpath `com.android.tools.build:gradle:9.1.1`)\n - Note: the top-level `build.gradle` also adds `gradlePluginPortal()` to repositories and includes additional classpath entries used by the build:\n   - `org.jetbrains.kotlin:kotlin-allopen:$kotlin_version`\n   - `com.github.ben-manes:gradle-versions-plugin:0.53.0`\n- Gradle wrapper: 9.4.1 (`gradle/wrapper/gradle-wrapper.properties` distributionUrl)\n- JDK: 21 is used in CI and repository setup (`.github/actions/common-setup/action.yml` and `.github/workflows/*` use setup-java with `java-version: 21`). Note: project `compileOptions` and `kotlinOptions.jvmTarget` are set to Java 17 in `app/build.gradle`.\n- Android compile/target SDK: compileSdk = 36, minSdk = 24 (see `app/build.gradle`).\n\n## Project Structure\n\n```\napp/src/main/kotlin/         # Main application source code\napp/src/test/kotlin/         # Unit tests\napp/src/androidTest/kotlin/  # Android instrumentation tests\n```\n\n## Coding Standards\n\n### File Headers\n\nAll source files must include the GPLv3 license header:\n\n```kotlin\n/*\n * WiFiAnalyzer\n * Copyright (C) 2015 - {current_year} VREM Software Development <VREMSoftwareDevelopment@gmail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n```\n\n### Naming Conventions\n\n- Use descriptive names for classes, methods, and variables\n- Follow Kotlin naming conventions: camelCase for variables/methods, PascalCase for classes\n\n### Code Formatting\n\nUse ktlint for code formatting:\n- Check: `./gradlew ktlintCheck`\n- Format: `./gradlew ktlintFormat`\n \nRepository-specific ktlint notes:\n- Plugin configured in `app/build.gradle` as `org.jlleitschuh.gradle.ktlint` (version `14.2.0`).\n- Baseline and rules: see `app/config/ktlint/baseline.xml` and project `.editorconfig` for formatting rules.\n\n## Communication Philosophy\n\n**Be direct and honest**: In all interactions — code reviews, technical discussions, architectural decisions, and general conversation — point out code smells, anti-patterns, SOLID/DRY violations, magic values, poor naming, and flawed reasoning without sugar-coating. Focus on actionable criticism with specific alternatives. Do not hedge or soften feedback unnecessarily.\n\n## Testing Requirements\n\n### Mandatory Testing\n\nAll new features and bug fixes MUST include unit tests.\n\n### Test File Naming\n\nTest files use several patterns, including but not limited to:\n- `[ClassName]Test.kt`\n- `[ClassName]InstrumentedTest.kt`\n- `[ClassName]IntegrationTest.kt`\n- `[ClassName]ParameterizedTest.kt`\n- `[ClassName]TestUtil.kt`\n\nUse the pattern that best describes the test's purpose. Document any deviations from these patterns in your code or pull request to maintain clarity.\n\n### Test Structure (AAA Pattern)\n\n```kotlin\n@Test\nfun shouldReturnCorrectVersionNumber() {\n    // Arrange: Set up test data and mocks\n    // Act: Execute the code being tested\n    // Assert: Verify the results\n}\n```\n\n### Testing Patterns Used\n\n// Example imports for test files:\n```kotlin\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.verify\nimport org.mockito.kotlin.whenever\n```\n\n// Example imports for assertions:\n```kotlin\nimport org.assertj.core.api.Assertions.assertThat\n\nassertThat(actual).isEqualTo(expected)\nassertThat(actual).isTrue\nassertThat(actual).isNotNull()\n```\n\n**Test teardown pattern:**\n```kotlin\n@After\nfun tearDown() {\n    verifyNoMoreInteractions(dependency1, dependency2)\n}\n```\n\n**Robolectric for Android components (use RobolectricUtil helper):**\n```kotlin\nimport com.vrem.wifianalyzer.RobolectricUtil\n\nprivate val mainActivity = RobolectricUtil.INSTANCE.activity\n\n// For fragments:\nRobolectricUtil.INSTANCE.startFragment(fragment)\n```\n\n## Android Instrumentation Test Conventions\n\n- Instrumentation test files are located in `app/src/androidTest/kotlin/`.\n- File names typically follow the pattern `[ClassName]InstrumentedTest.kt`.\n- Use the `@RunWith(AndroidJUnit4::class)` annotation for instrumentation tests.\n- Access UI components using Espresso or Robolectric as appropriate.\n- Example instrumentation test structure:\n\n```kotlin\n@RunWith(AndroidJUnit4::class)\nclass MainActivityInstrumentedTest {\n    @Test\n    fun shouldDisplayMainScreen() {\n        // Arrange: Launch activity\n        // Act: Interact with UI\n        // Assert: Verify UI state\n    }\n}\n```\n\n## Build Commands\n\n| Task | Command |\n|------|---------|\n| Check code style | `./gradlew ktlintCheck` |\n| Format code | `./gradlew ktlintFormat` |\n| Run lint | `./gradlew lintDebug` |\n| Run unit tests | `./gradlew testDebugUnitTest` |\n| Run tests with coverage | `./gradlew jacocoTestCoverageVerification` |\n| Run instrumented tests | `./gradlew connectedDebugAndroidTest` |\n\n### CI / GitHub Actions (what the repo runs)\n\n- Workflows:\n  - `.github/workflows/android-ci.yml` — main Android CI pipeline (jobs: ktlint, lint, test, coverage, build-apk, emulator-test). Runners use `ubuntu-24.04` / `ubuntu-latest` and a composite action `.github/actions/common-setup` to install JDK 21 and Gradle.\n  - `.github/workflows/codeql-analysis.yml` — CodeQL analysis (language: `java-kotlin`, uses JDK 21).\n\n- Important CI details and artifact/report locations (useful for reproducing or debugging locally):\n  - ktlint report: `app/build/reports/ktlint` (CI uploads as `ktlint-report`).\n  - lint report: `app/build/reports/lint-results*.*` (CI uploads as `lint-report`).\n  - unit test reports: `app/build/reports/tests` (CI uploads as `test-results`). The unit test task invoked is `:app:testDebugUnitTest` / `./gradlew testDebugUnitTest`.\n  - JaCoCo report (CI expects the XML): `app/build/reports/jacoco/jacocoTestReport/jacocoTestReport.xml` (uploaded to Codecov using `secrets.CODECOV_TOKEN`).\n  - APK artifact: `app/build/outputs/apk/debug` (uploaded as `artifact-apk`).\n  - Instrumentation / emulator test outputs: `app/build/reports/androidTests` and `app/build/outputs/androidTest-results/connected/**/*.xml` for JUnit XMLs.\n\n- Emulator job notes: the GitHub Action enables KVM, caches AVD (`~/.android/avd/*`) and runs `./gradlew connectedDebugAndroidTest`. Emulator caching and KVM are required for the `emulator-test` job in `android-ci.yml`.\n\n## Privacy and Security Guidelines\n\n1. **No Data Collection**: WiFiAnalyzer does not collect any personal/device information\n2. **No Internet**: The app does not require internet access\n3. **Minimal Permissions**: Use only necessary Android permissions\n4. **No Secrets**: Never commit API keys, passwords, or other secrets\n","category":"root","tokens":1985}]}