514 Commits

Author SHA1 Message Date
spradhan7656
31d822e7d6 fix the ui issue in the chat screen 2026-07-29 20:54:15 +05:30
spradhan7656
6288cd3cc1 fix the ui issue in the chat screen 2026-07-29 20:47:39 +05:30
callebtc
00ef72c45e fix: clear peer alerts on mesh shutdown 2026-07-29 15:49:33 +02:00
callebtc
2807a16d1e fix: rate-limit peer availability alerts 2026-07-29 15:29:48 +02:00
callebtc
4fad876944 Merge main and resolve notification conflicts 2026-07-29 15:14:25 +02:00
callebtc
11511df8c3 style: remove emoji from peer alert title 2026-07-29 15:03:25 +02:00
callebtc
363f8c5aae fix: restore background peer availability alerts 2026-07-29 15:00:13 +02:00
callebtc
a21c0242a6 Fix conversation persistence review issues 2026-07-29 14:43:13 +02:00
callebtc
172d086c23 Fix live conversation identity state updates 2026-07-29 14:23:25 +02:00
callebtc
a105d884cb Polish persistent private conversations 2026-07-29 13:51:55 +02:00
callebtc
9ed5cb26da
Merge pull request #798 from permissionlesstech/codex/reproducible-builds
Enable reproducible Android builds and releases
2026-07-29 13:47:45 +02:00
callebtc
01b59a7a0c
Merge pull request #809 from permissionlesstech/voice-recording-ux
Voice recording UX: slide-to-cancel, magnetic target, refined recording pill
2026-07-29 13:02:49 +02:00
callebtc
1dae188cdf
Merge pull request #806 from permissionlesstech/codex/persistent-conversations
Persist private conversations in People
2026-07-29 13:00:57 +02:00
callebtc
6a904a1849 voice: compute cancel verdict from the final pointer coordinate - recomposed shouldCancel state could be one frame stale on a fast slide-and-lift (PR review) 2026-07-29 12:55:36 +02:00
callebtc
ff0578cb88
Merge pull request #808 from moehamade/fix/hotspot-wifi-direct-reliability
fix: make Wi-Fi Direct hotspot sharing reliable
2026-07-29 12:33:16 +02:00
Moe Hamade
b5fd346437 fix: test the hotspot hold under the lock that publishes Aware
The previous recheck narrowed the race without closing it. Testing
hotspotHold outside lifecycleLock left this interleaving:

  1. the recheck passes, hold not yet set
  2. holdForHotspot() sets the flag and calls stop(), which takes the
     lock, finds nothing published, and returns having stopped nothing
  3. this block takes the lock and publishes the service anyway

Aware ends up running while the hotspot believes it owns the radio,
which is the original failure.

The hold is now tested inside the same synchronized block that
publishes, so the check and the publication are one step against
stop(). Ordering holds because holdForHotspot() sets the flag before
calling stop(): either the publisher observes the flag and abandons,
or stop() observes the published service and tears it down. There is
no interleaving that leaves a service published with the hold set.

stopServices() stays outside the lock since it can block.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-29 13:27:53 +03:00
callebtc
8eddcb15ca voice: keep pill height identical between rest and recording - constrain recording visualizer row to the text field's 22dp content height so the separator no longer shifts 2026-07-29 12:23:50 +02:00
callebtc
97026d7bbb fix: lock wear dependencies in CI 2026-07-29 12:20:48 +02:00
callebtc
56f52218ed voice: watch-quality recording UX - slide-to-cancel with magnetic X target (leans toward finger, blushes red with proximity, snaps on hover, REJECT haptic on cancel, firm click on enter/exit), release-anywhere tracking replaces button-owned release, timestamp left of waveform showing elapsed only, muted 1.5dp red outline, neutral grey recording pill with depth 2026-07-29 12:20:30 +02:00
Moe Hamade
05896f354d fix: route every hotspot failure through one teardown path
Addresses three issues from Codex review on #808.

The Wi-Fi Aware hold could be defeated by a race. startIfPossible()
does a long stretch of async work between checking the hold and
assigning the service, so holdForHotspot() landing in that window
left an in-flight start free to resurrect NAN behind the hotspot's
back, putting every P2P attempt back on BUSY. The hold is now
rechecked before committing the service, and the freshly started
service is torn down if the hotspot claimed the radio meanwhile.

