Commit Graph
1150 Commits
Author SHA1 Message Date
Barry Deen e0a889d2be fix: revert 16KB packaging changes behind GrapheneOS perf regression
Fully revert f68b40f, which shipped in 1.0.2 alongside reports of severe
slowdown and freezes on GrapheneOS:

- jniLibs.useLegacyPackaging back to true: compressed native libs cut the
  download from 82MB to 37MB, and uncompressed 16KB-aligned packaging is
  only needed for Google Play, which this build no longer targets
- secp256k1-kmp pinned back to known-good 0.16.0 (0.19.0 = libsecp256k1
  0.7.0 rebuilt with NDK 28; runs once per relay event on the verify path)

Also fix adjacent issues found while auditing every shipped release APK
(all were clean: release-signed, R8-minified, correctly aligned — ruling
out a malformed artifact as the cause):

- baseline-prof.txt still targeted com/wisp/app after the rebrand; the
  next release would have shipped zero app AOT rules. Fixed paths now
  yield 12,888 app rules; verified on-device (cold start 2048ms -> 830ms
  once compiled, ProfileVerifier reports compiledWithProfile=true)
- release signing moved into Gradle (RELEASE_STORE_* via local.properties
  or env) so the published APK is exactly what assembleRelease emits
- tools/audit-apk.sh: pre-release gate checking debuggable flag, lib
  packaging consistency, alignment, R8, baseline profile, signing cert
- ProfileVerifier status logged at startup for field diagnostics
- <profileable android:shell="true"/> so testers can capture simpleperf/
  Perfetto traces from release builds
- docs/grapheneos-perf-investigation.md: full findings plus the A/B
  attribution matrix (incl. GrapheneOS MTE toggle test) for confirming
  which half of f68b40f was guilty
2026-06-10 11:48:57 -04:00
Barry Deen 80f9e42cc6 chore: rebrand to Dark Wisp (com.darkwisp.app)
- Rename package com.wisp.app -> com.darkwisp.app
- Set applicationId/namespace to com.darkwisp.app
- Reset version to 1.0.0 (versionCode 1) as a new app
- Update display name to Dark Wisp / Dark Wisp Debug
- Update NIP-89 client tag to "Dark Wisp"
- Rebrand user-facing strings across all locales and README
- rootProject.name -> dark-wisp-android
2026-06-10 10:36:58 -04:00
Barry DeenandGitHub 9a6b100e3a Merge pull request #517 from barrydeen/chore/bump-version-1.0.5
chore: bump version to 1.0.5 (79)
2026-05-04 09:28:08 -04:00
Barry Deen d5a6f729d2 chore: bump version to 1.0.5 (79) 2026-05-04 09:26:26 -04:00
Barry DeenandGitHub 00d70f20f0 Merge pull request #516 from barrydeen/fix/bottom-tab-state-restore
fix: stop restoring stale tab back stacks on bottom-nav switch
2026-05-04 09:25:29 -04:00
Barry Deen 5b745ddb90 fix: stop restoring stale tab back stacks on bottom-nav switch
PR #514 changed the bottom-nav handler to use popUpTo with the graph's
start destination plus saveState/restoreState. Two regressions resulted:

- Tapping a tab restored the tab's saved back stack, returning the user
  to a previously-open thread instead of the tab's main screen.
- The graph's start destination (LOADING) is popped inclusive on first
  successful load, so popUpTo never matched. The resulting back-stack
  state could surface the splash/auth screen on system back from
  Notifications.

Revert that block to popUpTo(FEED) { inclusive = false } + launchSingleTop,
which always lands the user on the tab's main screen with a shallow stack.
The refreshDmsAndNotifications() throttle introduced alongside the broken
nav block is preserved — that part addresses real REQ churn jank and is
independent of how the back stack is structured.
2026-05-04 09:23:09 -04:00
Barry DeenandGitHub 04501e41de Merge pull request #515 from barrydeen/fix/tab-switch-jank
perf: reduce startup and feed rendering work
2026-05-04 08:33:37 -04:00
Barry Deen a55ebdfee6 chore: bump version to 1.0.4 (78) 2026-05-04 08:33:22 -04:00
Barry Deen c4a8aacee3 perf: restore tight NIP-05 timeouts, isolate download client, harden notif rebuild
- give getNip05Client a dedicated 5/10s client (was aliasing the 10/15s
  general client); slow .well-known/nostr.json endpoints no longer tie
  up verification threads
