diff --git a/app/build.gradle b/app/build.gradle index 1dc9f3d..0e298c2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,6 +30,7 @@ android { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.debug } } compileOptions { diff --git a/app/src/main/java/com/example/hpostesting/di/AppModule.kt b/app/src/main/java/com/example/hpostesting/di/AppModule.kt index 2e46abe..d806a06 100644 --- a/app/src/main/java/com/example/hpostesting/di/AppModule.kt +++ b/app/src/main/java/com/example/hpostesting/di/AppModule.kt @@ -38,6 +38,7 @@ import com.example.hpostesting.domain.SaveRawDataTest import com.example.hpostesting.firebase.FirebaseManager import com.example.hpostesting.presentation.utils.UsbServiceListener import com.example.hpostesting.presentation.utils.UsbServiceListenerImpl +import com.example.hpostesting.util.NetworkMonitor import com.example.hpostesting.util.PropertyProvider import com.example.hpostesting.util.PropertyProviderImpl import com.google.firebase.firestore.FirebaseFirestore @@ -240,8 +241,11 @@ object AppModule { return UsbServiceListenerImpl(context) } - - + @Provides + @Singleton + fun provideNetworkMonitor(@ApplicationContext context: Context): NetworkMonitor { + return NetworkMonitor(context) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/util/NetworkChecker.kt b/app/src/main/java/com/example/hpostesting/util/NetworkChecker.kt new file mode 100644 index 0000000..75d5886 --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/util/NetworkChecker.kt @@ -0,0 +1,79 @@ +package com.example.hpostesting.util + +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 java.net.HttpURLConnection +import java.net.URL +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 network = connectivityManager.activeNetwork + if (network != null) { + performPingCheck() + } + val networkRequest = NetworkRequest.Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .build() + + connectivityManager.registerNetworkCallback(networkRequest, networkCallback) + } + + fun stopMonitoring() { + try { + connectivityManager.unregisterNetworkCallback(networkCallback) + } catch (_: IllegalArgumentException) { + } + networkScope.cancel() + } + + private fun performPingCheck() { + networkScope.launch { + try { + val url = URL("https://www.google.com") + val connection = url.openConnection() as HttpURLConnection + connection.connectTimeout = 2000 + connection.connect() + val isReachable = connection.responseCode == 200 + _isConnected.postValue(isReachable) + connection.disconnect() + } catch (e: Exception) { + _isConnected.postValue(false) + } + } + } +}