/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠNew ĠVector ĠLtd Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠMatrix . org ĠFoundation ĠC . I . C . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . matrix . android . sdk . internal . session . room . send Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . work . Coroutine Worker Ċ import Ġandroidx . work . Worker Parameters Ċ import Ġcom . squareup . mos hi . Json Class Ċ import Ġorg . matrix . android . sdk . api . failure . shouldBe Ret ried Ċ import Ġorg . matrix . android . sdk . api . session . events . model . Event Ċ import Ġorg . matrix . android . sdk . api . session . room . send . Send State Ċ import Ġorg . matrix . android . sdk . internal . database . mapper . Content Mapper Ċ import Ġorg . matrix . android . sdk . internal . network . execute Request Ċ import Ġorg . matrix . android . sdk . internal . session . room . Room API Ċ import Ġorg . matrix . android . sdk . internal . worker . Session Worker Params Ċ import Ġorg . matrix . android . sdk . internal . worker . Worker Params Factory Ċ import Ġorg . matrix . android . sdk . internal . worker . getSession Component Ċ import Ġorg . green robot . event bus . EventBus Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ private Ġconst Ġval ĠMAX _ NUMBER _ OF _ RETRY _ BEFORE _ FAIL ING Ġ= Ġ 3 Ċ Ċ /** Ċ Ġ* ĠPossible Ġprevious Ġworker : Ġ[ Encrypt Event Worker ] Ġor Ġfirst Ġworker Ċ Ġ* ĠPossible Ġnext Ġworker ĠĠĠ Ġ: ĠNone Ċ Ġ*/ Ċ internal Ġclass ĠSend Event Worker ( context : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠWorker Parameters ) ĊĠĠĠ Ġ: ĠCor outine Worker ( context , Ġparams ) Ġ{ ĊĊĠĠĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠĠĠ Ġinternal Ġdata Ġclass ĠParams ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval ĠsessionId : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġremove Ġafter Ġsome Ġtime , Ġit 's Ġused Ġfor Ġcompat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent : ĠEvent ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Id : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroom Id : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Str : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġlast Failure Message : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ: ĠSession Worker Params Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconstructor ( sessionId : ĠString , Ġevent : ĠEvent , Ġlast Failure Message : ĠString ? Ġ= Ġnull ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsessionId Ġ= ĠsessionId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Id Ġ= Ġevent . eventId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Id Ġ= Ġevent . roomId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġevent . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Str Ġ= ĠContent Mapper . map ( event . content ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Failure Message Ġ= Ġlast Failure Message ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġlocal Echo Repository : ĠLocal Echo Repository ĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġroom API : ĠRoom API ĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġevent Bus : ĠEvent Bus ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdo Work (): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠWorker Params Factory . from Data < Params >( input Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠResult . success () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĠTim ber . e (" Unable Ġto Ġparse Ġwork Ġparameters ") Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsession Component Ġ= Ġget Session Component ( params . sessionId ) Ġ?: Ġreturn ĠResult . success () ĊĠĠĠĠĠĠĠ Ġsession Component . inject ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ( params . eventId Ġ== Ġnull Ġ|| Ġparams . roomId Ġ== Ġnull Ġ|| Ġparams . type Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcompat Ġwith Ġold Ġparams , Ġmake Ġit Ġfail Ġif Ġany ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . event ?. eventId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Echo Repository . update Send State ( params . event . eventId , ĠSend State . UN DE LI VER ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . success () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( params . last Failure Message Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Echo Repository . update Send State ( params . eventId , ĠSend State . UN DE LI VER ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTrans mit Ġthe Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . success ( input Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĠTim ber . e (" Work Ġcancelled Ġdue Ġto Ġinput Ġerror Ġfrom Ġparent ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Event ( params . eventId , Ġparams . roomId , Ġparams . type , Ġparams . content Str ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . success () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġdoes Ġstart Ġfrom Ġ 0 , Ġwe Ġwant Ġit Ġto Ġstop Ġif Ġit Ġfails Ġthe Ġthird Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Attempt Count Ġ= Ġrun Attempt Count Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Attempt Count Ġ>= ĠMAX _ NUMBER _ OF _ RETRY _ BEFORE _ FAIL ING Ġ|| Ġ! exception . shouldBe Ret ried ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Echo Repository . update Send State ( params . eventId , ĠSend State . UN DE LI VER ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . success () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . retry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsend Event ( eventId : ĠString , Ġroom Id : ĠString , Ġtype : ĠString , Ġcontent Str : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocal Echo Repository . update Send State ( eventId , ĠSend State . SEND ING ) ĊĠĠĠĠĠĠĠ Ġexecute Request < Send Response >( event Bus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi Call Ġ= Ġroom API . send ( eventId , Ġroom Id , Ġtype , Ġcontent Str ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlocal Echo Repository . update Send State ( eventId , ĠSend State . SENT ) ĊĠĠĠ Ġ} Ċ } Ċ