/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 Ġ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 . crypto Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . work . Coroutine Worker Ċ import Ġandroidx . work . Data Ċ import Ġandroidx . work . Worker Parameters Ċ import Ġcom . squareup . mos hi . Json Class Ċ import Ġorg . matrix . android . sdk . api . auth . data . Credentials Ċ 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 . events . model . EventType Ċ import Ġorg . matrix . android . sdk . api . session . events . model . Local Echo Ċ import Ġorg . matrix . android . sdk . api . session . events . model . to Content Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . MX Users Devices Map Ċ import Ġorg . matrix . android . sdk . internal . crypto . model . rest . Share Request Cancellation Ċ import Ġorg . matrix . android . sdk . internal . crypto . store . IM X Crypto Store Ċ import Ġorg . matrix . android . sdk . internal . crypto . tasks . Send To Device Task Ċ 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 Ċ Ċ internal Ġclass ĠCancel Go ssip Request Worker ( context : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠWorker Parameters ) ĊĠĠĠ Ġ: ĠCor outine Worker ( context , Ġparams ) Ġ{ ĊĊĠĠĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠĠĠ Ġinternal Ġdata Ġclass ĠParams ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠsessionId : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠrequestId : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecipients : ĠMap < String , ĠList < String >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom Request ( sessionId : ĠString , Ġrequest : ĠOut going Go ssip ing Request ): ĠParams Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠParams ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsessionId Ġ= ĠsessionId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId Ġ= Ġrequest . requestId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipients Ġ= Ġrequest . recipients ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġsend To Device Task : ĠSend To Device Task ĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġcrypto Store : ĠI MX Crypto Store ĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġevent Bus : ĠEvent Bus ĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġcredentials : ĠCredentials ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdo Work (): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Output Data Ġ= ĠData . Builder (). put Boolean (" failed ", Ġtrue ). build () ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠWorker Params Factory . from Data < Params >( input Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠResult . success ( error Output Data ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsession Component Ġ= Ġget Session Component ( params . sessionId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠResult . success ( error Output Data ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO , Ġcan Ġthis Ġhappen ? Ġshould ĠI Ġupdate Ġlocal Ġecho ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Unknown ĠSession , Ġcannot Ġsend Ġmessage , ĠsessionId : Ġ${ params . sessionId }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsession Component . inject ( this ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlocal Id Ġ= ĠLocal Echo . create Local Echo Id () ĊĠĠĠĠĠĠĠ Ġval Ġcontent Map Ġ= ĠMX Users Devices Map < Any >() ĊĠĠĠĠĠĠĠ Ġval Ġto Device Content Ġ= ĠShare Request Cancellation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequesting DeviceId Ġ= Ġcredentials . deviceId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠrequestId Ġ= Ġparams . requestId ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcrypto Store . save Go ssip ing Event ( Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠEventType . ROOM _ KEY _ REQUEST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġto Device Content . to Content (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender Id Ġ= Ġcredentials . userId ĊĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . age Local Ts Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġparams . recipients . forEach Ġ{ Ġuser To Device Map Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser To Device Map . value . forEach Ġ{ ĠdeviceId Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Map . set Object ( user To Device Map . key , ĠdeviceId , Ġto Device Content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Store . update Outgoing Go ssip ing Request State ( params . requestId , ĠOut going Go ssip ing Request State . C ANCE LL ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend To Device Task . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSend To Device Task . Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠeventType Ġ= ĠEventType . ROOM _ KEY _ REQUEST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Map Ġ= Ġcontent Map , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Id Ġ= Ġlocal Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Store . update Outgoing Go ssip ing Request State ( params . requestId , ĠOut going Go ssip ing Request State . CANCEL LED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . success () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( exception . shouldBe Ret ried ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . retry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Store . update Outgoing Go ssip ing Request State ( params . requestId , ĠOut going Go ssip ing Request State . FAILED _ TO _ CANCEL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . success ( error Output Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