Skip to content

Commit

Permalink
Created .util.network.NetworkConnectionUtility for Issue #3
Browse files Browse the repository at this point in the history
  • Loading branch information
jpaoneMines committed May 10, 2023
1 parent 5368397 commit 1f13872
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 3 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
*.iml
.gradle
.idea
/local.properties
.idea
.idea/gradle.xml
/.idea
/.idea/gradle.xml
/.idea/caches
/.idea/libraries
Expand Down
1 change: 1 addition & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@

# Change Log

## v 0.2.0 - 10 May 2023

- Added NetworkConnectionUtility into .util.network package

## v 0.1.2 - 20 April 2023

- Removed app/ module from github repository
Expand Down
2 changes: 1 addition & 1 deletion csci448/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package edu.mines.csci448.util.network

import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import android.util.Log
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update

object NetworkConnectionUtility {
private const val LOG_TAG = "448.NetworkConnectionUtility"

fun isNetworkAvailableAndConnected(context: Context): Boolean {
val connectivityManager = context.getSystemService(ConnectivityManager::class.java) as ConnectivityManager
val activeNetwork = connectivityManager.activeNetwork
return activeNetwork != null && (connectivityManager.getNetworkCapabilities(activeNetwork)?.hasCapability(
NetworkCapabilities.NET_CAPABILITY_VALIDATED) ?: false)
}

private val mNetworkAvailableStateFlow: MutableStateFlow<Boolean> = MutableStateFlow(false)
val networkAvailableStateFlow: StateFlow<Boolean>
get() = mNetworkAvailableStateFlow.asStateFlow()

private val networkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.build()

private val networkCallback = object : ConnectivityManager.NetworkCallback() {
// network is available for use
override fun onAvailable(network: Network) {
super.onAvailable(network)
Log.d(LOG_TAG, "onAvailable() called: network is available for use")
mNetworkAvailableStateFlow.update { true }
}

// Network capabilities have changed for the network
override fun onCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities
) {
super.onCapabilitiesChanged(network, networkCapabilities)
val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
val validated = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
Log.d(LOG_TAG, "onCapabilitiesChanged() called - validated/unmetered = $validated/$unmetered")
mNetworkAvailableStateFlow.update { validated }
}

// lost network connection
override fun onLost(network: Network) {
super.onLost(network)
Log.d(LOG_TAG, "onLost() called: lost network connection")
mNetworkAvailableStateFlow.update { false }
}
}

fun monitorNetworkStatus(context: Context) {
val connectivityManager = context.getSystemService(ConnectivityManager::class.java) as ConnectivityManager
connectivityManager.requestNetwork(networkRequest, networkCallback)
}

fun stopMonitoringNetworkStatus(context: Context) {
val connectivityManager = context.getSystemService(ConnectivityManager::class.java) as ConnectivityManager
connectivityManager.unregisterNetworkCallback(networkCallback)
}
}

0 comments on commit 1f13872

Please sign in to comment.