package Ġcom . gab riel . poke dex . core . platform Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠG ab riel Ċ Ġ* Ġon Ġ 1 7 / 1 0 / 2 0 1 9 Ċ Ġ* Ġat Ġ 1 1 : 5 0 Ċ Ġ* Ġat ĠUse mobile Ċ Ġ*/ Ċ class ĠSingle Live Event < T > Ġ: ĠMutable LiveData < T >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Observer Priority : ĠObserver < in ĠT >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Pending Priority Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠ Ġprivate Ġval Ġm Pending Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠ Ġfun Ġobserve Priority ( owner : ĠLifecycle Owner , Ġobserver : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Observer Priority Ġ= Ġobserver ĊĠĠĠĠĠĠĠ Ġobserve ( owner , Ġobserver ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoverride Ġfun Ġobserve ( owner : ĠLifecycle Owner , Ġobserver : ĠObserver < in ĠT >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Active Observer s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Multiple Ġob servers Ġregistered Ġbut Ġonly Ġone Ġwill Ġbe Ġnotified Ġof Ġchanges .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOb serve Ġthe Ġinternal ĠMutable LiveData ĊĠĠĠĠĠĠĠ Ġsuper . observe ( owner , ĠObserver Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Observer Priority Ġ== Ġnull Ġ|| Ġowner . lifecycle . currentState Ġ== ĠLifecycle . State . DESTROY ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Pending . compare AndSet ( true , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Pending Priority . compare AndSet ( true , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer Priority ?. on Changed ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoverride Ġfun ĠsetValue ( t : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Pending . set ( true ) ĊĠĠĠĠĠĠĠ Ġm Pending Priority . set ( true ) ĊĠĠĠĠĠĠĠ Ġsuper . setValue ( t ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsed Ġfor Ġcases Ġwhere ĠT Ġis ĠVoid , Ġto Ġmake Ġcalls Ġcleaner . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġcall () Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Single Live Event " ĊĠĠĠ Ġ} Ċ }