package Ġcom . j im z jy . router controller . common . utils Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . database . Content Observer Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . tele phony . Sms Manager Ċ import Ġandroid . tele phony . Sms Message Ċ import Ġandroid . tele phony . Subscription Manager Ċ import Ġjava . util .* Ċ import Ġjava . util . regex . Pattern Ċ Ċ const Ġval ĠADDRESS _ NUMBER _ 0 Ġ= Ġ"+ 8 6 1 0 6 5 9 3 0 0 5 " Ċ const Ġval ĠADDRESS _ NUMBER _ 1 Ġ= Ġ" 1 0 6 5 9 3 0 0 5 " Ċ const Ġval ĠADDRESS _ NUMBER _ 2 Ġ= Ġ" 8 6 1 0 6 5 9 3 0 0 5 " Ċ const Ġval ĠSMS _ IN BOX _ URI Ġ= Ġ" content :// sms / inbox " Ċ const Ġval ĠSMS _ RAW _ URI Ġ= Ġ" content :// sms / raw " Ċ const Ġval ĠSMS _ URI Ġ= Ġ" content :// sms " Ċ const Ġval ĠSMS _ CONTENT Ġ= Ġ" MM " Ċ const Ġval ĠSMS _ READ _ ORDER Ġ= Ġ" date Ġdesc " Ċ const Ġval ĠCAN _ NOT _ GET _ CODE Ġ= Ġ" Can Ġnot Ġget Ġthe Ġcode " Ċ const Ġval ĠNO _ SUB SCRIPTION _ ID _ FOUND Ġ= Ġ" No ĠSubscription ĠId Ġbe Ġfound " Ċ const Ġval ĠNO _ PERMISSION _ TO _ READ _ PHONE _ STATE Ġ= Ġ" No Ġpermission Ġto Ġread Ġphone Ġstate " Ċ const Ġval ĠNO _ PERMISSION _ FOR _ SMS Ġ= Ġ" No Ġpermission Ġfor Ġsms " Ċ Ċ @ Target Api ( 2 2 ) Ċ class ĠS ms Sender ( ctx : ĠContext , Ġprivate Ġval Ġnumber : ĠString ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsubscription Manager Ġ= Ġctx . getSystem Service ( Context . TELE PHONY _ SUB SCRIPTION _ SERVICE ) Ġas ĠSubscription Manager ĊĊĠĠĠ Ġfun Ġget Subscription Id (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠphoneNumber Ġ= Ġnumber ĊĠĠĠĠĠĠĠ Ġif Ġ( phoneNumber . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( phoneNumber . substring ( 0 .. 2 ) Ġ!= Ġ"+ 8 6 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠphoneNumber Ġ= Ġ"+ 8 6 $ phoneNumber " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubscription List Ġ= Ġsubscription Manager . active Subscription InfoList ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . number Ġ== ĠphoneNumber ) Ġreturn Ġit . subscriptionId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠS ms Utils Exception ( NO _ PERMISSION _ TO _ READ _ PHONE _ STATE , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠS ms Utils Exception ( NO _ SUB SCRIPTION _ ID _ FOUND ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Sms ( subscriptionId : ĠInt , Ġsent Intent : ĠPending Intent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( subscriptionId Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsms Manager Ġ= ĠS ms Manager . getDefault () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsms Manager . send Text Message ( ADDRESS _ NUMBER _ 0 , Ġnull , ĠSMS _ CONTENT , Ġsent Intent , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsms Manager Ġ= ĠS ms Manager . getS ms Manager For Subscription Id ( subscriptionId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsms Manager . send Text Message ( ADDRESS _ NUMBER _ 0 , Ġnull , ĠSMS _ CONTENT , Ġsent Intent , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠS ms Utils Exception ( NO _ PERMISSION _ FOR _ SMS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠS ms Receiver Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġm Message Listener : Ġ(( String ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Pattern Ġ= ĠPattern . compile ("\\ w *[ a - z 0 - 9 A - Z ]+ \\ w * ") ĊĊĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= Ġintent ?. extras ĊĠĠĠĠĠĠĠ Ġval Ġpd us Ġ= Ġ( bundle ?. get (" pd us ") Ġas ĠArray < ByteArray >) ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġmutable ListOf < Sms Message >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . addAll ( getMessage ( bundle , Ġpd us )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpd us . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . add ( Sms Message . createFrom P du ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġmessage [ 0 ]. origin ating Address ĊĠĠĠĠĠĠĠ Ġif Ġ( address Ġ== ĠADDRESS _ NUMBER _ 0 Ġ|| Ġaddress Ġ== ĠADDRESS _ NUMBER _ 1 Ġ|| Ġaddress Ġ== ĠADDRESS _ NUMBER _ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmessage Content Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Content Ġ+= Ġit . message Body ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Message Listener ?. invoke ( getCode ( message Content )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// abort Broadcast () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( 2 3 ) ĊĠĠĠ Ġprivate Ġfun ĠgetMessage ( bundle : ĠBundle , Ġpd us : ĠArray < ByteArray >): ĠMutable List < Sms Message > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġformat Ġ= Ġbundle . getString (" format ") ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġmutable ListOf < Sms Message >() ĊĠĠĠĠĠĠĠ Ġpd us . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . add ( Sms Message . createFrom P du ( it , Ġformat )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmessage ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Code ( message : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġm Pattern . matcher ( message ) ĊĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmatcher . group () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠCAN _ NOT _ GET _ CODE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Message Listener ( on Get Message : Ġ( code : ĠString ) Ġ-> ĠUnit ): ĠS ms Receiver Ġ{ ĊĠĠĠĠĠĠĠ Ġm Message Listener Ġ= Ġon Get Message ĊĠĠĠĠĠĠĠ Ġreturn Ġthis @ Sms Receiver ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠS ms Reader ( private Ġval ĠmContext : ĠContext , Ġm Handler : ĠHandler ) Ġ: ĠContent Observer ( m Handler ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġm Message Listener : Ġ(( String ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Pattern Ġ= ĠPattern . compile ("\\ w *[ a - z 0 - 9 A - Z ]+ \\ w * ") ĊĠĠĠ Ġprivate Ġvar Ġuri Before Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun ĠonChange ( self Change : ĠBoolean , Ġuri : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onChange ( self Change , Ġuri ) ĊĠĠĠĠĠĠĠ Ġif Ġ( uri . toString () Ġ== ĠSMS _ RAW _ URI Ġ|| Ġuri . toString () Ġ== Ġuri Before ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġuri Before Ġ= Ġuri . toString () ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= ĠmContext . content Resolver . query ( Uri . parse ( SMS _ IN BOX _ URI ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf (" body ", Ġ" date "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" address Ġin Ġ( ?,?, ? )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ADDRESS _ NUMBER _ 0 , ĠADDRESS _ NUMBER _ 1 , ĠADDRESS _ NUMBER _ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSMS _ READ _ ORDER ) ĊĠĠĠĠĠĠĠ Ġcursor . moveTo First () ĊĊĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Date Ġ= Ġcursor . getString ( 1 ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠDate (). time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( date Ġ- Ġmessage Date ) Ġin Ġ( 0 .. 3 0 0 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġcursor . getString ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Message Listener ?. invoke ( getCode ( message )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! cursor . is Closed ) Ġcursor . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Code ( message : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġm Pattern . matcher ( message ) ĊĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmatcher . group () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠCAN _ NOT _ GET _ CODE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Message Listener ( on Get Message : Ġ( code : ĠString ) Ġ-> ĠUnit ): ĠS ms Reader Ġ{ ĊĠĠĠĠĠĠĠ Ġm Message Listener Ġ= Ġon Get Message ĊĠĠĠĠĠĠĠ Ġreturn Ġthis @ Sms Reader ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠS ms Utils Exception : ĠException Ġ{ ĊĠĠĠ Ġconstructor (): Ġsuper () ĊĠĠĠ Ġconstructor ( s : ĠString ): Ġsuper ( s ) ĊĠĠĠ Ġconstructor ( s : ĠString , Ġcause : ĠThrowable ): Ġsuper ( s , Ġcause ) ĊĠĠĠ Ġconstructor ( cause : ĠThrowable ): Ġsuper ( cause ) Ċ } ĊĊĊĊ