- add getDownloadClient (30/60s) for MediaDownloader; the shared media
  client (10/30s) is fine for ExoPlayer streaming but its read timeout
  is too tight for full-file downloads on flaky networks
- tighten notification rebuild coalesce window from 50ms to one frame
  (16ms) so single-arrival updates feel responsive
- add NotificationRepository.shutdown() and call it from
  FeedViewModel.onCleared() so rebuildScope doesn't outlive the VM
2026-05-04 08:18:03 -04:00
Barry Deen e3373889e0 perf: reduce startup and feed rendering work 2026-05-04 08:08:44 -04:00
Barry DeenandGitHub de7af45149 Merge pull request #514 from barrydeen/fix/tab-switch-jank
fix: reduce bottom-tab switching jank
2026-05-04 07:46:53 -04:00
Barry Deen a0ec123e0c fix: preserve bottom-tab state during tab switching
Restore top-level tab destinations instead of recreating them on each tap, and avoid immediately resubscribing inbox streams when users bounce between tabs. This reduces navigation jank and repeated hangs on slower devices.
2026-05-04 07:44:39 -04:00
Barry DeenandGitHub b028007a7c Merge pull request #513 from barrydeen/chore/bump-version-0.3
bump
2026-05-03 21:59:32 -04:00
Barry Deen 55e3adfc74 bump 2026-05-03 21:58:58 -04:00
Barry DeenandGitHub 550b6d1997 Merge pull request #512 from barrydeen/feat/persist-decrypted-dms
Persist decrypted DMs to skip per-boot signer round-trips
2026-05-03 21:57:12 -04:00
Barry Deen 4894ccee40 feat: persist decrypted DMs to skip per-boot signer round-trips
NIP-17 gift wraps are re-fetched on every cold start (the kind-1059
subscription has no since cursor because gift-wrap timestamps are
randomized up to 2 days in the past). Without a decrypted-DM cache,
remote-signer mode (Amber) re-runs two NIP-44 IPC decrypts per wrap on
every launch.

Adds an ObjectBox-backed cache keyed by ownerPubkey|giftWrapId. On
construction, DmRepository hydrates conversations, seenGiftWraps,
rumorIdIndex and the DM notification list from disk off the main thread.
addPendingGiftWrap now short-circuits on seenGiftWraps before queuing,
so relay-redelivered wraps never reach the signer; only newly arrived
wraps are decrypted. addMessage / addReaction / addZap re-persist the
parent message so reactions and zaps survive restarts. clear() and
purgeUser() propagate to the persistence layer.
2026-05-03 21:54:41 -04:00
Barry DeenandGitHub 81aeaa05f8 Merge pull request #511 from barrydeen/refactor/remove-tor
refactor: remove Tor functionality
2026-05-03 21:16:01 -04:00
Barry Deen 0223e1b9e7 refactor: remove Tor functionality
Drops the embedded kmp-tor client, all .onion relay support, the Tor
toggle UI on splash/auth/drawer screens, the SOCKS proxy plumbing in
HttpClientFactory, all Tor-related strings across 11 locales, the
TorManager singleton, and the kmp-tor dependencies and ProGuard rules.

