Files
librepods/README.md
Kavish Devar 8eb6eba049 android: multidevice capabilites and accessiblity features (and "liquid glass") (#202)
many thanks to @rithvikvibhu for help with the hearing aids feature

adds:
hearing aid
two-device connection
new UI
transparency mode customization

commits:
* android: add accessibility stuff

adds option for customizing transparency mode, amplification, tone, etc.

* docs: update transparency mode format

* android: don't 'start' service every time MainActivity is launched

* android: add basic multidevice capabilities

use at your own risk, may or may not work

* android: clean up a bit of AI gen'd code

* android: clean up main service and remove minimum API on head gestures

* android: clean up a lot of stuff

* android: implement the accessiblity settings page

* android: add EQ settings for phone and media

* android: add toggle for DID hook

* docs: add 'has ownership' control cmd

* android: fix balance NaN error when amplification L/R is both zero

* android: bring back some accessiblity settings and add listeners for all config

* android: add header to ATTManager

* android: use device name sent by the connected device in island

* android: fix track color in tone volume

* android: remove unused composable

* android: update eq sliders style

* android: fix text color in selectors

* android: add delay before starting head tracking again

* android: add a few options

ik not the right branch/pr but, eh, i am not merging this hook until i test further, and if i don't merge, conflicts, a lot of 'em

* android: a small ui fix

* docs: a few more control cmds

* android: add microphone setting

also, un-hardcoded strings, and updated text sizes

* android: improve dropdowns

ai generated

* android: move attmanager to service to avoid trying to connect multiple times

* android: add ui for hearing stuff

mostly copied from the transparency settings, which are now updated to match ios <26 ui

* android: add media assist options in hearing aid

ui only

* android: add hearing aid adjustments

* android: liquidglass sliders

* android: improve liquid glass sliders

* android: little more liquid glass

* android: fix hearing aid parsing

* android: remove customdeviceactivity from manifest

* android: remove unused strings

* android: small ui tweaks

* android: a very big commit

refactoring ui, mostly

* android: move padding to StyledScaffold's content

because haze needs it

* android: revert accidental capitalization on toggle label

* android: update usages for toggle

* android: liquidglass, maybe?

the switch and icon button took quite a while. i forgot the order of modifiers matters!

* remove bleonly mode, use CAPod instead

* remove bleonly mode, use CAPod instead

* android: fix switch styling

* android: remove fade from transition

* android: add A16's new bluetooth identifier for log collection

just why...

* android: fix crash in head gestures screen

* android: show head gestures status in the navigation button

* android: don't crash if att not available

* android: use lazycolumn in airpods settings for better performance and navigation transitions

* android: fix text color in troubshooting button and pressandhold settings

* android: bring back original confirmation dialog

too lazy to fix/implement properly the glassy one

* android: prevent hearing aid turning off itself

* android: hide media assist, not implemented

* docs: update README with new features

* docs: add demo video

* docs: add new screenshots for android

* docs: update demo video position

* docs: app3 compatibility

* docs: new control cmds '25 (again)

* docs: change section title in control cmd doc

Updated section title from 'Control Commands' to 'Identifiers and details'.

* android: ui tweaks

* android: update styled slider thumb

* android: add accessiblity service for camera control

* android: add camera control, finally

i got too lazy to find out how to listen to app openings earlier, wasn't too hard

* android: add option to change camera app id

* android: not use relative paths for executing commands

i hope it's the same across all skins

* android: fix transparency and noise cancellation flags

huh... was it always like this?

* android: revert to using relative paths for su

compatibility issues with magisk

* android: bump version

* android: don't crash if self MAC is not available

* android: remove unused LOCAL_ADDRESS permission

* android: add opensource licenses

should've done this a long time ago!

* android: move navigation button to activity level

* android: update animation time on switch tap

* android: implement setting hearing test results

* android: update title in hearing test screen

* docs: add screenshot for hearing test

* android: fix haze for dialog when enabling hearing aid

* android: parse device info

* android: add support for various models

still need to update images or find a way to fetch from apple's cdn

* android: fix a2dp connection

* android: remove stray eq config in accessibility settings

* android: improve connection handling

* android: add a (very important) support dialog

to not be invasive, this only shows up once, and never again.

* docs: add note for DID hook on android
2025-10-26 21:03:49 +05:30

9.6 KiB
Raw Blame History

LibrePods Banner

XDA Thread GitHub release (latest by date) GitHub all releases GitHub stars GitHub issues GitHub license GitHub contributors

What is LibrePods?

LibrePods unlocks Apple's exclusive AirPods features on non-Apple devices. Get access to noise control modes, adaptive transparency, ear detection, hearing aid, customized transparency mode, battery status, and more - all the premium features you paid for but Apple locked to their ecosystem.

Device Compatibility

Status Device Features
AirPods Pro (2nd Gen) Fully supported and tested
AirPods Pro (3rd Gen) Fully supported (except heartrate monitoring)
⚠️ Other AirPods models Basic features (battery status, ear detection) should work

Most features should work with any AirPods. Currently, I've only got AirPods Pro 2 to test with.

Key Features

  • Noise Control Modes: Easily switch between noise control modes without having to reach out to your AirPods to long press
  • Ear Detection: Controls your music automatically when you put your AirPods in or take them out, and switch to phone speaker when you take them out
  • Battery Status: Accurate battery levels
  • Head Gestures: Answer calls just by nodding your head
  • Conversational Awareness: Volume automatically lowers when you speak
  • Hearing Aid*
  • Customize Transparency Mode*
  • Multi-device connectivity* (upto 2 devices)
  • Other customizations:
    • Rename your AirPods
    • Customize long-press actions
    • Few accessibility features
    • And more!

See our pinned issue for a complete feature list and roadmap.

Platform Support

Linux

The Linux version runs as a system tray app. Connect your AirPods and enjoy:

  • Battery monitoring
  • Automatic Ear detection
  • Conversational Awareness
  • Switching Noise Control modes
  • Device renaming

Note

Work in progress, but core functionality is stable and usable.

For installation and detailed info, see the Linux README.

Android

Screenshots

Settings 1 Settings 2 Debug Screen
Battery Notification and QS Tile for NC Mode Popup Head Tracking and Gestures
Long Press Configuration Widget Customizations 1
Customizations 2 accessibility transparency
hearing-aid hearing-test hearing-aid-adjustments

here's a very unprofessional demo video

https://github.com/user-attachments/assets/43911243-0576-4093-8c55-89c1db5ea533

Root Requirement

Caution

You must have a rooted device to use LibrePods on Android. This is due to a bug in the Android Bluetooth stack. Please upvote the issue by clicking the '+1' icon on the IssueTracker page.

There are no exceptions to the root requirement until Google merges the fix.

Bluetooth DID (Device Identification) Hook

Turns out, if you change the manufacturerid to that of Apple, you get access to several special features!

Multi-device Connectivity

Upto two devices can be simultaneously connected to AirPods, for audio and control both. Seamless connection switching. The same notification shows up on Apple device when Android takes over the AirPods as if it were an Apple device ("Move to iPhone"). Android also shows a popup when the other device takes over.

Accessibility Settings and Hearing Aid

Accessibility settings like customizing transparency mode (amplification, balance, tone, conversation boost, and ambient noise reduction), and loud sound reduction can be configured.

The hearing aid feature can now also be used. Currently it can only be used to adjust the settings, not actually take a hearing test because it requires much more precision. It is much better to use an already available audiogram result.

Note

To enable these features, enable App Settings -> act as Apple Device. This only works if you use the Xposed method or patch the library yourself. The root module method does not support this feature currently.

Installation Methods

This method is less intrusive and should be tried first:

  1. Install LSPosed, or another Xposed provider on your rooted device
  2. Download the LibrePods app from the releases section, and install it.
  3. Enable the Xposed module for the bluetooth app in your Xposed manager.
  4. Disable unmount modules for the Bluetooth app if enabled.
  5. Follow the instructions in the app to set up the module.
  6. Open the app and connect your AirPods
Method 2: Root Module (Backup Option)

If the Xposed method doesn't work for you:

  1. Download the btl2capfix.zip module from the releases section
  2. Install it using your preferred root manager (KernelSU, Apatch, or Magisk).
  3. Disable Unmount modules for the Bluetooth aop if enabled.
  4. Reboot your device
  5. Connect your AirPods
Method 3: Patching it yourself

If you prefer to patch the Bluetooth stack yourself, follow these steps:

  1. Look for the library in use by running lsof | grep libbluetooth
  2. Find the library path (e.g., /system/lib64/libbluetooth_jni.so)
  3. Find the l2c_fcr_chk_chan_modes function in the library
  4. Patch the function to always return 1 (true)
  5. Repack the library and push it back to the device. You can do this by creating a root module yourself.
  6. Reboot your device

If you're unfamiliar with these steps, search for tutorials online or ask in Android rooting communities.

A few notes

  • Due to recent AirPods' firmware upgrades, you must enable Off listening mode to switch to Off. This is because in this mode, louds sounds are not reduced!

  • If you have take both AirPods out, the app will automatically switch to the phone speaker. But, Android might keep on trying to connect to the AirPods because the phone is still connected to them, just the A2DP profile is not connected. The app tries to disconnect the A2DP profile as soon as it detects that Android has connected again if they're not in the ear.

  • When renaming your AirPods through the app, you'll need to re-pair them with your phone for the name change to take effect. This is a limitation of how Bluetooth device naming works on Android.

Star History

Star History Chart

License

LibrePods - AirPods liberated from Apples ecosystem Copyright (C) 2025 LibrePods contributors

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with this program over here. If not, see https://www.gnu.org/licenses/.

All trademarks, logos, and brand names are the property of their respective owners. Use of them does not imply any affiliation with or endorsement by them. All AirPods images, symbols, and the SF Pro font are the property of Apple Inc.