Skip to content

Releases: fionan313/CrowdLink

1.0

04 Apr 15:37
645b588

Choose a tag to compare

What's Changed

  • Fix: BLE connection pool saturation, keyboard overlap in chat, and update testing documentation by @fionan313 in #42

Full Changelog: 0.9...1.0

Encryption

01 Apr 13:55

Choose a tag to compare

Encryption Pre-release
Pre-release

v0.9.0

End-to-end encryption is now live across messages, location updates, and SOS alerts. All traffic is AES-256-GCM encrypted using a shared key exchanged during QR pairing. Relay nodes forward ciphertext without ever seeing the contents. SOS alerts now only go to paired friends instead of broadcasting to everyone nearby.

The map also got some updates! friend pins now have distinct colours and a proper person icon, and the offline label rendering is fixed.

Bug fixes

  • "Navigate To" on the SOS screen now opens the map with the friend pinned (not the compass)
  • Tapping Discovery on the nav bar when in a map view now actually goes back to discovery

Room database has been reset in this version, you'll need to re-pair your friends after updating.

What's Changed

  • feat: implement end-to-end encryption for messages, location sharing, and SOS alerts by @fionan313 in #41

Full Changelog: 0.8.1...0.9

0.8.1

25 Mar 16:25

Choose a tag to compare

0.8.1 Pre-release
Pre-release

CrowdLink v0.8.1 Changelog

Map

  • Added offline map screen with OpenStreetMap tiles via MapLibre
  • Friend pins rendered on map with tap-to-select and bottom sheet actions
  • Rotating location arrow shows your position and heading using compass sensor
  • Auto-caches tiles for a 1km radius around your location on map open
  • Map accessible from Discovery screen per-friend and as a top-level nav tab
  • Clear Map Cache option added to Settings

Pairing

  • Scanner now waits up to 15 seconds for the target device to appear in BLE range before sending pairing request, rather than failing immediately
  • Pairing times out after 20 seconds with a descriptive error if friend doesn't respond
  • QR scanner cancellation now navigates back correctly instead of hanging
  • Pairing screen given a proper top bar with back navigation

Security

  • Messages, location updates, and SOS alerts from unpaired devices are now silently dropped

SOS

  • SOS alert screen shows live distance to sender if both locations are available
  • "Last seen" replaces raw device ID in the metadata card
  • Action buttons promoted above the metadata card
  • TTS alert message simplified

Settings

  • Unpair All Friends and Reset App Data options added

Discovery

  • Connectivity banner warns when Bluetooth or Wi-Fi is off
  • Background location broadcast to all friends every 60 seconds when location sharing is enabled

Code quality

  • All android.util.Log calls migrated to Timber throughout
  • Deprecated BluetoothGattCharacteristic.value setter replaced with API 33+ writeCharacteristic() with fallback
  • Bitmap.createBitmap replaced with androidx.core.graphics.createBitmap
  • Removed unused ViewModels, dead methods, and unused state flows
  • British English applied consistently across comments and strings

What's Changed

  • feat: Offline map with live friend pins, directional marker & background location broadcasting by @fionan313 in #35
  • (tbi): Code Quality & Cleanup Pass by @fionan313 in #39
  • feat: Pairing UX overhaul, SOS alert improvements & connectivity banner by @fionan313 in #40

Full Changelog: 0.8.0...0.8.1

0.8.0

19 Mar 22:29
304f8d8

Choose a tag to compare

0.8.0 Pre-release
Pre-release

CrowdLink v0.8.0

This release focuses on the user experience layer on top of the mesh foundation from 0.7.0. First launch onboarding, a completely reworked discovery screen, GPS compass navigation, SOS emergency alerts, and a significant number of stability fixes including the crashes on older devices that were blocking testing.


What's new

First launch onboarding
New three-page onboarding flow on first install. Swipeable pages covering the welcome screen, how the mesh works, and a profile setup screen where the user sets their display name. The Get Started button is disabled until a valid name is entered. This also fixes the long-standing issue where friend cards were showing raw device model strings like "OnePlus IN2013" instead of a person's name.

