Fix #13, #38. I don't have a lot of confidence that this would work very well for every device. Also here's an SQL command that hopefully somebody could make into the app for me: `SELECT TrafficRecord.mac, SUM(TrafficRecord.sentPackets), SUM(TrafficRecord.sentBytes), SUM(TrafficRecord.receivedPackets), SUM(TrafficRecord.receivedBytes) FROM TrafficRecord LEFT JOIN TrafficRecord AS Next ON TrafficRecord.id = Next.previousId WHERE Next.id IS NULL GROUP BY TrafficRecord.mac;`
35 lines
1018 B
Kotlin
35 lines
1018 B
Kotlin
package be.mygod.vpnhotspot.util
|
|
|
|
import java.util.concurrent.ConcurrentHashMap
|
|
|
|
/**
|
|
* These class are based off https://github.com/1blustone/kotlin-events.
|
|
*/
|
|
open class Event0 : ConcurrentHashMap<Any, () -> Unit>() {
|
|
operator fun invoke() {
|
|
for ((_, handler) in this) handler()
|
|
}
|
|
}
|
|
|
|
class StickyEvent0 : Event0() {
|
|
override fun put(key: Any, value: () -> Unit): (() -> Unit)? =
|
|
super.put(key, value).also { if (it == null) value() }
|
|
}
|
|
|
|
open class Event1<T> : ConcurrentHashMap<Any, (T) -> Unit>() {
|
|
operator fun invoke(arg: T) {
|
|
for ((_, handler) in this) handler(arg)
|
|
}
|
|
}
|
|
|
|
class StickyEvent1<T>(private val fire: () -> T) : Event1<T>() {
|
|
override fun put(key: Any, value: (T) -> Unit): ((T) -> Unit)? =
|
|
super.put(key, value).also { if (it == null) value(fire()) }
|
|
}
|
|
|
|
open class Event2<T1, T2> : ConcurrentHashMap<Any, (T1, T2) -> Unit>() {
|
|
operator fun invoke(arg1: T1, arg2: T2) {
|
|
for ((_, handler) in this) handler(arg1, arg2)
|
|
}
|
|
}
|