/* Ċ Ġ* ĠVo IP . ms ĠSMS Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 - 2 0 2 1 ĠMichael ĠK our las Ċ Ġ* Ċ Ġ* Ġ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 Ġnet . k our las . vo ip ms _ sms . sms . workers Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . Service Info Ċ import Ġandroid . os . Build Ċ import Ġandroidx . work .* Ċ import Ġcom . squareup . mos hi . Json Class Ċ import Ġcom . squareup . mos hi . Json DataException Ċ import Ġnet . k our las . vo ip ms _ sms . R Ċ import Ġnet . k our las . vo ip ms _ sms . database . Database Ċ import Ġnet . k our las . vo ip ms _ sms . network . Network Manager Ċ import Ġnet . k our las . vo ip ms _ sms . notifications . Notifications Ċ import Ġnet . k our las . vo ip ms _ sms . preferences . account Configured Ċ import Ġnet . k our las . vo ip ms _ sms . preferences . getEmail Ċ import Ġnet . k our las . vo ip ms _ sms . preferences . getPassword Ċ import Ġnet . k our las . vo ip ms _ sms . sms . Conversation Id Ċ import Ġnet . k our las . vo ip ms _ sms . sms . Message Ċ import Ġnet . k our las . vo ip ms _ sms . utils . http Post With Multipart FormData Ċ import Ġnet . k our las . vo ip ms _ sms . utils . log Exception Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠWorker Ġused Ġto Ġsend Ġan ĠSMS Ġmessage Ġusing Ġthe ĠVo IP . ms ĠAPI . Ċ Ġ*/ Ċ class ĠSend Message Worker ( context : ĠContext , Ġparams : ĠWorker Parameters ) Ġ: ĊĠĠĠ ĠCor outine Worker ( context , Ġparams ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġconversation Id : ĠCon versation Id ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġerror : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmarked As Sent : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġmarked As Not Sent : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdo Work (): ĠResult Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTermin ate Ġquiet ly Ġif Ġwe Ġcannot Ġfind Ġthe Ġmessage Ġwe Ġare Ġsupposed ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġsend . ĊĠĠĠĠĠĠĠ Ġval Ġdatabase Id Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Data . getLong ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ database _ id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( database Id Ġ== Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . failure () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġthe Ġmessage Ġwe Ġwere Ġasked Ġto Ġsend . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage ( database Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġa Ġbroadcast Ġindicating Ġthat Ġthe Ġmessage Ġhas Ġbeen Ġsent , Ġor Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġan Ġattempt Ġto Ġsend Ġit Ġwas Ġmade . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsent Message Broadcast Intent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . sent _ message _ action , Ġit . did , Ġit . contact ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsent Message Broadcast Intent . putExtra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . sent _ message _ error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . send Broadcast ( sent Message Broadcast Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( error Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . success () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . failure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġare Ġnot Ġgoing Ġto Ġtry Ġsending Ġthis Ġmessage Ġagain Ġunless Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuser Ġtriggers Ġit Ġby Ġclicking Ġon Ġthe Ġmessage , Ġso Ġensure Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdatabase Ġis Ġcorrectly Ġupdated Ġeven Ġon Ġfailure . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! marked As Sent Ġ&& Ġ! marked As Not Sent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). mark Message Not Sent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Foreground Info (): ĠFore ground Info Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= ĠNotifications . getInstance ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Sync Message Send Notification () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFore ground Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotifications . SYNC _ SEND _ MESSAGE _ NOTIFICATION _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠService Info . FO REG ROUND _ SERVICE _ TYPE _ DATA _ SYNC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFore ground Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotifications . SYNC _ SEND _ MESSAGE _ NOTIFICATION _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġthe Ġmessage Ġwe Ġwere Ġasked Ġto Ġsend Ġusing Ġthe ĠVo IP . ms ĠAPI Ġand ĊĠĠĠĠ Ġ* Ġupdates Ġthe Ġdatabase Ġaccordingly . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠsendMessage ( database Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTermin ate Ġquiet ly Ġif Ġit Ġis Ġimpossible Ġto Ġsend Ġmessages Ġdue Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġaccount Ġconfiguration . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! account Configured ( application Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRetrieve Ġthe Ġmessage Ġwe Ġare Ġsupposed Ġto Ġsend . ĠTermin ate Ġquiet ly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġit Ġis Ġnot Ġin Ġa Ġvalid Ġstate . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠDatabase . getInstance ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getMessage Database Id ( database Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Id Ġ= Ġmessage ?. conversation Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Ġ== Ġnull Ġ|| Ġ! message . is Delivery InProgress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTermin ate Ġif Ġno Ġnetwork Ġconnection Ġis Ġavailable . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Network Manager . getInstance (). is Network Connection Available ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ network ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). mark Message Not Sent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . database Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġthe Ġmessage Ġusing Ġthe ĠVo IP . ms ĠAPI . ĠIf Ġwe Ġsucceed , Ġmark Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġmessage Ġwas Ġsent . ĠIf Ġnot , Ġmark Ġit Ġas Ġnot Ġhaving Ġbeen Ġsent . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvo ip Id Ġ= ĠsendMessage With Vo ip Ms Api ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vo ip Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). mark Message Sent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . database Id , Ġvo ip Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarked As Sent Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). mark Message Not Sent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . database Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarked As Not Sent Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġrequest Ġcame Ġfrom Ġan Ġinline Ġreply , Ġrefresh Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnotification . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinline Reply Ġ= Ġinput Data . getBoolean ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ inline _ reply ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inline Reply ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinline Reply Did Ġ= Ġinput Data . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ inline _ reply _ did ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinline Reply Contact Ġ= Ġinput Data . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ inline _ reply _ contact ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotifications . getInstance ( application Context ). show Notifications ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( Conversation Id ( inline Reply Did , Ġinline Reply Contact )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinline Reply Messages Ġ= ĠlistOf ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Exception ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ unknown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠĠĠ Ġdata Ġclass ĠMessage Response ( val Ġstatus : ĠString , Ġval Ġsms : ĠLong ?) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġthe Ġspecified Ġmessage Ġusing Ġthe ĠVo IP . ms ĠAPI ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠNull Ġif Ġthe Ġmessage Ġcould Ġnot Ġbe Ġsent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠsendMessage With Vo ip Ms Api ( message : ĠMessage ): ĠLong ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet ĠJSON Ġresponse Ġfrom ĠAPI ĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠMessage Response ? Ġ= ĠgetMessage Response ( message ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet ĠVo IP . ms ĠID Ġfrom Ġresponse ĊĠĠĠĠĠĠĠ Ġif Ġ( response ?. status Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ parse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( response ?. status Ġ!= Ġ" success ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġwhen Ġ( response ?. status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" invalid _ credentials " Ġ-> Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ error _ invalid _ credentials ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" invalid _ dst " Ġ-> Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ error _ invalid _ dst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" invalid _ sms " Ġ-> Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ error _ invalid _ sms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" limit _ re ached " Ġ-> Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ error _ limit _ re ached ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" message _ empty " Ġ-> Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ error _ message _ empty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" missing _ sms " Ġ-> Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ error _ missing _ sms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sms _ failed " Ġ-> Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ error _ sms _ failed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" sms _ tool ong " Ġ-> Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ error _ sms _ tool ong ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ error , Ġresponse ?. status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( response . sms Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ parse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse . sms ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠgetMessage Response ( message : ĠMessage ): ĠMessage Response ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhttp Post With Multipart FormData ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// www . vo ip . ms / api / v 1 / rest . php ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" api _ username " Ġto Ġget Email ( application Context ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" api _ password " Ġto Ġget Password ( application Context ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" method " Ġto Ġ" send SMS ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" did " Ġto Ġmessage . did , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" dst " Ġto Ġmessage . contact , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" message " Ġto Ġmessage . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġagain ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ request ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson DataException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Exception ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ api _ parse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Exception ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġapplication Context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ error _ unknown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSends Ġthe Ġmessage Ġassociated Ġwith Ġthe Ġspecified Ġdatabase ĠID . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠsendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , Ġdatabase Id : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinline Reply Conversation Id : ĠCon versation Id ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Ġ= ĠOne Time Work RequestBuilder < SendMessage Worker >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set InputData ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork Data Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ database _ id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġto Ġdatabase Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ inline _ reply ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ( inline Reply Conversation Id Ġ!= Ġnull ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ inline _ reply _ did ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġinline Reply Conversation Id ?. did , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . send _ message _ inline _ reply _ contact ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġinline Reply Conversation Id ?. contact ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Exp edited ( OutOf Quota Policy . RUN _ AS _ NON _ EX PED IT ED _ WORK _ REQUEST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWork Manager . getInstance ( context ). enqueue Unique Work ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . send _ message _ work _ id , Ġdatabase Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExisting Work Policy . KEEP , Ġwork ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