Skip to content

Commit ca75a33

Browse files
committed
Version 3.4.0 ->
- Added support for Kotlin Flow (`MutableStateFlow`) for both Internet Connection Status and Last Known Speed - Added `Extension Functions` for `NetworkX` - Documentation updated
1 parent 701c409 commit ca75a33

File tree

6 files changed

+147
-46
lines changed

6 files changed

+147
-46
lines changed

NetworkX/src/main/java/com/rommansabbir/networkx/NetworkSpeedType.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ object NetworkSpeedType {
44
const val GB = "GB"
55
const val MB = "MB"
66
const val KB = "KB"
7+
const val NONE = "NONE"
78
}

NetworkX/src/main/java/com/rommansabbir/networkx/NetworkXProvider.kt

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ import android.os.Handler
55
import android.os.Looper
66
import androidx.lifecycle.LiveData
77
import androidx.lifecycle.MutableLiveData
8+
import com.rommansabbir.networkx.extension.getDefaultIOScope
9+
import com.rommansabbir.networkx.extension.getDefaultLastKnownSpeed
10+
import kotlinx.coroutines.CoroutineScope
11+
import kotlinx.coroutines.flow.MutableStateFlow
12+
import kotlinx.coroutines.launch
813

914
object NetworkXProvider {
1015
/**
@@ -29,6 +34,9 @@ object NetworkXProvider {
2934
Handler(Looper.getMainLooper()).post {
3035
connected = value
3136
isInternetConnectedMutableLiveData.value = value
37+
getDefaultIOScope.launch {
38+
isInternetConnectedFlow.emit(value)
39+
}
3240
}
3341
}
3442
}
@@ -44,20 +52,27 @@ object NetworkXProvider {
4452
*/
4553
private var isInternetConnectedMutableLiveData: MutableLiveData<Boolean> =
4654
MutableLiveData()
55+
4756
val isInternetConnectedLiveData: LiveData<Boolean>
4857
get() = isInternetConnectedMutableLiveData
4958

59+
val isInternetConnectedFlow: MutableStateFlow<Boolean> = MutableStateFlow(connected)
60+
5061

5162
// Store last known speed
52-
private var lastKnownSpeedRef: LastKnownSpeed? = null
63+
private var lastKnownSpeedRef: LastKnownSpeed = getDefaultLastKnownSpeed
5364

5465
/**
5566
* Public access point to get the last known network speed
5667
*/
57-
val lastKnownSpeed: LastKnownSpeed?
68+
val lastKnownSpeed: LastKnownSpeed
5869
get() = lastKnownSpeedRef
5970

60-
private val lastKnownSpeedLiveDataRef: MutableLiveData<LastKnownSpeed> = MutableLiveData(null)
71+
private val lastKnownSpeedLiveDataRef: MutableLiveData<LastKnownSpeed> =
72+
MutableLiveData(getDefaultLastKnownSpeed)
73+
74+
val lastKnownSpeedFlow: MutableStateFlow<LastKnownSpeed> =
75+
MutableStateFlow(getDefaultLastKnownSpeed)
6176

6277
/**
6378
* Public access point to get the last known network speed which can be observed from Activity/Fragment.
@@ -69,6 +84,9 @@ object NetworkXProvider {
6984
synchronized(value) {
7085
lastKnownSpeedRef = value
7186
lastKnownSpeedLiveDataRef.value = value
87+
getDefaultIOScope.launch {
88+
lastKnownSpeedFlow.emit(value)
89+
}
7290
}
7391
}
7492

@@ -79,7 +97,10 @@ object NetworkXProvider {
7997
*
8098
* @param application, [Application] reference
8199
*/
82-
@Deprecated("Use NetworkXProvider.enable(config: NetworkXConfig) to initialize NetworkX properly")
100+
@Deprecated(
101+
"Use NetworkXProvider.enable(config: NetworkXConfig) to initialize NetworkX properly",
102+
replaceWith = ReplaceWith("NetworkXProvider.enable(NetworkXConfig.Builder().withApplication(this).withEnableSpeedMeter(true).build())")
103+
)
83104
fun init(application: Application, enableSpeedMeter: Boolean = false) {
84105
try {
85106
if (manager != null) {
@@ -96,7 +117,7 @@ object NetworkXProvider {
96117
* First check for [NetworkXManager] instance, if the status is null then initialize it properly
97118
* else ignore the initialization.
98119
*
99-
* @param config, [NetworkXConfig] reference
120+
* @param config [NetworkXConfig] reference.
100121
*/
101122
fun enable(config: NetworkXConfig) {
102123
try {
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.rommansabbir.networkx.extension
2+
3+
import androidx.lifecycle.LiveData
4+
import com.rommansabbir.networkx.LastKnownSpeed
5+
import com.rommansabbir.networkx.NetworkSpeedType
6+
import com.rommansabbir.networkx.NetworkXConfig
7+
import com.rommansabbir.networkx.NetworkXProvider
8+
import kotlinx.coroutines.CoroutineScope
9+
import kotlinx.coroutines.Dispatchers
10+
import kotlinx.coroutines.flow.MutableStateFlow
11+
12+
/**
13+
* Return if internet is connected or not.
14+
*/
15+
val isInternetConnected: Boolean = NetworkXProvider.isInternetConnected
16+
17+
/**
18+
* Return if internet is connected or not as [LiveData].
19+
*/
20+
val isInternetConnectedLiveData: LiveData<Boolean> = NetworkXProvider.isInternetConnectedLiveData
21+
22+
/**
23+
* Return if internet is connected or not as [MutableStateFlow].
24+
*/
25+
val isInternetConnectedFlow: MutableStateFlow<Boolean> = NetworkXProvider.isInternetConnectedFlow
26+
27+
/**
28+
* Return [LastKnownSpeed].
29+
*/
30+
val lastKnownSpeed: LastKnownSpeed = NetworkXProvider.lastKnownSpeed
31+
32+
/**
33+
* Return [LastKnownSpeed] as [LiveData]
34+
*/
35+
val lastKnownSpeedLiveData: LiveData<LastKnownSpeed> = NetworkXProvider.lastKnownSpeedLiveData
36+
37+
/**
38+
* Return [LastKnownSpeed] as [MutableStateFlow].
39+
*/
40+
val lastKnownSpeedFlow: MutableStateFlow<LastKnownSpeed> = NetworkXProvider.lastKnownSpeedFlow
41+
42+
/**
43+
* Return a default lazy instance of [LastKnownSpeed].
44+
*/
45+
internal val getDefaultLastKnownSpeed by lazy {
46+
LastKnownSpeed(NetworkSpeedType.NONE, NetworkSpeedType.NONE, NetworkSpeedType.NONE)
47+
}
48+
49+
/**
50+
* Return a default lazy instance of [CoroutineScope] which works under [Dispatchers.IO].
51+
*/
52+
internal val getDefaultIOScope by lazy { CoroutineScope(Dispatchers.IO) }
53+
54+
/**
55+
* Initialize [NetworkXProvider].
56+
*
57+
* @param config [NetworkXConfig].
58+
*/
59+
fun enableNetworkX(config: NetworkXConfig) = NetworkXProvider.enable(config)

README.md

Lines changed: 15 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Step 2. Add the dependency.
3434

3535
| Releases
3636
| ------------- |
37-
| 3.3.0 |
37+
| 3.4.0 |
3838

3939

4040
# Usages
@@ -51,52 +51,34 @@ Initialize `NetworkX` from your `Application.onCreate()`
5151
````
5252

5353
## Step 2:
54-
- To check internet connection status, simply call `NetworkXProvider.isInternetConnected` which return a `Boolean` value.
54+
- To check Internet Connection status, simply call extension variable
55+
`isInternetConnected` or `isInternetConnectedLiveData` or `isInternetConnectedFlow`.
5556
````
56-
val status = NetworkXProvider.isInternetConnected
57-
textView.text = "Internet connection status: $status"
58-
````
59-
60-
- To observe the internet connection status, start observing `NetworkXProvider.isInternetConnectedLiveData`
61-
62-
````
63-
NetworkXProvider.isInternetConnectedLiveData.observe(this) { status ->
64-
status?.let {
57+
isInternetConnectedFlow.collectLatest {
58+
lifecycleScope.launch {
6559
textView.text = "Internet connection status: $it"
6660
}
6761
}
6862
````
6963

70-
- To get connected network speed/last known speed call `NetworkXProvider.lastKnownSpeed` which return an `LastKnownSpeed` object
64+
- To get connected network speed/last known speed [`LastKnownSpeed`] call extension variable
65+
`lastKnownSpeed` or `lastKnownSpeedLiveData` or `lastKnownSpeedFlow`
7166

7267
````
73-
NetworkXProvider.lastKnownSpeed?.let {
74-
textView2.text =
75-
"Last Known Speed: Speed - ${it.speed} | Type - ${it.networkTypeNetwork} | Simplified Speed - ${it.simplifiedSpeed}"
76-
}
77-
````
78-
79-
- To obsever current network speed/last known speed start observing `NetworkXProvider.lastKnownSpeedLiveData`
80-
81-
````
82-
NetworkXProvider.lastKnownSpeedLiveData.observe(this) {
83-
it?.let {
84-
textView2.text =
85-
"Last Known Speed: Speed - ${it.speed} | Type - ${it.networkTypeNetwork} | Simplified Speed - ${it.simplifiedSpeed}"
86-
}
87-
}
68+
lastKnownSpeed?.let {
69+
textView2.text ="S-${it.speed}|T-${it.networkTypeNetwork}|SS-${it.simplifiedSpeed}"
70+
}
8871
````
8972

9073
## Notes:
91-
- NetworkX (including Speed Meter) only works when the app is in the foreground
92-
- The default value for `NetworkXProvider.isInternetConnected` is `false`
93-
- The default value for `NetworkXProvider.isInternetConnectedLiveData` is `null`
94-
- The default value for `NetworkXProvider.lastKnownSpeed` is `null`
95-
- The default value for `NetworkXProvider.lastKnownSpeedLiveData` is `null`
74+
- **NetworkX** (including **Speed Meter**) only works when the **Application** is in the **Forground Only**.
75+
- To emit (**`MutableStateFlow`**) **Last Known Speed** or **Internet Connection Status**,required **`CoroutineScope`** works under a **`Dispatchers.IO`** context.
76+
- The default value for **Internet Connection Status** is `false`.
77+
- The default value for **LastKnownSpeed** is `NONE`.
9678

9779
---
9880

99-
### How to show the `NoInternetDialog`?
81+
### How to show the **`NoInternetDialog`**?
10082

10183
```kotlin
10284
NoInternetDialog

app/src/main/java/com/rommansabbir/networkobserverexample/MainActivity.kt

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@ package com.rommansabbir.networkobserverexample
33
import android.annotation.SuppressLint
44
import android.os.Bundle
55
import androidx.appcompat.app.AppCompatActivity
6+
import androidx.lifecycle.lifecycleScope
67
import com.rommansabbir.networkx.NetworkXProvider
8+
import com.rommansabbir.networkx.NetworkXProvider.isInternetConnectedFlow
9+
import com.rommansabbir.networkx.NetworkXProvider.lastKnownSpeedFlow
710
import kotlinx.android.synthetic.main.activity_main.*
11+
import kotlinx.coroutines.flow.collect
12+
import kotlinx.coroutines.launch
813

914
class MainActivity : AppCompatActivity() {
1015
@SuppressLint("SetTextI18n")
@@ -15,25 +20,58 @@ class MainActivity : AppCompatActivity() {
1520
val status = NetworkXProvider.isInternetConnected
1621
textView.text = "Internet connection status: $status"
1722

18-
//
23+
/* //
1924
NetworkXProvider.isInternetConnectedLiveData.observe(this) { status ->
2025
status?.let {
2126
textView.text = "Internet connection status: $it"
2227
}
23-
}
28+
}*/
2429

25-
NetworkXProvider.lastKnownSpeed?.let {
30+
/* NetworkXProvider.lastKnownSpeed.let {
2631
textView2.text =
2732
"Last Known Speed: Speed - ${it.speed} | Type - ${it.networkTypeNetwork} | Simplified Speed - ${it.simplifiedSpeed}"
28-
}
33+
}*/
2934

35+
lifecycleScope.launchWhenCreated {
36+
try {
37+
lastKnownSpeedFlow.collect {
38+
lifecycleScope.launch {
39+
textView2.text =
40+
"Last Known Speed: Speed - ${it.speed} | Type - ${it.networkTypeNetwork} | Simplified Speed - ${it.simplifiedSpeed}"
41+
}
42+
}
43+
} catch (e: Exception) {
44+
e.printStackTrace()
45+
}
46+
}
47+
lifecycleScope.launchWhenCreated {
48+
try {
49+
isInternetConnectedFlow.collect {
50+
lifecycleScope.launch {
51+
textView.text = "Internet connection status: $it"
52+
}
53+
}
54+
}
55+
catch (e : Exception){
56+
e.printStackTrace()
57+
}
58+
}
59+
/*
3060
NetworkXProvider.lastKnownSpeedLiveData.observe(this) {
3161
it?.let {
3262
textView2.text =
3363
"Last Known Speed: Speed - ${it.speed} | Type - ${it.networkTypeNetwork} | Simplified Speed - ${it.simplifiedSpeed}"
3464
}
3565
}
66+
*/
3667

37-
}
68+
/* lifecycleScope.launchWhenCreated {
69+
NetworkXProvider.isInternetConnectedFlow.collectLatest {
70+
lifecycleScope.launch {
71+
textView.text = "Internet connection status: $it"
72+
}
73+
}
74+
}*/
3875

76+
}
3977
}

app/src/main/java/com/rommansabbir/networkobserverexample/MyApplication.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ class MyApplication : Application() {
1111
override fun onCreate() {
1212
super.onCreate()
1313

14-
// NetworkXProvider.init(this, true)
14+
/*NetworkXProvider.init(this, true)*/
1515
/**
1616
* Initialize NetworkX
1717
*/
18-
val builder = NetworkXConfig.Builder()
18+
val builder = NetworkXConfig
19+
.Builder()
1920
.withApplication(this)
20-
// You can disable speed meter if not required
2121
.withEnableSpeedMeter(true)
2222
.build()
2323
NetworkXProvider.enable(builder)

0 commit comments

Comments
 (0)