summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-07-29 13:57:26 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-07-31 10:59:18 +0000
commit596c977f7faa49e65262f5add7b1abf1aa6b608f (patch)
tree84f2e2c9401d8cde953e595d959bb1d6ed17bbe6 /android
parent13721d8c0292666f083594aad6865540aef9f6b0 (diff)
downloadmullvadvpn-596c977f7faa49e65262f5add7b1abf1aa6b608f.tar.xz
mullvadvpn-596c977f7faa49e65262f5add7b1abf1aa6b608f.zip
Create `AppVersionInfoFetcher`
Diffstat (limited to 'android')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoFetcher.kt74
1 files changed, 74 insertions, 0 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoFetcher.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoFetcher.kt
new file mode 100644
index 0000000000..2b066c934b
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoFetcher.kt
@@ -0,0 +1,74 @@
+package net.mullvad.mullvadvpn.dataproxy
+
+import java.util.Calendar
+
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+
+import android.content.Context
+
+import net.mullvad.mullvadvpn.MullvadDaemon
+
+val ONE_DAY_IN_MILLISECONDS = 24L * 60L * 60L * 1000L
+val ONE_MINUTE_IN_MILLISECONDS = 60L * 1000L
+
+val KEY_CURRENT_IS_SUPPORTED = "current_is_supported"
+val KEY_LAST_UPDATED = "last_updated"
+val KEY_LATEST_STABLE = "latest_stable"
+val KEY_LATEST = "latest"
+val SHARED_PREFERENCES = "app_version_info_cache"
+
+class AppVersionInfoFetcher(val daemon: Deferred<MullvadDaemon>, val context: Context) {
+ private val preferences = context.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE)
+
+ private val mainLoop = run()
+
+ fun stop() {
+ mainLoop.cancel()
+ }
+
+ private fun run() = GlobalScope.launch(Dispatchers.Default) {
+ while (true) {
+ delay(calculateDelay())
+ fetch()
+ }
+ }
+
+ private fun calculateDelay(): Long {
+ val now = Calendar.getInstance().timeInMillis
+ val lastUpdated = preferences.getLong(KEY_LAST_UPDATED, 0)
+ val delta = now - lastUpdated
+
+ if (delta < 0 || delta >= ONE_DAY_IN_MILLISECONDS) {
+ return 0
+ } else {
+ return ONE_DAY_IN_MILLISECONDS - delta
+ }
+ }
+
+ private suspend fun fetch() {
+ var now = Calendar.getInstance().timeInMillis
+ var versionInfo = daemon.await().getVersionInfo()
+ var attempt = 0
+
+ while (attempt < 5 && versionInfo == null) {
+ delay(ONE_MINUTE_IN_MILLISECONDS)
+ now = Calendar.getInstance().timeInMillis
+ versionInfo = daemon.await().getVersionInfo()
+ attempt += 1
+ }
+
+ if (versionInfo != null) {
+ preferences.edit().apply {
+ putLong(KEY_LAST_UPDATED, now)
+ putBoolean(KEY_CURRENT_IS_SUPPORTED, versionInfo.currentIsSupported)
+ putString(KEY_LATEST_STABLE, versionInfo.latestStable)
+ putString(KEY_LATEST, versionInfo.latest)
+ commit()
+ }
+ }
+ }
+}