/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 Ġ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 . window . java Ċ Ċ import Ġandroidx . core . util . Consumer Ċ import Ġandroidx . window . Window Info Repo Ċ import Ġandroidx . window . Window Layout Info Ċ import Ġandroidx . window . Window Metrics Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . as Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util . concurrent . Executor Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġkotlin . concurrent . with Lock Ċ Ċ /** Ċ Ġ* ĠAn Ġadapted Ġinterface Ġfor Ġ[ Window Info Repo ] Ġthat Ġallows Ġlistening Ġfor Ġevents Ġvia Ġa Ġcallback Ċ Ġ* Ġsh aped ĠAPI . Ċ Ġ*/ Ċ class ĠWindow Info Repo Callback Adapter ( ĊĠĠĠ Ġprivate Ġval Ġrepo : ĠWindow Info Repo Ċ ) Ġ: ĠWindow Info Repo Ġby Ġrepo Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġ[ Re entrant Lock ] Ġto Ġprotect Ġagainst Ġconcurrent Ġaccess Ġto Ġ[ consumer To Job Map ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠRe entrant Lock () ĊĠĠĠ Ġprivate Ġval Ġconsumer To Job Map Ġ= Ġmutable Map Of < Consumer <* >, ĠJob >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġa Ġlistener Ġto Ġconsume Ġ[ Window Metrics ] Ġvalues . ĠIf Ġthe Ġsame Ġconsumer Ġis Ġregistered ĊĠĠĠĠ Ġ* Ġtwice Ġthen Ġthis Ġmethod Ġis Ġa Ġno - op . ĊĠĠĠĠ Ġ* Ġ@ see ĠWindow Info Repo . current Window Metrics ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Current Window Metrics Listener ( executor : ĠExecutor , Ġconsumer : ĠConsumer < Window Metrics >) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Listener ( executor , Ġconsumer , Ġrepo . current Window Metrics ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġa Ġlistener Ġto Ġstop Ġconsuming Ġ[ Window Metrics ] Ġvalues . ĠIf Ġthe Ġlistener Ġhas Ġalready ĊĠĠĠĠ Ġ* Ġbeen Ġremoved Ġthen Ġthis Ġis Ġa Ġno - op . ĊĠĠĠĠ Ġ* Ġ@ see ĠWindow Info Repo . current Window Metrics ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Current Window Metrics Listener ( consumer : ĠConsumer < Window Metrics >) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Listener ( consumer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġa Ġlistener Ġto Ġconsume Ġ[ Window Layout Info ] Ġvalues . ĠIf Ġthe Ġsame Ġconsumer Ġis ĊĠĠĠĠ Ġ* Ġregistered Ġtwice Ġthen Ġthis Ġmethod Ġis Ġa Ġno - op . ĊĠĠĠĠ Ġ* Ġ@ see ĠWindow Info Repo . window Layout Info ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Window Layout Info Listener ( ĊĠĠĠĠĠĠĠ Ġexecutor : ĠExecutor , ĊĠĠĠĠĠĠĠ Ġconsumer : ĠConsumer < Window Layout Info > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Listener ( executor , Ġconsumer , Ġrepo . window Layout Info ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġa Ġlistener Ġto Ġstop Ġconsuming Ġ[ Window Layout Info ] Ġvalues . ĠIf Ġthe Ġlistener Ġhas Ġalready ĊĠĠĠĠ Ġ* Ġbeen Ġremoved Ġthen Ġthis Ġis Ġa Ġno - op . ĊĠĠĠĠ Ġ* Ġ@ see ĠWindow Info Repo . window Layout Info ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Window Layout Info Listener ( consumer : ĠConsumer < Window Layout Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Listener ( consumer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGeneric Ġmethod Ġfor Ġregistering Ġa Ġ[ Consumer ] Ġto Ġcollect Ġthe Ġvalues Ġfrom Ġa Ġ[ Flow ]. ĊĠĠĠĠ Ġ* ĠRegister ing Ġthe Ġsame Ġ[ Consumer ] Ġis Ġa Ġno - op . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġadd Listener ( executor : ĠExecutor , Ġconsumer : ĠConsumer < T >, Ġflow : ĠFlow < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( consumer To Job Map [ consumer ] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= ĠCor outine Scope ( executor . as Coroutine Dispatcher ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer To Job Map [ consumer ] Ġ= Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . collect Ġ{ Ġconsumer . accept ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGeneric Ġmethod Ġfor Ġcancel ing Ġa Ġ[ Job ] Ġrelated Ġto Ġa Ġconsumer . ĠCancel ing Ġtwice Ġin Ġa Ġrow Ġis Ġa ĊĠĠĠĠ Ġ* Ġno - op . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġremove Listener ( consumer : ĠConsumer <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer To Job Map [ consumer ]?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer To Job Map . remove ( consumer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }