package Ġapp . sos app . sos . sos app . ui Modules . contacts Picker Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat . check Self Permission Ċ import Ġandroidx . core . os . bundle Of Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . navigation . fragment . nav Args Ċ import Ġapp . sos app . sos . sos app . R Ċ import Ġapp . sos app . sos . sos app . databinding . Fragment Contacts Picker Binding Ċ import Ġapp . sos app . sos . sos app . databinding . Fragment Home Binding Ċ import Ġapp . sos app . sos . sos app . databinding . Fragment S os Contacts Binding Ċ import Ġapp . sos app . sos . sos app . models . Model Contact Ċ import Ġapp . sos app . sos . sos app . models . Model E mergency Number Ċ import Ġapp . sos app . sos . sos app . ui Modules . base . Base Fragment Ċ import Ġapp . sos app . sos . sos app . ui Modules . edit S OS Msg . Fragment Edit S OS Message Ċ import Ġapp . sos app . sos . sos app . ui Modules . goTo AppSettings Ċ import Ġapp . sos app . sos . sos app . utils .* Ċ import Ġcom . t uring tech nologies . material scrollbar . Alphabet Indicator Ċ Ċ class ĠFragment Contacts Picker Ġ: ĠBase Fragment < Fragment Contacts Picker Binding > (){ ĊĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġby Ġlazy Ġ{ Ġ" Frag Contacts Picker " Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPER MISSION S _ REQUEST _ READ _ CONTACT S Ġ= Ġ 1 0 0 3 ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ KEY _ SELECTED _ CONTACT S Ġ= Ġ" selected Contacts " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġlayout Id Ġ= ĠR . layout . fragment _ contacts _ picker ĊĠĠĠ Ġprivate Ġval Ġargs : ĠFragment Contacts Picker Args Ġby Ġnav Args () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Repo Contacts : ĠRepo Contacts ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Adapter Contacts : ĠAdapter Contacts ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnav Controller : ĠNav Controller ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġm Data Binding Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller Ġ= Ġfind Nav Controller () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Repo Contacts Ġ= ĠRepo Contacts ( m Activity . application Context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġb Selected Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter Contacts Ġ= ĠAdapter Contacts ( args . max Selection , ĠonClick Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġm Adapter Contacts . getSelected Contacts (). size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Ġ<= Ġ 0 ) Ġbtn Select . disable () Ġelse Ġbtn Select . enable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Selected Ġ= Ġ"${ selected }/${ args . max Selection }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrv Contacts . adapter Ġ= Ġm Adapter Contacts ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch ScrollBar . set Indicator ( Alphabet Indicator ( m Activity ), Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset View Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetData Observer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Activity . set Firebase Analytics Current Screen (" Contacts Picker ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Dialog s . is Showing Dialog ) Ġload Contacts () ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(:: m Repo Contacts . isInitialized ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Repo Contacts . on Clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠPER MISSION S _ REQUEST _ READ _ CONTACT S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Contacts () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr ational Ġ= Ġ! Activity Compat . should Show Request Permission R ationale ( m Activity , ĠManifest . permission . READ _ CONTACT S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Dialog s . show Common Confirmation Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS OS App Res . getString ( R . string . title _ permission _ required ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS OS App Res . getString ( if Ġ( ration al ) ĠR . string . msg _ read _ contact _ permission _ required _ ration al Ġelse ĠR . string . msg _ read _ contact _ permission _ required ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS OS App Res . getString ( R . string . action _ grant _ now ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Btn Click Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Dialog s . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ration al ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Activity . goTo AppSettings () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Contacts () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Dialog s . m Dialog ?. setOn Key Listener Ġ{ Ġdialog Interface , Ġi , Ġkey Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== ĠKeyEvent . KEYCODE _ BACK Ġ&& Ġkey Event . action Ġ== ĠKeyEvent . ACTION _ UP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Interface . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . pop Back Stack () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Key Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFragment Contacts Picker Binding . setView Listeners (){ ĊĠĠĠĠĠĠĠ Ġswipe Refresh Layout . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Contacts () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn Select . set Safe OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsel Contacts Ġ= Ġm Adapter Contacts . getSelected Contacts () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sel Contacts . isNull OrEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Activity . set Firebase Analytics Log Event (" CONTACT S _ P ICK ", Ġbundle Of (" Pick ed " Ġto Ġ" Pick ed _ Error ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Activity . toast ( S OS App Res . getString ( R . string . err _ msg _ general )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Activity . set Firebase Analytics Log Event (" CONTACT S _ P ICK ", Ġbundle Of (" Pick ed " Ġto Ġ" Pick ed _ Total _${ sel Contacts . size } ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( args . sos Contacts ) Ġm Prefs . sos Contacts Models Ġ= Ġsel Contacts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Back Stack Entry ?. saved State Handle ?. set ( EXTRA _ KEY _ SELECTED _ CONTACT S , Ġm Adapter Contacts . getSelected Contacts ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop Back Stack () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Contacts () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Activity . set Firebase Analytics Log Event (" CONTACT S _ P ICK ", Ġbundle Of (" Loading " Ġto Ġ" Loading ")) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Adapter Contacts . item Count Ġ<= Ġ 0 ) Ġm Dialog s . show Progress Dialog ( S OS App Res . getString ( R . string . msg _ loading _ contacts )) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Self Permission ( m Activity , ĠManifest . permission . READ _ CONTACT S ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( array Of ( Manifest . permission . READ _ CONTACT S ), ĠPER MISSION S _ REQUEST _ READ _ CONTACT S ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Repo Contacts . fetch Contacts ( args . sos Contacts ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetData Observer (){ ĊĠĠĠĠĠĠĠ Ġm Repo Contacts . contacts LD . observe ( view Lifecycle Owner ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Data Binding { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Refresh Layout . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Contacts Ui ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Activity . set Firebase Analytics Log Event (" CONTACT S _ P ICK ", Ġbundle Of (" Loading " Ġto Ġ" Loading _ Completed ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFragment Contacts Picker Binding . set Contacts Ui ( numbers : ĠList < Model Contact >? ){ ĊĠĠĠĠĠĠĠ Ġm Dialog s . dismiss Progress () ĊĠĠĠĠĠĠĠ Ġif Ġ(! numbers . isNull OrEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter Contacts . submit ( numbers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtv Contacts Error . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrv Contacts . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġm Adapter Contacts . getSelected Contacts (). size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb Selected Ġ= Ġ"${ selected }/${ args . max Selection }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Ġ<= Ġ 0 ) Ġbtn Select . disable () Ġelse Ġbtn Select . enable () ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrv Contacts . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtv Contacts Error . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }