371 Commits

Author SHA1 Message Date
a1denvalu3
b079ae8742
fix(sync): resolve hash alignment and early break bugs on GCS filter trimming (#708)
* fix(sync): resolve hash alignment and early break bugs on GCS filter trimming

* fix(sync): filter out zero bucket and deduplicate buckets before encoding

* fix(sync): preserve zero-bucket mapping by clamping 0 to 1 during encoding and decoding
2026-06-08 19:00:03 -05:00
callebtc
054887bad8
Fix request sync duplicate public messages (#707)
Co-authored-by: CC <cc@ggg.local>
2026-06-08 15:41:11 -05:00
GitHub Action
f7ce1f4be6 Automated update of relay data - Sun Jun 7 07:27:22 UTC 2026 2026-06-07 07:27:22 +00:00
GitHub Action
1a99064fc7 Automated update of relay data - Sun May 31 07:22:04 UTC 2026 2026-05-31 07:22:04 +00:00
GitHub Action
2a8dbac89d Automated update of relay data - Sun May 24 07:09:35 UTC 2026 2026-05-24 07:09:35 +00:00
GitHub Action
67e767237b Automated update of relay data - Sun May 17 07:01:09 UTC 2026 2026-05-17 07:01:09 +00:00
GitHub Action
8ddf03d139 Automated update of relay data - Sun May 10 06:58:05 UTC 2026 2026-05-10 06:58:05 +00:00
GitHub Action
1d99434a25 Automated update of relay data - Sun May 3 06:54:32 UTC 2026 2026-05-03 06:54:32 +00:00
GitHub Action
911c80db0e Automated update of relay data - Sun Apr 26 06:41:15 UTC 2026 2026-04-26 06:41:16 +00:00
GitHub Action
c332fb2ff1 Automated update of relay data - Sun Apr 19 06:37:36 UTC 2026 2026-04-19 06:37:36 +00:00
GitHub Action
47adcca1e1 Automated update of relay data - Sun Apr 12 06:35:32 UTC 2026 2026-04-12 06:35:32 +00:00
GitHub Action
42f6cf9d7f Automated update of relay data - Sun Apr 5 06:29:20 UTC 2026 2026-04-05 06:29:20 +00:00
callebtc
4dfec917c8
Revert "voice note player ui (#680)" (#690)
This reverts commit bc8909bab0d40797e57c2f791e7a1a4b0ce5b842.
2026-03-30 10:21:38 +02:00
callebtc
e3c7bd5346
Revert "update input button styling (#682)" (#689)
This reverts commit ce86f4ec2fcecf7067ca850a42dd585f6eeded71.
2026-03-30 10:20:25 +02:00
callebtc
be1a2ec914
update version (#688) 2026-03-30 10:14:32 +02:00
GitHub Action
426e4f0994 Automated update of relay data - Sun Mar 29 06:27:23 UTC 2026 2026-03-29 06:27:23 +00:00
Ovi
5b0a7d0ce9
fix: add input validation for protocol decoding and fragment reassembly (#666)
* fix: add input validation for protocol decoding and fragment reassembly

* fix:subtract the old entry's size before adding the new one, so duplicate/retransmitted fragments don't inflate the counter

* fix: FragmentManager.handleFragment() can be entered concurrently (e.g., fragments for the same fragmentID arriving from multiple peers/relays). In order for this to happen multiple devices would be needed to connect to the mesh. even with a per-fragmentID byte cap, an attacker could open many fragment IDs at once and force the device to buffer lots of fragment data overall (risking memory pressure/OOM). In this fix we made fragments atomic and thread safe. When a fragment index is retransmitted, we compute the size delta (new - old) so duplicates don’t inflate counters and can’t be used to bypass limits. Under heavy load/attack the app will drop/reject fragment sets earlier instead of growing memory usage without bound to reduce risk of oom. tested on pixel 6 and pixel 8.

* fix: add fragmenttest
2026-03-26 16:24:29 +01:00
a1denvalu3
96b35e957c
Add 'Send private message' action to chat user sheet (#649)
* Add 'Send private message' action to chat user sheet

* Change 'Send private message' action color to purple

* Fix: Resolve short ID against all participants, not just cached nicknames

* Fix: Correctly open private chat sheet for mesh peers

---------

Co-authored-by: a1denvalu3 <>
2026-03-25 14:45:36 +01:00
a1denvalu3
dac81b2c3b
fix: use CSPRNG for heartbeat intervals (#685) 2026-03-25 14:42:53 +01:00
Clare Kinery
ce86f4ec2f
update input button styling (#682) 2026-03-25 14:42:24 +01:00
GitHub Action
95daa47a5b Automated update of relay data - Sun Mar 22 06:19:38 UTC 2026 2026-03-22 06:19:38 +00:00
GitHub Action
9fb8d4b37e Automated update of relay data - Sun Mar 15 06:23:41 UTC 2026 2026-03-15 06:23:42 +00:00
GitHub Action
4082a48154 Automated update of relay data - Sun Mar 8 06:15:21 UTC 2026 2026-03-08 06:15:21 +00:00
rollforsats
9ad1214e96
Unit tests for BinaryProtocol (#678)
* Comprehensive tests for BinaryProtocol

* Test feedback
2026-03-06 13:08:18 +01:00
Clare Kinery
bc8909bab0
voice note player ui (#680) 2026-03-06 13:07:45 +01:00
GitHub Action
632ee884e9 Automated update of relay data - Sun Mar 1 06:17:19 UTC 2026 2026-03-01 06:17:19 +00:00
GitHub Action
4f62e6828b Automated update of relay data - Sun Feb 22 06:17:38 UTC 2026 2026-02-22 06:17:38 +00:00
GitHub Action
dc8b6ee37e Automated update of relay data - Sun Feb 15 06:19:54 UTC 2026 2026-02-15 06:19:54 +00:00
GitHub Action
6d44919f5b Automated update of relay data - Sun Feb 8 06:20:17 UTC 2026 2026-02-08 06:20:17 +00:00
callebtc
390f264987
bump (#661) 2026-02-01 13:33:22 +01:00
a1denvalu3
43029e88e6
fix: pause geohash heartbeat (kind 20001) sampling when backgrounded (#660) 2026-02-01 13:25:36 +01:00
GitHub Action
73d8ce56a2 Automated update of relay data - Sun Feb 1 06:19:30 UTC 2026 2026-02-01 06:19:30 +00:00
a1denvalu3
f79451b615
fix(geohash): cleanup sampling subscriptions when closing location sheet (#659)
- Added DisposableEffect to LocationChannelsSheet to ensure cleanup runs when composable is removed
- Fixed ChatViewModel.endGeohashSampling() to correctly delegate to GeohashViewModel instead of being a no-op
- Prevents lingering kind 20001 subscriptions after closing the sheet
2026-01-31 16:42:20 +01:00
GitHub Action
06d2665b70 Automated update of relay data - Sun Jan 25 06:07:49 UTC 2026 2026-01-25 06:07:49 +00:00
GitHub Action
46e30897ae Automated update of relay data - Sun Jan 18 06:07:42 UTC 2026 2026-01-18 06:07:42 +00:00
callebtc
ab04764212
Fix location update in notes sheet and Nostr subscription leaks (#636)
- Fixes #634: Trigger location refresh when LocationNotesSheet opens
- Fixes #635: Implement proper subscription diffing and cleanup in GeohashViewModel
2026-01-17 00:47:53 +07:00
callebtc
e3056d70c0
bump to 1.7.0 (#624) 2026-01-16 01:13:33 +07:00
Moe Hamade
5013b32ca9
feat: Introduce Gradle property to control APK splits (#560)
* feat: Introduce Gradle property to control APK splits

This commit introduces a new Gradle project property, `buildSplitApks`, to conditionally enable or disable the generation of ABI-specific (arm64, x86_64) and universal APKs.

Key changes:
- In `app/build.gradle.kts`, the `splits.abi.isEnable` flag is now dynamically set based on the `buildSplitApks` property.
- APK splitting is disabled by default to support standard Android App Bundle (`bundleRelease`) builds.
- The release workflow (`release.yml`) is updated to pass `-PbuildSplitApks=true` when building release APKs for GitHub.
- The general Android build workflow (`android-build.yml`) is also modified to enable splits only for the `Release` variant, ensuring debug builds are not affected.

* chore: Simplify and automate APK split builds

This commit simplifies the build process by automatically enabling ABI splits for APKs (`assemble`) and disabling them for AABs (`bundle`).

This removes the need to manually pass the `-PbuildSplitApks=true` property. The build script now intelligently determines whether to create architecture-specific APKs based on the task being executed (e.g., `assembleRelease` vs. `bundleRelease`).

The GitHub Actions workflows (`release.yml`, `android-build.yml`) have been updated to remove this now-redundant property, streamlining the CI configuration.
2026-01-16 01:06:15 +07:00
callebtc
e07bee5a75
spacing for geohash sheet text (#623) 2026-01-16 01:03:25 +07:00
yet300
51a06cf0b7
Refactored BottomSheetTopBar to BitchatSheetTopBar (#601)
* Automated update of relay data - Sun Sep 21 06:21:05 UTC 2025

* Automated update of relay data - Sun Sep 28 06:20:40 UTC 2025

* refactor: new close button like ios(but not liquid glass)

* Automated update of relay data - Sun Oct  5 06:20:09 UTC 2025

* Automated update of relay data - Sun Oct 12 06:20:12 UTC 2025

* Automated update of relay data - Sun Oct 19 06:21:51 UTC 2025

* Automated update of relay data - Sun Oct 26 06:21:31 UTC 2025

* Automated update of relay data - Sun Nov  2 06:22:16 UTC 2025

* Automated update of relay data - Sun Nov  9 06:21:43 UTC 2025

* Automated update of relay data - Sun Nov 16 06:22:37 UTC 2025

* Automated update of relay data - Sun Nov 23 06:22:51 UTC 2025

* Automated update of relay data - Sun Nov 30 06:24:08 UTC 2025

* Automated update of relay data - Sun Dec  7 06:22:59 UTC 2025

* Automated update of relay data - Sun Dec 14 06:24:33 UTC 2025

* Automated update of relay data - Sun Dec 21 06:24:49 UTC 2025

* Automated update of relay data - Sun Dec 28 06:25:38 UTC 2025

* Automated update of relay data - Sun Jan  4 06:26:28 UTC 2026

* Automated update of relay data - Sun Jan 11 06:26:19 UTC 2026

* feat: Add BitchatSheetTopBar component

* Refactor: Use BitchatSheetTopBar in bottom sheets

This commit refactors several bottom sheet components to use the new reusable `BitchatSheetTopBar` composable.

This change provides a consistent look and feel for top bars across the following sheets:
- DebugSettingsSheet
- MeshPeerListSheet
- LocationNotesSheet
- LocationChannelsSheet
- LocationNotesSheetPresenter (for the location unavailable state)

The `BitchatSheetCenterTopBar` has been removed as its functionality is now covered by the more flexible `BitchatSheetTopBar`.

* Refactor: Use BitchatSheetTopBar in MeshPeerListSheet

---------

Co-authored-by: GitHub Action <action@github.com>
2026-01-16 01:00:04 +07:00
Anupam Kumar
fddadbe44a
Fix/590-Private-key-stored-as-Plain-text (#603)
* Private Key Stored in Plaintext(SharedPreference) in EncryptionService migrated to EncryptedSharedPreferences.

* Fix: Safe migration to EncryptedSharedPreferences and restore testability

- Use distinct filename for encrypted prefs to avoid collision with legacy plaintext file
- Move Keystore setup to initialize() to support Robolectric test mocks
- Implement safe read-old/write-new migration logic

---------

Co-authored-by: callebtc <93376500+callebtc@users.noreply.github.com>
2026-01-15 23:03:10 +07:00
a1denvalu3
a13109970d
fix(ui): Show acquiring location state instead of unavailable (#621)
* fix(ui): Show acquiring location state instead of unavailable

This change updates the LocationNotesSheetPresenter to display an 'Acquiring Location' sheet when location permissions are granted but the location is still loading. This prevents the misleading 'Location Unavailable' error on devices with slow GPS start-up (e.g., GrapheneOS).

Fixes #578

* Adjust text

---------

Co-authored-by: a1denvalu3 <>
2026-01-15 23:02:26 +07:00
callebtc
db26b673ee
fix: Ensure empty neighbor lists in newer announcements clear mesh edges (#620)
* fix: Ensure empty neighbor lists in newer announcements clear mesh edges

- Refactored MeshGraphService.updateFromAnnouncement to prioritize timestamp checks.
- Treated null neighbor lists (omitted TLV) as empty lists to allow peer disconnection/isolation updates to propagate.
- Added MeshGraphServiceTest to verify timestamp logic and edge eviction.

* fix(test): Use TestOnly API to reset singleton instead of reflection

- Added MeshGraphService.resetForTesting()
- Updated MeshGraphServiceTest to use the new API, avoiding fragile reflection on companion object fields.
2026-01-15 23:01:56 +07:00
a1denvalu3
39e43fa923
security: ensure media files are deleted during panic mode (#607)
Closes #591
- Added FileUtils.clearAllMedia() to recursively delete media directories and cache.
- Called clearAllMedia() in ChatViewModel.panicClearAllData().

fix: correct voice notes directory path for cleanup

- Updated FileUtils.clearAllMedia to use 'voicenotes' instead of 'voice_notes' to match VoiceRecorder.kt

fix: update media cleanup to include cache directories

- Updated FileUtils.clearAllMedia to explicitly clean 'files/incoming' and 'images/incoming' from context.cacheDir, reflecting the storage location change from issue #592.
- Maintained legacy cleanup for context.filesDir.

Co-authored-by: a1denvalu3 <>
2026-01-15 22:32:30 +07:00
callebtc
5501141ae0
Fix: Correctly parse recipient/sender IDs in broadcaster to enable unicast (#619)
* Fix: Unicast source-routed packets at origin instead of broadcasting

* Fix: Correctly parse recipient/sender IDs as hex strings in broadcaster
2026-01-15 16:32:40 +07:00
callebtc
c64ea0a021
fix: centralize and strictly enforce connection limits (#618) 2026-01-15 16:00:48 +07:00
callebtc
83fbcca557
Implement iOS-compatible Direct Peer Detection (TTL Logic) (#574)
* Clean up direct peer detection logic (Max TTL) and remove unrelated routing/media changes

* cleanup fix
2026-01-15 15:24:24 +07:00
callebtc
8358073420
improve verification sheet (#615) 2026-01-15 15:11:36 +07:00
callebtc
ae67fa4344
fix(security): Clear in-memory keys during panic mode (#596)
* fix(security): Clear in-memory keys during panic mode #588

* feat: Recreate mesh service after panic clear (#602)

* feat: Recreate mesh service after panic clear

This commit refactors the panic clear process to ensure a new mesh identity is immediately created and applied.

Previously, the `ChatViewModel` would clear sensitive data, but the recreation of the `BluetoothMeshService` was handled externally. This could lead to a delay or failure in adopting the new identity.

Key changes:
- Introduces `MeshServiceHolder` to manage the lifecycle of the `BluetoothMeshService` instance.
- Adds `recreateMeshServiceAfterPanic()` to `ChatViewModel`, which now explicitly clears the old service instance and creates a new one with a regenerated identity.
- The `meshService` property in `ChatViewModel` is now a `var` to allow it to be replaced with the fresh instance post-panic.
- The new service is started, and a broadcast announcement is sent immediately, ensuring the new peer ID is used on the network.

* fix: Ensure mesh service is properly managed in foreground service

* refactor: Decouple handlers from direct service reference

This commit updates the `VerificationHandler` and `MediaSendingManager` to receive the `meshService` via a lambda function (`getMeshService`) instead of a direct reference.

This change decouples the handlers from the service instance, preventing them from holding a stale reference if the service reconnects or changes. By invoking the lambda to get the current service instance when needed, it ensures they always interact with the active `meshService`.

* fix: restart bluetooth

---------

Co-authored-by: Moe Hamade <69801237+moehamade@users.noreply.github.com>
2026-01-15 15:11:10 +07:00
callebtc
9dfebd73db
Refactor: Implement Hybrid Location Provider (System/Fused) (#612)
* refactor: abstract LocationProvider, use FusedLocationProvider

* Refactor: Sync permission state on check

Replaces manual updatePermissionState calls with a unified checkAndSyncPermission method. This ensures that _permissionState flow always reflects the actual system permission status whenever it is checked (e.g. in requestOneShotLocation), preventing desync issues when permissions are revoked at runtime.

* Refactor: Add timeout and tracking to SystemLocationProvider

Implements robust cleanup and timeout logic for location requests.
- SystemLocationProvider: Adds 30s timeout and listener tracking for legacy one-shot requests to prevent memory leaks on pre-Android 11 devices.
- FusedLocationProvider: Adds 30s duration to requests.
- LocationProvider: Adds cancel() method for full resource cleanup.
- LocationChannelManager: Ensures cancel() is called during cleanup.

* try catch
2026-01-15 14:30:26 +07:00