From b321bbe07ff48d571feb4f81c66f58223584dc83 Mon Sep 17 00:00:00 2001 From: pacien Date: Mon, 20 Aug 2018 17:46:07 +0200 Subject: Generify periodically refreshing live data --- .../activities/common/SelfRefreshingLiveData.kt | 42 ++++++++++++++++++++++ .../activities/start/NetworkListLiveData.kt | 19 +++------- .../activities/status/nodes/NodeListLiveData.kt | 25 +++++-------- .../tincapp/activities/viewlog/LogLiveData.kt | 32 ++++++++--------- 4 files changed, 70 insertions(+), 48 deletions(-) create mode 100644 app/src/main/java/org/pacien/tincapp/activities/common/SelfRefreshingLiveData.kt (limited to 'app/src/main') 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 @@ +/* + * Tinc App, an Android binding and user interface for the tinc mesh VPN daemon + * Copyright (C) 2017-2018 Pacien TRAN-GIRARD + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.pacien.tincapp.activities.common + +import android.arch.lifecycle.LiveData +import java.util.concurrent.Executors +import java.util.concurrent.ScheduledFuture +import java.util.concurrent.TimeUnit + +/** + * @author pacien + */ +abstract class SelfRefreshingLiveData(private val refreshInterval: Long, private val timeUnit: TimeUnit) : LiveData() { + private val scheduledExecutor = Executors.newSingleThreadScheduledExecutor() + private lateinit var scheduledFuture: ScheduledFuture<*> + + override fun onActive() { + scheduledFuture = scheduledExecutor.scheduleWithFixedDelay(this::onRefresh, 0, refreshInterval, timeUnit) + } + + override fun onInactive() { + scheduledFuture.cancel(false) + } + + abstract fun onRefresh() +} 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 @@ package org.pacien.tincapp.activities.start -import android.arch.lifecycle.LiveData +import org.pacien.tincapp.activities.common.SelfRefreshingLiveData import org.pacien.tincapp.context.AppPaths -import java.util.* -import kotlin.concurrent.timer +import java.util.concurrent.TimeUnit /** * @author pacien */ -class NetworkListLiveData : LiveData>() { - private val updateInterval = 2 * 1000L // in milliseconds +class NetworkListLiveData : SelfRefreshingLiveData>(1, TimeUnit.SECONDS) { private val appPaths = AppPaths - private lateinit var updateTimer: Timer - override fun onActive() { - updateTimer = timer(period = updateInterval, action = { updateNetworkList() }) - } - - override fun onInactive() { - updateTimer.apply { cancel() }.apply { purge() } - } - - private fun updateNetworkList() { + override fun onRefresh() { val networkList = appPaths.confDir().list()?.sorted() ?: emptyList() postValue(networkList) } 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 @@ package org.pacien.tincapp.activities.status.nodes -import android.arch.lifecycle.LiveData +import org.pacien.tincapp.activities.common.SelfRefreshingLiveData import org.pacien.tincapp.commands.Tinc -import java.util.* -import kotlin.concurrent.timer +import java.util.concurrent.TimeUnit /** * @author pacien */ -class NodeListLiveData(private val netName: String) : LiveData>() { - private val updateInterval = 2 * 1000L // in milliseconds +class NodeListLiveData(private val netName: String) : SelfRefreshingLiveData>(1, TimeUnit.SECONDS) { private val tincCtl = Tinc - private lateinit var updateTimer: Timer - override fun onActive() { - updateTimer = timer(period = updateInterval, action = { updateNodeList() }) - } - - override fun onInactive() { - updateTimer.apply { cancel() }.apply { purge() } - } + override fun onRefresh() { + val nodeList = tincCtl.dumpNodes(netName) + .thenApply { list -> list.map { it.substringBefore(' ') } } + .get() - private fun updateNodeList() { - tincCtl.dumpNodes(netName) - .thenApply { list -> list.map { it.substringBefore(' ')} } - .thenAccept(this::postValue) + postValue(nodeList) } } 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 @@ package org.pacien.tincapp.activities.viewlog -import android.arch.lifecycle.LiveData +import org.pacien.tincapp.activities.common.SelfRefreshingLiveData import org.pacien.tincapp.commands.Executor import org.pacien.tincapp.commands.Tinc import java.util.* -import kotlin.concurrent.timer +import java.util.concurrent.TimeUnit /** * @author pacien */ -class LogLiveData(private val netName: String, private val logLevel: Int, private val logLineSize: Int) : LiveData>() { - private val updateInterval = 250L // milliseconds +class LogLiveData(private val netName: String, private val logLevel: Int, private val logLineSize: Int) + : SelfRefreshingLiveData>(250, TimeUnit.MILLISECONDS) { + private val executor = Executor private val log = LinkedList() - private var loggerProcess: Process? = null - private var logUpdateTimer: Timer? = null + private lateinit var loggerProcess: Process override fun onActive() { + super.onActive() loggerProcess = startNewLogger() - logUpdateTimer = timer(period = updateInterval, action = { outputLog() }) } override fun onInactive() { - loggerProcess?.destroy() - logUpdateTimer?.apply { cancel() }?.apply { purge() } + loggerProcess.destroy() + super.onInactive() + } + + override fun onRefresh() { + synchronized(log) { + val logView = ArrayList(log) + postValue(logView) + } } private fun startNewLogger(): Process { @@ -64,11 +71,4 @@ class LogLiveData(private val netName: String, private val logLevel: Int, privat log.addLast(line) } } - - private fun outputLog() { - synchronized(log) { - val logView = ArrayList(log) - postValue(logView) - } - } } -- cgit v1.2.3