/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġandroidx . work . impl . constraints . track ers Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . annotation . Restrict To Ċ import Ġandroidx . work . Logger Ċ import Ġandroidx . work . impl . constraints . Constraint Listener Ċ import Ġandroidx . work . impl . utils . task executor . Task Executor Ċ import Ġjava . util . Linked HashSet Ċ Ċ /** Ċ Ġ* ĠA Ġbase Ġfor Ġtracking Ġconstraints Ġand Ġnotify ing Ġlisteners Ġof Ġchanges . Ċ Ġ* Ċ Ġ* Ġ@ param Ġ< T > Ġthe Ġconstraint Ġdata Ġtype Ġobserved Ġby Ġthis Ġtracker Ċ Ġ* Ġ@ hide Ċ Ġ*/ Ċ @ Restrict To ( Restrict To . Scope . LIBRARY _ GROUP ) Ċ abstract Ġclass ĠConstraint Tracker < T > Ġprotected Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġtask Executor : ĠTask Executor Ċ ) Ġ{ ĊĠĠĠ Ġprotected Ġval Ġapp Context : ĠContext Ġ= Ġcontext . application Context ĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠAny () ĊĠĠĠ Ġprivate Ġval Ġlisteners Ġ= ĠLinked HashSet < Constraint Listener < T >>() ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent State : ĠT ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġthe Ġgiven Ġlistener Ġfor Ġtracking . ĊĠĠĠĠ Ġ* ĠThis Ġmay Ġcause Ġ[. get InitialState ] Ġand Ġ[. start Tracking ] Ġto Ġbe Ġinvoked . ĊĠĠĠĠ Ġ* ĠIf Ġa Ġstate Ġis Ġset , Ġthis Ġwill Ġimmediately Ġnotify Ġthe Ġgiven Ġlistener . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġtarget Ġlistener Ġto Ġstart Ġnotify ing ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Listener ( listener : ĠConstraint Listener < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( listeners . add ( listener )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( listeners . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠinitialState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . get (). debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ"${ java Class . simple Name }: Ġinitial Ġstate Ġ= Ġ$ currentState " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Tracking () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Constraint Changed ( currentState Ġas ĠT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġthe Ġgiven Ġlistener Ġfrom Ġtracking . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġlistener Ġto Ġstop Ġnotify ing . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Listener ( listener : ĠConstraint Listener < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( listeners . remove ( listener ) Ġ&& Ġlisteners . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Tracking () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġstate : ĠT ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent State Ġ?: ĠinitialState ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset ( newState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentState Ġ!= Ġnull Ġ&& Ġ( currentState Ġ== ĠnewState )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= ĠnewState ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon Constraint Changed Ġmay Ġlead Ġto Ġcalls Ġto Ġadd Listener Ġor Ġremove Listener . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġcan Ġpotentially Ġresult Ġin Ġa Ġmodification Ġto Ġthe Ġset Ġwhile Ġit Ġis Ġbeing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġiter ated Ġover , Ġso Ġwe Ġhandle Ġthis Ġby Ġcreating Ġa Ġcopy Ġand Ġusing Ġthat Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġiteration . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlisteners List Ġ= Ġlisteners . toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Executor . main Thread Executor . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners List . forEach Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcurrent State Ġwas Ġinitialized Ġby Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Constraint Changed ( currentState Ġas ĠT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermines Ġthe Ġinitial Ġstate Ġof Ġthe Ġconstraint Ġbeing Ġtracked . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġval ĠinitialState : ĠT ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġtracking Ġfor Ġconstraint Ġstate Ġchanges . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġstart Tracking () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop Ġtracking Ġfor Ġconstraint Ġstate Ġchanges . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġstop Tracking () Ċ } Ċ Ċ private Ġval ĠTAG Ġ= ĠLogger . tag With Prefix (" Constraint Tracker ") Ċ