package Ġorg . sage b ion etwork s . assessment model . pass ived ata . recorder Ċ Ċ import Ġandroid . content . Context Ċ import Ġio . github . a ak ira . n api er . N api er Ċ import Ġkotlinx . coroutines . Cancellation Exception Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . datetime . Clock Ċ import Ġorg . sage b ion etwork s . assessment model . pass ived ata . async action . Async Action Configuration Ċ import Ġorg . sage b ion etwork s . assessment model . pass ived ata . async action . Async Action Status Ċ import Ġorg . sage b ion etwork s . assessment model . pass ived ata . recorder . motion . Flow Recorder Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Print Stream Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġfor Ġa ĠRec order Ġthat Ġreads Ġfrom Ġa ĠFlow Ġand Ġproduces Ġa ĠFile Result Ġin ĠJson Ġformat . Ċ Ġ*/ Ċ abstract Ġclass ĠFlow Json File Result Recorder < in ĠE >( ĊĠĠĠ Ġoverride Ġval Ġidentifier : ĠString , ĊĠĠĠ Ġoverride Ġval Ġconfiguration : ĠAsync Action Configuration , ĊĠĠĠ Ġoverride Ġval Ġscope : ĠCor outine Scope , ĊĠĠĠ Ġflow : ĠFlow < E >, ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ċ ) Ġ: ĠFlow Recorder < E , ĠFile Result >( ĊĠĠĠ Ġidentifier , Ġconfiguration , Ġscope , Ġflow Ċ ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġresult Ġ= ĠComp letable Deferred < File Result >() ĊĊĠĠĠ Ġprivate Ġval ĠJSON _ MIME _ CONTENT _ TYPE Ġ= Ġ" application / json " ĊĠĠĠ Ġprivate Ġval ĠJSON _ FILE _ START Ġ= Ġ"[" ĊĠĠĠ Ġprivate Ġval ĠJSON _ FILE _ END Ġ= Ġ" ]" ĊĠĠĠ Ġprivate Ġval ĠJSON _ OBJECT _ DE LI MIN ATOR Ġ= Ġ"," ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfile : ĠFile ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġfile Print Stream : ĠPrint Stream ĊĊĠĠĠ Ġprivate Ġval Ġis First JsonObject Ġ= ĠAtomic Boolean ( true ) ĊĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Ġ= Ġget Task OutputFile ("$ identifier . json ") ĊĠĠĠĠĠĠĠ Ġfile Print Stream Ġ= ĠPrint Stream ( file ) ĊĠĠĠĠĠĠĠ Ġfile Print Stream . print ( JSON _ FILE _ START ) ĊĠĠĠĠĠĠĠ Ġsuper . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġopen Ġfun Ġget Task OutputFile ( ĊĠĠĠĠĠĠĠ Ġfilename : ĠString ĊĠĠĠ Ġ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġcontext . files Dir ĊĠĠĠĠĠĠĠ Ġval Ġoutput Filename Ġ= Ġ"${ UUID . randomUUID () }/ $ filename " ĊĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= ĠFile ( path , Ġoutput Filename ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! outputFile . isFile Ġ&& Ġ! outputFile . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoutputFile . parent File !!. mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoutputFile . createNew File () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠoutputFile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġhandle Element ( e : ĠE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is First JsonObject . compare AndSet ( true , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Print Stream . print ( JSON _ OBJECT _ DE LI MIN ATOR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġserialize Element ( e ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġserialize Element ( e : ĠE ) ĊĊĠĠĠ Ġoverride Ġfun Ġcompleted Handling Flow ( e : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠN api er . i (" Completed Ġhandling Ġflow ") ĊĠĠĠĠĠĠĠ Ġif Ġ( e Ġ== Ġnull Ġ|| Ġe Ġis ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Print Stream . print ( JSON _ FILE _ END ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . complete ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ?: ĠClock . System . now (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠendTime Ġ?: ĠClock . System . now (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSON _ MIME _ CONTENT _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ async Status Ġ= ĠAsync Action Status . FINISHED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Print Stream . close () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . complete Exception ally ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Print Stream . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }