diff --git a/app/src/main/java/in/sminnovations/attendanceapp/main/NetworkMonitor.kt b/app/src/main/java/in/sminnovations/attendanceapp/main/NetworkMonitor.kt new file mode 100644 index 0000000..c4b2d0a --- /dev/null +++ b/app/src/main/java/in/sminnovations/attendanceapp/main/NetworkMonitor.kt @@ -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 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) + } + } + } +} diff --git a/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/componets/Connectivity.kt b/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/componets/Connectivity.kt new file mode 100644 index 0000000..62222c0 --- /dev/null +++ b/app/src/main/java/in/sminnovations/attendanceapp/screens/home/ui/componets/Connectivity.kt @@ -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) + ) + } +} + +