Move from NetworkProvider to NetworkViewModel

This commit is contained in:
Rahul Patel
2024-09-04 03:41:17 +05:30
committed by Aayush Gupta
parent 6618dc7108
commit 59b404309a
3 changed files with 58 additions and 49 deletions

View File

@@ -24,6 +24,7 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
@@ -35,13 +36,13 @@ import androidx.navigation.ui.setupWithNavController
import com.aurora.store.data.event.BusEvent import com.aurora.store.data.event.BusEvent
import com.aurora.store.data.event.InstallerEvent import com.aurora.store.data.event.InstallerEvent
import com.aurora.store.data.model.NetworkStatus import com.aurora.store.data.model.NetworkStatus
import com.aurora.store.data.providers.NetworkProvider
import com.aurora.store.data.receiver.MigrationReceiver import com.aurora.store.data.receiver.MigrationReceiver
import com.aurora.store.databinding.ActivityMainBinding import com.aurora.store.databinding.ActivityMainBinding
import com.aurora.store.util.AppUtil import com.aurora.store.util.AppUtil
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_DEFAULT_SELECTED_TAB import com.aurora.store.util.Preferences.PREFERENCE_DEFAULT_SELECTED_TAB
import com.aurora.store.view.ui.sheets.NetworkDialogSheet import com.aurora.store.view.ui.sheets.NetworkDialogSheet
import com.aurora.store.viewmodel.network.NetworkViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -53,6 +54,8 @@ class MainActivity : AppCompatActivity() {
@Inject @Inject
lateinit var appUtil: AppUtil lateinit var appUtil: AppUtil
private val networkViewModel: NetworkViewModel by viewModels()
private lateinit var B: ActivityMainBinding private lateinit var B: ActivityMainBinding
// TopLevelFragments // TopLevelFragments
@@ -90,29 +93,30 @@ class MainActivity : AppCompatActivity() {
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController val navController = navHostFragment.navController
this.lifecycleScope.launch { networkViewModel.register()
NetworkProvider(applicationContext).networkStatus.collect { networkViewModel.status.observe(this) { networkStatus ->
when (it) { when (networkStatus) {
NetworkStatus.AVAILABLE -> { NetworkStatus.AVAILABLE -> {
if (!supportFragmentManager.isDestroyed && isIntroDone()) { if (!supportFragmentManager.isDestroyed && isIntroDone()) {
val fragment = supportFragmentManager val fragment = supportFragmentManager
.findFragmentByTag(NetworkDialogSheet.TAG) .findFragmentByTag(NetworkDialogSheet.TAG)
fragment?.let { fragment?.let {
supportFragmentManager.beginTransaction()
.remove(fragment)
.commitAllowingStateLoss()
}
}
}
NetworkStatus.LOST -> {
if (!supportFragmentManager.isDestroyed && isIntroDone()) {
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction()
.add(NetworkDialogSheet.newInstance(), NetworkDialogSheet.TAG) .remove(fragment)
.commitAllowingStateLoss() .commitAllowingStateLoss()
} }
} }
} }
NetworkStatus.LOST -> {
if (!supportFragmentManager.isDestroyed && isIntroDone()) {
supportFragmentManager.beginTransaction()
.add(NetworkDialogSheet.newInstance(), NetworkDialogSheet.TAG)
.commitAllowingStateLoss()
}
}
else -> {}
} }
} }
@@ -176,6 +180,11 @@ class MainActivity : AppCompatActivity() {
} }
} }
override fun onDestroy() {
networkViewModel.unregister()
super.onDestroy()
}
private fun isIntroDone(): Boolean { private fun isIntroDone(): Boolean {
return Preferences.getBoolean(this@MainActivity, Preferences.PREFERENCE_INTRO) return Preferences.getBoolean(this@MainActivity, Preferences.PREFERENCE_INTRO)
} }

View File

@@ -2,5 +2,6 @@ package com.aurora.store.data.model
enum class NetworkStatus { enum class NetworkStatus {
AVAILABLE, AVAILABLE,
UNAVAILABLE,
LOST LOST
} }

View File

@@ -17,49 +17,47 @@
* *
*/ */
package com.aurora.store.data.providers package com.aurora.store.viewmodel.network
import android.content.Context import android.content.Context
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.Network import android.net.Network
import android.net.NetworkCapabilities import android.net.NetworkCapabilities
import android.net.NetworkRequest import android.net.NetworkRequest
import android.util.Log import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.aurora.extensions.isMAndAbove import com.aurora.extensions.isMAndAbove
import com.aurora.store.AuroraApp
import com.aurora.store.data.model.NetworkStatus import com.aurora.store.data.model.NetworkStatus
import kotlinx.coroutines.flow.MutableStateFlow import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.asStateFlow import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.flow.launchIn import javax.inject.Inject
class NetworkProvider(context: Context) { @HiltViewModel
class NetworkViewModel @Inject constructor(
private val TAG = NetworkProvider::class.java.simpleName @ApplicationContext private val context: Context
) : ViewModel() {
private val _networkStatus = MutableStateFlow(NetworkStatus.AVAILABLE) val status: MutableLiveData<NetworkStatus> = MutableLiveData(NetworkStatus.UNAVAILABLE)
val networkStatus = _networkStatus.asStateFlow()
private val connectivityManager = private val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
private val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
status.postValue(NetworkStatus.AVAILABLE)
}
init { override fun onLost(network: Network) {
networkStatus.launchIn(AuroraApp.scope) super.onLost(network)
status.postValue(NetworkStatus.LOST)
}
}
// Monitor network fun register() {
connectivityManager.registerNetworkCallback(getNetworkRequest(), connectivityManager.registerNetworkCallback(getNetworkRequest(), networkCallback)
object : ConnectivityManager.NetworkCallback() { }
override fun onAvailable(network: Network) {
super.onAvailable(network)
Log.d(TAG, "Network available!")
_networkStatus.value = NetworkStatus.AVAILABLE
}
override fun onLost(network: Network) { fun unregister() {
super.onLost(network) connectivityManager.unregisterNetworkCallback(networkCallback)
Log.d(TAG, "Network unavailable!")
_networkStatus.value = NetworkStatus.LOST
}
})
} }
private fun getNetworkRequest(): NetworkRequest { private fun getNetworkRequest(): NetworkRequest {
@@ -69,6 +67,7 @@ class NetworkProvider(context: Context) {
if (isMAndAbove()) { if (isMAndAbove()) {
networkRequest.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) networkRequest.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
} }
return networkRequest.build()
return networkRequest.build()
} }
} }