package Ġcom . ust ad mobile . retrie ver . test app Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . bluetooth . Bluetooth Manager Ċ import Ġandroid . comp anion . Association Request Ċ import Ġandroid . comp anion . Bluetooth Device Filter Ċ import Ġandroid . comp anion . Companion Device Manager Ċ import Ġandroid . content .* Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . paging . Paged List Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . ust ad mobile . retrie ver . test app . databinding . Fragment NodeList Binding Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ import Ġcom . ust ad mobile . door . Door DataSource Factory Ċ import Ġcom . ust ad mobile . door . ext . as Repository LiveData Ċ import Ġcom . ust ad mobile . door . util . system TimeIn Millis Ċ import Ġcom . ust ad mobile . retrie ver . db . entities . Network Node Ċ import Ġcom . ust ad mobile . retrie ver . Retriever Ċ import Ġcom . ust ad mobile . retrie ver . Retriever Android Impl Ċ import Ġcom . ust ad mobile . retrie ver . test app . controller . NodeList Controller Ċ import Ġcom . ust ad mobile . retrie ver . test app . view . Node ListView Ċ import Ġio . github . a ak ira . n api er . N api er Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . kode in . di . DI Ċ import Ġorg . kode in . di . DI Aware Ċ import Ġorg . kode in . di . android . x . closest DI Ċ import Ġorg . kode in . di . instance Ċ import Ġjava . net . Inet 4 Address Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . NetworkInterface Ċ import Ġjava . util .* Ċ Ċ interface ĠClick Add Node { ĊĠĠĠ Ġfun Ġclick Add Note () Ċ } Ċ class ĠNode List Fragment (): ĠFragment (), ĠNode ListView , ĠNode Listener , ĠClick Add Node , ĠD IA ware Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġdi : ĠDI Ġby Ġclosest DI () ĊĊĠĠĠ Ġprivate Ġval Ġretrie ver : ĠRetrie ver Ġby Ġinstance () ĊĊĠĠĠ Ġprivate Ġvar Ġcontroller : ĠNode List Controller ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġnode List LiveData : ĠLive Data < Paged List < Network Node >> ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġnode List Recycler Adapter Ġ: ĠNode Paged List Recycler Adapter ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġnode List Observer Ġ= ĠObserver < Paged List < Network Node >? >{ Ġt -> ĊĠĠĠĠĠĠĠ Ġrun { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode List Recycler Adapter ?. submit List ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠBT _ ON _ REQUEST _ CODE Ġ= Ġ 8 7 ĊĊĠĠĠ Ġprivate Ġvar Ġbinding : ĠFragment NodeList Binding ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġfab Clicked : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġroot View : ĠView ĊĊĠĠĠĠĠĠĠ Ġval Ġdevice StartTime Ġ= Ġsystem TimeIn Millis () ĊĊĠĠĠĠĠĠĠ ĠN api er . d (" Retriever : ĠGot Ġdevice Ġlist Ġin Ġ${ system TimeIn Millis () Ġ- Ġdevice StartTime } ms ") ĊĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment NodeList Binding . inflate ( in flater , Ġcontainer , Ġfalse ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot View Ġ= Ġit . root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . listener Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . fragment NodeList Rv . layout Manager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode List Recycler Adapter Ġ= ĠNode Paged List Recycler Adapter ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . fragment NodeList Rv . adapter Ġ= Ġnode List Recycler Adapter ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontroller Ġ= ĠNode List Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), Ġ( retrie ver Ġas ĠRetrie ver Android Impl ). database , Ġthis ) ĊĠĠĠĠĠĠĠ Ġcontroller ?. onCreate () ĊĊĊĠĠĠĠĠĠĠ Ġreturn Ġroot View ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Device Add rs Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . list ( NetworkInterface . get Network Interfaces ()). filter Ġ{ Ġ! it . is Loop back Ġ}. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . list ( it . inet Addresses ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter Is Instance < Inet 4 Address >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistening Port Ġ= Ġretrie ver . list ening Port () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ?. local Node Addr Ġ= Ġall Device Add rs . join ToString Ġ{ Ġaddr Ġ-> Ġ" http ://${ addr . host Address }: $ list ening Port /" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcheck Bluetooth (){ ĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Manager : ĠBluetooth Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. getSystem Service ( Context . BL U ETO OTH _ SERVICE ) Ġas ĠBluetooth Manager ĊĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Adapter : ĠBluetooth Adapter Ġ= Ġbluetooth Manager . adapter ĊĊĠĠĠĠĠĠĠ Ġif (! bluetooth Adapter . isEnabled ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenable Bluetooth Intent : ĠIntent Ġ= ĠIntent ( Bluetooth Adapter . ACTION _ REQUEST _ ENABLE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Launch Ġ= Ġregister For Activity Result ( Activity Result Contracts . Start Activity For Result ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ-> Ġif ( result . result Code Ġ== ĠActivity . RESULT _ OK ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Companion Device Pair ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Launch . launch ( enable Bluetooth Intent ) ĊĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Companion Device Pair ing () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdevice Manager : ĠComp anion Device Manager Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext ?. getSystem Service ( Context . COMP AN ION _ DEVICE _ SERVICE ) Ġas ĠComp anion Device Manager ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġstart Companion Device Pair ing (){ ĊĊĠĠĠĠĠĠĠ Ġ// Device Ġfilter ĊĠĠĠĠĠĠĠ Ġval Ġbluetooth Device Filter : ĠBluetooth Device Filter Ġ= ĠBluetooth Device Filter . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// . setName Pattern ( Pattern . compile (" My Ġdevice ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// . add Service Uuid ( Parcel Uuid ( UUID ( 0 x 1 2 3 abc L , Ġ- 1 L )), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// Request ĊĠĠĠĠĠĠĠ Ġval Ġpair ing Request : ĠAssociation Request Ġ= ĠAssociation Request . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Device Filter ( bluetooth Device Filter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Single Device ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġall Associations Ġ= Ġdevice Manager . associ ations ĊĊĠĠĠĠĠĠĠ Ġdevice Manager . associate ( pair ing Request , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject : ĠComp anion Device Manager . Callback () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Device Found ( cho oser Launcher : ĠIntent Sender ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN api er . d (" P 2 P ĠTest 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// show ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Intent Sender For Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcho oser Launcher , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBT _ ON _ REQUEST _ CODE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġ 0 , Ġ 0 , Ġ 0 , null ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN api er . d (" P 2 P ĠRetrie ver : ĠFound Ġbluetooth Ġdevice .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( error : ĠCharSequence ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN api er . w (" P 2 P ĠRetrie ver Ġ: ĠFailed Ġassociation Ġdevice ĠManager ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġnull ) ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( request Code ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBT _ ON _ REQUEST _ CODE Ġ-> when ( result Code ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity . RESULT _ OK Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice To Pair : ĠBluetooth Device ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. get Parcelable Extra ( Companion Device Manager . EXTRA _ DEVICE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( device To Pair ?. address Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Note : Ġ 1 8 / Mar / 2 2 Ġthis Ġhas Ġbeen Ġdisabled Ġ- Ġshould Ġbe Ġdone Ġvia Ġthe Ġretrie ver Ġinterface Ġitself Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretrie ver . add New Node ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNetwork Node ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice To Pair . name Ġ+ Ġ":" Ġ+ Ġdevice To Pair . address , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice To Pair . address , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN api er . d (" P 2 P Ġselected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ-> Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġnode List : ĠDoor DataSource Factory < Int , ĠNetwork Node >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode List LiveData ?. remove Observer ( node List Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode List LiveData Ġ= Ġvalue ?. as Repository LiveData (( retrie ver Ġas ĠRetrie ver Android Impl ). database . network Node Dao ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode List LiveData ?. observe ( this , Ġnode List Observer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick Node ( node : ĠNetwork Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclipboard : ĠClip board Manager ? Ġ= Ġcontext ?. getSystem Service ( Context . CLIP BOARD _ SERVICE ) Ġas ĠClip board Manager ? ĊĠĠĠĠĠĠĠ Ġval Ġclip Ġ= ĠClip Data . new Plain Text ("", Ġnode . network Node Endpoint Url ) ĊĠĠĠĠĠĠĠ Ġclipboard ?. set Primary Clip ( clip ) ĊĊĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" Endpoint Ġcopied Ġto Ġclipboard ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġbinding ?. fragment NodeList Rv ?. adapter Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġnode List Recycler Adapter Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġbinding Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonDelete Node ( node : ĠNetwork Node ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġendpoint Url Ġ= Ġnode . network Node Endpoint Url Ċ // ĠĠĠĠĠĠĠ Ġif (! endpoint Url . isNull OrEmpty ()){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġretrie ver . update Network Node Lost ( endpoint Url ) Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclick Add Note () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Bluetooth () ĊĠĠĠ Ġ} ĊĊ Ċ }