package Ġcom . sh o un ak mul ay . tele phony . sms Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . tele phony .* Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . annotation . Requires Permission Ċ import Ġcom . sh o un ak mul ay . tele phony . utils . Constants . ACTION _ SMS _ DE LI VER ED Ċ import Ġcom . sh o un ak mul ay . tele phony . utils . Constants . ACTION _ SMS _ SENT Ċ import Ġcom . sh o un ak mul ay . tele phony . utils . Constants . SMS _ BODY Ċ import Ġcom . sh o un ak mul ay . tele phony . utils . Constants . SMS _ DE LI VER ED _ BRO ADCAST _ REQUEST _ CODE Ċ import Ġcom . sh o un ak mul ay . tele phony . utils . Constants . SMS _ SENT _ BRO ADCAST _ REQUEST _ CODE Ċ import Ġcom . sh o un ak mul ay . tele phony . utils . Constants . SMS _ TO Ċ import Ġcom . sh o un ak mul ay . tele phony . utils . Content Uri ĊĊ Ċ class ĠS ms Controller ( private Ġval Ġcontext : ĠContext ) Ġ{ ĊĊĠ Ġ// ĠFETCH ĠSMS ĊĠ Ġfun Ġget Messages ( ĊĠĠĠĠĠ Ġcontent Uri : ĠContent Uri , ĊĠĠĠĠĠ Ġprojection : ĠList < String >, ĊĠĠĠĠĠ Ġselection : ĠString ?, ĊĠĠĠĠĠ Ġselection Args : ĠList < String > ?, ĊĠĠĠĠĠ Ġsort Order : ĠString ? ĊĠ Ġ): ĠList < HashMap < String , ĠString ? >> Ġ{ ĊĠĠĠ Ġval Ġmessages Ġ= Ġmutable ListOf < HashMap < String , ĠString ? >>() ĊĊĠĠĠ Ġval Ġcursor Ġ= Ġcontext . content Resolver . query ( ĊĠĠĠĠĠĠĠ Ġcontent Uri . uri , ĊĠĠĠĠĠĠĠ Ġprojection . to Typed Array (), ĊĠĠĠĠĠĠĠ Ġselection , ĊĠĠĠĠĠĠĠ Ġselection Args ?. to Typed Array (), ĊĠĠĠĠĠĠĠ Ġsort Order ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġwhile Ġ( cursor Ġ!= Ġnull Ġ&& Ġcursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠ Ġval ĠdataObject Ġ= ĠHashMap < String , ĠString ? >( projection . size ) ĊĠĠĠĠĠ Ġfor Ġ( columnName Ġin Ġcursor . column Names ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġcursor . getString ( cursor . getColumnIndex ( columnName )) ĊĠĠĠĠĠĠĠ ĠdataObject [ columnName ] Ġ= Ġvalue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġmessages . add ( data Object ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcursor ?. close () ĊĊĠĠĠ Ġreturn Ġmessages ĊĊĠ Ġ} ĊĊĠ Ġ// ĠS END ĠSMS ĊĠ Ġfun Ġsend Sms ( destination Address : ĠString , Ġmessage Body : ĠString , Ġlisten Status : ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġsms Manager Ġ= Ġget Sms Manager () ĊĠĠĠ Ġif Ġ( listen Status ) Ġ{ ĊĠĠĠĠĠ Ġval Ġpending Intent s Ġ= Ġget Pending Intent s () ĊĠĠĠĠĠ Ġsms Manager . send Text Message ( destination Address , Ġnull , Ġmessage Body , Ġpending Intent s . first , Ġpending Intent s . second ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġsms Manager . send Text Message ( destination Address , Ġnull , Ġmessage Body , Ġnull , Ġnull ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġsend Multipart Sms ( destination Address : ĠString , Ġmessage Body : ĠString , Ġlisten Status : ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġsms Manager Ġ= Ġget Sms Manager () ĊĠĠĠ Ġval Ġmessage Parts Ġ= Ġsms Manager . divide Message ( message Body ) ĊĠĠĠ Ġif Ġ( listen Status ) Ġ{ ĊĠĠĠĠĠ Ġval Ġpending Intent s Ġ= Ġget Multiple Pending Intent s ( message Parts . size ) ĊĠĠĠĠĠ Ġsms Manager . send Multipart Text Message ( destination Address , Ġnull , Ġmessage Parts , Ġpending Intent s . first , Ġpending Intent s . second ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġsms Manager . send Multipart Text Message ( destination Address , Ġnull , Ġmessage Parts , Ġnull , Ġnull ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Multiple Pending Intent s ( size : ĠInt ): ĠPair < ArrayList < Pending Intent >, ĠArrayList < Pending Intent >> Ġ{ ĊĠĠĠ Ġval Ġsent Pending Intent s Ġ= Ġarray ListOf < Pending Intent >() ĊĠĠĠ Ġval Ġdelivered Pending Intent s Ġ= Ġarray ListOf < Pending Intent >() ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. size ) Ġ{ ĊĠĠĠĠĠ Ġval Ġpending Intent s Ġ= Ġget Pending Intent s () ĊĠĠĠĠĠ Ġsent Pending Intent s . add ( pending Intent s . first ) ĊĠĠĠĠĠ Ġdelivered Pending Intent s . add ( pending Intent s . second ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠPair ( sent Pending Intent s , Ġdelivered Pending Intent s ) ĊĠ Ġ} ĊĊĠ Ġfun Ġsend Sms Intent ( destination Address : ĠString , Ġmessage Body : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ SEND TO ). apply Ġ{ ĊĠĠĠĠĠ Ġdata Ġ= ĠUri . parse ( SMS _ TO Ġ+ Ġdestination Address ) ĊĠĠĠĠĠ Ġput Extra ( SMS _ BODY , Ġmessage Body ) ĊĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠ Ġ} ĊĠĠĠ Ġcontext . application Context . startActivity ( intent ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Pending Intent s (): ĠPair < Pending Intent , ĠPending Intent > Ġ{ ĊĠĠĠ Ġval Ġsent Intent Ġ= ĠIntent ( ACTION _ SMS _ SENT ). apply Ġ{ ĊĠĠĠĠĠ Ġ` package ` Ġ= Ġcontext . application Context . packageName ĊĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ RECE IVER _ REGISTER ED _ ONLY ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġsent Pending Intent Ġ= ĠPending Intent . get Broadcast ( context , ĠSMS _ SENT _ BRO ADCAST _ REQUEST _ CODE , Ġsent Intent , ĠPending Intent . FLAG _ ONE _ SHOT ) ĊĊĠĠĠ Ġval Ġdelivered Intent Ġ= ĠIntent ( ACTION _ SMS _ DE LI VER ED ). apply Ġ{ ĊĠĠĠĠĠ Ġ` package ` Ġ= Ġcontext . application Context . packageName ĊĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ RECE IVER _ REGISTER ED _ ONLY ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġdelivered Pending Intent Ġ= ĠPending Intent . get Broadcast ( context , ĠSMS _ DE LI VER ED _ BRO ADCAST _ REQUEST _ CODE , Ġdelivered Intent , ĠPending Intent . FLAG _ ONE _ SHOT ) ĊĊĠĠĠ Ġreturn ĠPair ( sent Pending Intent , Ġdelivered Pending Intent ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Sms Manager (): ĠS ms Manager Ġ{ ĊĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP _ MR 1 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġsubscription Id Ġ= ĠS ms Manager . getDefault Sms Subscription Id () ĊĠĠĠĠĠ Ġif Ġ( subscriptionId Ġ!= ĠSubscription Manager . INVALID _ SUB SCRIPTION _ ID ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠS ms Manager . getS ms Manager For Subscription Id ( subscriptionId ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠS ms Manager . getDefault () ĊĠ Ġ} ĊĊĠ Ġ// ĠPH ONE ĊĠ Ġfun Ġopen Dial er ( phoneNumber : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġdial er Intent Ġ= ĠIntent ( Intent . ACTION _ DI AL ). apply Ġ{ ĊĠĠĠĠĠ Ġdata Ġ= ĠUri . parse (" tel :$ phoneNumber ") ĊĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcontext . startActivity ( dial er Intent ) ĊĠ Ġ} ĊĊĠ Ġ@ Requires Permission ( all Of Ġ= Ġ[ Manifest . permission . CALL _ PHONE ]) ĊĠ Ġfun Ġdial PhoneNumber ( phoneNumber : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġcall Intent Ġ= ĠIntent ( Intent . ACTION _ CALL ). apply Ġ{ ĊĠĠĠĠĠ Ġdata Ġ= ĠUri . parse (" tel :$ phoneNumber ") ĊĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( call Intent . resolve Activity ( context . package Manager ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġcontext . application Context . startActivity ( call Intent ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠSTATUS ĊĠ Ġfun Ġis Sms Cap able (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġtele phony Manager Ġ= Ġget Tele phony Manager () ĊĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠ Ġtele phony Manager . is Sms Cap able ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġpackage Manager Ġ= Ġcontext . package Manager ĊĠĠĠĠĠ Ġif Ġ( package Manager Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpackage Manager . has System Feature ( PackageManager . FEATURE _ TELE PHONY ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget Cell ular Data State (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġget Tele phony Manager (). data State ĊĠ Ġ} ĊĊĠ Ġfun Ġget Call State (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġget Tele phony Manager (). call State ĊĠ Ġ} ĊĊĠ Ġfun ĠgetData Activity (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġget Tele phony Manager (). data Activity ĊĠ Ġ} ĊĊĠ Ġfun Ġget Network Operator (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġget Tele phony Manager (). network Operator ĊĠ Ġ} ĊĊĠ Ġfun Ġget Network Operator Name (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġget Tele phony Manager (). network Operator Name ĊĠ Ġ} ĊĊĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠ Ġfun ĠgetData Network Type (): ĠInt Ġ{ ĊĠĠĠ Ġval Ġtele phony Manager Ġ= Ġget Tele phony Manager () ĊĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ> ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠ Ġtele phony Manager . data Network Type ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġtele phony Manager . network Type ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget Phone Type (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġget Tele phony Manager (). phone Type ĊĠ Ġ} ĊĊĠ Ġfun Ġget Sim Operator (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġget Tele phony Manager (). sim Operator ĊĠ Ġ} ĊĊĠ Ġfun Ġget Sim Operator Name (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġget Tele phony Manager (). sim Operator Name ĊĠ Ġ} ĊĊĠ Ġfun Ġget Sim State (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġget Tele phony Manager (). sim State ĊĠ Ġ} ĊĊĠ Ġfun Ġis Network Roaming (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġget Tele phony Manager (). is Network Roaming ĊĠ Ġ} ĊĊĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠ Ġ@ Requires Permission ( all Of Ġ= Ġ[ Manifest . permission . ACCESS _ CO AR SE _ LOCATION , ĠManifest . permission . READ _ PHONE _ STATE ]) ĊĠ Ġfun Ġget Service State (): ĠInt ? Ġ{ ĊĠĠĠ Ġval Ġservice State Ġ= Ġget Tele phony Manager (). service State ĊĠĠĠ Ġreturn Ġservice State ?. state ĊĠ Ġ} ĊĊĠ Ġ@ Requires Api ( Build . VERSION _ CODES . Q ) ĊĠ Ġfun Ġget Signal Strength (): ĠList < Int >? Ġ{ ĊĠĠĠ Ġval Ġsignal Strength Ġ= Ġget Tele phony Manager (). signal Strength ĊĠĠĠ Ġreturn Ġsignal Strength ?. cell Signal Strength s ?. map Ġ{ ĊĠĠĠĠĠ Ġreturn @ map Ġit . level ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Requires Api ( Build . VERSION _ CODES . Q ) ĊĠ Ġfun Ġget Cell Identity Info (): ĠList < Int >? Ġ{ ĊĠĠĠ Ġval Ġcell Id Ġ= Ġget Cell Identity () ĊĠĠĠ Ġreturn Ġcell Id ?. map Ġ{ ĊĠĠĠĠĠ Ġreturn @ map Ġit . level ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Cell Identity (): ĠCell Identity Ġ{ ĊĠĠĠ Ġreturn Ġcontext . getSystem Service ( Context . Cell Identity ) Ġas ĠCell Identity ĊĠ Ġ} ĊĊĊĠ Ġprivate Ġfun Ġget Tele phony Manager (): ĠTele phony Manager Ġ{ ĊĠĠĠ Ġreturn Ġcontext . getSystem Service ( Context . TELE PHONY _ SERVICE ) Ġas ĠTele phony Manager ĊĠ Ġ} Ċ }