diff options
author | pacien | 2018-08-20 17:46:07 +0200 |
---|---|---|
committer | pacien | 2018-08-20 17:46:07 +0200 |
commit | b321bbe07ff48d571feb4f81c66f58223584dc83 (patch) | |
tree | 83b0cf740091bf1f43dfd9d6249645c6181831c0 /app | |
parent | 8c47b9d6947a3ff4f75842f874b882471efcab76 (diff) | |
download | tincapp-b321bbe07ff48d571feb4f81c66f58223584dc83.tar.gz |
Generify periodically refreshing live data
Diffstat (limited to 'app')
4 files changed, 70 insertions, 48 deletions
diff --git a/app/src/main/java/org/pacien/tincapp/activities/common/SelfRefreshingLiveData.kt b/app/src/main/java/org/pacien/tincapp/activities/common/SelfRefreshingLiveData.kt new file mode 100644 index 0000000..cb98736 --- /dev/null +++ b/app/src/main/java/org/pacien/tincapp/activities/common/SelfRefreshingLiveData.kt | |||
@@ -0,0 +1,42 @@ | |||
1 | /* | ||
2 | * Tinc App, an Android binding and user interface for the tinc mesh VPN daemon | ||
3 | * Copyright (C) 2017-2018 Pacien TRAN-GIRARD | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 3 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | package org.pacien.tincapp.activities.common | ||
20 | |||
21 | import android.arch.lifecycle.LiveData | ||
22 | import java.util.concurrent.Executors | ||
23 | import java.util.concurrent.ScheduledFuture | ||
24 | import java.util.concurrent.TimeUnit | ||
25 | |||
26 | /** | ||
27 | * @author pacien | ||
28 | */ | ||
29 | abstract class SelfRefreshingLiveData<T>(private val refreshInterval: Long, private val timeUnit: TimeUnit) : LiveData<T>() { | ||
30 | private val scheduledExecutor = Executors.newSingleThreadScheduledExecutor() | ||
31 | private lateinit var scheduledFuture: ScheduledFuture<*> | ||
32 | |||
33 | override fun onActive() { | ||
34 | scheduledFuture = scheduledExecutor.scheduleWithFixedDelay(this::onRefresh, 0, refreshInterval, timeUnit) | ||
35 | } | ||
36 | |||
37 | override fun onInactive() { | ||
38 | scheduledFuture.cancel(false) | ||
39 | } | ||
40 | |||
41 | abstract fun onRefresh() | ||
42 | } | ||
diff --git a/app/src/main/java/org/pacien/tincapp/activities/start/NetworkListLiveData.kt b/app/src/main/java/org/pacien/tincapp/activities/start/NetworkListLiveData.kt index d0d39b8..aaab0e7 100644 --- a/app/src/main/java/org/pacien/tincapp/activities/start/NetworkListLiveData.kt +++ b/app/src/main/java/org/pacien/tincapp/activities/start/NetworkListLiveData.kt | |||
@@ -18,28 +18,17 @@ | |||
18 | 18 | ||
19 | package org.pacien.tincapp.activities.start | 19 | package org.pacien.tincapp.activities.start |
20 | 20 | ||
21 | import android.arch.lifecycle.LiveData | 21 | import org.pacien.tincapp.activities.common.SelfRefreshingLiveData |
22 | import org.pacien.tincapp.context.AppPaths | 22 | import org.pacien.tincapp.context.AppPaths |
23 | import java.util.* | 23 | import java.util.concurrent.TimeUnit |
24 | import kotlin.concurrent.timer | ||
25 | 24 | ||
26 | /** | 25 | /** |
27 | * @author pacien | 26 | * @author pacien |
28 | */ | 27 | */ |
29 | class NetworkListLiveData : LiveData<List<String>>() { | 28 | class NetworkListLiveData : SelfRefreshingLiveData<List<String>>(1, TimeUnit.SECONDS) { |
30 | private val updateInterval = 2 * 1000L // in milliseconds | ||
31 | private val appPaths = AppPaths | 29 | private val appPaths = AppPaths |
32 | private lateinit var updateTimer: Timer | ||
33 | 30 | ||
34 | override fun onActive() { | 31 | override fun onRefresh() { |
35 | updateTimer = timer(period = updateInterval, action = { updateNetworkList() }) | ||
36 | } | ||
37 | |||
38 | override fun onInactive() { | ||
39 | updateTimer.apply { cancel() }.apply { purge() } | ||
40 | } | ||
41 | |||
42 | private fun updateNetworkList() { | ||
43 | val networkList = appPaths.confDir().list()?.sorted() ?: emptyList() | 32 | val networkList = appPaths.confDir().list()?.sorted() ?: emptyList() |
44 | postValue(networkList) | 33 | postValue(networkList) |
45 | } | 34 | } |
diff --git a/app/src/main/java/org/pacien/tincapp/activities/status/nodes/NodeListLiveData.kt b/app/src/main/java/org/pacien/tincapp/activities/status/nodes/NodeListLiveData.kt index cdbdf0a..70ea54e 100644 --- a/app/src/main/java/org/pacien/tincapp/activities/status/nodes/NodeListLiveData.kt +++ b/app/src/main/java/org/pacien/tincapp/activities/status/nodes/NodeListLiveData.kt | |||
@@ -18,30 +18,21 @@ | |||
18 | 18 | ||
19 | package org.pacien.tincapp.activities.status.nodes | 19 | package org.pacien.tincapp.activities.status.nodes |
20 | 20 | ||
21 | import android.arch.lifecycle.LiveData | 21 | import org.pacien.tincapp.activities.common.SelfRefreshingLiveData |
22 | import org.pacien.tincapp.commands.Tinc | 22 | import org.pacien.tincapp.commands.Tinc |
23 | import java.util.* | 23 | import java.util.concurrent.TimeUnit |
24 | import kotlin.concurrent.timer | ||
25 | 24 | ||
26 | /** | 25 | /** |
27 | * @author pacien | 26 | * @author pacien |
28 | */ | 27 | */ |
29 | class NodeListLiveData(private val netName: String) : LiveData<List<String>>() { | 28 | class NodeListLiveData(private val netName: String) : SelfRefreshingLiveData<List<String>>(1, TimeUnit.SECONDS) { |
30 | private val updateInterval = 2 * 1000L // in milliseconds | ||
31 | private val tincCtl = Tinc | 29 | private val tincCtl = Tinc |
32 | private lateinit var updateTimer: Timer | ||
33 | 30 | ||
34 | override fun onActive() { | 31 | override fun onRefresh() { |
35 | updateTimer = timer(period = updateInterval, action = { updateNodeList() }) | 32 | val nodeList = tincCtl.dumpNodes(netName) |
36 | } | 33 | .thenApply { list -> list.map { it.substringBefore(' ') } } |
37 | 34 | .get() | |
38 | override fun onInactive() { | ||
39 | updateTimer.apply { cancel() }.apply { purge() } | ||
40 | } | ||
41 | 35 | ||
42 | private fun updateNodeList() { | 36 | postValue(nodeList) |
43 | tincCtl.dumpNodes(netName) | ||
44 | .thenApply { list -> list.map { it.substringBefore(' ')} } | ||
45 | .thenAccept(this::postValue) | ||
46 | } | 37 | } |
47 | } | 38 | } |
diff --git a/app/src/main/java/org/pacien/tincapp/activities/viewlog/LogLiveData.kt b/app/src/main/java/org/pacien/tincapp/activities/viewlog/LogLiveData.kt index f410a8c..9767e12 100644 --- a/app/src/main/java/org/pacien/tincapp/activities/viewlog/LogLiveData.kt +++ b/app/src/main/java/org/pacien/tincapp/activities/viewlog/LogLiveData.kt | |||
@@ -18,30 +18,37 @@ | |||
18 | 18 | ||
19 | package org.pacien.tincapp.activities.viewlog | 19 | package org.pacien.tincapp.activities.viewlog |
20 | 20 | ||
21 | import android.arch.lifecycle.LiveData | 21 | import org.pacien.tincapp.activities.common.SelfRefreshingLiveData |
22 | import org.pacien.tincapp.commands.Executor | 22 | import org.pacien.tincapp.commands.Executor |
23 | import org.pacien.tincapp.commands.Tinc | 23 | import org.pacien.tincapp.commands.Tinc |
24 | import java.util.* | 24 | import java.util.* |
25 | import kotlin.concurrent.timer | 25 | import java.util.concurrent.TimeUnit |
26 | 26 | ||
27 | /** | 27 | /** |
28 | * @author pacien | 28 | * @author pacien |
29 | */ | 29 | */ |
30 | class LogLiveData(private val netName: String, private val logLevel: Int, private val logLineSize: Int) : LiveData<List<String>>() { | 30 | class LogLiveData(private val netName: String, private val logLevel: Int, private val logLineSize: Int) |
31 | private val updateInterval = 250L // milliseconds | 31 | : SelfRefreshingLiveData<List<String>>(250, TimeUnit.MILLISECONDS) { |
32 | |||
32 | private val executor = Executor | 33 | private val executor = Executor |
33 | private val log = LinkedList<String>() | 34 | private val log = LinkedList<String>() |
34 | private var loggerProcess: Process? = null | 35 | private lateinit var loggerProcess: Process |
35 | private var logUpdateTimer: Timer? = null | ||
36 | 36 | ||
37 | override fun onActive() { | 37 | override fun onActive() { |
38 | super.onActive() | ||
38 | loggerProcess = startNewLogger() | 39 | loggerProcess = startNewLogger() |
39 | logUpdateTimer = timer(period = updateInterval, action = { outputLog() }) | ||
40 | } | 40 | } |
41 | 41 | ||
42 | override fun onInactive() { | 42 | override fun onInactive() { |
43 | loggerProcess?.destroy() | 43 | loggerProcess.destroy() |
44 | logUpdateTimer?.apply { cancel() }?.apply { purge() } | 44 | super.onInactive() |
45 | } | ||
46 | |||
47 | override fun onRefresh() { | ||
48 | synchronized(log) { | ||
49 | val logView = ArrayList(log) | ||
50 | postValue(logView) | ||
51 | } | ||
45 | } | 52 | } |
46 | 53 | ||
47 | private fun startNewLogger(): Process { | 54 | private fun startNewLogger(): Process { |
@@ -64,11 +71,4 @@ class LogLiveData(private val netName: String, private val logLevel: Int, privat | |||
64 | log.addLast(line) | 71 | log.addLast(line) |
65 | } |