Compose Broadcasts is a powerful Jetpack Compose library that simplifies the process of working with Android's BroadcastReceivers in a composable environment. It provides an intuitive API to observe and react to system-wide events and changes in your Compose UI.
- ๐ Easy integration with Jetpack Compose
- ๐ก Observe system events like battery level, airplane mode, and more
- ๐๏ธ Custom BroadcastReceiver support
- ๐งฉ Composable functions for common system events
- ๐ ๏ธ Flexible API for creating custom broadcast listeners
- โฎ๏ธ No need to worry about registering / unregistering listeners anymore
Add the following to your app's build.gradle.kts:
// Get the latest version from GitHub Releases/Tags (or the badge shown above)
implementation("io.github.shubhamsinghshubham777:composebroadcasts:x.y.z")Here's the complete list of composables Compose Broadcasts provides at the moment:
| Composable | Return Type |
|---|---|
| rememberBroadcastReceiverAsState | Generic (T) |
| rememberIsAirplaneModeOn | Boolean |
| rememberBatteryLevel | Int |
| rememberIsCharging | Boolean |
| rememberPackageInfo | CBPackageInfo? |
| rememberCurrentTimeMillis | Long |
| rememberSystemLocale | Locale |
| rememberIsScreenOn | Boolean |
| rememberIsHeadsetConnected | Boolean |
| rememberCurrentInputMethod | CBInputMethodInfo? |
And here are some examples of how to use them in your project:
val isAirplaneModeOn by rememberIsAirplaneModeOn()
Text("Airplane mode is ${if (isAirplaneModeOn) "ON" else "OFF"}")val batteryLevel by rememberBatteryLevel()
Text("Current battery level: $batteryLevel%")val isCharging by rememberIsCharging()
Text("Device is ${if (isCharging) "charging" else "not charging"}")Check out the ๐งฉ Custom BroadcastReceivers section below to learn how to create PackageInfoReceiver.
val packageInfoReceiver = PackageInfoReceiver()
val packageInfo by rememberPackageInfo(packageInfoReceiver)
Text("Last package change: $packageInfo")val currentTimeMillis by rememberCurrentTimeMillis()
Text("Current time: ${convertMillisToTimeString(currentTimeMillis)}")Check out the ๐งฉ Custom BroadcastReceivers section below to learn how to create LocaleReceiver.
val localeReceiver = LocaleReceiver()
val currentLocale by rememberSystemLocale(localeReceiver)
Text("Current system locale: ${currentLocale.toLanguageTag()}")You can create custom BroadcastReceivers by extending the CBBroadcastReceiver class:
class MyCustomReceiver : CBBroadcastReceiver(tag = "my_custom_receiver") {
override fun onReceive(context: Context?, intent: Intent?) {
super.onReceive(context, intent)
// Your custom logic here (if you like the old way of writing receivers)
// Ideally, your logic should be a part of the composable itself
// This class should just be left blank, for example:
// class MyCustomReceiver : CBBroadcastReceiver(tag = "my_custom_receiver")
}
}Then, register the receiver in your AndroidManifest.xml file:
<manifest>
<application>
<receiver android:name=".MyCustomReceiver" android:exported="false">
<intent-filter>
<!-- Example: android.intent.action.PACKAGE_ADDED -->
<action android:name="YOUR_CUSTOM_ACTION" />
</intent-filter>
</receiver>
</application>
</manifest>Finally, use it in your composable:
val customState by rememberBroadcastReceiverAsState(
initialValue = initialState,
// Example: CBIntentAction.Custom(Intent.ACTION_PACKAGE_ADDED)
intentFilters = listOf(CBIntentFilter(CBIntentAction.Custom("YOUR_CUSTOM_ACTION"))),
broadcastReceiver = MyCustomReceiver(),
) { context, intent ->
// Map the received intent to your state
}Contributions are welcome! Please feel free to submit a Pull Request.
This library is licensed under the Apache 2.0 License. See the LICENSE file for details.