* origin/main: (21 commits)
Remove actions-up script in favor of Dependabot (#11034)
Rename root file from `js` to `ts`, improve platform splitting (#11012)
Route iOS notification settings intent into the app (#11003)
Bump actions/checkout from 6.0.3 to 7.0.0 (#11022)
Bump the actions group with 3 updates (#11021)
Use latest fingerprint-native action (#11016)
Avoid leaking previous messages via replies (#11017)
Always set `allTime` to `true` for search v2 (#11033)
Update search input with `useAutocomplete` (#11023)
Remove `react-native-dotenv` (#10706)
Cull unused files (#11029)
Always scroll to bottom of chat after sending a message (#10913)
Replace react-native-compressor video path with native expo-bluesky-video-compress module [APP-2428] (#10954)
WSOD when trying to create account from starter pack on non-default provider (#10970)
Use correct param name for setup-bundletool action (#11020)
Release Prep 1.126.0 (#11015)
Fix chat input positioning on mobile android (#11013)
Disable selectable profile description on Android (#11002)
Fix CI - grant workflows permission for internal sync push (#11010)
Set apple team id via environment variable (#11008)
...
# Conflicts:
# src/lib/notifications/notifications.ts
On Android, denying the initial notification permission request could
surface a second prompt later in the same session. The only guard against
re-prompting was the OS-level canAskAgain flag, which on Android stays true
after a single in-app denial (unlike iOS, where it flips to false). As a
result a later call site (e.g. Home after Login/onboarding) would trigger
another system dialog.
Add a module-scoped, session-lifetime flag that is set the first time we
actually invoke requestPermissionsAsync, and short-circuit subsequent calls.
The guard is placed after the existing getPermissionsAsync checks so it is
only consumed when a prompt is actually about to show, preserving the
already-granted push-token registration path. Resets on app restart.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NtBTPxwFTRgYrySHSUREva