package Ġru . n 1 ks . f 1 dashboard . capture Ċ Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . util . Log Ċ import Ġio . reactivex . Back pressure Strategy Ċ import Ġio . reactivex . Emitter Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . util . zip . GZIP OutputStream Ċ Ċ class ĠLive Capture Worker ( ĊĠĠĠ Ġprivate Ġval Ġfile : ĠFile Ċ ) Ġ: ĠAuto Closeable Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Live Capture Worker " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġframe Count : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġval ĠoutputStream Ġ= ĠG ZIP OutputStream ( File OutputStream ( file )) ĊĠĠĠ Ġprivate Ġval Ġstart Timestamp Ġ= ĠSystem Clock . uptime Millis () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġflow Emitter : ĠEmit ter < ByteArray > ĊĠĠĠ Ġprivate Ġval Ġflow Ġ= ĠFlow able . create < ByteArray >({ ĊĠĠĠĠĠĠĠ Ġflow Emitter Ġ= Ġit ĊĠĠĠ Ġ}, ĠBack pressure Strategy . BUFFER ) ĊĠĠĠ Ġprivate Ġval Ġflow Disposable : ĠDis posable ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" open Ġfile Ġ" Ġ+ Ġfile . path ) ĊĠĠĠĠĠĠĠ Ġflow Disposable Ġ= Ġflow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Live Capture Frame ( System Clock . uptime Millis () Ġ- Ġstart Timestamp , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Schedulers . new Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do Finally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" close Ġfile Ġ" Ġ+ Ġfile . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . apply Ġ{ Ġfinish (); Ġflush (); Ġclose () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġit . writeTo ( output Stream ); ĠoutputStream . flush () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Packet ( packet : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġframe Count ++ ĊĠĠĠĠĠĠĠ Ġflow Emitter . onNext ( packet ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġflow Disposable . dispose () ĊĠĠĠ Ġ} Ċ } Ċ