Commit Graph
1116 Commits
Author SHA1 Message Date
Barry DeenandGitHub 2ba9359e99 Merge pull request #426 from barrydeen/fix/compute-id-oom
fix: prevent OOM in computeId for events with large tag lists
2026-04-05 14:05:01 -04:00
Barry Deen 917657a6c1 fix: prevent OOM in computeId for events with large tag lists
Build tags JSON directly into the StringBuilder instead of allocating
an intermediate JsonArray and calling toString(), which created three
copies of the data (JsonArray objects + toString string + StringBuilder).
2026-04-05 14:04:35 -04:00
Barry DeenandGitHub efa989796a Merge pull request #425 from barrydeen/fix/navigation-double-tap-crash
fix: guard navigation calls to prevent double-tap crash
2026-04-05 13:49:40 -04:00
Barry Deen 8020b970f4 fix: guard navigation calls to prevent double-tap crash
Add NavController.navigateSafe() extension that checks the current
back stack entry lifecycle is RESUMED before navigating. Prevents
"Cannot transition entry that is not in the back stack" crash caused
by rapid successive navigate() calls during transitions.
2026-04-05 13:48:29 -04:00
Barry DeenandGitHub d6c78748dc Merge pull request #424 from barrydeen/fix/repost-authors-concurrent-modification
fix: ConcurrentModificationException in repostAuthors
2026-04-05 13:43:42 -04:00
Barry Deen 3319d084be fix: use concurrent set for repostAuthors to prevent ConcurrentModificationException
repostAuthors stored plain LinkedHashSet instances that were written to
from relay IO coroutines and iterated from the feed filter coroutine on
Dispatchers.Default. Replace with ConcurrentHashMap.newKeySet() at all
four creation sites so concurrent add/iterate is safe.

Fixes crash on Samsung SM-A546U (Android 13) at
EventRepository.isRepostedByAny.
2026-04-05 13:43:05 -04:00
Barry DeenandGitHub d8b62018d5 Merge pull request #423 from dmnyc/feat/profile-auto-search-zap-success-anim
feat: auto-search profiles, zap success animation, user status improvements + notification stats filters
2026-04-05 13:38:18 -04:00
Barry DeenandClaude Opus 4.6 b357579932 fix: make drawer observe statusVersion for instant optimistic status updates
The drawer was reading user status with a one-shot call that only
updated on unrelated recompositions. Collect statusVersion so the
optimistic update in setUserStatus triggers an immediate recompose.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:37:46 -04:00
The Daniel 229264f471 fix: only trim blank lines in posts, not profile bios
The newline trimming before URLs was stripping line breaks from
profile bios, smushing text and links together. Add trimBlankLines
parameter to parseContent, disabled when plainLinks is true (which
indicates profile/bio rendering).
2026-04-05 12:19:03 -04:00
The Daniel efe0bc977f feat: notification stats bar as filters + bolt icon toggle
- Tap any stat in the 24h summary bar to filter notifications to
  that type (replies, reactions, zaps, reposts, mentions, DMs).
  Active filter highlighted with primary color. Tap again to reset.
- Zap stat icon respects the bolt/bitcoin toggle from Interface
  settings, matching the rest of the app.
2026-04-05 09:21:27 -04:00
The Daniel 1c59ebf54a feat: optimistic status update for instant feedback
Add setUserStatus() to EventRepository for direct cache updates.
Call it in publishUserStatus() before the relay round-trip so the
status change appears immediately in the drawer and on posts.
2026-04-05 09:21:27 -04:00
The Daniel 5c647f673f fix: hide user status on replies to reduce clutter
Only show NIP-38 status on root posts, not replies, where the
reply-to line and nip05 already take up header space.
2026-04-05 09:21:27 -04:00
The Daniel 582f74bd52 feat: auto-search profiles while typing
Add debounced auto-search that fires 500ms after the user stops
typing (minimum 2 characters). Results populate below the search
box without needing to press Enter. Each keystroke resets the timer
to avoid spamming the relay. Search refs are seeded on screen init
so auto-search works immediately.
2026-04-04 23:05:55 -04:00
The Daniel 970bcec0be feat: improve zap success animation
- Add bright center flash and expanding ring on zap confirmation
- Add 12-20 spark particles (white dots with orange glow) alongside
  bolt particles for more energy
