tailscale / tailscale/tailscale
Android: health warnings can remain stuck after the underlying issue has cleared
- Dominant language
- Go
- Stars
- 36.5k
- Forks
- 3.2k
- Avg merge
- 2d 3h
- Merged PRs (30d)
- 123
Description
### Summary
On Android, health warnings do not always clear automatically after the backend health state has recovered.
### Steps to reproduce
1. Trigger a transient health warning on Android (for example a temporary DNS/router/connectivity-related warning).
2. Let the underlying condition recover without stopping Tailscale.
3. Open the Health warnings screen, or observe the warning badge/notification state.
### Expected behavior
Once the backend health state no longer includes the warnable, the corresponding health warning should disappear automatically from the UI, and any related warning indicator should clear as well.
### Actual behavior
The warning can remain visible even after the underlying issue has already been resolved.
### Notes
From local inspection, the backend appears to send the full current health state on each health change, and the health model treats a missing warnable as healthy again.
The Android-side issue seems to be in `HealthNotifier`:
- it only calls the warning reconciliation path when `health.Warnings` is non-null, so a healthy state can fail to clear previously displayed warnings
- it also uses `distinctUntilChanged` based only on warning count, so if warning A disappears and warning B appears with the same count, the update may be dropped
That combination can leave stale warnings in the Android UI until another state transition happens (for example stopping the client).
### Environment
- App: Tailscale Android
- Repo: `tailscale/tailscale-android`
- Observed on local checkout at commit `2d5671203f5b5b074db33395d1f9750145ab0600`
Contributor guide
Assessment
This issue has not been assessed yet.