Relay URL validation now accepts only wss:// (with hostname, no port,
non-localhost, non-IP). The cleartextTrafficPermitted network security
flag stays — still needed for local relays on RFC1918 / loopback.
2026-05-03 21:14:51 -04:00
Barry DeenandGitHub 94b9d7b78c Merge pull request #510 from barrydeen/fix/relay-connect-anr
fix: dispatch Relay.connect() off the calling thread to avoid ANR
2026-05-03 20:51:25 -04:00
Barry Deen 955787eaad fix: dispatch Relay.connect() off the calling thread
OkHttpClient.newWebSocket() can block on its shared TaskRunner lock
for several seconds under contention. UI callbacks that invoke
RelayPool.sendToRelayOrEphemeral were calling Relay.connect() inline
on the main thread, producing 5s+ ANRs. Dispatch connect() through a
small dedicated thread pool so callers never wait on WebSocket setup.
2026-05-03 20:47:03 -04:00
Barry DeenandGitHub 683e3072b2 Merge pull request #509 from barrydeen/feat/inline-video-loop
feat: loop inline mp4 videos in note cards
2026-05-03 20:36:19 -04:00
Barry Deen 08d1340e9e feat: loop inline mp4 videos in note cards
Inline video players in RichContent now use REPEAT_MODE_ONE so MP4s
auto-repeat when rendered inside a note card. Applied to both freshly
created and PiP-reclaimed players. Fullscreen and audio paths are
unchanged.
2026-05-03 20:35:48 -04:00
Barry DeenandGitHub b6105eb134 Merge pull request #494 from dmnyc/feat/fiat-mode-coin-stack-icon
feat: coin stack icon for zaps in fiat mode
2026-05-03 20:01:28 -04:00
Barry DeenandGitHub 8d17d12a45 Merge pull request #502 from dmnyc/feat/post-undo-timer-settings
feat: post undo timer settings
2026-05-03 20:01:11 -04:00
Barry DeenandGitHub 0347c8f0e4 Merge pull request #503 from dmnyc/fix/drawer-item-spacing
fix: reduce drawer menu item spacing
2026-05-03 20:00:55 -04:00
Barry DeenandGitHub f857466455 Merge pull request #504 from dmnyc/fix/switch-unchecked-colors
fix: improve Switch visibility in unchecked state
2026-05-03 20:00:40 -04:00
Barry DeenandGitHub 1a10f6b84f Merge pull request #495 from fiatjaf/debug-build
use a different id and name for the app when doing a debug build
2026-05-03 20:00:13 -04:00
Barry DeenandGitHub 786710efbf Merge pull request #505 from fiatjaf/fix-spacing
add a spacing between "replying to" and the name
2026-05-03 19:59:14 -04:00
Barry DeenandGitHub 30bcaca875 Merge pull request #506 from fiatjaf/thumbhash
Thumbhash
2026-05-03 19:58:54 -04:00
fiatjaf e0c2c7c9e9 use a different id and name for the app when doing a debug build. 2026-04-29 16:18:33 -03:00
fiatjaf 615d4e7236 add "imeta" tags to notes with uploaded images, with thumbhash. 2026-04-28 23:28:39 -03:00
fiatjaf 21f78ee0bb thumbhash rendering support. 2026-04-28 21:28:40 -03:00
fiatjaf 1d04ef5d2b add a spacing between "replying to" and the name. 2026-04-28 21:02:05 -03:00
The Daniel beda5018ef fix: improve Switch visibility in unchecked state
Add wispSwitchColors() helper in Theme.kt that sets unchecked thumb,
track, and border colors so off-state toggles are distinguishable from
the background across all color schemes. Applied to all Switch instances
app-wide (10 files). Consolidates duplicate inline colors from
NotificationsScreen into the shared helper.
2026-04-28 18:56:46 -04:00
The Daniel 600e714216 fix: reduce drawer menu item height to 48dp
NavigationDrawerItem defaults to 56dp which causes excessive scrolling
in the sidebar. Reduced to 48dp for a tighter layout.
2026-04-28 18:51:31 -04:00
The Daniel 82390b7624 feat: post undo timer settings
Adds configurable undo countdown for publishing:

- "Undo countdown" toggle (default on)
- Duration picker (5/10/15/20/30s, default 10)
- "Include replies" toggle (default off — replies send immediately)

ComposeViewModel reads settings to skip the countdown when disabled
or for replies unless opted in. Countdown duration is now configurable
instead of hardcoded to 10s.

Dedicated to Séimí Mac Síomón and Corndalorian.

Ports barrydeen/wisp-ios#34 to Android.
2026-04-28 18:51:21 -04:00
Barry DeenandGitHub 413a06915e Merge pull request #500 from barrydeen/feat/qr-scan-drawer
feat: add QR scan tab to drawer QR sheet
2026-04-26 09:27:09 -04:00
Barry Deen fddae10109 chore: bump version to 1.0.2 (76) 2026-04-26 09:26:10 -04:00
Barry Deen c8d6e0d05f feat: add QR scan tab to drawer QR sheet
Adds a Scan tab alongside Nostr/Lightning in the drawer's QR sheet that
opens the camera and decodes Nostr entities (npub, note, nprofile, nevent,
naddr) — with or without the nostr: prefix — and navigates directly to
the matching profile, thread, or article.

