Skip to content

Commit 72132a4

Browse files
committed
creating NetworkClock object
1 parent 3aaad8f commit 72132a4

12 files changed

Lines changed: 150 additions & 7 deletions

File tree

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.softartdev.kronos
2+
3+
import android.content.Context
4+
import com.lyft.kronos.AndroidClockFactory
5+
import com.lyft.kronos.KronosClock
6+
7+
actual object NetworkClock {
8+
9+
lateinit var kronosClock: KronosClock
10+
11+
fun sync(applicationContext: Context) {
12+
kronosClock = AndroidClockFactory.createKronosClock(applicationContext)
13+
kronosClock.syncInBackground()
14+
}
15+
16+
actual fun getCurrentNtpTimeMs(): Long? = when {
17+
::kronosClock.isInitialized -> kronosClock.getCurrentTimeMs()
18+
else -> null
19+
}
20+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.softartdev.kronos
2+
3+
expect object NetworkClock {
4+
/**
5+
* @return the current time in milliseconds, or null if no ntp sync has occurred.
6+
*/
7+
fun getCurrentNtpTimeMs(): Long?
8+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.softartdev.kronos
2+
3+
actual object NetworkClock {
4+
5+
fun sync() {
6+
//TODO "Not yet implemented"
7+
}
8+
9+
actual fun getCurrentNtpTimeMs(): Long? = null
10+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.softartdev.kronos
2+
3+
import com.lyft.kronos.*
4+
5+
object JvmClockFactory {
6+
7+
@JvmStatic
8+
fun createDeviceClock(): Clock = JvmSystemClock()
9+
10+
@JvmStatic
11+
@JvmOverloads
12+
fun createKronosClock(
13+
syncListener: SyncListener? = null,
14+
ntpHosts: List<String> = DefaultParam.NTP_HOSTS,
15+
requestTimeoutMs: Long = DefaultParam.TIMEOUT_MS,
16+
minWaitTimeBetweenSyncMs: Long = DefaultParam.MIN_WAIT_TIME_BETWEEN_SYNC_MS,
17+
cacheExpirationMs: Long = DefaultParam.CACHE_EXPIRATION_MS,
18+
maxNtpResponseTimeMs: Long = DefaultParam.MAX_NTP_RESPONSE_TIME_MS
19+
): KronosClock = ClockFactory.createKronosClock(
20+
localClock = createDeviceClock(),
21+
syncResponseCache = JvmPreferenceSyncResponseCache(),
22+
syncListener = syncListener,
23+
ntpHosts = ntpHosts,
24+
requestTimeoutMs = requestTimeoutMs,
25+
minWaitTimeBetweenSyncMs = minWaitTimeBetweenSyncMs,
26+
cacheExpirationMs = cacheExpirationMs,
27+
maxNtpResponseTimeMs = maxNtpResponseTimeMs
28+
)
29+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.softartdev.kronos
2+
3+
import com.lyft.kronos.SyncResponseCache
4+
import com.lyft.kronos.internal.Constants.TIME_UNAVAILABLE
5+
import java.util.prefs.Preferences
6+
7+
class JvmPreferenceSyncResponseCache : SyncResponseCache {
8+
private val preferences: Preferences = Preferences.userNodeForPackage(JvmPreferenceSyncResponseCache::class.java)
9+
10+
override var currentTime: Long
11+
get() = preferences.getLong(KEY_CURRENT_TIME, TIME_UNAVAILABLE)
12+
set(value) = preferences.putLong(KEY_CURRENT_TIME, value)
13+
override var elapsedTime: Long
14+
get() = preferences.getLong(KEY_ELAPSED_TIME, TIME_UNAVAILABLE)
15+
set(value) = preferences.putLong(KEY_ELAPSED_TIME, value)
16+
override var currentOffset: Long
17+
get() = preferences.getLong(KEY_OFFSET, TIME_UNAVAILABLE)
18+
set(value) = preferences.putLong(KEY_OFFSET, value)
19+
20+
override fun clear() = preferences.clear()
21+
22+
companion object {
23+
internal const val KEY_CURRENT_TIME = "com.lyft.kronos.cached_current_time"
24+
internal const val KEY_ELAPSED_TIME = "com.lyft.kronos.cached_elapsed_time"
25+
internal const val KEY_OFFSET = "com.lyft.kronos.cached_offset"
26+
}
27+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.softartdev.kronos
2+
3+
import com.lyft.kronos.Clock
4+
5+
class JvmSystemClock : Clock {
6+
override fun getCurrentTimeMs(): Long = System.currentTimeMillis()
7+
8+
// TODO: use SystemClock.elapsedRealtime()
9+
override fun getElapsedTimeMs(): Long = System.currentTimeMillis()
10+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.softartdev.kronos
2+
3+
import com.lyft.kronos.KronosClock
4+
5+
actual object NetworkClock {
6+
7+
lateinit var kronosClock: KronosClock
8+
9+
fun sync() {
10+
kronosClock = JvmClockFactory.createKronosClock()
11+
kronosClock.syncInBackground()
12+
}
13+
14+
actual fun getCurrentNtpTimeMs(): Long? = when {
15+
::kronosClock.isInitialized -> kronosClock.getCurrentTimeMs()
16+
else -> null
17+
}
18+
}

sampleApp/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ kotlin {
5959
dependencies {
6060
implementation(compose.desktop.common)
6161
implementation(compose.desktop.currentOs)
62+
implementation(compose.preview)
6263
}
6364
}
6465

sampleApp/src/androidMain/kotlin/com/softartdev/kronos/sample/App.android.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import android.net.Uri
66
import android.os.Bundle
77
import androidx.activity.ComponentActivity
88
import androidx.activity.compose.setContent
9+
import com.softartdev.kronos.NetworkClock
910

1011
class AndroidApp : Application() {
1112
companion object {
@@ -15,6 +16,7 @@ class AndroidApp : Application() {
1516
override fun onCreate() {
1617
super.onCreate()
1718
INSTANCE = this
19+
NetworkClock.sync(applicationContext)
1820
}
1921
}
2022

sampleApp/src/commonMain/kotlin/com/softartdev/kronos/sample/App.kt

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,35 @@
11
package com.softartdev.kronos.sample
22

3-
import androidx.compose.foundation.layout.*
3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.fillMaxSize
46
import androidx.compose.material.Button
57
import androidx.compose.material.Text
6-
import androidx.compose.runtime.Composable
8+
import androidx.compose.runtime.*
79
import androidx.compose.ui.Alignment
810
import androidx.compose.ui.Modifier
9-
import androidx.compose.ui.unit.dp
1011
import com.softartdev.kronos.Greeting
12+
import com.softartdev.kronos.NetworkClock
1113

1214
@Composable
1315
internal fun App() = AppTheme {
16+
var ntpTimeMs by remember { mutableStateOf(NetworkClock.getCurrentNtpTimeMs()) }
1417
Column(
1518
modifier = Modifier.fillMaxSize(),
1619
horizontalAlignment = Alignment.CenterHorizontally,
17-
verticalArrangement = Arrangement.Center
20+
verticalArrangement = Arrangement.SpaceEvenly
1821
) {
22+
Text(text = "Network time millis: $ntpTimeMs")
1923
Button(
20-
onClick = { openUrl("https://github.com/terrakok") }
24+
onClick = { ntpTimeMs = NetworkClock.getCurrentNtpTimeMs() }
25+
) {
26+
Text(text = "Refresh network time millis")
27+
}
28+
Button(
29+
onClick = { openUrl("https://github.com/softartdev/Kronos-Multiplatform") }
2130
) {
2231
Text("Open github")
2332
}
24-
Spacer(modifier = Modifier.height(32.dp))
2533
Text(text = Greeting().greet())
2634
}
2735
}

0 commit comments

Comments
 (0)