Startup error paths bypassed cleanup. A web-server failure, a null
connection info, or a throw from the outer block stopped the manager
but left the Aware hold set, blocking all mesh starts until the user
happened to retry or close the screen. Worse, an error after the
server had started left it serving the APK on port 9999 -- including
after the device reconnected to an ordinary Wi-Fi network -- because
only stopHotspot() cleared it.

Both follow from the same gap: cleanup lived at the call sites rather
than in one place. All failures now go through failWith(), which
shares teardown() with stopHotspot() and releases the server, the
manager and the hold together.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-29 13:09:04 +03:00
callebtc
dcb77dc6b1 Merge remote-tracking branch 'origin/main' into codex/reproducible-builds 2026-07-29 12:08:12 +02:00
Moe Hamade
41544a6840 fix: make Wi-Fi Direct hotspot sharing reliable
Starting the APK-sharing hotspot failed intermittently with
"Failed to create hotspot: BUSY", sometimes for minutes, then
succeeded for no apparent reason. Two distinct causes, both
confirmed against a Pixel 9a via dumpsys and HAL logs.

1. Wi-Fi Aware holds the radio. The mesh's NAN interface and
   Wi-Fi Direct's P2P interface cannot coexist on common chipsets:

     HalDevMgr: bestIfaceCreationProposal is null, requestIface=P2P,
                existingIface=[name=wlan0 type=STA, name=aware_nmi0 type=NAN]
     WifiP2pNative: Failed to create P2p iface

   The P2P state machine then stays in P2pDisabledState and answers
   every createGroup with BUSY, while still broadcasting
   WIFI_P2P_STATE_ENABLED. Whether sharing worked came down to
   whether Aware happened to be attached, which is what made it look
   random. WifiAwareController now releases Aware for the duration of
   the hotspot and blocks restarts until it finishes.

2. Orphaned groups. A P2P group outlives the process that created
   it, so a crash or swipe-away while hosting leaves one behind, and
   the framework answers BUSY for as long as it exists. Startup now
   removes a stale group first, but only one it can show is ours --
   Wi-Fi Direct is shared with Cast, Android Auto and Quick Share.
   Ownership is the group name we recorded creating, with the SSID
   prefix as a fallback for orphans from older builds.

Also fixed while tracing these:

- Channel leak: initialize() ran on every retry attempt and the
  channel was never closed, leaving a binder registration with
  WifiP2pService per attempt. Observed climbing to 7 stale clients.
  It is now initialised once and closed after removeGroup replies.
- BUSY is the framework's catch-all reply, so retrying was futile
  for permanent causes and too impatient for real contention.
  Retries now back off 1s/2s/4s/8s and only for genuinely transient
  failures; P2P being off fails immediately with a message that says
  so rather than 15 seconds ending in "busy".
- Turning Wi-Fi off mid-session left the UI showing an active
  hotspot forever; it now aborts cleanly.

Retry and startup decisions are extracted into HotspotStartupPolicy,
which has no Android dependencies and is covered by 13 unit tests.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-29 12:54:01 +03:00
callebtc
bf87a80617 Honor private message admission during panic 2026-07-29 11:00:24 +02:00
callebtc
c5ff1ca59a Complete persistent conversation lifecycle 2026-07-29 03:53:29 +02:00
callebtc
d3f01f27c6 persistent 2026-07-29 03:41:24 +02:00
callebtc
7fad2f2202 persist 2026-07-29 03:41:16 +02:00
callebtc
c7720d3847 Fix private media routing for contact conversations 2026-07-29 00:43:39 +02:00
callebtc
57b002917f Check updates for cached universal APK 2026-07-28 18:50:15 +02:00
callebtc
9800927b59 Support sharing installed ARM64 APK 2026-07-28 18:42:01 +02:00
callebtc
42a8edf8ed fix: request local network access for hotspot sharing 2026-07-28 16:06:12 +02:00
callebtc
3f8b596361 build: enable reproducible Android releases 2026-07-28 14:29:49 +02:00
callebtc
fbb13a33d5 Reject broadcast sends exceeding the receiver fragment cap
Receivers hard-cap reassembly at MAX_FRAGMENTS_PER_ID (256), but the
generic send path fragmented packets with no caller cap (0xFFFF), so
broadcast file transfers above ~120 KB were fully transmitted yet
undeliverable. FragmentingPacketSender now caps fragmentation at
MAX_FRAGMENTS_PER_ID and reports failure via a new
TransferProgressEvent.failed flag, which surfaces as
DeliveryStatus.Failed in the UI and as a file_send error in the debug
test hook instead of an indefinite wait.

