SensorScope app icon

SensorScope

Sensor dashboard for exploring live Android device sensor readings and diagnostics.

Get it on Google Play ↗ Source on GitHub ↗

SensorScope is an Android hardware diagnostics app for inspecting device sensors, battery telemetry, and thermal stress behavior in real time. It is built for technicians, QA teams, Android developers, and power users who need a clear view into the hardware signals exposed by a device.

Project Overview

SensorScope gives Android users a focused diagnostic dashboard for sensors, battery state, thermal checks, calibration baselines, and report previews. The app reads local device telemetry, stores diagnostic baselines and thermal logs on the device, and lets users export CSV snapshots only when they choose to share them.

Key Features

Architecture Overview

Components

MainActivity hosts a Compose NavHost with dashboard, sensor detail, dead-pixel, thermal stress, battery telemetry, calibration, and report-preview destinations. SensorScopeApp creates an AppContainer, which wires data sources, repositories, Room DAOs, and use cases without a third-party dependency-injection framework.

SensorDataSourceImpl wraps SensorManager as Kotlin Flow streams. BatteryDataSourceImpl converts Android battery broadcasts and BatteryManager properties into domain readings. SensorScopeDatabase persists calibration baselines and thermal stress logs with Room.

Data Flow

Device hardware emits sensor and battery events. Data sources convert Android framework callbacks into domain models, repositories combine live readings with local Room state, use cases expose focused operations to ViewModels, and Compose screens render the current state or trigger actions such as baseline capture and report export.

Design Patterns

The app uses a layered architecture with data sources, repositories, use cases, ViewModels, and Compose UI. Runtime state is modeled with Kotlin coroutines and Flow; local persistence uses Room DAOs; navigation uses Jetpack Navigation Compose.

Tech Stack & Libraries

Layer Technology Version Purpose
Platform Android SDK min 24, target 36, compile 36.1 Android app runtime and framework APIs
Language Kotlin 2.2.10 App and test implementation
Build Gradle Wrapper 9.5.1 Reproducible Android builds
Build Plugin Android Gradle Plugin 9.1.1 Android application packaging
UI Jetpack Compose BOM 2024.09.00 Declarative UI toolkit
UI Material 3 BOM-managed App components, navigation bar, icons, and theming
Navigation Navigation Compose 2.8.9 In-app route graph
Async Kotlin Coroutines 1.10.2 Sensor and battery streams
Persistence Room 2.7.0 Calibration and thermal log storage
Images Coil Compose 2.7.0 Image loading support
Network Retrofit, OkHttp, Moshi 2.12.0, 4.10.0, 1.15.2 Available networking stack
Screenshots Roborazzi 1.59.0 Play Store screenshot and graphic generation
Tests JUnit, Robolectric, AndroidX Test 4.13.2, 4.16.1, 1.6.x JVM and Android-facing tests
Secrets Secrets Gradle Plugin 2.0.1 .env loading for optional local secrets

Configuration

The Android application configuration lives in app/build.gradle.kts. Important values include applicationId, namespace, minSdk, targetSdk, versionCode, versionName, signing configs, and test options. Changing build configuration requires a Gradle sync or rebuild.

Local secrets are read from .env through the Secrets Gradle Plugin. Release signing can be configured with KEYSTORE_PATH, STORE_PASSWORD, and KEY_PASSWORD; avoid committing production signing secrets.

Usage / Quick Start

Run the App on a Device

./gradlew installDebug

Open SensorScope from the launcher. Use the bottom navigation to switch between Sensors, Screen, Thermals, Power, Offsets, and Dossier. Sensor detail screens are opened from the dashboard by selecting a listed hardware sensor.

Generate Play Store Assets

./gradlew generatePlayStoreAssets

API Reference

Not applicable. SensorScope is a native Android application and does not expose a public HTTP API, CLI API, or SDK API. Internal app operations are organized through Kotlin repository interfaces in app/src/main/java/com/michael/sensorscope/domain/repository/.

Testing

Run JVM unit, Robolectric, and Compose tests:

./gradlew testDebugUnitTest

Run instrumented tests on a connected device or emulator:

./gradlew connectedDebugAndroidTest

Regenerate Roborazzi-backed Play Store screenshots:

./gradlew generatePlayStoreAssets

Test files live under app/src/test/java/com/michael/sensorscope/ and app/src/androidTest/java/com/michael/sensorscope/. Existing tests include navigation behavior, feature interaction coverage, manifest permission checks, example Robolectric tests, and Play Store screenshot generation tests. Coverage reporting is not configured.

Deployment

Android Debug Builds

./gradlew assembleDebug

The generated APK is written under app/build/outputs/apk/debug/.

Android Release Builds

export KEYSTORE_PATH=/absolute/path/to/upload-key.jks
export STORE_PASSWORD
export KEY_PASSWORD
./gradlew assembleRelease

Release output is written under app/build/outputs/apk/release/. A release AAB task may also be used through standard Android Gradle Plugin tasks when Play Console upload packaging is needed.

Docker and docker-compose deployment are not configured.

Hiring a senior Android / Flutter engineer?

I architect and ship production mobile software — Kotlin, Jetpack Compose, Flutter — for robotics, EV infrastructure, fintech, and real-time systems. Open to remote roles in Europe and the US.

Get in touch →