- Increase canvas from 120dp to 160dp for wider spread
- Extend duration to 1.1s for more dramatic effect
2026-04-04 23:05:46 -04:00
Barry DeenandGitHub c93395a84e Merge pull request #422 from dmnyc/post-ui-improvements
feat: reply attribution, user status (haiku detection sadly removed)
2026-04-04 22:31:52 -04:00
Barry Deen 5adf31c69f fix: address code review concerns
- Extract duplicate NIP-38 status processing into shared helper method
- Add timestamp tracking so out-of-order status events don't regress
- Fix reply attribution to use reply target event's pubkey instead of
  first p-tag (which may be an unrelated mention)
- Make replyToName reactive via profileVersion so it updates when
  profiles load instead of showing hex permanently
2026-04-04 22:25:47 -04:00
Barry DeenandGitHub 790e9c8fb8 Merge pull request #421 from dmnyc/feat/ui-polish-round-2
feat: UI polish round 2
2026-04-04 22:22:57 -04:00
Barry Deen 2ad1acdd89 fix: address code review concerns
- Remove debug Log.d calls from ThreadViewModel (ran on every rebuild)
- Wrap emojiRemoveCallback in DisposableEffect for proper lifecycle cleanup
- Fix recovery phrase TalkBack leak: conditionally render mnemonic words
  instead of overlaying on top of real text
- Add ERROR state to Nip05Badge with retry-on-tap and refresh icon
- Restore live stream zap functionality removed in prior commits:
  recipient override, a-tag for addressable events, chat relay hints,
  zap error dialog, and stream-level zap action
- Revert follow indicator to avatar badge (circle with checkmark on
  profile picture) instead of inline checkmark next to display name
2026-04-04 22:20:52 -04:00
The Daniel ca3b8971c2 feat: replace bitmap logo with vector, animate on splash screen
- Add ic_wisp_logo vector drawable with radial gradient from official SVG
- Replace bitmap ic_launcher_foreground with vector on splash and auth screens
- Add radial gradient glow behind logo for contrast on profile grid
- Animate wisp icon with gentle bob and sway on splash screen
- Match web font style: SansSerif W500, white on splash, no letter spacing
2026-04-04 21:26:25 -04:00
The Daniel 42ca865778 feat: fade FAB and new notes button while scrolling
Animate both overlays to 30% opacity when scrolling, fade back over
400ms when scroll stops so content behind them is visible.
2026-04-04 19:35:13 -04:00
The Daniel f723ccf0a6 fix: navigation, layout, and bottom gap fixes
- Fix thread scroll-to-reply with NIP-10 fallback and layout-aware retry
- Auto-scroll drawer when Settings expands
- Add statusBarsPadding to drawer so profile doesn't overlap phone UI
- Fix bottom nav bar gap with NavigationBarDefaults.windowInsets
- Zero out contentWindowInsets on all screens inside NavHost (Profile,
  Thread, Notifications, Search, Hashtag Feed, Article, Bookmarks)
  to eliminate duplicate bottom padding from parent's bottom nav bar
- Extend bolt/bitcoin toggle to drawer wallet icon, drawer lightning
  address icon, and profile zap/lightning address icons
