added the network check
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
package `in`.sminnovations.attendanceapp.main
|
||||
|
||||
import android.content.Context
|
||||
import android.net.ConnectivityManager
|
||||
import android.net.Network
|
||||
import android.net.NetworkCapabilities
|
||||
import android.net.NetworkRequest
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
import kotlinx.coroutines.cancel
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Singleton
|
||||
class NetworkMonitor @Inject constructor(
|
||||
@ApplicationContext private val context: Context
|
||||
) {
|
||||
|
||||
private val connectivityManager =
|
||||
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
||||
|
||||
private val _isConnected = MutableLiveData(false)
|
||||
val isConnected: LiveData<Boolean> get() = _isConnected
|
||||
|
||||
private val networkScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
|
||||
|
||||
private val networkCallback = object : ConnectivityManager.NetworkCallback() {
|
||||
override fun onAvailable(network: Network) {
|
||||
performPingCheck()
|
||||
}
|
||||
|
||||
override fun onLost(network: Network) {
|
||||
_isConnected.postValue(false)
|
||||
}
|
||||
}
|
||||
|
||||
fun startMonitoring() {
|
||||
val networkRequest = NetworkRequest.Builder()
|
||||
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||
.build()
|
||||
|
||||
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
|
||||
}
|
||||
|
||||
fun stopMonitoring() {
|
||||
try {
|
||||
connectivityManager.unregisterNetworkCallback(networkCallback)
|
||||
} catch (e: IllegalArgumentException) {
|
||||
}
|
||||
networkScope.cancel()
|
||||
}
|
||||
|
||||
private fun performPingCheck() {
|
||||
networkScope.launch {
|
||||
try {
|
||||
// Ping Google's public DNS server
|
||||
val process = Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8")
|
||||
val isReachable = process.waitFor() == 0
|
||||
_isConnected.postValue(isReachable)
|
||||
} catch (e: Exception) {
|
||||
_isConnected.postValue(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package `in`.sminnovations.attendanceapp.screens.home.ui.componets
|
||||
|
||||
import android.content.Context
|
||||
import android.net.ConnectivityManager
|
||||
import android.net.Network
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
|
||||
|
||||
@Composable
|
||||
fun NetworkErrorDialog(
|
||||
showDialog: Boolean,
|
||||
onRetry: () -> Unit
|
||||
) {
|
||||
if (showDialog) {
|
||||
AlertDialog(
|
||||
onDismissRequest = { /* Do nothing to prevent dismissal by tapping outside */ },
|
||||
title = {
|
||||
Text(text = "Network Error")
|
||||
},
|
||||
text = {
|
||||
Text(text = "Network is not connected. Please check your Wi-Fi or mobile data.")
|
||||
},
|
||||
confirmButton = {
|
||||
Button(
|
||||
onClick = {
|
||||
onRetry()
|
||||
|
||||
}
|
||||
) {
|
||||
Text("Retry")
|
||||
}
|
||||
},
|
||||
modifier = Modifier.padding(16.dp)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user