Redesigned discovery screen
The two ambiguous "Stop Scan" / "Hide" buttons have been replaced with a single MeshStatusPill that toggles both scanning and advertising together. The relay node banner is now hidden until at least one relay is actually found — previously it showed "Searching for Relay... 0 relays found" as the first thing on screen which looked broken. Friend cards now show a proximity label (Very close / Nearby / In range) instead of a precise distance number that implied more accuracy than BLE signal strength can actually deliver. Each card has direct Find and Message action buttons.

GPS compass with RSSI fallback
Friends screen now has a Find button on each friend card that opens a compass screen pointing towards that friend using GPS bearing. When GPS is unavailable or the fix is stale, the screen falls back to BLE signal strength proximity rings automatically rather than showing an error. Both signals are shown simultaneously when available — the GPS distance is shown large with the RSSI estimate shown underneath as a secondary confidence indicator. Fixed a coroutine leak where navigating to the compass screen twice would create duplicate location collectors.

SOS emergency alert
Long-press the SOS button on the friends screen to broadcast an emergency alert to all paired friends simultaneously via the mesh. Receiving devices play the alarm ringtone at full volume via the alarm audio stream which bypasses silent mode on most devices, vibrate with a repeating pattern, and announce the sender's name and coordinates via text-to-speech after a short delay. Tapping the notification opens a full-screen red emergency screen showing the sender's name, exact coordinates, received timestamp, and action buttons to navigate towards them or message them directly.

Location sharing with privacy toggle
GPS coordinates are now shared with paired friends over the mesh via a compact 29-byte binary serialisation format. The location sharing toggle in Settings → Privacy now actually works — toggling it off stops broadcasts immediately and clears all cached friend locations from the database. Previously the toggle existed in the UI but had no effect.

Empty states
Chat screen and relay nodes screen both now show proper empty states instead of a blank screen. Chat explains that messages are routed over the mesh. Relay nodes explains what relay nodes are and that they will appear automatically when found.

Settings wired up
All settings toggles are now functional and persist across restarts — auto-start, mesh relay, ESP32 scanning, ghost mode, location sharing. Device ID shown in About. Paired friends count shown live. Clear message history with confirmation dialog. Debug section added for development use.


Bug fixes

  • Fixed crash on OnePlus 5T (API 29) — RelayNodeScanner was accessing bluetoothLeScanner at Hilt injection time before permissions were granted, causing a SecurityException on startup
  • Fixed app failing to launch on Samsung J5 — legacy BLUETOOTH and BLUETOOTH_ADMIN permissions restored to manifest with maxSdkVersion="30"
  • Fixed mesh relay setting toggle having no effect — MeshRoutingEngine now reads the preference before relaying
  • Fixed ShareLocationUseCase broadcasting stale coordinates — now waits for a fresh GPS fix under 50m accuracy before transmitting
  • Fixed stopScanning null reference in RelayNodeScanner — scanner instance now stored at scan start rather than resolved at stop time
  • Fixed CI build failures caused by backtick test names incompatible with older DEX versions — renamed to underscore format

Known issues

  • End-to-end encryption is not yet implemented — all payloads currently transmit without encryption. Coming in 0.9.0
  • ESP32/LoRa relay node firmware is partially operational — OLED and LED indicators working, LoRa transmission not yet complete
  • GATT error 133 occurs intermittently on some devices — Android BLE stack issue, does not reliably affect message delivery
  • WiFi Direct messaging sends duplicates — the same message is currently dispatched over both BLE mesh and WiFi Direct simultaneously. Under investigation

What's coming in v0.9.0

  • End-to-end encryption for all payloads — messages, location, SOS
  • ESP32/LoRa relay node firmware completion
  • Expanded test coverage across mesh, crypto, and use case layers
  • User evaluation sessions

Test devices: Nothing Phone 2a (API 35), Samsung Note 10+ (API 31)
Min SDK: API 28 (Android 9+)

PR's

  • feat: BLE pairing handshake, location sharing & compass navigation by @fionan313 in #16
  • feat: onboarding, discovery redesign, crash fixes & compass unification by @fionan313 in #28
  • feat: Implement mesh-based SOS emergency alert system by @fionan313 in #31
  • feat: Implement empty state UI for Relay Discovery and Chat screens by @fionan313 in #32
  • feat: Implement location sharing toggle and persistence cleanup by @fionan313 in #30

