@@ -26,26 +26,31 @@ import android.os.PowerManager
26
26
import androidx.core.content.getSystemService
27
27
import androidx.lifecycle.MutableLiveData
28
28
import com.protonvpn.android.bus.TrafficUpdate
29
+ import com.protonvpn.android.di.ElapsedRealtimeClock
30
+ import com.protonvpn.android.di.WallClock
29
31
import com.protonvpn.android.logging.LogCategory
30
32
import com.protonvpn.android.logging.ProtonLogger
31
33
import com.protonvpn.android.utils.AndroidUtils.registerBroadcastReceiver
32
- import com.protonvpn.android.vpn.ConnectivityMonitor
33
34
import com.protonvpn.android.vpn.VpnState
34
35
import com.protonvpn.android.vpn.VpnStateMonitor
36
+ import dagger.hilt.android.qualifiers.ApplicationContext
35
37
import kotlinx.coroutines.CoroutineScope
36
38
import kotlinx.coroutines.Dispatchers
37
39
import kotlinx.coroutines.Job
38
40
import kotlinx.coroutines.delay
39
41
import kotlinx.coroutines.launch
40
42
import java.util.concurrent.TimeUnit
43
+ import javax.inject.Inject
44
+ import javax.inject.Singleton
41
45
import kotlin.math.roundToLong
42
46
43
- class TrafficMonitor constructor(
44
- val context : Context ,
45
- val scope : CoroutineScope ,
46
- val now : () -> Long ,
47
- val vpnStateMonitor : VpnStateMonitor ,
48
- private val connectivityMonitor : ConnectivityMonitor ,
47
+ @Singleton
48
+ class TrafficMonitor @Inject constructor(
49
+ @ApplicationContext private val context : Context ,
50
+ private val scope : CoroutineScope ,
51
+ @ElapsedRealtimeClock private val monotonicClock : () -> Long ,
52
+ @WallClock private val wallClock : () -> Long ,
53
+ private val vpnStateMonitor : VpnStateMonitor ,
49
54
) {
50
55
companion object {
51
56
const val TRAFFIC_HISTORY_LENGTH_S = 31L
@@ -60,7 +65,7 @@ class TrafficMonitor constructor(
60
65
private var sessionUploaded = 0L
61
66
private var lastTotalDownload = 0L
62
67
private var lastTotalUpload = 0L
63
- private var lastTimestamp = 0L
68
+ private var lastMonotonicTimestamp = 0L
64
69
65
70
private var updateJob: Job ? = null
66
71
@@ -88,13 +93,13 @@ class TrafficMonitor constructor(
88
93
}
89
94
90
95
private fun resetSession () {
91
- lastTimestamp = now ()
96
+ lastMonotonicTimestamp = monotonicClock ()
92
97
lastTotalDownload = TrafficStats .getTotalRxBytes()
93
98
lastTotalUpload = TrafficStats .getTotalTxBytes()
94
99
95
100
sessionDownloaded = 0L
96
101
sessionUploaded = 0L
97
- sessionStart = lastTimestamp
102
+ sessionStart = wallClock()
98
103
99
104
trafficStatus.value = TrafficUpdate (0 , sessionStart, 0 , 0 , 0 , 0 , 0 )
100
105
trafficHistory.value = emptyList()
@@ -115,8 +120,8 @@ class TrafficMonitor constructor(
115
120
if (updateJob == null ) {
116
121
updateJob = scope.launch(Dispatchers .Main ) {
117
122
while (true ) {
118
- val timestamp = now ()
119
- val elapsedMillis = timestamp - lastTimestamp
123
+ val monotonicTimestamp = monotonicClock ()
124
+ val elapsedMillis = monotonicTimestamp - lastMonotonicTimestamp
120
125
val elapsedSeconds = elapsedMillis / 1000f
121
126
122
127
// Speeds need to be divided by two due to TrafficStats calculating both phone and VPN
@@ -132,20 +137,20 @@ class TrafficMonitor constructor(
132
137
sessionDownloaded + = downloaded
133
138
sessionUploaded + = uploaded
134
139
135
- val sessionTimeSeconds = (timestamp - sessionStart).toInt() / 1000
140
+ val sessionTimeSeconds = (wallClock() - sessionStart).toInt() / 1000
136
141
val update = TrafficUpdate (
137
- timestamp , sessionStart, downloadSpeed, uploadSpeed, sessionDownloaded,
142
+ monotonicTimestamp , sessionStart, downloadSpeed, uploadSpeed, sessionDownloaded,
138
143
sessionUploaded, sessionTimeSeconds
139
144
)
140
145
trafficStatus.value = update
141
146
trafficHistory.value = (trafficHistory.value!! + update)
142
147
.takeLastWhile {
143
- it.timestampMs > timestamp - TimeUnit .SECONDS .toMillis(TRAFFIC_HISTORY_LENGTH_S )
148
+ it.monotonicTimestampMs > monotonicTimestamp - TimeUnit .SECONDS .toMillis(TRAFFIC_HISTORY_LENGTH_S )
144
149
}
145
150
146
151
lastTotalDownload = totalDownload
147
152
lastTotalUpload = totalUpload
148
- lastTimestamp = timestamp
153
+ lastMonotonicTimestamp = monotonicTimestamp
149
154
150
155
delay(1000 )
151
156
}
0 commit comments