package Ġat . spec ure . measurement . signal Ċ Ċ import Ġandroid . os . Binder Ċ import Ġandroid . os . Handler Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġat . spec ure . data . entity . Connectivity State Record Ċ import Ġat . spec ure . data . entity . Signal Measurement Chunk Ċ import Ġat . spec ure . data . entity . Signal Measurement Record Ċ import Ġat . spec ure . data . repository . Measurement Repository Ċ import Ġat . spec ure . data . repository . Signal Measurement Repository Ċ import Ġat . spec ure . data . repository . TestData Repository Ċ import Ġat . spec ure . info . cell . Cell Info Watcher Ċ import Ġat . spec ure . info . cell . Cell Network Info Ċ import Ġat . spec ure . info . connectivity . Connectivity State Bundle Ċ import Ġat . spec ure . info . connectivity . Connectivity Watcher Ċ import Ġat . spec ure . info . network . Active Network LiveData Ċ import Ġat . spec ure . info . network . Active Network Watcher Ċ import Ġat . spec ure . info . network . Mobile Network Type Ċ import Ġat . spec ure . info . network . Network Info Ċ import Ġat . spec ure . info . network . Wifi Network Info Ċ import Ġat . spec ure . info . strength . Signal Strength Info Ċ import Ġat . spec ure . info . strength . Signal Strength LiveData Ċ import Ġat . spec ure . info . strength . Signal Strength Watcher Ċ import Ġat . spec ure . location . Location Info Ċ import Ġat . spec ure . location . Location State Ċ import Ġat . spec ure . location . Location Watcher Ċ import Ġat . spec ure . location . cell . Cell Location Info Ċ import Ġat . spec ure . location . cell . Cell Location LiveData Ċ import Ġat . spec ure . location . cell . Cell Location Watcher Ċ import Ġat . spec ure . test . to DeviceInfo Location Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . Timer Ċ import Ġjava . util . Timer Task Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ private Ġconst Ġval ĠMAX _ SIGNAL _ COUNT _ PER _ CHUNK Ġ= Ġ 2 5 Ċ private Ġconst Ġval ĠMAX _ SIGNAL _ UP TIME _ PER _ CHUNK _ MIN Ġ= Ġ 1 0 L Ċ private Ġconst Ġval ĠMAX _ TIME _ NETWORK _ UN RE ACH ABLE _ SECONDS Ġ= Ġ 1 0 L Ċ Ċ @ Singleton Ċ class ĠSignal Measurement Processor Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠTest Data Repository , ĊĠĠĠ Ġprivate Ġval Ġlocation Watcher : ĠLocation Watcher , ĊĠĠĠ Ġprivate Ġval Ġsignal Strength LiveData : ĠSignal Strength LiveData , ĊĠĠĠ Ġprivate Ġval Ġsignal Strength Watcher : ĠSignal Strength Watcher , ĊĠĠĠ Ġprivate Ġval Ġactive Network LiveData : ĠActive Network LiveData , ĊĠĠĠ Ġprivate Ġval Ġactive Network Watcher : ĠActive Network Watcher , ĊĠĠĠ Ġprivate Ġval Ġcell Info Watcher : ĠCell Info Watcher , ĊĠĠĠ Ġprivate Ġval Ġcell Location LiveData : ĠCell Location LiveData , ĊĠĠĠ Ġprivate Ġval Ġcell Location Watcher : ĠCell Location Watcher , ĊĠĠĠ Ġprivate Ġval Ġsignal Repository : ĠSignal Measurement Repository , ĊĠĠĠ Ġprivate Ġval Ġconnectivity Watcher : ĠConnect ivity Watcher , ĊĠĠĠ Ġprivate Ġval Ġmeasurement Repository : ĠMeasurement Repository Ċ ) Ġ: ĠB inder (), ĠSignal Measurement Producer Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġis Un stop p able Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġ_ isActive Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġ_ is Paused Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġ_ active State LiveData Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġprivate Ġval Ġ_ paused State LiveData Ġ= ĠMutable LiveData < Boolean >() ĊĊĠĠĠ Ġprivate Ġvar Ġnetwork Info : ĠNetwork Info ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġrecord : ĠSignal Measurement Record ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġchunk : ĠSignal Measurement Chunk ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġlast Seen Network Info : ĠNetwork Info ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlast Seen Network Record : ĠSignal Measurement Record ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlast Seen Network Timestamp Millis : ĠLong ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġun connected Timer Ġ= ĠTimer () ĊĊĠĠĠ Ġprivate Ġvar Ġchunk DataSize Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġchunk Count Down Runner Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . i (" Chunk Ġcount down Ġtimer Ġreached ") ĊĠĠĠĠĠĠĠ Ġcommit Chunk Data () ĊĠĠĠĠĠĠĠ Ġcreate New Chunk () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġchunk Count Down Handler Ġ= ĠHandler () ĊĊĠĠĠ Ġprivate Ġvar Ġlocation Info : ĠLocation Info ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsignal Strength Info : ĠSignal Strength Info ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcell Location : ĠCell Location Info ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġval ĠisActive : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ isActive ĊĊĠĠĠ Ġoverride Ġval Ġis Paused : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ is Paused ĊĊĠĠĠ Ġoverride Ġval Ġactive State LiveData : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ active State LiveData ĊĊĠĠĠ Ġoverride Ġval Ġpaused State LiveData : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ paused State LiveData ĊĊĠĠĠ Ġoverride Ġfun Ġset End Alarm () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnot Ġnecessary Ġto Ġimplement Ġhere ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart Measurement ( un stop p able : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . w (" start Measurement ") ĊĠĠĠĠĠĠĠ Ġ_ isActive Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġis Un stop p able Ġ= Ġun stop p able ĊĠĠĠĠĠĠĠ Ġ_ active State LiveData . post Value (_ isActive ) ĊĠĠĠĠĠĠĠ Ġ_ paused State LiveData . post Value (_ is Paused ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle New Network ( active Network Watcher . current Network Info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop Measurement ( un stop p able : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . w (" stop Measurement ") ĊĊĠĠĠĠĠĠĠ Ġchunk ?. state Ġ= ĠSignal Measurement State . SUCCESS ĊĠĠĠĠĠĠĠ Ġcommit Chunk Data () ĊĠĠĠĠĠĠĠ Ġis Un stop p able Ġ= Ġun stop p able ĊĠĠĠĠĠĠĠ Ġ_ isActive Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ_ is Paused Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġnetwork Info Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrecord Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġchunk Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ_ active State LiveData . post Value (_ isActive ) ĊĠĠĠĠĠĠĠ Ġ_ paused State LiveData . post Value (_ is Paused ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpause Measurement ( un stop p able : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . w (" pause Measurement ") ĊĠĠĠĠĠĠĠ Ġis Un stop p able Ġ= Ġun stop p able ĊĠĠĠĠĠĠĠ Ġ_ is Paused Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ_ paused State LiveData . post Value (_ is Paused ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġresume Measurement ( un stop p able : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . w (" resume Measurement ") ĊĠĠĠĠĠĠĠ Ġis Un stop p able Ġ= Ġun stop p able ĊĠĠĠĠĠĠĠ Ġ_ is Paused Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ_ paused State LiveData . post Value (_ is Paused ) ĊĠĠĠĠĠĠĠ Ġif Ġ( isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle New Network ( active Network Watcher . current Network Info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbind ( owner : ĠLifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactive Network LiveData . observe ( owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isActive Ġ&& Ġ! is Paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle New Network ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( location Watcher . state Ġ== ĠLocation State . ENABLED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Info Ġ= Ġlocation Watcher . latest Location ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlocation Watcher . live Data . observe ( owner , ĠObserver Ġ{ Ġinfo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location Watcher . state Ġ== ĠLocation State . ENABLED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Info Ġ= Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isActive Ġ&& Ġ! is Paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Location Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġsignal Strength Info Ġ= Ġsignal Strength Watcher . last Signal Strength ĊĠĠĠĠĠĠĠ Ġsignal Strength LiveData . observe ( owner , ĠObserver Ġ{ Ġinfo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Strength Info Ġ= Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isActive Ġ&& Ġ! is Paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Signal Strength Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġcell Location Ġ= Ġcell Location Watcher . latest Location ĊĠĠĠĠĠĠĠ Ġcell Location LiveData . observe ( owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcell Location Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isActive Ġ&& Ġ! is Paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Cell Location () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġconnectivity Watcher . connectivity State LiveData . observe ( owner , ĠObserver Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Connectivity State ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplan Un connected Clean () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun connected Timer . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun connected Timer . purge () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun connected Timer Ġ= ĠTimer () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Signal Ġmeasurement Ġun connected Ġgap Ġtimeout Ġstarted ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun connected Timer . schedule ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Signal Ġmeasurement Ġun connected Ġgap Ġtimeout Ġreached ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclean Last Network () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS . to Millis ( MAX _ TIME _ NETWORK _ UN RE ACH ABLE _ SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcancel Pl anned Un connected Clean ing () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun connected Timer . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun connected Timer . purge () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Signal Ġmeasurement Ġun connected Ġgap Ġtimeout Ġremoved ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclean Last Network () Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Seen Network Info Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġlast Seen Network Record Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġlast Seen Network Timestamp Millis Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle New Network ( new Info : ĠNetwork Info ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Info Ġ= Ġnetwork Info ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Info Ġ== Ġnull Ġ&& Ġcurrent Info Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Network Ġbecome Ġunavailable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Chunk Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Seen Network Info Ġ= Ġnetwork Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Seen Network Record Ġ= Ġrecord ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Seen Network Timestamp Millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplan Un connected Clean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Info Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Info Ġ!= Ġnull Ġ&& Ġcurrent Info Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Network Ġappeared ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Info Ġ= Ġnew Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( last Seen Network Info Ġ!= Ġnull ) Ġ&& Ġ( last Seen Network Info ?. type Ġ== Ġnew Info . type ) Ġ&& Ġ( last Seen Network Timestamp Millis ?. plus ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS . to Millis ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMAX _ TIME _ NETWORK _ UN RE ACH ABLE _ SECONDS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġ- 1 Ġ>= ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Info Ġ= Ġlast Seen Network Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Ġ= Ġlast Seen Network Record ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclean Last Network () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Pl anned Un connected Clean ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Network Ġappeared Ġ${ record ?. mobile Network Type ?. name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclean Last Network () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Pl anned Un connected Clean ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate New Record ( new Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit Ġmust Ġbe Ġstarted Ġlike Ġnew Ġchunk Ġon Ġdifferent Ġtype Ġof Ġthe Ġnetwork Ġbecause Ġnetwork Ġtype Ġis Ġcommon Ġfor Ġentire Ġchunk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Info Ġ!= Ġnull Ġ&& Ġcurrent Info Ġ!= Ġnull Ġ&& Ġcurrent Info . type Ġ!= Ġnew Info . type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Network Ġchanged ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Info Ġ= Ġnew Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Chunk Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate New Record ( new Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" New Ġnetwork Ġother Ġcase Ġ-> Ġnew : Ġ${ new Info ?. cell UUID } Ġold Ġ${ current Info ?. cell UUID }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate New Record ( network Info : ĠNetwork Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrecord Ġ= ĠSignal Measurement Record ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork UUID Ġ= Ġnetwork Info . cell UUID , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransport Type Ġ= Ġnetwork Info . type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġlocation Info . to DeviceInfo Location () ĊĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Repository . save And Register Record ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchunk Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcreate New Chunk () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcommit Chunk Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġchunk ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Commit Ġchunk Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Repository . send Measurement Chunk ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate New Chunk () Ġ{ ĊĠĠĠĠĠĠĠ Ġrecord ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Ġ= ĠSignal Measurement Chunk ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasurement Id Ġ= Ġit . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Number Ġ= Ġchunk ?. sequence Number ?. inc () Ġ?: Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠSignal Measurement State . RUNNING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Nan os Ġ= ĠSystem . nano Time (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmission Retry Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġchunk Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Repository . save Measurement Chunk ( chunk ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk DataSize Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschedule Count Down Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" New Ġchunk Ġcreated ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Wlan Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Cell Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Tele phony Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Signal Strength Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Cell Location () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Location Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Capabilities () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Permissions Status () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġschedule Count Down Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġchunk Count Down Handler . remove Callbacks ( chunk Count Down Runner ) ĊĠĠĠĠĠĠĠ Ġchunk Count Down Handler . post Delayed ( chunk Count Down Runner , ĠTimeUnit . MIN UTES . to Millis ( MAX _ SIGNAL _ UP TIME _ PER _ CHUNK _ MIN )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Connectivity State ( bundle : ĠConnect ivity State Bundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchunk ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save Connectivity State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnect ivity State Record ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuuid Ġ= Ġit . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġbundle . state , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġbundle . message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Nan os Ġ= Ġbundle . time Nan os ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Cell Info () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= Ġchunk ?. id ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġnetwork Info ĊĠĠĠĠĠĠĠ Ġif Ġ( uuid Ġ!= Ġnull Ġ&& Ġinfo Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo List : ĠList < Network Info > Ġ= Ġwhen Ġ( info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ifi Network Info Ġ-> ĠlistOf ( info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCell Network Info Ġ-> Ġcell Info Watcher . all Cell Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown Ġcell Ġinfo Ġ${ info . java Class . simple Name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save Cell Info ( uuid , Ġinfo List . toList (), Ġrecord ?. startTime Nan os Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Capabilities () Ġ{ ĊĠĠĠĠĠĠĠ Ġchunk ?. id ?. let Ġ{ Ġmeasurement Repository . save Capabilities ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Location Info () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= Ġchunk ?. id ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġlocation Info ĊĠĠĠĠĠĠĠ Ġif Ġ( uuid Ġ!= Ġnull Ġ&& Ġlocation Ġ!= Ġnull Ġ&& Ġlocation Watcher . state Ġ== ĠLocation State . ENABLED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save Geo Location ( uuid , Ġlocation , Ġrecord ?. startTime Nan os Ġ?: Ġ 0 , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Cell Location () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= Ġchunk ?. id ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġcell Location ĊĠĠĠĠĠĠĠ Ġif Ġ( uuid Ġ!= Ġnull Ġ&& Ġlocation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save Cell Location ( uuid , Ġlocation , Ġrecord ?. startTime Nan os Ġ?: Ġ 0 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Signal Strength Info () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= Ġchunk ?. id ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġsignal Strength Info ĊĠĠĠĠĠĠĠ Ġif Ġ( uuid Ġ!= Ġnull Ġ&& Ġinfo Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell UUID Ġ= Ġnetwork Info ?. cell UUID Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmobile Network Type : ĠMobile Network Type ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( network Info Ġ!= Ġnull Ġ&& Ġnetwork Info Ġis ĠCell Network Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmobile Network Type Ġ= Ġ( network Info Ġas ĠCell Network Info ). network Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Signal Ġsaving Ġtime ĠS MP : Ġstarting Ġtime : Ġ${ record ?. startTime Nan os } ĠĠ Ġcurrent Ġtime : Ġ${ System . nano Time () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save Signal Strength ( uuid , Ġcell UUID , Ġmobile Network Type , Ġinfo , Ġrecord ?. startTime Nan os Ġ?: Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk DataSize ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chunk DataSize Ġ>= ĠMAX _ SIGNAL _ COUNT _ PER _ CHUNK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v (" Chunk Ġmax Ġsize Ġreached : Ġ$ chunk DataSize ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Chunk Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate New Chunk () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Permissions Status () Ġ{ ĊĠĠĠĠĠĠĠ Ġchunk ?. id ?. let Ġ{ Ġmeasurement Repository . save Permissions Status ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Wlan Info () Ġ{ ĊĠĠĠĠĠĠĠ Ġrecord ?. let Ġ{ Ġmeasurement Repository . save Wlan Info ( it . id ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Tele phony Info () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġnetwork Info ĊĠĠĠĠĠĠĠ Ġif Ġ( info Ġ!= Ġnull Ġ&& Ġinfo Ġis ĠCell Network Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . mobile Network Type Ġ= Ġinfo . network Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Repository . update Signal Measurement Record ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġchunk ?. id ?. let Ġ{ Ġmeasurement Repository . save Tele phony Info ( it ) Ġ} ĊĠĠĠ Ġ} Ċ }