2026-04-04 19:35:13 -04:00
The Daniel 4bba7ef133 fix: trim extra blank lines before URLs and embeds in posts
When post content has consecutive newlines before a URL or embed,
only one newline is kept to save vertical space.
2026-04-04 19:35:13 -04:00
The Daniel 1228a93b87 feat: wallet and auth UX improvements
- Hide recovery phrase behind full-opacity tap-to-reveal overlay
- Persist balance hidden state to SharedPreferences
- Fix balance unit pills wrapping on small screens
- Add squircle shape to sign-in logo for non-black themes
- Remove quotation marks from zap messages in TopZapperBanner
2026-04-04 19:35:13 -04:00
The Daniel ea36116c86 feat: react to post when adding emoji from library
Save pending reaction callback when opening emoji library from popup.
Invoke with first selected emoji when library sheet completes.
Applied across all EmojiLibrarySheet call sites.
2026-04-04 19:35:13 -04:00
The Daniel 26cde86bd5 feat: redesign zap animations and replace reply icon
- Replace hand-drawn bolt paths with ic_bolt vector in both animations
- LightningAnimation: smooth pulse instead of jittery flicker
- ZapBurstEffect: bolt particles with staggered ease-out
- Fix bolt aspect ratio to 14x22dp
- Replace reply arrow with comment bubble (ModeComment) at 22dp
2026-04-03 23:26:50 -04:00
The Daniel 3e46320b21 fix: consistent NIP-05 verification display across all views
- Fix case-sensitive JSON key lookup (e.g. Blockstream)
- Extract shared Nip05Badge composable with self-contained state
- Impersonator: grey text + red cancel icon; Error: faded grey, no icon
- Pass nip05Repo to all NoteActions constructors (6 missing sites)
- Replace follow badge on avatar with inline checkmark next to name
- Hide nip05 field for blank identifiers
2026-04-03 23:26:39 -04:00
The Daniel 8ad7071994 feat: extend zap icon toggle and collapse color picker
- Increase unselected toggle icon alpha from 0.4 to 0.7 for contrast
- Collapse color picker behind tap-to-expand in Interface settings
2026-04-03 23:26:27 -04:00
The Daniel e13434790b feat: improve zap dialog preset UX
- Remove message text from preset chips, show small message icon instead
- Pre-fill message field when selecting a preset, clear when switching
- Move save button into custom amount flow
- Sort presets by amount ascending
- Flatten chip layout to single Row for consistent height
2026-04-03 23:26:11 -04:00
The Daniel 7a8bafad2f chore: add app/temp/ to .gitignore 2026-04-03 16:15:33 -04:00
The Daniel c21addbf11 feat: display and edit user status (NIP-38, kind 30315)
Subscribe to kind 30315 events alongside profile metadata in
OutboxRouter, MetadataFetcher, and self-data startup subscription.
Process status events in both addEvent and cacheEvent paths in
EventRepository to avoid seenEventIds dedup race. Route kind 30315
from EventRouter to addEvent for events from unknown subscriptions.

Display status in italic faded text under the display name in
PostCard, matching the style used by Amethyst and Damus.

Add status editor in the navigation drawer — tap "Set status..."
below the nip05 to open a dialog. Publishes kind 30315 with d-tag
"general" to write relays. Empty content clears the status.
2026-04-03 16:13:52 -04:00
The Daniel e81098642a feat: add reply-to attribution on posts
Show "replying to [name]" below the display name when a post is a
reply. The reply-to author is resolved from the first p-tag via
eventRepo. Tapping the name navigates to their profile.
2026-04-03 16:13:39 -04:00
Barry DeenandGitHub b72d61fc2b Merge pull request #420 from barrydeen/feat/live-stream-zap-enhancements
feat: enhance live stream zap functionality
2026-04-02 13:53:14 -04:00
Barry DeenandClaude Opus 4.6 9bc605b05d feat: enhance live stream zap functionality
- Add "Zap this stream" button in stream info bar with pending/success states
- Insert zap announcement messages in chat when someone zaps the stream
- Track and display total stream zap sats next to the zap button
- Fix zap recipient to target the actual streamer (p-tag Host), not the
  stream provider (event author)
- Use NIP-57 "a" tag for addressable events in zap requests so receipts
  are properly associated with the stream
- Include stream chat relays in zap request relay hints so receipts reach
  the streamer and chat room subscribers
- Fix EventRouter to route live-react and live-zap subscriptions to
  LiveStreamRepository for proper reaction/zap tracking
- Show zap error dialog on failure
- Bump version to v0.17.1 (code 67)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 13:52:41 -04:00
Barry DeenandGitHub d65d74c1d7 Merge pull request #419 from barrydeen/fix/group-chat-fetch-last-100
fix: fetch last 100 messages instead of using since timestamps for group chats
2026-04-02 13:08:09 -04:00
Barry Deen 2048ddc9b6 fix: fetch last 100 messages instead of using since timestamps for group chats
The since-based filtering was causing visibility bugs for users due to
clock skew and stale timestamps. Always fetch the last 100 messages,
500 reactions, and 200 zaps fresh from the relay when opening a chat room.
2026-04-02 13:07:24 -04:00
Barry DeenandGitHub 40a86f7a21 Merge pull request #418 from barrydeen/fix/live-chat-relay-connectivity
fix: resolve live stream chat cross-platform visibility
2026-04-02 12:59:20 -04:00
Barry Deen b5e6c24f04 fix: resolve live stream chat cross-platform visibility issues
Fix dedup race between live-chat-discovery and per-stream live-chat
subscriptions that silently dropped messages. Register "live-chat-" as
a dedup bypass prefix so both subs independently reach EventRouter.