Full Changelog: 0.7.0...0.8.0

Alpha Build - Messaging over mesh

05 Mar 13:08
9cda2fe

Choose a tag to compare

Pre-release

CrowdLink v0.7.0

This is the biggest change so far. The core mesh networking is working end-to-end on physical devices — messages now travel multiple hops between Android phones with no internet connection, no mobile network, and no infrastructure of any kind.


What's new

BLE Mesh Networking
The main feature of this release. Messages are routed between devices using a custom BLE GATT mesh implementation with controlled flooding and TTL-based hop limiting. A message sent from one phone will relay through intermediate devices to reach the recipient even when the two phones have never been in direct range of each other. Duplicate messages are dropped via a seen-message cache. Relay probability is set to 75% to prevent network flooding.

End-to-end message delivery confirmed
Fixed a critical serialisation bug where UUID strings were being truncated to 16 bytes instead of the required 36 characters. This was causing the routing engine to never match the recipient ID and always relay instead of deliver. Messages now correctly deliver to the intended device.

In-app notifications
Incoming mesh messages now fire an Android notification when the app is in the background or the chat screen is not open. Tapping the notification navigates directly to the relevant chat. Handles Android 13+ POST_NOTIFICATIONS permission.

Restructured settings screen
Settings is now a proper sectioned screen rather than just a profile editor. Sections for BLE and mesh configuration, LoRa relay nodes, privacy controls, and about. Includes toggles for mesh relay, auto-start on launch, location sharing, and ghost mode. Profile editing moved to its own dedicated screen.

Partial ESP32 relay node support
The app now scans for nearby CrowdLink ESP32 relay nodes over BLE. Relay node screen shows discovered nodes and supports auto-connect to the strongest signal. The ESP32 firmware is somewhat operational with OLED status display and RGB LED activity indicators, LoRa transmission code to be implemented.


Bug fixes

  • Fixed UUID truncation in MeshMessageSerialiser causing all messages to relay indefinitely and never deliver
  • Removed stale mesh_backup directory that was causing Android Studio to open the wrong file during editing
  • Cleaned up backup test directory that was failing CI due to suspend function calls outside coroutine context

Known issues

  • GATT error 133 occurs intermittently on some devices — this is an Android BLE stack issue and does not affect message delivery in most cases
  • Scanning and advertising stop when navigating away from the discovery screen — workaround is to start both before navigating to chat
  • ESP32 LoRa modules (DX-LR02) overheating due to wiring issue — under investigation, AUX pin not yet connected

What's coming in v0.8.0

  • GPS location sharing over mesh
  • Compass/arrow directional view for finding friends
  • End-to-end encryption using Google Tink
  • Compass jitter fixes with low-pass sensor filtering

Test devices: Nothing Phone 2a (API 35), Samsung Note 10+ (API 31)
Min SDK: API 28 (Android 9+)

Alpha Build - Pre Mesh fixes

23 Feb 17:17

Choose a tag to compare

Pre-release

Final P2P only version of application

Interim Submission

30 Nov 11:18
207316d

Choose a tag to compare

Interim Submission Pre-release
Pre-release

Interim Submission Release

Completion: ~35% of planned features
Submission Date: November 30, 2024

Completed Features

  • Bluetooth Low Energy device discovery
  • RSSI-based distance estimation (±0.6m accuracy)
  • Moving average RSSI smoothing (68% noise reduction)
  • Cross-device compatibility (API 28-35)
  • Clean Architecture implementation with MVVM
  • 21 unit tests (81% pass rate)

Test Devices

  • Nothing Phone 2a (Android 15, API 35)
  • Samsung Galaxy Note 10+ (Android 12, API 31)

Next Phase

Week 6: Friend pairing via QR codes


Academic Project: TU856 Computer Science FYP | TU Dublin 2024/25
Supervisor: Bryan Duggan
Student: Fionán Ó Ceallaigh (C22337521)