62 lines
3.0 KiB
Markdown
62 lines
3.0 KiB
Markdown
# Notification Log
|
||
|
||
Notification Log is a private, non-root Android notification listener for API
|
||
34–36. It keeps an encrypted local history of notification appearances, edits,
|
||
and removal reasons, including a distinction between an app cancelling its own
|
||
notification and a user dismissing it.
|
||
|
||
## Privacy and capture limits
|
||
|
||
The event log and copied image files are encrypted at rest with an Android
|
||
Keystore-backed AES-GCM key. Export is deliberately unencrypted only after the
|
||
user acknowledges a warning and chooses a destination through Android's Storage
|
||
Access Framework.
|
||
|
||
Android exposes standard notification extras such as title, text, big text,
|
||
inbox lines, messaging-style messages, and readable big-picture content. This
|
||
app copies a readable bitmap at post time when Android provides one. It cannot
|
||
reconstruct opaque custom `RemoteViews`, OTP content Android redacts, or image
|
||
URIs/Icons which Android does not allow it to load. Such images remain marked
|
||
as `[image]` without causing the text event to be lost.
|
||
|
||
The app declares `QUERY_ALL_PACKAGES` solely to implement the settings pages'
|
||
“all installed apps” list. A Play-distributed build must meet Google Play's
|
||
restricted package-visibility policy and provide the required declaration; a
|
||
future distribution variant may need a narrower app-selection flow.
|
||
|
||
## Background behavior
|
||
|
||
Android owns the notification-listener connection; this app has no polling,
|
||
scheduled job, alarm, or boot receiver. When one or more logging types are
|
||
enabled and notification access has been granted, Android binds the listener
|
||
again after device boot. When every logging type is disabled, the app disables
|
||
that listener component: it has no background service and does not start at
|
||
boot. Re-enabling any logging type re-enables and asks Android to rebind it.
|
||
|
||
## Notification update policy
|
||
|
||
Each platform notification key is tracked independently. Group summaries are
|
||
logged as their own platform notifications; the app does not invent extra group
|
||
events. Ongoing notifications are recorded when Android posts, updates, or
|
||
removes them, but are never treated as user-dismissible. Identical reposts are
|
||
ignored. With the default **Ignore routine updates** setting, standard
|
||
progress/chronometer notifications do not create edit rows; non-routine content
|
||
changes do. Disabling that setting records the updates as edits.
|
||
|
||
## Development checks
|
||
|
||
```bash
|
||
./gradlew test assembleDebug
|
||
./scripts/run-aosp-api36-notification-smoke.sh
|
||
```
|
||
|
||
The AOSP API 36 smoke scenario starts from a clean emulator snapshot, grants
|
||
listener access, drives all helper notification variants, verifies encrypted
|
||
event and image persistence, and verifies that the listener records another
|
||
event after an emulator reboot. It deliberately leaves user swipe dismissal,
|
||
biometric lock behavior, and OEM/foldable rendering to device testing.
|
||
|
||
The local Android test lab has been checked on AOSP API 34/35/36, Google APIs
|
||
API 35/36, and LineageOS API 35/36 using clean LSPosed snapshots. Root and
|
||
Xposed are not used by this application.
|