package com.tamarasdk.util import androidx.annotation.MainThread import androidx.collection.ArraySet import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.Observer class SingleLiveEvent : MediatorLiveData() { private val observers = ArraySet>() @MainThread override fun observe(owner: LifecycleOwner, observer: Observer) { val wrapper = ObserverWrapper(observer) observers.add(wrapper) super.observe(owner, wrapper) } @MainThread override fun removeObserver(observer: Observer) { if (observers.remove(observer)) { super.removeObserver(observer) return } val iterator = observers.iterator() while (iterator.hasNext()) { val wrapper = iterator.next() if (wrapper.observer == observer) { iterator.remove() super.removeObserver(wrapper) break } } } @MainThread override fun setValue(t: T?) { observers.forEach { it.newValue() } super.setValue(t) } private class ObserverWrapper(val observer: Observer) : Observer { private var pending = false override fun onChanged(t: T) { if (pending) { pending = false observer.onChanged(t) } } fun newValue() { pending = true } } }