/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠPeter ĠKen ji ĠY aman aka Ċ Ġ* Ċ Ġ* Ġ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 . py am soft . tick ert ape . alert . runner Ċ Ċ import Ġandroidx . annotation . Check Result Ċ import Ġcom . py am soft . py d roid . core . En for cer Ċ import Ġcom . py am soft . py d roid . notify . Notifier Ċ import Ġcom . py am soft . py d roid . notify . Notify Channel Info Ċ import Ġcom . py am soft . tick ert ape . alert . Alert Internal Api Ċ import Ġcom . py am soft . tick ert ape . alert . notification . Big M over Notification Data Ċ import Ġcom . py am soft . tick ert ape . alert . notification . Notification Id Map Ċ import Ġcom . py am soft . tick ert ape . alert . notification . Notification Type Ċ import Ġcom . py am soft . tick ert ape . alert . params . Big M over Parameters Ċ import Ġcom . py am soft . tick ert ape . db . mo ver . Big M over Insert Dao Ċ import Ġcom . py am soft . tick ert ape . db . mo ver . Big M over Query Dao Ċ import Ġcom . py am soft . tick ert ape . db . mo ver . Big M over Report Ċ import Ġcom . py am soft . tick ert ape . db . mo ver . Json M appable Big M over Report Ċ import Ġcom . py am soft . tick ert ape . db . symbol . Symbol Query Dao Ċ import Ġcom . py am soft . tick ert ape . quote . Ticker Ċ import Ġcom . py am soft . tick ert ape . quote . Ticker Interactor Ċ import Ġcom . py am soft . tick ert ape . quote . get Watch List Quotes Ċ import Ġcom . py am soft . tick ert ape . stocks . api . Stock Market Session Ċ import Ġcom . py am soft . tick ert ape . stocks . api . Stock Quote Ċ import Ġcom . py am soft . tick ert ape . stocks . api . current Session Ċ import Ġjava . time . LocalDateTime Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġtim ber . log . Tim ber Ċ Ċ @ Singleton Ċ internal Ġclass ĠBig M over Runner Ċ @ Inject Ċ internal Ġconstructor ( ĊĠĠĠ Ġ@ param : Alert Internal Api Ġprivate Ġval Ġnot ifier : ĠNot ifier , ĊĠĠĠ Ġprivate Ġval Ġbig M over Query Dao : ĠBig M over Query Dao , ĊĠĠĠ Ġprivate Ġval Ġbig M over Insert Dao : ĠBig M over Insert Dao , ĊĠĠĠ Ġprivate Ġval Ġid Map : ĠNotification Id Map , ĊĠĠĠ Ġprivate Ġval Ġsymbol Query Dao : ĠSymbol Query Dao , ĊĠĠĠ Ġprivate Ġval Ġinter actor : ĠT icker Interactor , Ċ ) Ġ: ĠBase Runner < Big M over Parameters >() Ġ{ ĊĊĠ Ġoverride Ġsuspend Ġfun Ġperform Work ( params : ĠBig M over Parameters ) Ġ= Ġcoroutine Scope Ġ{ ĊĠĠĠ Ġval Ġforce Ġ= Ġparams . force Refresh ĊĠĠĠ Ġinter actor ĊĠĠĠĠĠĠĠ Ġ. get Watch List Quotes ( force , Ġsymbol Query Dao ) ĊĠĠĠĠĠĠĠ Ġ. on Failure Ġ{ ĠTim ber . e ( it , Ġ" Error Ġrefresh ing Ġquotes ") Ġ} ĊĠĠĠĠĠĠĠ Ġ. recover Ġ{ Ġempty List () Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . filter Big M over s () Ġ} ĊĠĠĠĠĠĠĠ Ġ. on Success Ġ{ Ġpost Notifications ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. on Failure Ġ{ ĠTim ber . e ( it , Ġ" Error Ġgetting Ġbig Ġm over Ġquotes ") Ġ} ĊĊĠĠĠ Ġreturn @ coroutine Scope ĊĠ Ġ} ĊĊĠ Ġ@ Check Result ĊĠ Ġprivate Ġfun ĠBig M over Report . update To Session ( ĊĠĠĠĠĠ Ġnow : ĠLocalDateTime , ĊĠĠĠĠĠ Ġsession : ĠStock Market Session , ĊĠ Ġ): ĠBig M over Report Ġ{ ĊĠĠĠ Ġreturn Ġthis . last Not ified ( now ) ĊĠĠĠĠĠĠĠ Ġ. last Percent ( session . percent ()) ĊĠĠĠĠĠĠĠ Ġ. last Price ( session . price ()) ĊĠĠĠĠĠĠĠ Ġ. last State ( session . state ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġsuspend Ġfun Ġpost Notifications ( big M over s : ĠList < Stock Quote >) Ġ{ ĊĠĠĠ ĠEn for cer . assert Off MainThread () ĊĊĠĠĠ Ġval Ġnow Ġ= ĠLocalDateTime . now () ĊĠĠĠ Ġval Ġall Quotes Ġ= Ġwith Context ( context Ġ= ĠDispatch ers . IO ) Ġ{ Ġbig M over Query Dao . query ( false ) Ġ} ĊĊĠĠĠ Ġbig M over s . forEach Ġ{ Ġquote Ġ-> ĊĠĠĠĠĠ Ġval Ġm over Record Ġ= Ġall Quotes . first OrNull Ġ{ Ġit . symbol () Ġ== Ġquote . symbol () Ġ} ĊĠĠĠĠĠ Ġval Ġinsert Record Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( mo ver Record Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġno Ġm over Ġrecord Ġexists Ġyet , Ġmake Ġa Ġnew Ġone ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson M appable Big M over Report . create ( quote ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġquote . current Session () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mo ver Record . last State () Ġ!= Ġsession . state ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠState Ġhas Ġchanged , Ġupdate Ġthe Ġrecord ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm over Record . update To Session ( now , Ġsession ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( now . minus Hours ( NOTIFY _ PERIOD ). is After ( mo ver Record . last Not ified ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWas Ġlast Ġnotified Ġover ĠPER IOD Ġhours Ġago , Ġnotify Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm over Record . update To Session ( now , Ġsession ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWas Ġlast Ġnotified Ġwithin ĠPER IOD Ġhours , Ġdo Ġnot Ġnotify Ġagain . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( insert Record Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . w (" Not Ġshowing Ġrepeat Ġbig Ġm over Ġnotification Ġfor : Ġ${ quote . symbol () }") ĊĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠInsert Ġthe Ġrecord Ġso Ġthat Ġwe Ġcan Ġavoid Ġfuture Ġno isy Ġbig Ġm over Ġupdates . ĊĠĠĠĠĠ Ġwith Context ( context Ġ= ĠDispatch ers . IO ) Ġ{ Ġbig M over Insert Dao . insert ( insert Record ) Ġ} ĊĊĠĠĠĠĠ Ġpost Notification ( quote ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġpost Notification ( quote : ĠStock Quote ) Ġ{ ĊĠĠĠ Ġval Ġid Ġ= Ġid Map . get Notification Id ( Notification Type . BIG _ MO VER ) Ġ{ Ġquote . symbol () Ġ} ĊĠĠĠ Ġnot ifier . show ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Info Ġ= ĠCHAN NEL _ INFO , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Ġ= ĠBig M over Notification Data ( quote Ġ= Ġquote ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. also Ġ{ ĠTim ber . d (" Posted Ġbig Ġm over Ġnotification : Ġ$ it ") Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Check Result ĊĠ Ġprivate Ġfun ĠList < Ticker >. filter Big M over s (): ĠList < Stock Quote > Ġ{ ĊĠĠĠ Ġreturn Ġthis . as Sequence () ĊĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . quote Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġquote Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġquote . current Session () ĊĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġsession . percent (). value () ĊĠĠĠĠĠĠĠĠĠ Ġreturn @ filter Ġvalue . compareTo ( 1 0 . 0 ) Ġ> Ġ 0 Ġ|| Ġvalue . compareTo (- 1 0 . 0 ) Ġ< Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. toList () ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġ// ĠDon 't Ġnotify Ġbetween Ġperiods ĊĠĠĠ Ġprivate Ġconst Ġval ĠNOT IFY _ PERIOD Ġ= Ġ 6 L ĊĊĠĠĠ Ġprivate Ġval ĠCHAN NEL _ INFO Ġ= ĊĠĠĠĠĠĠĠ ĠNotify Channel Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ" channel _ big _ mo vers ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Big ĠM over s ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Big ĠM over ĠAlert s ", ĊĠĠĠĠĠĠĠ Ġ) ĊĠ Ġ} Ċ } Ċ