Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
4342771
feat: add Adapter `retrieve_peripherals` method
szymonlesisz Oct 23, 2025
fdcaedb
build: Upgrade jni from 0.19 to 0.20
qdot Apr 26, 2026
38e4804
build: Upgrade jni from 0.20 to 0.21
qdot Apr 26, 2026
f59c47e
fix: Update droidplug and test crate for jni 0.21 lifetime requirements
qdot Apr 27, 2026
3f8cef1
build: Bump jni from 0.21 to 0.22
qdot Apr 27, 2026
0b81626
refactor: Rename JNIEnv to Env and GlobalRef to Global<T> across droi…
qdot Apr 27, 2026
b2f0528
refactor: Wrap JNI strings with jni_str! and signatures with jni_sig!
qdot Apr 27, 2026
6a19506
refactor: Migrate to callback-based attach_current_thread
qdot Apr 27, 2026
7905053
refactor: Migrate extern C functions to EnvUnowned + with_env pattern
qdot Apr 27, 2026
a2f5816
fix: Update exception handling and NativeMethod for jni 0.22
qdot Apr 27, 2026
16aaa20
fix: Modernize deprecated jni 0.22 APIs and fix Android-only build er…
qdot Apr 27, 2026
0d7a9f0
fix: Migrate Android test crate to jni 0.22 EnvUnowned + with_env pat…
qdot Apr 27, 2026
dfdcf34
refactor: Replace JNI boilerplate with bind_java_type! macros and Jav…
qdot Apr 27, 2026
93a3e34
refactor: Replace adapter extern C callbacks with native_method! macro
qdot Apr 27, 2026
3c1b3a0
refactor: Eliminate classcache module, use bind_java_type! class caching
qdot Apr 27, 2026
70b0ca4
fix: Fix Android cross-compilation issues with bind_java_type! macros
qdot Apr 27, 2026
1194685
fix: Fix JNI signature mismatches caused by bind_java_type! JObject m…
qdot Apr 27, 2026
9e8a10d
fix: Propagate JNI callback failures instead of silently discarding them
qdot May 23, 2026
7dd9823
chore: run rustfmt
qdot May 25, 2026
1e129e2
fix: resolve clippy warnings breaking CI
qdot May 25, 2026
a332913
fix: report droidplug init failure to all callers instead of only the…
qdot Aug 29, 2026
b5278e3
fix: preserve Java exception details on unknown-exception error paths
qdot Aug 29, 2026
52f64f6
Add local adapter address API
qdot Aug 30, 2026
d2bd5e0
Merge PR #448: add peripheral retrieval API
qdot Aug 30, 2026
81ceb82
finish peripheral retrieval on dev
qdot Aug 30, 2026
6d9946a
chore: Clippy fix run
qdot Aug 30, 2026
f66da8d
chore: clean retrieval lint warnings
qdot Aug 30, 2026
a3b5d53
fix(corebluetooth): send descriptor discovery event even on error
mikatammi Mar 18, 2026
1cbfdfd
test(corebluetooth): cover descriptor discovery errors
qdot Aug 30, 2026
26ac1d1
Fix clear_peripherals on CoreBluetooth to clear internal map
JosephBirks Mar 28, 2026
706acef
fix(corebluetooth): synchronize peripheral clearing
qdot Aug 30, 2026
4fae932
fix(common): preserve connected peripherals during clear_peripherals
Apr 14, 2026
5211ba2
fix(winrt): cache matched addresses in watcher to prevent dropping Sc…
Apr 14, 2026
bb70abd
fix(cross-platform): enforce COMPLETE_LOCAL_NAME priority over SHORT_…
Apr 14, 2026
cb32fb0
revert: avoid blocking while clearing peripherals
qdot Aug 30, 2026
bc0ee89
fix(corebluetooth): preserve advertisement name precedence
qdot Aug 30, 2026
02a04bd
fix(winrt): scope scan-response matching to active scans
qdot Aug 30, 2026
b2bd989
winrtble: also receive on the Coded PHY where supported
userepo Jul 2, 2026
21fe42b
chore: Run rustfmt
qdot Aug 30, 2026
c9b7576
fix(winrt): avoid non-Send iterators across awaits
qdot Aug 30, 2026
be41637
feat(winrtble): implement add_peripheral (connect by address)
tanarchytan Jul 15, 2026
40279f1
corebluetooth - store negotiated MTU after service discovery
chmorgan Jul 16, 2026
4fc1ce2
tests - require negotiated CoreBluetooth MTU
chmorgan Jul 16, 2026
d2170d9
fix(corebluetooth): validate inferred MTU
qdot Aug 30, 2026
b1a1e80
Raise droidplug's minSdk to 24 to match the API it uses
tternes Jul 27, 2026
5a83163
test(android): raise instrumentation app minSdk to 24
qdot Aug 30, 2026
32180be
ci(android): build Gradle artifacts and document API floor
qdot Aug 30, 2026
07b2b18
ci: provision Java for JNI host tests
qdot Aug 30, 2026
e2917ce
feat: expose GAP appearance in peripheral properties
mingzhuuu Jul 29, 2026
39fddc1
test: cover GAP appearance in peripheral properties
qdot Aug 30, 2026
08708a8
docs: add 0.13.0 changelog
qdot Aug 30, 2026
90cadb0
ci: limit JNI host tests to Linux
qdot Aug 30, 2026
ac63d9c
fix: include all Java JNI support classes in host tests
qdot Aug 30, 2026
2c66ee7
fix: align JNI test jar with host cargo target
qdot Aug 30, 2026
f0636b4
chore: clean up Linux and Android build warnings
qdot Aug 30, 2026
f1ef913
build: Update dependencies
qdot Aug 30, 2026
1dee76d
chore: clean up CI warnings
qdot Aug 30, 2026
2204f65
docs: clarify peripheral properties and event discovery (#339 #460)
qdot Aug 31, 2026
cc1e55c
fix(#326): harden Windows subscription cleanup
qdot Aug 31, 2026
72f97e1
test: harden JNI host threading coverage #427
qdot Aug 31, 2026
23e8709
fix(corebluetooth): establish terminal completion and FIFO queues (#3…
qdot Aug 31, 2026
1e9242b
fix(corebluetooth): evict peripherals with dead event senders (#397 #…
qdot Aug 31, 2026
6962642
fix(corebluetooth): make operation completion queues FIFO (#397 #422 …
qdot Aug 31, 2026
b149dac
fix(corebluetooth): propagate read and descriptor callback errors (#3…
qdot Aug 31, 2026
389137a
fix(corebluetooth): complete callback errors and missing requests (#3…
qdot Aug 31, 2026
a197212
fix(corebluetooth): route callback errors and reject missing objects …
qdot Aug 31, 2026
3d905c0
test(corebluetooth): reject late duplicate future completion (#397 #4…
qdot Aug 31, 2026
42d23ac
Fix CoreBluetooth callback completion handling (#397 #422 #464)
qdot Aug 31, 2026
75b3955
fix(corebluetooth): preserve write queue order under backpressure (#464)
qdot Aug 31, 2026
08420f1
docs: document triaged bug fixes (#326 #339 #397 #422 #427 #460 #464 …
qdot Aug 31, 2026
44c464c
chore: Fix if collapse issues (clippy)
qdot Aug 31, 2026
faa4626
chore: Fix formatting after clippy fix. God damnit. :|
qdot Aug 31, 2026
4f67739
chore: Fix clippy issues on windows
qdot Aug 31, 2026
5adb1ad
chore: Fix windows fmt due to clippy updates oh my god make it stop
qdot Aug 31, 2026
c27f9d9
chore(corebluetooth): upgrade to objc2 0.6 (#455)
qdot Aug 31, 2026
2641a38
chore: Fix even more clippy issues but also fmt this time
qdot Aug 31, 2026
4c12de8
fix android tx power advertisement fallback
qdot Aug 31, 2026
07861c5
fix android test JNI macro declaration order
qdot Aug 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 20 additions & 11 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ jobs:
CARGO_BUILD_TARGET: ${{ matrix.cbt }}

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Install dependencies
if: ${{ runner.os == 'Linux' }}
run: |
sudo apt-get update
sudo apt-get install libdbus-1-dev
- uses: actions/setup-java@v2
if: ${{ matrix.target == 'android' }}
sudo apt-get install libdbus-1-dev openjdk-17-jdk
- uses: actions/setup-java@v5
if: ${{ matrix.target == 'android' || matrix.target == 'linux' }}
with:
distribution: 'zulu'
java-version: '17'
Expand All @@ -71,20 +71,29 @@ jobs:
run: cargo check --all --bins --examples --no-default-features
- name: Check with all features
run: cargo check --all --bins --examples --all-features
- name: Run JNI host tests
if: ${{ matrix.target == 'linux' }}
run: ./scripts/run-jni-tests.sh
- name: Run tests
if: ${{ matrix.target != 'android' }}
run: cargo test --all
- name: Build Android library and test app
if: ${{ matrix.target == 'android' }}
run: |
./scripts/build-java.sh
cp src/droidplug/java/gradlew tests/android/
cp -r src/droidplug/java/gradle tests/android/
printf 'sdk.dir=%s\n' "$ANDROID_HOME" > tests/android/local.properties
cd tests/android
chmod +x gradlew
./gradlew assembleDebug assembleAndroidTest
- name: Run clippy
uses: actions-rs/clippy-check@v1
with:
name: clippy ${{ matrix.os }}
token: ${{ secrets.GITHUB_TOKEN }}
args: --all-features
run: cargo clippy --all-features -- -D warnings

format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Format Rust code
run: cargo fmt --all -- --check

Expand All @@ -100,7 +109,7 @@ jobs:
# env:
# RUSTC_BOOTSTRAP: 1
# steps:
# - uses: actions/checkout@v2
# - uses: actions/checkout@v4
# - name: Install dependencies
# if: ${{ runner.os == 'Linux' }}
# run: sudo apt-get install libdbus-1-dev
Expand Down
61 changes: 61 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,64 @@
# 0.13.0 (2026-08-29)

## Features

- Add `Central::retrieve_peripherals()` and `RetrievePeripheralsOptions` for
retrieving peripherals by identifier or advertised service without scanning.
This is supported on Linux, macOS/iOS, and Windows; Android returns
`Error::NotSupported`.
- Add `Central::adapter_address()` for retrieving the local adapter address on
Linux and Windows. Apple platforms and ordinary Android applications return
`Ok(None)` because their public APIs do not expose this address.
- Implement `Central::add_peripheral()` on Windows, allowing bonded or already
connected devices to be reached by address without waiting for an
advertisement.
- Add `appearance` to `PeripheralProperties`, populated from GAP Appearance
advertising data on Windows, Linux, and Android. CoreBluetooth does not expose
this advertising field, so it remains `None` on Apple platforms.
- Add support for receiving advertisements on the Bluetooth LE Coded PHY on
Windows where supported.

## Bugfixes

- Fix CoreBluetooth service discovery hanging when descriptor discovery fails.
- Fix CoreBluetooth `clear_peripherals()` so cleared devices can be rediscovered
and emit fresh discovery events.
- Report the negotiated CoreBluetooth MTU after service discovery instead of
always returning the default MTU.
- Preserve complete local names over shortened names across split or repeated
advertisements on Android, macOS/iOS, and Windows.
- Fix filtered Windows scans dropping scan-response packets that omit service
UUIDs, and prevent stale scan-response matches from leaking between scans.
- Propagate Android JNI callback and initialization failures consistently while
preserving Java exception details.
- Harden Windows characteristic subscription state so repeated subscriptions do
not install duplicate handlers and failed CCCD operations remain retryable.
(#326)
- Clarify that `Peripheral::properties()` is a backend-dependent snapshot and
may be unavailable, incomplete, or stale. (#339)
- Prevent CoreBluetooth descriptor discovery and GATT operation failures from
hanging pending futures or panicking on missing relationships. (#397, #422)
- Run compatible CoreBluetooth operations through FIFO queues, preserve
write-without-response ordering under backpressure, and complete pending
operations safely on disconnect or late callbacks. (#464)
- Remove stale CoreBluetooth peripheral event senders after dispatch failures so
peripherals can be rediscovered cleanly. (#469)
- Expand Android JNI host-test coverage for futures, streams, and environment
setup across worker threads. (#427)
- Update the event-driven discovery example to describe its async-task usage.
(#460)

## Breaking Changes

- **Android minimum SDK**: Android API 24 (Android 7.0) or newer is now required.
- **`PeripheralProperties` struct literals**: The new `appearance` field must be
initialized by callers that construct this public struct directly.

## Dependencies

- Update `jni` from 0.19 to 0.22 and migrate the Android backend to its current
API.

# 0.12.0 (2026-03-08)

## Features
Expand Down
Loading
Loading