Make ephemeral relay connections for live chat writable and
auto-reconnecting so streams survive transient connection drops.
2026-04-02 12:58:24 -04:00
Barry DeenandGitHub 706a63e3b0 Merge pull request #417 from barrydeen/fix/pip-improvements
fix: improve PiP player controls and rendering
2026-04-02 01:27:43 -04:00
Barry DeenandClaude Opus 4.6 b0e6f7baa6 chore: bump version to v0.17.0 (code 66)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 01:27:12 -04:00
Barry DeenandClaude Opus 4.6 5c51e16967 fix: improve PiP player controls, auto-play suppression, and rendering
- Add play/pause button to PiP overlay
- Tap to show/hide controls with 2s auto-hide timeout
- Disable feed video auto-play while PiP is active
- Wire up fullscreen callback for livestream player
- Use TextureView instead of PlayerView to fix SurfaceView z-ordering

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 01:25:18 -04:00
Barry DeenandGitHub d3726d8f6c Merge pull request #416 from barrydeen/fix/poll-type-selector
fix: replace poll type chip with segmented pill selector
2026-04-02 00:31:52 -04:00
Barry Deen bbb36e1171 fix: replace poll type FilterChip with segmented pill selector
The previous "Free Poll"/"Zap Poll" FilterChip was confusing since it
defaulted to showing "Text Poll" label. Replace with a clear two-pill
segmented selector (Standard / Zap) above the poll options.
2026-04-02 00:31:22 -04:00
Barry DeenandGitHub 0647daba10 Merge pull request #415 from barrydeen/fix/pip-drag-and-zindex
feat: draggable PiP with fullscreen toggle
2026-04-02 00:22:07 -04:00
Barry Deen 30abe4c6cd feat: add PiP button to fullscreen and return to PiP on back
When expanding PiP to fullscreen, the same ExoPlayer is reused. The
fullscreen view now has a mini player button to return to PiP. Pressing
back or closing the fullscreen also returns to PiP instead of stopping
playback entirely.
2026-04-02 00:18:45 -04:00
Barry Deen 96d55b564c fix: revert PiP to Compose overlay with drag support
Remove the Dialog-based approach which caused multiple issues. Restore
the original AnimatedVisibility Box overlay which was stable, adding only
the drag gesture for repositioning. The PiP may go behind inline video
AndroidViews but is otherwise reliable.
2026-04-02 00:12:47 -04:00
Barry Deen 43e018e674 fix: handle fullscreen within PiP dialog using same player
Fullscreen now expands the PiP dialog to full screen instead of opening a
separate FullScreenVideoPlayer with a new ExoPlayer. Back button or the
mini player button returns to PiP mode. This keeps the same player instance
throughout, so playback never interrupts or orphans.
2026-04-01 23:59:26 -04:00
Barry Deen 6e467ded1a fix: use Dialog window for PiP to guarantee z-ordering above all views
translationZ doesn't work across different Android ViewGroup parents.
Switch to an Android Dialog which creates its own window layer, ensuring
the PiP player always renders above inline video views in the feed.
Drag repositioning uses window attribute manipulation instead of Compose
offset for reliable positioning within the Dialog window.
2026-04-01 23:53:32 -04:00
Barry Deen 7bea8f07dc fix: restore Box overlay approach for PiP with translationZ for z-ordering
The Popup-based approach caused the PiP to vanish. Revert to the original
Box overlay with AnimatedVisibility, using a FrameLayout wrapper with high
translationZ to ensure the PiP PlayerView renders above inline video
AndroidViews in the feed.
2026-04-01 23:49:11 -04:00
Barry Deen a05038f344 fix: make PiP draggable and always render above inline videos
Use a Popup window so the floating player renders in its own window layer,
guaranteeing it stays above inline video AndroidViews in the feed. Add drag
gesture support with screen-edge clamping so users can reposition the mini
player anywhere on screen.
2026-04-01 23:42:11 -04:00
Barry DeenandGitHub 0eabfdc22c Merge pull request #414 from barrydeen/feat/zap-polls
feat: add zap poll support (kind 6969)
2026-04-01 23:37:33 -04:00