When android device is not connected to the Internet, I'm going to check if Wi-Fi can be connected with connection live data and connect to a specific Wi-Fi.
ConnectionLiveData
private val TAG = "ConnectionLiveData"
class ConnectionLiveData(context: Context) : LiveData<Boolean>() {
private lateinit var networkCallback: ConnectivityManager.NetworkCallback
private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
private val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
private val validNetworks: MutableSet<Network> = HashSet()
private fun checkValidNetworks() {
postValue(validNetworks.size > 0)
}
override fun onActive() {
networkCallback = createNetworkCallback()
val networkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
}
override fun onInactive() {
connectivityManager.unregisterNetworkCallback(networkCallback)
}
private fun createNetworkCallback() = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
Log.d(TAG, "---Location onAvailable: $network")
val networkCapabilities = connectivityManager.getNetworkCapabilities(network)
val hasInternetCapability = networkCapabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
Log.d(TAG, "---Location onAvailable: $network, $hasInternetCapability")
if (hasInternetCapability == true) {
CoroutineScope(Dispatchers.IO).launch {
val hasInternet = DoesNetworkHaveInternet.execute(network.socketFactory)
if (hasInternet) {
withContext(Dispatchers.Main) {
Log.d(TAG, "onAvailable: adding network. $network")
validNetworks.add(network)
checkValidNetworks()
}
}
}
}else {
Log.d(TAG, "There is no active network")
}
}
override fun onLost(network: Network) {
Log.d(TAG,
"The application no longer has a default network. The last default network was $network"
)
validNetworks.remove(network)
checkValidNetworks()
}
override fun onCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities
) {
Log.d(TAG, "The default network changed capabilities: $networkCapabilities")
}
override fun onLinkPropertiesChanged(
network: Network,
linkProperties: LinkProperties
) {
Log.d(TAG, "The default network changed link properties: $linkProperties")
}
}
}
ConnectivityManager
@Singleton
class ConnectivityManager
@Inject
constructor(
application: Application,
) {
private val connectionLiveData = ConnectionLiveData(application)
// observe this in ui
val isNetworkAvailable = mutableStateOf(false)
fun registerConnectionObserver(lifecycleOwner: LifecycleOwner){
connectionLiveData.observe(lifecycleOwner) { isConnected ->
isConnected?.let { isNetworkAvailable.value = it }
}
}
fun unregisterConnectionObserver(lifecycleOwner: LifecycleOwner){
connectionLiveData.removeObservers(lifecycleOwner)
}
}
And then, when I connect the wifi, it logs like this.
2021-11-27 10:09:10.808 28100-28143/com.connectapp D/ConnectionLiveData: ---Location onAvailable: 152
2021-11-27 10:09:10.810 28100-28143/com.connectapp D/ConnectionLiveData: ---Location onAvailable: 152, true
2021-11-27 10:09:10.812 28100-28143/com.connectapp D/ConnectionLiveData: The default network changed capabilities: [ Transports: WIFI Capabilities: NOT_METERED&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED LinkUpBandwidth>=1048576Kbps LinkDnBandwidth>=1048576Kbps SignalStrength: -56]
2021-11-27 10:09:10.814 28100-28143/com.connectapp D/ConnectionLiveData: The default network changed link properties: {Network Interface}
2021-11-27 10:09:10.885 28100-28100/com.connectapp D/ConnectionLiveData: onAvailable: adding network. 152
But when I remove stored Wi-Fi data at device, it doesn't return Log So my question is this, when android device is not connected to internet, connect to specific Wi-Fi. How I can connect it?