package Ġdev . ey os iy as . sms block er . service Ċ Ċ import Ġandroid . content .* Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . tele phony . Sms Message Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġdev . ey os iy as . sms block er . database . Storage Ċ import Ġdev . ey os iy as . sms block er . model . Black list Ċ import Ġdev . ey os iy as . sms block er . model . Blocked Ċ import Ġdev . ey os iy as . sms block er . model . Keyword Ċ import Ġdev . ey os iy as . sms block er . model . Whitelist Ċ import Ġdev . ey os iy as . sms block er . util . Constant Ċ import Ġdev . ey os iy as . sms block er . util . Constant . SMS _ FORMAT Ċ import Ġdev . ey os iy as . sms block er . util . Core Ċ import Ġdev . ey os iy as . sms block er . util . Inform Manager Ċ import Ġdev . ey os iy as . sms block er . util . Pref Manager Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util . regex . Matcher Ċ import Ġjava . util . regex . Pattern ĊĊ Ċ class ĠBlock er Service Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbody : ĠStringBuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġvar Ġnumber Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġtimestamp : ĠLong Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġbundle : ĠBundle ? Ġ= Ġintent . extras ĊĠĠĠĠĠĠĠ Ġval Ġmessages : ĠArray < Sms Message ?> ĊĊĠĠĠĠĠĠĠ Ġval Ġformat Ġ= Ġbundle !!. getString ( SMS _ FORMAT ) ĊĠĠĠĠĠĠĠ Ġval Ġmsg Objects : ĠArray < *> ? Ġ= Ġbundle . get ( Constant . SMS _ B UNDLE ) Ġas ĠArray < *> ? ĊĠĠĠĠĠĠĠ Ġmessages Ġ= ĠarrayOf Null s ( msg Objects !!. size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġmessages . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessages [ i ] Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ms Message . createFrom P du ( msg Objects [ i ] Ġas ĠByteArray , Ġformat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ms Message . createFrom P du ( msg Objects [ i ] Ġas ĠByteArray ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . append ( messages [ i ] !!. message Body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Ġ= Ġmessages [ i ] !!. origin ating Address . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= Ġmessages [ i ] !!. timestamp Millis ĊĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġmessages . indices ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages [ i ] Ġ= ĠS ms Message . createFrom P du ( msg Objects [ i ] Ġas ĠByteArray ?) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . append ( messages [ i ] !!. message Body ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Ġ= Ġmessages [ i ] !!. origin ating Address . toString () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= Ġmessages [ i ] !!. timestamp Millis Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Message ( context , Ġnumber , Ġbody . toString (), Ġtimestamp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcreate Message ( context : ĠContext , Ġaddress : ĠString , Ġbody : ĠString , Ġtimestamp : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdb Ġ= ĠStorage . database ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġblacklist DAO Ġ= Ġdb . blacklist Dao () ĊĠĠĠĠĠĠĠ Ġval Ġblocked DAO Ġ= Ġdb . blocked Dao () ĊĠĠĠĠĠĠĠ Ġval Ġkeyword DAO Ġ= Ġdb . keyword Dao () ĊĠĠĠĠĠĠĠ Ġval Ġwhitelist DAO Ġ= Ġdb . whitelist Dao () ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= ĠPref Manager ( context ) ĊĠĠĠĠĠĠĠ Ġvar Ġis Clean Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( blacklist DAO . blacklist Count () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( blacklist : ĠBlack list Ġin Ġblacklist DAO . pure Black lists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( address . equals ( blacklist . number , Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Clean Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Clean Ġ&& Ġkeyword DAO . keywords Count () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( keyword : ĠKeyword Ġin Ġkeyword DAO . pure Keywords ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( body . contains ( keyword . keyword )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Clean Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Clean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmatcher : ĠMatcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( manager . blocking Rule ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstant . START S _ WITH _ TAG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart sWith Pattern : ĠPattern Ġ= ĠPattern . compile ( String . format ("^ % s ", Ġmanager . startsWith )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( whitelist DAO . whitelist Count () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( whitelist : ĠWh itelist Ġin Ġwhitelist DAO . pure Wh itel ists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! address . equals ( whitelist . number , Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher Ġ= Ġstart sWith Pattern . matcher ( address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Clean Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Clean Ġ= Ġ! startsWith Pattern . matcher ( address ). find () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstant . END S _ WITH _ TAG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend sWith Pattern : ĠPattern Ġ= ĠPattern . compile ( String . format ("% s $", Ġmanager . endsWith )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( whitelist DAO . whitelist Count () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( whitelist : ĠWh itelist Ġin Ġwhitelist DAO . pure Wh itel ists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! address . equals ( whitelist . number , Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher Ġ= Ġend sWith Pattern . matcher ( address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Clean Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Clean Ġ= Ġ! endsWith Pattern . matcher ( address ). find () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstant . NU CLEAR _ OPTION _ TAG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn uclear Pattern : ĠPattern Ġ= ĠPattern . compile (" (? <! \\ d )\\ d { 3 , 4 } (? ! \\ d )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( whitelist DAO . whitelist Count () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( whitelist : ĠWh itelist Ġin Ġwhitelist DAO . pure Wh itel ists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! address . equals ( whitelist . number , Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher Ġ= Ġn uclear Pattern . matcher ( address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Clean Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Clean Ġ= Ġ! n uclear Pattern . matcher ( address ). find () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Clean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Values Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Values . put ( Constant . FIELD _ NAME , Ġaddress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Values . put ( Constant . FIELD _ BODY , Ġbody ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Values . put ( Constant . FIELD _ DATE , Ġtimestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Resolver : ĠContent Resolver Ġ= Ġcontext . content Resolver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . insert ( Constant . CONTENT _ PROVIDER _ IN BOX , Ġcontent Values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify User ( context , Ġaddress , Ġbody ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblocked DAO . add Blocked ( Blocked ( 0 , Ġaddress , Ġbody , Ġtimestamp )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify User ( context : ĠContext , Ġnumber : ĠString , Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinform Ġ= ĠInform Manager ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġbuilder : ĠNotification Compat . Builder Ġ= Ġinform . show Notification ( Core . displayName ( context , Ġnumber ), Ġmessage ) ĊĠĠĠĠĠĠĠ Ġinform . manager . notify (( 1 .. 9 9 9 9 ). random (), Ġbuilder . build ()) ĊĠĠĠ Ġ} Ċ }