/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠD uck Duck Go Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . duck duck go . mobile . android . vpn . pixels Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Lifecycle Observer Ċ import Ġandroidx . lifecycle . On Lifecycle Event Ċ import Ġandroidx . work .* Ċ import Ġcom . duck duck go . app . global . plugins . worker . Worker Injector Plugin Ċ import Ġcom . duck duck go . di . scopes . App Object Graph Ċ import Ġcom . duck duck go . mobile . android . vpn . dao . Vpn Service State Stats Dao Ċ import Ġcom . duck duck go . mobile . android . vpn . model . Vpn Service State Ċ import Ġcom . duck duck go . mobile . android . vpn . service . Tracker Blocking Vpn Service Ċ import Ġcom . duck duck go . mobile . android . vpn . store . Database Date Formatter Ċ import Ġcom . duck duck go . mobile . android . vpn . store . Vpn Database Ċ import Ġcom . squareup . an vil . annotations . Contribut es To Ċ import Ġdagger . Module Ċ import Ġdagger . Provides Ċ import Ġdagger . mult ib ind ings . Into Set Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . th reet en . bp . LocalDateTime Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ @ Module Ċ @ Contribut es To ( App Object Graph :: class ) Ċ class ĠDevice Shield Status Reporting Module Ġ{ ĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Into Set ĊĠĠĠ Ġfun Ġprovide Device Shield Status Reporting ( work Manager : ĠWork Manager ): ĠLifecycle Observer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDevice Shield Status Reporting ( work Manager ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Provides ĊĠĠĠ Ġ@ Into Set ĊĠĠĠ Ġfun Ġprovide Device Shield Status Reporting Worker Injector Plugin ( ĊĠĠĠĠĠĠĠ Ġdevice Shield Pixels : ĠDevice Shield Pixels , ĊĠĠĠĠĠĠĠ Ġv pn Database : ĠV pn Database ĊĠĠĠ Ġ): ĠWorker Injector Plugin Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDevice Shield Status Reporting Worker Injector Plugin ( device Shield Pixels , Ġv pn Database ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠDevice Shield Status Reporting ( ĊĠĠĠ Ġprivate Ġval Ġwork Manager : ĠWork Manager Ċ ) Ġ: ĠLifecycle Observer Ġ{ ĊĊĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ CREATE ) ĊĠĠĠ Ġfun Ġschedule Device Shield Status Reporting () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . v (" Scheduling Ġthe ĠDevice Shield Status Reporting Ġworker ") ĊĠĠĠĠĠĠĠ Ġwork Manager . cancel All Work By Tag ( WORK ER _ STATUS _ REPORT ING _ TAG ) ĊĊĠĠĠĠĠĠĠ ĠPeriod ic Work RequestBuilder < Device Shield Status Reporting Worker >( 1 2 , ĠTimeUnit . HOUR S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tag ( WORK ER _ STATUS _ REPORT ING _ TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Backoff Criteria ( Backoff Policy . LINEAR , Ġ 1 0 , ĠTimeUnit . MIN UTES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (). run Ġ{ Ġwork Manager . enqueue ( this ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠDevice Shield Status Reporting Worker ( private Ġval Ġcontext : ĠContext , Ġparams : ĠWorker Parameters ) Ġ: ĠCor outine Worker ( context , Ġparams ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġdevice Shield Pixels : ĠDevice Shield Pixels ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġv pn Service State Stats Dao : ĠV pn Service State Stats Dao ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġdo Work (): ĠResult Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Tracker Blocking Vpn Service . is Service Running ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Shield Pixels . report Enabled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Shield Pixels . report Disabled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Last Day Vpn Enable Disable Counts () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . success () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġsuspend Ġfun Ġsend Last Day Vpn Enable Disable Counts () Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠLocalDateTime . now (). minus Days ( 1 ). to LocalDate (). at Start OfDay (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase Date Formatter . timestamp ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Day Vpn Stats Ġ= Ġv pn Service State Stats Dao . getService State Stats Since ( startTime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . day Ġ} [ startTime . substring Before (" T ")] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . groupBy Ġ{ Ġit . vpn Service State Stats . state Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Day Vpn Stats ?. let Ġ{ Ġstats Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Shield Pixels . report Last Day Enable Count ( stats [ Vpn Service State . ENABLED ]. or Empty (). size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Shield Pixels . report Last Day Disable Count ( stats [ Vpn Service State . DISABLED ]. or Empty (). size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠWORK ER _ STATUS _ REPORT ING _ TAG Ġ= Ġ" WORK ER _ STATUS _ REPORT ING _ TAG " ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠDevice Shield Status Reporting Worker Injector Plugin ( ĊĠĠĠ Ġprivate Ġval Ġdevice Shield Pixels : ĠDevice Shield Pixels , ĊĠĠĠ Ġprivate Ġval Ġv pn Database : ĠV pn Database Ċ ) Ġ: ĠWorker Injector Plugin Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinject ( worker : ĠList enable Worker ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( worker Ġis ĠDevice Shield Status Reporting . Device Shield Status Reporting Worker ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworker . device Shield Pixels Ġ= Ġdevice Shield Pixels ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworker . vpn Service State Stats Dao Ġ= Ġv pn Database . vpn Service State Dao () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