Extracts the camera scanner from WalletScreen into a reusable QrScanner
component, and centralizes NostrUriData→route mapping as toRoute() in
Navigation.kt so the deep-link handler and scanner share it.
2026-04-26 09:26:10 -04:00
The Daniel 77a5182bbe fix: cap quoted note nesting to prevent squashed action bars
Add quoteDepth parameter to RichContent, QuotedNote, PostCard, and
GalleryCard. At depth >= 1 (already inside a quote), force compact
preview rendering (avatar + name + snippet) instead of full PostCard
with action bar. Prevents recursive nesting from crushing layouts.
2026-04-25 23:59:24 -04:00
The Daniel 18232c3e8f feat: add coin stack icon to remaining fiat mode sites and fix action bar text wrapping
Show coin stack icon in fiat mode for notifications (filter header,
per-zap icon, DM zap, summary stat), reaction details zap row, and
embedded invoices. Add maxLines=1 to all ActionBar count/amount text
to prevent vertical wrapping in tight layouts.
2026-04-25 23:59:14 -04:00
The Daniel 50cfed57e0 feat: show coin stack icon for zaps in fiat mode
Replace the bolt/bitcoin icon with a coin stack icon on note zap
displays and the action bar zap button when fiat mode is active.
Also swap the drawer wallet menu item to the wallet icon in fiat mode.
Fixes corrupted Box import in WispDrawerContent.
2026-04-25 14:40:15 -04:00
Barry DeenandGitHub 0b0d30dec2 Merge pull request #493 from barrydeen/fix/16kb-page-size
fix: support 16 KB page size for Android 15+
2026-04-23 11:03:49 -04:00
Barry Deen f68b40f5a7 fix: support 16 KB page size for Android 15+
Disable legacy jniLibs packaging so native libraries are stored
uncompressed and page-aligned in the APK. Bump secp256k1-kmp to 0.19.0
and kmp-tor-resource to 408.16.4 since the prior versions shipped
ELF binaries with 4 KB LOAD alignment. All 13 .so files in the release
APK now report 2**14 alignment.
2026-04-23 11:03:17 -04:00
Barry DeenandGitHub 0d8c856c29 Merge pull request #492 from barrydeen/feat/inline-video-download
feat: add download button to inline video controls
2026-04-23 10:36:06 -04:00
Barry Deen 3ab1041fce feat: add download button to inline video controls 2026-04-23 10:35:38 -04:00
Barry DeenandGitHub b609fc56c0 Merge pull request #491 from barrydeen/fix/notifications-freeze-indexof
perf: avoid O(N^2) indexOf in notifications list
2026-04-23 10:30:19 -04:00
Barry Deen 503c46b256 perf: avoid O(N^2) indexOf in notifications list
Replace items(...) + notifications.indexOf(item) with itemsIndexed(...)
in NotificationsScreen. The indexOf call ran during composition for
every visible item, causing a linear scan per item and quadratic total
work as the list grew. Reported as a UI freeze when tapping the
notifications tab on slower devices (GrapheneOS).
2026-04-23 10:29:43 -04:00
Barry DeenandGitHub f4c716551b Merge pull request #490 from barrydeen/fix/quoted-note-emoji-picker
fix: use user's emoji picker for quoted/referenced notes
2026-04-23 10:18:43 -04:00
Barry Deen 69e49eb648 fix: use user's emoji picker for quoted/referenced notes
Quoted notes nested inside another note were using the default unicode
emoji fallback instead of the user's sorted-by-frequency picker with
their custom emojis. Plumb resolvedEmojis, unicodeEmojis, and the
onOpenEmojiLibrary callback through NoteActions so nested PostCard /
GalleryCard renders in RichContent.QuotedNote pick up the same emoji
state as their parent.
2026-04-23 10:03:41 -04:00