A lightweight Kotlin library for observing network connectivity on Android.
Detect WiFi, Cellular, VPN, and Offline states with a simple API and Jetpack Compose support.
connectivity(context).observe()- WiFi and Ethernet detection
- Cellular detection (3G / LTE / 5G)
- VPN detection (priority over WiFi and Cellular)
- Offline detection
- Kotlin
Flowwith distinct updates - Jetpack Compose integration
- One-shot snapshot via
currentStatus
Maven Central publishing is planned. For now, add the library module to your project.
git clone https://github.com/majid2851/AndroidConnect.gitCopy the connectivity folder into your Android project, or use it as a Git submodule.
In settings.gradle.kts:
include(":connectivity")If the module is in a subfolder:
include(":connectivity")
project(":connectivity").projectDir = file("path/to/connectivity")In app/build.gradle.kts:
dependencies {
implementation(project(":connectivity"))
}No extra permission setup is required. The library declares ACCESS_NETWORK_STATE and merges it automatically.
import com.majid.connectivity.NetworkStatus
import com.majid.connectivity.connectivity
import kotlinx.coroutines.launch
val connectivity = connectivity(context)
lifecycleScope.launch {
connectivity.observe().collect { status ->
when (status) {
NetworkStatus.WiFi -> { /* WiFi */ }
NetworkStatus.Cellular -> { /* Mobile Data */ }
NetworkStatus.Vpn -> { /* VPN */ }
NetworkStatus.Offline -> { /* No Internet */ }
NetworkStatus.Unknown -> { /* Initial */ }
}
}
}import androidx.compose.runtime.getValue
import com.majid.connectivity.compose.rememberConnectivityState
@Composable
fun MyScreen() {
val status by rememberConnectivityState()
if (!status.isConnected) {
Text("You are offline")
}
}val status = connectivity(context).currentStatus
if (status.isConnected) {
fetchData()
}import androidx.compose.runtime.getValue
import com.majid.connectivity.compose.rememberConnectivity
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@Composable
fun StatusText() {
val conn = rememberConnectivity()
val status by conn.observe()
.collectAsStateWithLifecycle(initialValue = conn.currentStatus)
Text("Network: ${status.label}")
}| Status | Description |
|---|---|
| WiFi | Connected via WiFi or Ethernet |
| Cellular | Connected via mobile data |
| Vpn | Connected through a VPN tunnel |
| Offline | No active network |
| Unknown | Initial state |
Helpers:
isConnected: Booleanlabel: String
class Connectivity {
fun observe(): Flow<NetworkStatus>
val currentStatus: NetworkStatus
}
fun connectivity(context: Context): Connectivity@Composable
fun rememberConnectivity(context: Context = LocalContext.current): Connectivity
@Composable
fun rememberConnectivityState(context: Context = LocalContext.current): State<NetworkStatus>When multiple transports are active at the same time:
VPN > WiFi / Ethernet > Cellular > Offline
AndroidConnect/
|-- app/
|-- connectivity/
|-- src/main/java/com/majid/connectivity/
|-- Connectivity.kt
|-- ConnectivityObserver.kt
|-- NetworkStatus.kt
|-- NetworkConnectivityObserver.kt
|-- compose/ConnectivityState.kt
Run the demo app:
./gradlew :app:installDebugThe demo includes:
- Animated status card
- Feature chips for WiFi, Cellular, VPN, and Offline
- Real-time change history
Linux / macOS:
./gradlew :connectivity:assembleDebug
./gradlew assembleDebugWindows:
.\gradlew.bat assembleDebug| Item | Version |
|---|---|
| Min SDK | 21 |
| Target SDK | 35 |
| Kotlin | 2.0.0 |
| Compose BOM | 2024.08.00 |
| Gradle | 8.8 |
- Maven Central publishing
- JitPack support
- Callback-style API
- Instrumented tests
- Metered network detection
- Fork the repository
- Create a feature branch
- Commit your changes
- Open a Pull Request
Apache License 2.0. See LICENSE.