package Ġcom . ams av arth an . security . ui . views . main Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Animator Listener Adapter Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . tele phony . Sms Manager Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . as LiveData Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . navigation . fragment . nav Args Ċ import Ġandroidx . navigation . nav Options Ċ import Ġcom . ams av arth an . security . App Ċ import Ġcom . ams av arth an . security . R Ċ import Ġcom . ams av arth an . security . data . datastore . AppData Store Ċ import Ġcom . ams av arth an . security . data . datastore . data Store Ċ import Ġcom . ams av arth an . security . databinding . Fragment Main Binding Ċ import Ġcom . ams av arth an . security . helpers . Recent s Helper Ċ import Ġcom . ams av arth an . security . re ceiv ers . Sms Status Broadcast Receiver Ċ import Ġcom . ams av arth an . security . re ceiv ers . Sms Status Broadcast Receiver . Companion . ACTION _ SMS _ DE LI VER ED Ċ import Ġcom . ams av arth an . security . re ceiv ers . Sms Status Broadcast Receiver . Companion . ACTION _ SMS _ SENT Ċ import Ġcom . ams av arth an . security . ui . view models . Guard ian ViewModel Ċ import Ġcom . ams av arth an . security . ui . view models . My ViewModel Factory Ċ import Ġcom . ams av arth an . security . ui . view models . User ViewModel Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . google . android . material . transition . Material Fade Ċ import Ġcom . google . android . material . transition . Material Shared Axis Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . schedule Ċ Ċ class ĠMain Fragment Ġ: ĠFragment (), ĠHandler Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFragment Main Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĠĠĠ Ġprivate Ġval Ġargs Ġby Ġnav Args < Main Fragment Args >() ĊĊĠĠĠ Ġprivate Ġvar Ġcan Alert Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġ_ in defin ite Sn ackBar : ĠSn ackbar ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġsms Manager Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠContext Compat . getSystem Service ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS ms Manager :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġapp DataStore Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠApp DataStore ( require Context (). data Store ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġguard ian ViewModel : ĠGuard ian ViewModel Ġby Ġview Models Ġ{ ĊĠĠĠĠĠĠĠ ĠMy ViewModel Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġguard ian Dao Ġ= Ġ( activity ?. application Ġas ĠApp ). database . guardian Dao (), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġuser ViewModel : ĠUser ViewModel Ġby Ġview Models Ġ{ ĊĠĠĠĠĠĠĠ ĠMy ViewModel Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Dao Ġ= Ġ( activity ?. application Ġas ĠApp ). database . user Dao (), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġrequest Send SMS Permission Ġ= ĊĠĠĠĠĠĠĠ Ġregister For Activity Result ( Activity Result Contracts . Request Permission ()) Ġ{ Ġis Granted Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( is Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġinitiate Alert () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsn ackBar (" Permission Ġdenied ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġrequest Multiple Permission Ġ= Ġregister For Activity Result ( ĊĠĠĠĠĠĠĠ ĠActivity Result Contracts . Request Multiple Permissions () ĊĠĠĠ Ġ) Ġ{ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFragment Main Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Ġ= Ġthis @ Main Fragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġview Lifecycle Owner ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġenter Transition Ġ= ĠMaterial Fade () ĊĠĠĠĠĠĠĠ Ġexit Transition Ġ= ĠMaterial Shared Axis ( Material Shared Axis . Y , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġbinding . student ViewModel Ġ= Ġuser ViewModel ĊĊĠĠĠĠĠĠĠ Ġrequest App Permissions () ĊĊĠĠĠĠĠĠĠ Ġapp DataStore . preference Flow . as LiveData (). observe ( view Lifecycle Owner ) Ġ{ Ġis First Run Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is First Run ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ observe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( args . bypass First Run Check ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . layout . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp DataStore . save First Run Status To Preferences Store ( require Context (), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ observe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMain Fragment Directions . action Main Fragment To Student Details Fragment (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Options Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop Up To ( R . id . main Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclusive Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest App Permissions () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsms Permission Status Ġ= ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĠManifest . permission . SEND _ SMS ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġcall Log Permission Status Ġ= ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĠManifest . permission . READ _ CALL _ LOG ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpermissions To Ask Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( sms Permission Status Ġ== ĠPackage Manager . PERMISSION _ DEN IED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions To Ask . add ( Manifest . permission . SEND _ SMS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( call Log Permission Status Ġ== ĠPackage Manager . PERMISSION _ DEN IED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions To Ask . add ( Manifest . permission . READ _ CALL _ LOG ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( permissions To Ask . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Multiple Permission . launch ( permissions To Ask . to Typed Array ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitiate Alert (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Alert ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackBar ( getString ( R . string . please _ wait )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsn ackBar ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . alert ing _ status ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ IN DEFIN ITE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġupdate UI ( false ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Alert As SMS () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġuser ViewModel . user . value Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecent Call Logs As Message Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" Here Ġis Ġ${ user . name }' s Ġrecent Ġcall Ġlog Ġ: ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Line () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append Line () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Logs Ġ= ĠRecent s Helper . get Recent Call Logs ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Logs . forEach Indexed Ġ{ Ġindex , Ġcall Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcaller Name Ġ= Ġif Ġ( call . name . isBlank ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . unknown _ caller ) Ġelse Ġcall . name ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( recent Call Logs As Message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("${ index Ġ+ Ġ 1 }. Ġ$ caller Name Ġ- Ġ${ call . phoneNumber }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call . oc cur ance Ġ> Ġ 0 ) Ġappend (" Ġ(${ call . oc cur ance }) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġcall Logs . size Ġ- Ġ 1 ) Ġappend Line () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġguard ian ViewModel . guard ians . observe ( view Lifecycle Owner ) Ġ{ Ġguard ians Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( guard ians . isEmpty ()) Ġreturn @ observe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguard ians . forEach Ġ{ Ġguard ian Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdestination Ġ= Ġguard ian . phoneNumber . format As Number () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . sms _ template , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . gender . pr ono un ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend SMS ( message , Ġdestination ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Logs . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend SMS ( recent Call Logs As Message . toString (), Ġdestination , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UI ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate UI ( revert To Normal : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( revert To Normal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . button Thumb . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove All Animator Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ= Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Animation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimer (). schedule ( TIMEOUT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Alert Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ in defin ite Sn ackBar ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcan Alert Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġbinding . button Thumb . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Animation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Animator Listener ( object Ġ: ĠAn imator Listener Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Animation End ( animation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Alert As SMS () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend SMS ( message : ĠString , Ġdestination : ĠString , Ġmultipart : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġextras Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput String (" destination ", Ġdestination ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput String (" message ", Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsent PI Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( require Context (), ĠS ms Status Broadcast Receiver :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠACTION _ SMS _ SENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extras ( extras ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ IM MUT ABLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdelivered PI Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( require Context (), ĠS ms Status Broadcast Receiver :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠACTION _ SMS _ DE LI VER ED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extras ( extras ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ IM MUT ABLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( multipart ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġsms Manager ?. divide Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsms Manager ?. send Multipart Text Message ( destination , Ġnull , Ġparts , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsms Manager ?. send Text Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsent PI , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelivered PI ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsn ackBar ( message : ĠString , Ġduration : ĠInt Ġ= ĠSn ackbar . LENGTH _ SHORT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsn ackBar Ġ= ĠSn ackbar . make ( binding . root , Ġmessage , Ġduration ) ĊĠĠĠĠĠĠĠ Ġif Ġ( duration Ġ== ĠSn ackbar . LENGTH _ IN DEFIN ITE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ in defin ite Sn ackBar Ġ= Ġsn ackBar ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsn ackBar . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Settings Button Clicked ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ in defin ite Sn ackBar ?. is Shown Ġ== Ġtrue ) Ġreturn ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( Main Fragment Directions . action Main Fragment To Student Details Fragment ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgo To Hel pline Numbers Fragment ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ in defin ite Sn ackBar ?. is Shown Ġ== Ġtrue ) Ġreturn ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( Main Fragment Directions . action Main Fragment To Hel pline Number Fragment ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Button Thumb Long Pressed ( view : ĠView ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpermission Status Ġ= ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . SEND _ SMS ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( permission Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ DEN IED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Send SMS Permission . launch ( Manifest . permission . SEND _ SMS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġinitiate Alert () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . format As Number (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . startsWith ("+ 9 1 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"+ 9 1 ${ this . replace (" Ġ", Ġ"") }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . replace (" Ġ", Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTIME OUT : ĠLong Ġ= Ġ 1 0 0 0 0 ĊĠĠĠ Ġ} Ċ } ĊĊĊ