Adds FragmentingPacketSenderTest and a file_oversize mesh-lab scenario
asserting sender-side rejection.
2026-07-28 13:17:35 +02:00
callebtc
41494d7c16 Add ADB-driven mesh test-hook framework and two-device mesh lab
Debug-only broadcast receiver (app/src/debug) exposes mesh operations over
ADB: scan, connect, Noise handshake, DMs, broadcast, announce, file
send/receive with SHA-256 verification, BLE toggle, state dumps, and raw
packet injection. tools/release_gate/mesh_lab.py orchestrates scenarios
(dm, broadcast, file, file_private, raw) on two live devices and emits
evidence JSON.
2026-07-28 13:05:49 +02:00
callebtc
96340a35aa fix string 2026-07-28 00:57:30 +02:00
callebtc
57d11299da
Merge pull request #781 from permissionlesstech/codex/background-power-optimization
Centralize adaptive background power scheduling
2026-07-28 00:15:08 +02:00
callebtc
4658a3961f
Merge pull request #795 from permissionlesstech/fix/onboarding-skip-button-alignment
Fix onboarding skip-button jump between permission screens
2026-07-28 00:14:23 +02:00
callebtc
15a580aeef
Merge pull request #796 from permissionlesstech/codex/private-message-arrival-order
Fix private message ordering across clock skew
2026-07-27 23:50:05 +02:00
callebtc
c54fdcd9fb Merge remote-tracking branch 'origin/main' into codex/background-power-optimization
# Conflicts:
#	app/src/main/java/com/bitchat/android/mesh/MeshCore.kt
#	app/src/main/java/com/bitchat/android/ui/PrivateChatManager.kt
#	app/src/main/java/com/bitchat/android/wifi-aware/WifiAwareMeshService.kt
2026-07-27 23:29:56 +02:00
callebtc
62926f88d5 fix: preserve arrival order across aliases 2026-07-27 23:29:01 +02:00
callebtc
5b13598bd0
Merge pull request #794 from permissionlesstech/kimi/dm-outbox-retry-scheduler
Retry scheduler for queued DMs and Noise session re-establishment
2026-07-27 23:13:23 +02:00
callebtc
dfe4fba212 fix: preserve private message arrival order 2026-07-27 22:50:27 +02:00
callebtc
3c150d91e0 fix: unify outbox locking and tie retry scheduler to service lifecycle 2026-07-27 22:48:10 +02:00
callebtc
b79276f236 Tweak KDoc for onboarding footer alignment note.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 22:42:22 +02:00
callebtc
673f65d052 Fix onboarding skip-button jump between permission screens.
Align the background location footer with the battery optimization layout so primary, check-again, and skip stay at the same height when navigating between them.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 22:42:15 +02:00
callebtc
7f2e684572 feat: retry scheduler for queued private messages and session re-establishment 2026-07-27 22:33:28 +02:00
callebtc
d814ac7f80
Merge pull request #729 from permissionlesstech/codex/bound-compressed-payload-expansion
Bound pre-auth compressed payload expansion
2026-07-27 22:28:26 +02:00
callebtc
3f6ac31262
Merge pull request #793 from permissionlesstech/ui/theme-aware-peer-colors
ui: theme-aware muted peer colors
2026-07-27 22:26:48 +02:00
callebtc
0721c39f89 Route oversize send failure to the active conversation
Addresses review feedback: the size-cap error was posted to the main
mesh timeline, so a user sending from a private chat or channel never
saw it. rejectIfOversized now posts to the private conversation
(addPrivateMessageNoUnread) or channel (addChannelMessage) the send
originated from, falling back to the main timeline for public sends.

Adds regression tests for both routings.
2026-07-27 22:24:02 +02:00
callebtc
d5cef681e4 Merge remote-tracking branch 'origin/main' into codex/unread-dm-rows
# Conflicts:
#	app/src/main/java/com/bitchat/android/ui/ChatViewModel.kt
#	app/src/test/kotlin/com/bitchat/android/ui/PrivateChatManagerTest.kt
2026-07-27 22:16:13 +02:00
callebtc
773b21500f Merge remote-tracking branch 'origin/main' into codex/unread-dm-rows
# Conflicts:
#	app/src/main/java/com/bitchat/android/ui/ChatViewModel.kt
#	app/src/test/kotlin/com/bitchat/android/ui/PrivateChatManagerTest.kt
2026-07-27 22:12:03 +02:00