package Ġcom . g arc ia . sa ul . app g . view . activity Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . app . Activity Compat Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . support . v 7 . widget . Default Item Animator Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġcom . g arc ia . sa ul . app g . R Ċ import Ġcom . g arc ia . sa ul . app g . data . api . client . Gr in Client Ċ import Ġcom . g arc ia . sa ul . app g . data . model . MB l ue tooth Device Ċ import Ġcom . g arc ia . sa ul . app g . inter actor . Local Devices Interactor Ċ import Ġcom . g arc ia . sa ul . app g . presenter . Local Devices Presenter Ċ import Ġcom . g arc ia . sa ul . app g . view . adapter . Local Devices Adapter Ċ import Ġcom . g arc ia . sa ul . app g . view . listener . Recycler Device Listener Ċ import Ġkotlinx . android . synt hetic . main . activity _ local _ devices .* Ċ Ċ class ĠLocal Devices Activity Ġ: ĠAppCompatActivity (), ĠLocal Devices Presenter . View Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠENABLE _ BT _ REQUEST _ CODE Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġval ĠREQUEST _ CO AR SE _ LOCATION Ġ= Ġ 9 9 9 ĊĠĠĠ Ġprivate Ġvar Ġbluetooth Adapter Ġ= ĠBluetooth Adapter . getDefault Adapter () ĊĊĠĠĠ Ġprivate Ġvar Ġdevices List Ġ Ġ= Ġarray ListOf < MB l ue tooth Device >() ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cycler Ġ: ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠLocal Devices Adapter ĊĠĠĠ Ġprivate Ġval Ġlayout Manager Ġby Ġlazy Ġ{ ĠLinearLayoutManager ( this ) Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpresenter : ĠLocal Devices Presenter ĊĠĠĠ Ġprivate Ġvar Ġgr in Client : ĠGr in Client Ġ= ĠGr in Client () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ local _ devices ) ĊĊĠĠĠĠĠĠĠ Ġinit Presenter () ĊĠĠĠĠĠĠĠ Ġlistener () ĊĠĠĠĠĠĠĠ Ġdisable Refresh () ĊĠĠĠĠĠĠĠ Ġverify Bluetooth () ĊĠĠĠĠĠĠĠ Ġcheck Location Permission () ĊĠĠĠĠĠĠĠ Ġinit Ui () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit Presenter (){ ĊĠĠĠĠĠĠĠ Ġpresenter Ġ= ĠLocal Devices Presenter ( Local Devices Interactor ( gr in Client )) ĊĠĠĠĠĠĠĠ Ġpresenter . view Ġ= Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Bluetooth () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Adapter . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Switch . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Switch . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Fab . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisable Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh Fab . isEnabled Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Location Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . ACCESS _ CO AR SE _ LOCATION ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ CO AR SE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < String >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ CO AR SE _ LOCATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results . isNotEmpty () Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproceed Discovery () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Location Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlistener () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġbluetooth Switch . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Bluetooth () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlist Fab . setOnClickListener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠRemote Devices Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrefresh Fab . setOnClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevices List . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bluetooth Adapter . start Discovery ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , Ġapplication Context . resources . getString ( R . string . on _ search _ devices ), ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproceed Discovery () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , Ġapplication Context . resources . getString ( R . string . on _ error ), ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġvar Ġbroadcast Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġintent . action ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Bluetooth Device . ACTION _ FOUND Ġ== Ġaction ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr ssi Ġ= Ġintent . get Short Extra ( Bluetooth Device . EXTRA _ RSS I , Ġjava . lang . Short . MIN _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbluetooth Device Ġ= Ġintent . get Parcelable Extra < Bluetooth Device >( Bluetooth Device . EXTRA _ DEVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname : ĠString Ġ= Ġbluetooth Device . name Ġ?: Ġapplication Context . resources . getString ( R . string . device _ unknown ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstrength Ġ= Ġr ssi . toString () Ġ+ Ġapplication Context . resources . getString ( R . string . device _ db m ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= ĠM Bluetooth Device ("", name , bluetooth Device . address , strength ," ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevices List . add ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" Device ", Ġname ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset RecyclerView () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Bluetooth () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! bluetooth Adapter . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenable Intent Ġ= ĠIntent ( Bluetooth Adapter . ACTION _ REQUEST _ ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( enable Intent , ĠENABLE _ BT _ REQUEST _ CODE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġthis . unregister Receiver ( broadcast Receiver ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠENABLE _ BT _ REQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Switch . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Fab . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , Ġapplication Context . resources . getString ( R . string . bluetooth _ activated ), ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠRESULT _ C ANCE LED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Switch . isChecked Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , Ġapplication Context . resources . getString ( R . string . bluetooth _ disabled ), ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġproceed Discovery () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠIntent Filter ( Bluetooth Device . ACTION _ FOUND ) ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( Bluetooth Device . ACTION _ NAME _ CHANGED ) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( broadcast Receiver , Ġfilter ) ĊĠĠĠĠĠĠĠ Ġbluetooth Adapter . start Discovery () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Ui (){ ĊĠĠĠĠĠĠĠ Ġre cycler Ġ= Ġlocal De vs RecyclerView Ġas ĠRecyclerView ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset RecyclerView (){ ĊĊĊĠĠĠĠĠĠĠ Ġre cycler . set Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠ Ġre cycler . item Animator Ġ= ĠDefault Item Animator () ĊĠĠĠĠĠĠĠ Ġre cycler . layout Manager Ġ= Ġlayout Manager ĊĠĠĠĠĠĠĠ Ġadapter Ġ= Ġ( Local Devices Adapter ( devices List , Ġobject : ĠRe cycler Device Listener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick ( m Bluetooth Device : ĠM Bluetooth Device , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . on Put Device ( m Bluetooth Device ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠĠĠĠĠ Ġre cycler . adapter Ġ= Ġadapter ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Put Device Success ( device : ĠM Bluetooth Device ) Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Ãī x ito Ġal Ġsub ir Ġ${ device . name }", Toast . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Put Device Error ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠR . string . on _ error , Toast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ ĠLog . e (" on Put Device ", Ġerror . toString ()) ĊĠĠĠ Ġ} Ċ Ċ } Ċ