package Ġcom . m ct ech . library . architecture Ċ Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . Mediator LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ class ĠSingle Live Event < T > Ġ: ĠMed iator LiveData < T >() Ġ{ ĊĠĠĠ Ġprivate Ġval Ġm Pending Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠ Ġprivate Ġval Ġm Observer s Ġ= Ġmutable Map Of < String , ĠObserver < in ĠT >>() ĊĊĠĠĠ Ġfun Ġobserve ( key Ġ: ĠString , Ġowner : ĠLifecycle Owner , Ġobserver : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Observer s [ key ] Ġ= Ġobserver ĊĠĠĠĠĠĠĠ Ġsuper . observe ( owner , ĠObserver < T > Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( m Observer s ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Pending . compare AndSet ( true , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . on Changed ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Observer ( key Ġ: ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( m Observer s ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer s . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . key Ġ== Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . remove Observer ( it . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer s . remove ( key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoverride Ġfun ĠsetValue ( t : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Pending . set ( true ) ĊĠĠĠĠĠĠĠ Ġsuper . setValue ( t ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsed Ġfor Ġcases Ġwhere ĠT Ġis ĠVoid , Ġto Ġmake Ġcalls Ġcleaner . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġcall () Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġnull ĊĠĠĠ Ġ} Ċ }