diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-07-29 13:57:26 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-07-31 10:59:18 +0000 |
| commit | 596c977f7faa49e65262f5add7b1abf1aa6b608f (patch) | |
| tree | 84f2e2c9401d8cde953e595d959bb1d6ed17bbe6 /android | |
| parent | 13721d8c0292666f083594aad6865540aef9f6b0 (diff) | |
| download | mullvadvpn-596c977f7faa49e65262f5add7b1abf1aa6b608f.tar.xz mullvadvpn-596c977f7faa49e65262f5add7b1abf1aa6b608f.zip | |
Create `AppVersionInfoFetcher`
Diffstat (limited to 'android')
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/AppVersionInfoFetcher.kt | 74 |
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() + } + } + } +} |
