Purpose
A living manual-QA checklist for the battery-monitoring work. Tracks what to check, how, where, and whether it's verified — so testing is done deliberately on a real device rather than ad-hoc.
Refreshed 2026-07-15: navigation paths updated to the #112 settings structure (General / Alerts / Notification Behaviour), rows added for features shipped since filing (#108, #109, #112–#114, #122–#125, #139, #151), stale notes dropped (#34 icons are done). Existing verification marks preserved.
Legend: ✅ verified · ⏳ not yet verified · 🔬 needs a physical device (can't be done reliably on an emulator) · 🤖 covered by automated unit tests (CI).
How to test
- Install the debug build:
./gradlew :app:installDebug (or adb install -r -g app/build/outputs/apk/debug/app-debug.apk), or Run from Android Studio.
- Grant the notification permission when prompted (Android 13+).
Automated (CI) — 🤖 no manual action needed
- 🤖
getBatteryPercentage() guards invalid scale (BatteryDOTest)
- 🤖 Quiet-hours range logic: same-day / overnight / equal / boundaries (
NotificationServiceTest)
- 🤖 Temperature °C↔°F conversion + "45 °F ≠ 45 °C threshold" (
TemperatureUtilsTest)
- 🤖 Capacity estimate
charge_counter ÷ capacity% (SystemServiceTest)
- 🤖 Rate smoothing + current/rate gates (
BatteryRateTrackerTest)
- 🤖 Detector decision cores (
FastDrainDetectorTest, SlowChargeDetectorTest)
- 🤖 Charge-speed power/tiers (
ChargeSpeedTest), receiver wiring (PowerConnectionReceiverTest, BatteryLevelReceiverTest)
- 🤖 Health tracking (
BatteryHealthTrackerTest/StateTest), slider helper (BatteryRangeSliderHelperTest)
Core behaviour — manual
| # |
Check |
How / Where |
Status |
| 1 |
App launches, shows battery % + status |
Open app |
✅ (emulator) |
| 2 |
Persistent notification shows live % · status · temp, silent + ongoing |
Pull notification shade |
✅ (emulator) |
| 3 |
Warning alert fires at warning level (new copy: "Battery getting low", #114) |
Let battery pass the warning % (or set warning high) |
⏳ |
| 4 |
Critical alert fires at critical level (title now "Battery critically low", #114) |
Let battery pass the critical % |
✅ (emulator, in-app; copy re-check ⏳) |
| 5 |
Full-charge alert at 100% while charging (new copy nudges unplugging, #114) |
Charge to full |
⏳ |
| 6 |
Alerts arrive while app is fully closed / swiped away |
Swipe app away, let level cross a threshold, wait |
🔬 ⏳ |
| 7 |
Monitoring + persistent notification resume after reboot |
Reboot device, don't open app, check shade |
🔬 ⏳ |
Temperature alert (#18)
| # |
Check |
How / Where |
Status |
| 8 |
"High Temperature Alert" toggle + threshold slider present |
Settings → Alerts → High Temperature |
✅ (emulator, pre-#112 path) |
| 9 |
Threshold shows user's unit; switching to °F shows °F range (45 °C ↔ 113 °F) |
Change General → Temperature Unit, revisit slider |
✅ (emulator) |
| 10 |
Temperature reads in chosen unit on main + details |
Main screen "Temperature" row |
✅ (emulator: 25 °C / 77 °F) |
| 11 |
Alert actually fires when battery gets hot (hysteresis, one alert per hot spell) |
Heavy load / charging in warm room |
🔬 ⏳ |
| # |
Check |
How / Where |
Status |
| 12 |
Charge-connected announcement shows source · tier · ~W; style pref respected (toast / notification / none) |
Plug in; style under Notification Behaviour → Appearance |
🔬 ⏳ |
| 13 |
Ongoing notification: %/h while discharging; tier + ~W while charging (#125) |
Shade, both directions |
🔬 ⏳ |
| 14 |
Details table: Charge/Drain rate + Current rows appear after warm-up, hidden when unknown |
Home details table |
⏳ |
| 15 |
"Time to full" row while charging, hidden when not computable (#124) |
Details table while charging |
🔬 ⏳ |
| 16 |
Rate toggle works: General → Status Notification → Show rate off → plain status label |
Toggle + check shade |
⏳ |
Drain & slow-charge alerts (#109, #123)
| # |
Check |
How / Where |
Status |
| 17 |
Fast-drain alert fires when drain stays above the limit for the window; reminder while locked |
Set a low limit, run heavy load |
🔬 ⏳ |
| 18 |
Drain-rate colouring in the details table (amber near limit, red at/above) |
Details table under load |
⏳ |
| 19 |
Slow-charge warning on sustained trickle wired charging <80% (needs a genuinely bad cable/brick) |
Alerts → Charging toggle; charge via bad cable |
🔬 ⏳ |
| 20 |
No false slow-charge warning on healthy chargers — ⚠️ expected to false-positive on the Kirin Mate 10 Pro until #152 is fixed |
Normal charge sessions on both devices |
🔬 ⏳ |
| # |
Check |
How / Where |
Status |
| 21 |
Root menu: 3 headers with descriptive summaries + version footer; tapping footer opens the About dialog (#113) |
Open Settings |
⏳ |
| 22 |
Vibrate toggle present; ON→alerts vibrate, OFF→no vibration |
Notification Behaviour → Sound & Vibration; trigger an alert |
✅ present / ⏳ behaviour |
| 23 |
Warning/critical range slider keeps warning > critical; home-screen slider (#139) stays in sync |
Alerts → Battery Levels + home gauge slider |
⏳ |
| 24 |
Quiet hours suppress sound outside the window; "critical ignores quiet hours" override works |
Notification Behaviour → Quiet Hours |
⏳ |
| 25 |
"Mute alerts in silent mode": ON → silent in silent/DnD; OFF (default) → sounds anyway |
Notification Behaviour → Sound & Vibration |
⏳ |
| 26 |
Long settings list clears the system nav bar |
Scroll to the bottom of Alerts |
✅ (emulator, pre-#112 layout) |
| 27 |
Debug menu (long-press health %) absent in release, present in debug |
Battery Insights |
⏳ (logic verified) |
| 28 |
Arabic: new #112/#114 strings render correctly (menus, alerts, About) |
Switch app language to العربية, spot-check |
⏳ |
Battery Insights
| # |
Check |
How / Where |
Status |
| 29 |
Charge cycles show the real OS value where reported (Android 14+) |
Battery Insights → Charge Cycles |
🔬 ⏳ |
| 30 |
Health % + status render, consistent with basis |
Battery Insights |
✅ (emulator, cycle-based) |
| 31 |
Basis caption correct per source: "Measured from rated capacity" / "reported by Android" / "tracked since install — real wear may be higher" (#114) |
Insights, with/without rated capacity |
⏳ |
| 32 |
"How it works" explains the three bases + the 20–80 tip (#114) |
Insights → How It Works |
⏳ |
| 33 |
Capacity shows a value, or "Unknown" + info icon when unreliable (#94) |
Main screen "Capacity" row |
✅ value (emulator) / ⏳ "Unknown" path |
Notes
Tick boxes / update the Status column as things get verified on device.
Purpose
A living manual-QA checklist for the battery-monitoring work. Tracks what to check, how, where, and whether it's verified — so testing is done deliberately on a real device rather than ad-hoc.
Legend: ✅ verified · ⏳ not yet verified · 🔬 needs a physical device (can't be done reliably on an emulator) · 🤖 covered by automated unit tests (CI).
How to test
./gradlew :app:installDebug(oradb install -r -g app/build/outputs/apk/debug/app-debug.apk), or Run from Android Studio.Automated (CI) — 🤖 no manual action needed
getBatteryPercentage()guards invalid scale (BatteryDOTest)NotificationServiceTest)TemperatureUtilsTest)charge_counter ÷ capacity%(SystemServiceTest)BatteryRateTrackerTest)FastDrainDetectorTest,SlowChargeDetectorTest)ChargeSpeedTest), receiver wiring (PowerConnectionReceiverTest,BatteryLevelReceiverTest)BatteryHealthTrackerTest/StateTest), slider helper (BatteryRangeSliderHelperTest)Core behaviour — manual
% · status · temp, silent + ongoingTemperature alert (#18)
Charging & rate (#108, #122, #124, #125)
source · tier · ~W; style pref respected (toast / notification / none)%/hwhile discharging; tier + ~W while charging (#125)Drain & slow-charge alerts (#109, #123)
Settings (#112, #113, #151, #114)
Battery Insights
Notes
CURRENT_NOWunit bug (Kirin (Mate 10 Pro): ongoing notification shows nonsense "Discharging −1 mA" — CURRENT_NOW reported in mA, not µA #152) make capacity, current, and charging-tier readings unreliable there — prefer the Samsung for rows 12–15, 19–20, 33; use the Kirin to reproduce Kirin (Mate 10 Pro): ongoing notification shows nonsense "Discharging −1 mA" — CURRENT_NOW reported in mA, not µA #152.Tick boxes / update the Status column as things get verified on device.