crypto: Split out the live devices observer

This commit is contained in:
Damir Jelić 2021-04-02 15:30:07 +02:00
parent 0b064f647a
commit 182fc84186
1 changed files with 19 additions and 15 deletions

View File

@ -65,21 +65,21 @@ private class CryptoProgressListener(listener: ProgressListener?) : RustProgress
internal class LiveDevice( internal class LiveDevice(
userIds: List<String>, userIds: List<String>,
machine: OlmMachine observer: DeviceUpdateObserver
) : MutableLiveData<List<CryptoDeviceInfo>>() { ) : MutableLiveData<List<CryptoDeviceInfo>>() {
var userIds: List<String> = userIds var userIds: List<String> = userIds
private var machine: OlmMachine = machine private var observer: DeviceUpdateObserver = observer
private val listener = { devices: List<CryptoDeviceInfo> -> private val listener = { devices: List<CryptoDeviceInfo> ->
value = devices value = devices
} }
override fun onActive() { override fun onActive() {
machine.addDeviceUpdateListener(this) observer.addDeviceUpdateListener(this)
} }
override fun onInactive() { override fun onInactive() {
machine.removeDeviceUpdateListener(this) observer.removeDeviceUpdateListener(this)
} }
} }
@ -128,9 +128,21 @@ class Device(inner: InnerDevice, machine: InnerMachine) {
} }
} }
internal class DeviceUpdateObserver() {
internal val listeners = HashMap<LiveDevice, List<String>>()
fun addDeviceUpdateListener(device: LiveDevice) {
listeners.set(device, device.userIds)
}
fun removeDeviceUpdateListener(device: LiveDevice) {
listeners.remove(device)
}
}
internal class OlmMachine(user_id: String, device_id: String, path: File) { internal class OlmMachine(user_id: String, device_id: String, path: File) {
private val inner: InnerMachine = InnerMachine(user_id, device_id, path.toString()) private val inner: InnerMachine = InnerMachine(user_id, device_id, path.toString())
private val deviceUpdateListeners = HashMap<LiveDevice, List<String>>() private val deviceUpdateObserver = DeviceUpdateObserver()
fun userId(): String { fun userId(): String {
return this.inner.userId() return this.inner.userId()
@ -159,16 +171,8 @@ internal class OlmMachine(user_id: String, device_id: String, path: File) {
) )
} }
fun addDeviceUpdateListener(device: LiveDevice) {
deviceUpdateListeners.set(device, device.userIds)
}
fun removeDeviceUpdateListener(device: LiveDevice) {
deviceUpdateListeners.remove(device)
}
suspend fun updateLiveDevices() { suspend fun updateLiveDevices() {
for ((liveDevice, users) in deviceUpdateListeners) { for ((liveDevice, users) in deviceUpdateObserver.listeners) {
val devices = getUserDevices(users) val devices = getUserDevices(users)
liveDevice.postValue(devices) liveDevice.postValue(devices)
} }
@ -251,7 +255,7 @@ internal class OlmMachine(user_id: String, device_id: String, path: File) {
suspend fun getLiveDevices(userIds: List<String>): LiveData<List<CryptoDeviceInfo>> { suspend fun getLiveDevices(userIds: List<String>): LiveData<List<CryptoDeviceInfo>> {
val plainDevices = getUserDevices(userIds) val plainDevices = getUserDevices(userIds)
val devices = LiveDevice(userIds, this) val devices = LiveDevice(userIds, deviceUpdateObserver)
devices.setValue(plainDevices) devices.setValue(plainDevices)
return devices return devices