Commit Graph
361 Commits
Author SHA1 Message Date
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
callebtcandGitHub 4dfec917c8 Revert "voice note player ui (#680)" (#690)
This reverts commit bc8909bab0.
2026-03-30 10:21:38 +02:00
callebtcandGitHub e3c7bd5346 Revert "update input button styling (#682)" (#689)
This reverts commit ce86f4ec2f.
2026-03-30 10:20:25 +02:00
callebtcandGitHub 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
OviandGitHub 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
a1denvalu3GitHuba1denvalu3 <>
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
a1denvalu3andGitHub dac81b2c3b fix: use CSPRNG for heartbeat intervals (#685) 2026-03-25 14:42:53 +01:00
Clare KineryandGitHub 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
rollforsatsandGitHub 9ad1214e96 Unit tests for BinaryProtocol (#678)
* Comprehensive tests for BinaryProtocol

* Test feedback
2026-03-06 13:08:18 +01:00
Clare KineryandGitHub 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
callebtcandGitHub 390f264987 bump (#661) 2026-02-01 13:33:22 +01:00
a1denvalu3andGitHub 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
a1denvalu3andGitHub 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
callebtcandGitHub 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
callebtcandGitHub e3056d70c0 bump to 1.7.0 (#624) 2026-01-16 01:13:33 +07:00
Moe HamadeandGitHub 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
callebtcandGitHub e07bee5a75 spacing for geohash sheet text (#623) 2026-01-16 01:03:25 +07:00
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
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
a1denvalu3GitHuba1denvalu3 <>
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
callebtcandGitHub 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
a1denvalu3GitHuba1denvalu3 <>
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
callebtcandGitHub 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
callebtcandGitHub c64ea0a021 fix: centralize and strictly enforce connection limits (#618) 2026-01-15 16:00:48 +07:00
callebtcandGitHub 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
callebtcandGitHub 8358073420 improve verification sheet (#615) 2026-01-15 15:11:36 +07:00
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
callebtcandGitHub 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
callebtcandGitHub c2f60d6ab2 announce peer ID in servicedata to prevent duplicate connections (#613) 2026-01-15 13:51:30 +07:00
a1denvalu3GitHuba1denvalu3 <>
e3310a34fd security: prevent storage exhaustion by saving incoming files to cache (#606)
Closes #592
- Changed FileUtils.saveIncomingFile to use context.cacheDir instead of context.filesDir.
- This ensures incoming files are treated as temporary and can be cleared by the OS if space is needed.

Co-authored-by: a1denvalu3 <>
2026-01-15 13:42:50 +07:00
callebtcandGitHub 41945e6ff0 OSM fallback for geocoding (#611)
* OSM fallback for geocoding

* fallback to city for missing province
2026-01-15 11:45:22 +07:00
callebtcandGitHub 5ec02c99fd Fix and Improve LocationManager logic (#599)
* location manager improvements

* fix: resolve compilation errors and improve location state handling

- Fix missing imports and stray braces in LocationChannelManager
- Implement checkSystemLocationEnabled and BroadcastReceiver for location state
- Order class members for correct initialization
- Consolidate UI refresh logic in LocationChannelsSheet

* fix: guard against stale geocoding results on legacy devices

- Add isActive check after blocking Geocoder.getFromLocation call
- Prevent stale results from overwriting state after job cancellation
2026-01-15 11:11:56 +07:00
callebtcandGitHub e769a03634 Fix/nostr dm bottom sheet (#598)
* nostr in new dm sheets

* open sheet for nostr peers
2026-01-14 17:38:47 +07:00
callebtcandGitHub 216352c39d use bluetooth icon (#597) 2026-01-14 17:17:19 +07:00
94b28b2107 Move PrivateChatSheet hosting into ChatDialogs and unify sheet state (#586)
* 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: Show private chat in sheet from notification

* Refactor: Hoist private chat sheet state to ChatViewModel

* remove icon

* remove old bottom sheet

---------

Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: callebtc <93376500+callebtc@users.noreply.github.com>
2026-01-14 17:12:40 +07:00
callebtcandGitHub 829fb52a04 Update arti to 1.9.0 and produce 32 bit builds (#585)
* x86

* update arti to 1.9.0
2026-01-14 14:58:26 +07:00
callebtcandGitHub dd856ac01f visual logger refactor (#583) 2026-01-14 04:40:04 +07:00
callebtcandGitHub ce71de29f7 Feat/graph force (#581)
* mesh topology wip

* graph

* graph animated
2026-01-13 05:11:20 +07:00