-
Notifications
You must be signed in to change notification settings - Fork 1
Android Alarm Notification QA
Use this runbook for release issue #457 after the app can be installed from a signed release AAB or release-equivalent Android build.
Do not mark #457 complete until these are satisfied:
- #452 provides a signed release AAB or release-equivalent install path.
- #445 full-screen intent declaration material is reviewed or submitted by a human with Play Console access, per the parent track order.
- QA has access to an Android device or emulator with Google Play services, a backend environment with alarm APIs enabled, and a test account that can create schedules.
- Android permissions:
docs/Android-Manifest-Permissions.md - General native alarm checklist:
plans/native_alarm_platform_qa_checklist.md - Native Android bridge:
android/app/src/main/kotlin/club/devkor/ontime/ - Dart reconciliation:
lib/domain/use-cases/reconcile_alarms_use_case.dart - Alarm provider/status values:
lib/domain/entities/alarm_entities.dart
Record every device used.
| Device | Android version | Install source | Backend env | Tester | Result |
|---|---|---|---|---|---|
| TBD | TBD | signed release AAB or release-equivalent install | TBD | TBD | TBD |
Minimum recommended coverage:
- Android 13 or newer for
POST_NOTIFICATIONS. - Android 12 or newer for exact alarm special access.
- One physical device for boot restore and full-screen alarm behavior.
Package name:
PACKAGE=club.devkor.ontimeNotification permission on Android 13+:
adb shell pm grant "$PACKAGE" android.permission.POST_NOTIFICATIONS
adb shell pm revoke "$PACKAGE" android.permission.POST_NOTIFICATIONSExact alarm special access on Android 12+:
adb shell appops set "$PACKAGE" SCHEDULE_EXACT_ALARM allow
adb shell appops set "$PACKAGE" SCHEDULE_EXACT_ALARM deny
adb shell appops get "$PACKAGE" SCHEDULE_EXACT_ALARMIf the shell command is unavailable or ignored on the device, use Android Settings > Apps > Special app access > Alarms and reminders, then relaunch OnTime and re-run the scenario.
Avoid pm clear unless the tester intentionally wants to wipe local app data
for the test account.
For each scenario, create or reuse a schedule whose alarm time is soon enough to observe without waiting through a long real-world route. Record:
| Field | Value |
|---|---|
| Schedule ID | TBD |
| Schedule title | TBD |
| Schedule time | TBD |
| Expected preparation start/alarm time | TBD |
| Account | TBD |
| Backend environment | TBD |
| App version/build | TBD |
- Grant
POST_NOTIFICATIONS. - Launch OnTime and sign in.
- Confirm notification permission copy is not blocking the app.
- Create a near-future schedule and allow alarm reconciliation to run.
- Record whether fallback or native alarm notifications can be shown.
Expected result: notification permission is treated as granted, and fallback notifications are available when native alarm scheduling cannot be used.
- Revoke
POST_NOTIFICATIONS. - Launch OnTime and sign in.
- Exercise the allow-notification or My Page recovery path.
- Create a near-future schedule and allow alarm reconciliation to run.
Expected result: the app explains why schedule preparation reminders need notifications and does not post fallback notifications while permission is denied.
- Allow
SCHEDULE_EXACT_ALARM. - Grant
POST_NOTIFICATIONS. - Create a near-future schedule.
- Background the app before the expected alarm time.
- Wait for the alarm.
Expected result: the native Android alarm provider is used, the alarm fires at the expected time, and the alarm path opens schedule preparation.
- Deny
SCHEDULE_EXACT_ALARM. - Grant
POST_NOTIFICATIONS. - Relaunch OnTime or toggle schedule alarms off and on in My Page.
- Create a near-future schedule and wait for the alarm time.
Expected result: the app explains precise alarm timing when recovery is needed,
uses localNotification fallback where available, and records/reporting should
show fallback behavior instead of native exact alarm scheduling.
- Deny
SCHEDULE_EXACT_ALARM. - Revoke
POST_NOTIFICATIONS. - Relaunch OnTime or toggle schedule alarms off and on in My Page.
- Create a near-future schedule.
Expected result: no native alarm or fallback notification is armed; the app surfaces permission recovery instead of silently claiming alarm coverage.
- Allow exact alarm special access and notification permission.
- Create a near-future schedule.
- Lock the device or put the app in the background.
- Wait for the alarm.
- Use the full-screen alarm action to start preparing.
- Repeat once and dismiss/cancel the ringing alarm instead of starting.
Expected result: AlarmRingingActivity appears only for the user-scheduled
alarm moment, the start action routes into schedule preparation, and dismissal
stops ringing/vibration and removes the alarm notification.
- Create a near-future schedule with permissions granted.
- Before the alarm time, start preparation early, finish the schedule, delete the schedule, or disable schedule alarms in My Page.
- Wait past the original alarm time.
Expected result: no alarm or fallback notification fires after cancellation.
- Allow exact alarm special access and notification permission.
- Create a future schedule far enough out to reboot the device.
- Restart the device.
- Unlock and wait for the expected alarm time. If practical, also open OnTime once after boot to trigger app reconciliation.
Expected result: future native alarms are restored where Android permits boot restore, and any failure is recorded with the device model and Android version.
Attach this evidence to #457 or the release QA record.
| Item | Evidence |
|---|---|
| Device model | TBD |
| Android version/API | TBD |
| App version/build number | TBD |
| Install source or artifact path | TBD |
| Backend environment | TBD |
| Test account | TBD |
| Notification granted result | TBD |
| Notification denied result | TBD |
| Exact alarm granted result | TBD |
| Exact alarm denied + notification granted result | TBD |
| Exact alarm denied + notification denied result | TBD |
| Full-screen alarm UI result | TBD |
| Fallback notification result | TBD |
| Cancellation result | TBD |
| Boot restore result | TBD |
| Failures and logs | TBD |
| Screenshots/recordings | TBD |
For any failure, record:
- Scenario name and permission state.
- Schedule ID, expected alarm time, actual observed time, and timezone.
- Whether the app was foregrounded, backgrounded, terminated, locked, or after reboot.
- Screenshot or screen recording.
- Relevant
adb logcatexcerpt filtered toOnTime,Alarm, orclub.devkor.ontime, without personal account data. - Whether the issue reproduces after reinstalling the same artifact.