/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 2 ĠX iz hi ĠZ hu Ċ Ġ* Ċ Ġ* Ġ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 Ġme . x iz zh u . android . j osh ua . core Ċ Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlinx . coroutines . launch Ċ import Ġme . x iz zh u . android . j osh ua . core . repository . Bible Reading Repository Ċ import Ġme . x iz zh u . android . j osh ua . core . repository . Reading Progress Repository Ċ import Ġme . x iz zh u . android . j osh ua . utils . elapsed Realtime Ċ import Ġme . x iz zh u . android . j osh ua . utils . filter IsValid Ċ import Ġme . x iz zh u . android . logger . Log Ċ Ċ data Ġclass ĠReading Progress ( val Ġcontinuous Reading Days : ĠInt , Ġval Ġlast Reading Timestamp : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchapter Reading Status : ĠList < Chapter Reading Status >) Ġ{ ĊĠĠĠ Ġfun ĠisValid (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( continuous Reading Days Ġ< Ġ 0 Ġ|| Ġlast Reading Timestamp Ġ< Ġ 0 L ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġchapter Reading Status . forEach Ġ{ Ġif Ġ(! it . isValid ()) Ġreturn Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠChapter Reading Status ( val Ġbook Index : ĠInt , Ġval Ġchapter Index : ĠInt , Ġval Ġread Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Sp ent In Millis : ĠLong , Ġval Ġlast Reading Timestamp : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠisValid (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book Index Ġ< Ġ 0 Ġ|| Ġbook Index Ġ>= ĠBible . BOOK _ COUNT ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chapter Index Ġ< Ġ 0 Ġ|| Ġchapter Index Ġ>= ĠBible . get Chapter Count ( book Index )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Count Ġ< Ġ 0 Ġ|| Ġtime Sp ent In Millis Ġ< Ġ 0 L Ġ|| Ġlast Reading Timestamp Ġ< Ġ 0 L ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠReading Progress Manager ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġb ible Reading Repository : ĠBible Reading Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġreading Progress Repository : ĠReading Progress Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġapp Scope : ĠCor outine Scope Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG : ĠString Ġ= ĠReading Progress Manager :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ( otherwise Ġ= ĠVis ible ForTesting . PRIVATE ) ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTIME _ SP ENT _ THRESHOLD _ IN _ M ILL IS Ġ= Ġ 2 5 0 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Ver se Index Observer : ĠFlow < Ver se Index >? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Ver se Index : ĠVer se Index Ġ= ĠVer se Index . INVALID ĊĠĠĠ Ġprivate Ġvar Ġlast Timestamp : ĠLong Ġ= Ġ 0 L ĊĊĠĠĠ Ġfun Ġstart Tracking () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Ver se Index Observer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlast Timestamp Ġ= Ġelapsed Realtime () ĊĠĠĠĠĠĠĠ Ġcurrent Ver se Index Observer Ġ= Ġb ible Reading Repository . current Ver se Index ĊĠĠĠĠĠĠĠ Ġapp Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ver se Index Observer ?. filter IsValid () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Reading Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ver se Index Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Timestamp Ġ= Ġelapsed Realtime () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġtrack Reading Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġver se Index Ġ= Ġcurrent Ver se Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verse Index . isValid () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġlast Timestamp Ġ== Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġb ible Reading Repository . current Translation . first (). isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= Ġelapsed Realtime () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Sp ent In Millis Ġ= Ġnow Ġ- Ġlast Timestamp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time Sp ent In Millis Ġ< ĠTIME _ SP ENT _ THRESHOLD _ IN _ M ILL IS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreading Progress Repository . track Reading Progress ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġver se Index . book Index , Ġver se Index . chapter Index , Ġtime Sp ent In Millis , Ġnow ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġtrack Ġreading Ġprogress ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Tracking () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġuses Ġapp Scope Ġto Ġmake Ġsure Ġthis Ġwill Ġbe Ġexecuted Ġwithout Ġbeing Ġcanceled ĊĠĠĠĠĠĠĠ Ġ// Ġuses ĠDispatch ers . Main . immediate Ġto Ġmake Ġsure Ġthis Ġwill Ġbe Ġexecuted Ġimmediately ĊĠĠĠĠĠĠĠ Ġapp Scope . launch ( Dispatch ers . Main . immediate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Reading Progress () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ver se Index Ġ= ĠVer se Index . INVALID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Timestamp Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ver se Index Observer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġread (): ĠReading Progress Ġ= Ġreading Progress Repository . read () Ċ } Ċ