/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 Ġ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 . app . fire Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . System Clock Ċ import Ġandroidx . annotation . Ui Thread Ċ import Ġandroidx . core . os . post Delayed Ċ import Ġandroidx . lifecycle .* Ċ import Ġandroidx . work . One Time Work RequestBuilder Ċ import Ġandroidx . work . Work Manager Ċ import Ġcom . duck duck go . app . global . Application Clear Data State Ċ import Ġcom . duck duck go . app . global . Application Clear Data State . FINISHED Ċ import Ġcom . duck duck go . app . global . Application Clear Data State . INITIAL IZ ING Ċ import Ġcom . duck duck go . app . global . view . Clear Data Action Ċ import Ġcom . duck duck go . app . settings . clear . Clear What Option Ċ import Ġcom . duck duck go . app . settings . clear . Clear When Option Ċ import Ġcom . duck duck go . app . settings . db . Settings DataStore Ċ import Ġkotlinx . coroutines .* Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ interface ĠData Clear er Ġ: ĠLifecycle Observer Ġ{ ĊĠĠĠ Ġval Ġdata Clear er State : ĠLive Data < Application Clear Data State > ĊĠĠĠ Ġvar Ġis Fresh App Launch : ĠBoolean Ċ } Ċ Ċ class ĠAutomatic Data Clear er ( ĊĠĠĠ Ġprivate Ġval Ġwork Manager : ĠWork Manager , ĊĠĠĠ Ġprivate Ġval Ġsettings DataStore : ĠSettings DataStore , ĊĠĠĠ Ġprivate Ġval Ġclear Data Action : ĠClear Data Action , ĊĠĠĠ Ġprivate Ġval Ġdata Clear er Time Keeper : ĠBackground Time Keeper , ĊĠĠĠ Ġprivate Ġval Ġdata Clear er Foreground App Restart Pixel : ĠData Clear er Foreground App Restart Pixel Ċ ) Ġ: ĠData Clear er , ĠLifecycle Observer , ĠCor outine Scope Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġclear Job : ĠJob Ġ= ĠJob () ĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠDispatch ers . Main Ġ+ Ġclear Job ĊĊĠĠĠ Ġoverride Ġval Ġdata Clear er State : ĠMutable LiveData < Application Clear Data State > Ġ= ĠMutable LiveData < Application Clear Data State >(). also Ġ{ ĊĠĠĠĠĠĠĠ Ġit . post Value ( INITIAL IZ ING ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġis Fresh App Launch Ġ= Ġtrue ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ START ) ĊĠĠĠ Ġfun Ġon App Fore gro unded () Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon App Fore gro unded Async () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġsuspend Ġfun Ġon App Fore gro unded Async () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Clear er State . value Ġ= ĠINITIAL IZ ING ĊĊĠĠĠĠĠĠĠ ĠTim ber . i (" on App Fore gro unded ; Ġis Ġfrom Ġfresh Ġapp Ġlaunch ? Ġ$ is Fresh App Launch ") ĊĊĠĠĠĠĠĠĠ Ġwork Manager . cancel All Work By Tag ( Data Clear ing Worker . WORK _ REQUEST _ TAG ) ĊĊĠĠĠĠĠĠĠ Ġval Ġapp Used Since Last Clear Ġ= Ġsettings DataStore . app Used Since Last Clear ĊĠĠĠĠĠĠĠ Ġsettings DataStore . app Used Since Last Clear Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġapp Icon Changed Ġ= Ġsettings DataStore . app Icon Changed ĊĠĠĠĠĠĠĠ Ġsettings DataStore . app Icon Changed Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġclear What Ġ= Ġsettings DataStore . autom atically Clear What Option ĊĠĠĠĠĠĠĠ Ġval Ġclear When Ġ= Ġsettings DataStore . autom atically Clear When Option ĊĠĠĠĠĠĠĠ ĠTim ber . i (" Currently Ġconfigured Ġto Ġautomatically Ġclear Ġ$ clear What Ġ/ Ġ$ clear When ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( clear What Ġ== ĠClear What Option . CLEAR _ NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" No Ġdata Ġwill Ġbe Ġcleared Ġas Ġit 's Ġconfigured Ġto Ġclear Ġnothing Ġautomatically ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Clear er State . value Ġ= ĠFIN ISHED ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Clear Data ( clear When , Ġapp Used Since Last Clear , Ġapp Icon Changed )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Dec ided Ġdata Ġshould Ġbe Ġcleared ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Data When App In Foreground ( clear What ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Dec ided Ġnot Ġto Ġclear Ġdata Ġat Ġthis Ġtime ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Clear er State . value Ġ= ĠFIN ISHED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis Fresh App Launch Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġsettings DataStore . clear App Background Timestamp () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ STOP ) ĊĠĠĠ Ġfun Ġon App Back gro unded () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Now Ġ= ĠSystem Clock . elapsed Realtime () ĊĠĠĠĠĠĠĠ ĠTim ber . i (" Recording Ġwhen Ġapp Ġback gro unded Ġ($ time Now )") ĊĊĠĠĠĠĠĠĠ Ġdata Clear er State . value Ġ= ĠINITIAL IZ ING ĊĊĠĠĠĠĠĠĠ Ġsettings DataStore . app Back gro unded Timestamp Ġ= Ġtime Now ĊĊĠĠĠĠĠĠĠ Ġval Ġclear When Option Ġ= Ġsettings DataStore . autom atically Clear When Option ĊĠĠĠĠĠĠĠ Ġval Ġclear What Option Ġ= Ġsettings DataStore . autom atically Clear What Option ĊĊĠĠĠĠĠĠĠ Ġif Ġ( clear What Option Ġ== ĠClear What Option . CLEAR _ NONE Ġ|| Ġclear When Option Ġ== ĠClear When Option . APP _ EXIT _ ONLY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" No Ġbackground Ġtimer Ġrequired Ġfor Ġcurrent Ġconfiguration : Ġ$ clear What Option Ġ/ Ġ$ clear When Option ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschedule Background Timer To Trigger Clear ( clear When Option . duration Milliseconds ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġschedule Background Timer To Trigger Clear ( duration Millis : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwork Manager . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Request Ġ= ĠOne Time Work RequestBuilder < Data Clear ing Worker >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setInitial Delay ( duration Millis , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Tag ( Data Clear ing Worker . WORK _ REQUEST _ TAG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . enqueue ( work Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Work Ġrequest Ġscheduled , Ġ${ duration Millis } ms Ġfrom Ġnow , Ġto Ġclear Ġdata Ġif Ġthe Ġuser Ġhasn 't Ġreturned Ġto Ġthe Ġapp . Ġjob Ġid : Ġ${ work Request . id }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ui Thread ĊĠĠĠ Ġ@ Suppress (" NON _ EX HA UST IVE _ WHEN ") ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġclear Data When App In Foreground ( clear What : ĠClear What Option ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . i (" Clear ing Ġdata Ġwhen Ġapp Ġis Ġin Ġthe Ġforeground : Ġ$ clear What ") ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( clear What ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClear What Option . CLEAR _ TAB S _ ONLY Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Data Action . clear Tabs Async ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Notify ing Ġlistener Ġthat Ġclearing Ġhas Ġfinished ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Clear er State . value Ġ= ĠFIN ISHED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠClear What Option . CLEAR _ TAB S _ AND _ DATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocess Needs Re started Ġ= Ġ! is Fresh App Launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" App Ġis Ġin Ġforeground ; Ġrestart Ġneeded ? Ġ$ process Needs Re started ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Data Action . clear Tabs And All Data Async ( app In Foreground Ġ= Ġtrue , Ġshould Fire Data Clear Pixel Ġ= Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" All Ġdata Ġnow Ġcleared , Ġwill Ġrestart Ġprocess ? Ġ$ process Needs Re started ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( process Needs Re started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Data Action . set App Used Since Last Clear Flag ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Clear er Foreground App Restart Pixel . increment Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġneed Ġa Ġmoment Ġto Ġdraw Ġbackground Ġcolor Ġ( reduc es Ġf lick ering ĠUX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler (). post Delayed ( 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Will Ġnow Ġrestart Ġprocess ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Data Action . kill And Restart Process ( notify Data Cle ared Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Will Ġnot Ġrestart Ġprocess ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Clear er State . value Ġ= ĠFIN ISHED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Clear Data ( clean When Option : ĠClear When Option , Ġapp Used Since Last Clear : ĠBoolean , Ġapp Icon Changed : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Determin ing Ġif Ġdata Ġshould Ġbe Ġcleared Ġfor Ġoption Ġ$ clean When Option ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! app Used Since Last Clear ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" App Ġhasn 't Ġbeen Ġused Ġsince Ġlast Ġclear ; Ġno Ġneed Ġto Ġclear Ġagain ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTim ber . d (" App Ġhas Ġbeen Ġused Ġsince Ġlast Ġclear ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Fresh App Launch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" This Ġis Ġa Ġfresh Ġapp Ġlaunch , Ġso Ġwill Ġclear Ġthe Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( app Icon Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" No Ġdata Ġwill Ġbe Ġcleared Ġas Ġthe Ġapp Ġicon Ġwas Ġjust Ġchanged ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( clean When Option Ġ== ĠClear When Option . APP _ EXIT _ ONLY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" This Ġis ĠNOT Ġa Ġfresh Ġapp Ġlaunch , Ġand Ġthe Ġconfiguration Ġis Ġfor Ġapp Ġexit Ġonly . ĠNot Ġclearing Ġthe Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! settings DataStore . has Background Timestamp Re corded ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w (" No Ġbackground Ġtimestamp Ġrecorded ; Ġwill Ġnot Ġclear Ġthe Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġenough Time Passed Ġ= Ġdata Clear er Time Keeper . has En ough Time Elapsed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback gro unded Timestamp Ġ= Ġsettings DataStore . app Back gro unded Timestamp , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear When Option Ġ= Ġclean When Option ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Has Ġenough Ġtime Ġpassed Ġto Ġtrigger Ġthe Ġdata Ġclear ? Ġ$ en ough Time Passed ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġenough Time Passed ĊĠĠĠ Ġ} Ċ Ċ } Ċ