package Ġnl . team wild en berg . solo metrics Ċ Ċ import Ġandroid . R . attr .* Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . widget . Adapter View Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . ListView Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . preference . Preference Fragment Compat Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx kotlin . plus Assign Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkotlinx . android . synt hetic . main . device _ list _ activity .* Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Main Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġnl . team wild en berg . solo metrics . Adapter . Device ListAdapter Ċ import Ġnl . team wild en berg . solo metrics . B le .* Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ class ĠDevice List Activity Ġ: ĠAppCompatActivity (), ĠCor outine Scope Ġby ĠMain Scope () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdevice Discovery List : ĠListView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdevice Discovery Adapter : ĠDevice ListAdapter ĊĠĠĠ Ġprivate Ġvar Ġdevice List : ĠMutable List < Blue Device > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġval Ġcomposite Disposable : ĠComposite Disposable Ġ= ĠComposite Disposable () ĊĠĠĠ Ġprivate Ġval Ġbl s : ĠIB le Service Ġ= ĠB le Service () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . device _ list _ activity ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġdevice Type Ġ= Ġintent . get Serializable Extra (" device Type ") Ġas ĠDevice TypeEnum ĊĠĠĠĠĠĠĠ Ġif Ġ( device Type Ġ== ĠDevice TypeEnum . Solo Screen Du ino ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Image . setImage Resource ( R . drawable . ic _ web _ black _ 2 4 dp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif ( device Type Ġ== ĠDevice TypeEnum . U ltr ason ic ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Image . setImage Resource ( R . drawable . ic _ nature _ black _ 2 4 dp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdevice Discovery Adapter Ġ= ĠDevice ListAdapter ( this , Ġdevice List ) ĊĠĠĠĠĠĠĠ Ġdevice Discovery List Ġ= ĠfindViewById < ListView >( R . id . discover ListView ) ĊĠĠĠĠĠĠĠ Ġdevice Discovery List . adapter Ġ= Ġdevice Discovery Adapter ĊĠĠĠĠĠĠĠ Ġdevice Discovery List . on ItemClickListener Ġ= ĠAdapter View . On ItemClickListener Ġ{ Ġparent , Ġview , Ġposition , Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġyour Ġlist view 's Ġselected Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġselected Item Ġ= Ġparent . getItem At Position ( position ) Ġas ĠBlue Device ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfinish Intent Ġ= ĠIntent ( this , ĠDevice List Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Intent . putExtra (" deviceId ", Ġselected Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġfinish Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . finish (); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġprog bar Ġ= ĠfindViewById < ProgressBar >( R . id . toolbar progress ) ĊĠĠĠĠĠĠĠ Ġprog bar . set Progress ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġstart Button Ġ= ĠfindViewById < Floating ActionButton >( R . id . start Button ) ĊĠĠĠĠĠĠĠ Ġstart Button . setOnClickListener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Discovery ( device Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstart Discovery ( device Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSettings Fragment Ġ: ĠPreference Fragment Compat () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate Preferences ( savedInstanceState : ĠBundle ?, Ġroot Key : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Preferences From Resource ( R . xml . root _ preferences , Ġroot Key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/// ĠK U DOS : ĊĠĠĠ Ġ/// Ġhttps :// stackoverflow . com / a / 4 6 4 9 9 3 8 7 / 5 5 3 5 8 9 ĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠHandle Ġaction Ġbar Ġitem Ġclicks Ġhere . ĠThe Ġaction Ġbar Ġwill ĊĠĠĠĠĠĠĠ Ġ// Ġautomatically Ġhandle Ġclicks Ġon Ġthe ĠHome / Up Ġbutton , Ġso Ġlong ĊĠĠĠĠĠĠĠ Ġ// Ġas Ġyou Ġspecify Ġa Ġparent Ġactivity Ġin ĠAndroid Manifest . xml . ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . getItem Id ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . id . home Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġvar Ġfinish Intent Ġ= ĠIntent ( this , ĠDevice List Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ C ANCE LED , Ġfinish Intent ) ĊĠĠĠĠĠĠĠ Ġthis . finish (); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Discovery ( device Type : ĠDevice TypeEnum ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstart Button Ġ= ĠfindViewById < Floating ActionButton >( R . id . start Button ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( composite Disposable . size () Ġ== Ġ 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Button . setImage Resource ( android . R . drawable . ic _ media _ pause ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// start Button . set BackgroundColor ( Color . RED ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Discovery Adapter . notify DataSet Changed () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprog bar Ġ= ĠfindViewById < ProgressBar >( R . id . toolbar progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtimer Guard Observable Ġ= ĠObservable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. interval ( 0 , Ġ 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do Finally () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprog bar . set Progress ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprog bar . set Progress (( it Ġ/ Ġ 1 0 ). toInt (), Ġfalse ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġt Ġ-> Ġ( t Ġ+ Ġ 1 ). toInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġt Ġ-> Ġt Ġ>= Ġ 9 9 9 Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobs Ġ= Ġbl s . GetDevice List ( device Type , Ġtimer Guard Observable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Disposable Ġ+= Ġobs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// . observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do Finally { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Discovery () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġdevice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// this . adapter . add ( device ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( device . address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device List . filter Ġ{ Ġit . type Ġ== Ġdevice Type Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. count () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice List . add ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Discovery Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" error Ġthing ie ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" device observable Ġcompleted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" number Ġof Ġdisp . Ġ${ composite Disposable . size () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Discovery () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Discovery (){ ĊĠĠĠĠĠĠĠ Ġvar Ġstart Button Ġ= ĠfindViewById < Floating ActionButton >( R . id . start Button ) ĊĠĠĠĠĠĠĠ Ġstart Button . setImage Resource ( android . R . drawable . ic _ media _ play ); Ċ // ĠĠĠĠĠĠĠ Ġstart Button . set BackgroundColor ( Color . BLUE ); ĊĠĠĠĠĠĠĠ Ġcomposite Disposable . clear () ĊĊĠĠĠ Ġ} Ċ }