package Ġco . net guru . b aby . monitor . client . feature . communication . pair ing Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . ns d . N sd Service Info Ċ import Ġandroid . net . wifi . Wifi Manager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . os . bundle Of Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġandroidx . navigation . Nav Options Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġco . net guru . b aby . monitor . client . R Ċ import Ġco . net guru . b aby . monitor . client . common . base . Base Fragment Ċ import Ġco . net guru . b aby . monitor . client . common . extensions . set Divider Ċ import Ġco . net guru . b aby . monitor . client . common . extensions . show Snackbar Message Ċ import Ġco . net guru . b aby . monitor . client . feature . analytics . Screen Ċ import Ġco . net guru . b aby . monitor . client . feature . communication . ns d . N sd Services Adapter Ċ import Ġco . net guru . b aby . monitor . client . feature . communication . ns d . N sd State Ċ import Ġco . net guru . b aby . monitor . client . feature . communication . ns d . Resolve FailedException Ċ import Ġco . net guru . b aby . monitor . client . feature . communication . ns d . Start Discovery FailedException Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġkotlinx . android . synt hetic . main . fragment _ connecting _ devices .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠService Discovery Fragment Ġ: ĠBase Fragment () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġlayout Resource Ġ= ĠR . layout . fragment _ connecting _ devices ĊĠĠĠ Ġoverride Ġval Ġscreen : ĠScreen Ġ= ĠScreen . SERVICE _ DIS COVERY ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġfactory : ĠViewModel Provider . Factory ĊĊĠĠĠ Ġprivate Ġvar Ġtime Out Disposable : ĠDis posable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġn sd Services Adapter : ĠN sd Services Adapter ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠViewModel Providers . of ( this , Ġfactory )[ Service Discovery ViewModel :: class . java ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġsetup Adapter () ĊĠĠĠĠĠĠĠ Ġsetup Observer s () ĊĠĠĠĠĠĠĠ Ġsetup InProgress Views () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġn sd Services Adapter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN sd Services Adapter Ġ{ Ġn sd Service Info Ġ-> Ġnavigate To Pair ing Fragment ( ns d Service Info ) Ġ} ĊĠĠĠĠĠĠĠ Ġre cyclerView . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager ( require Context (), ĠLinearLayoutManager . VERTICAL , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġn sd Services Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Divider ( R . drawable . recycler _ divider ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate To Pair ing Fragment ( ns d Service Info : ĠN sd Service Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . service Discovery To Pair ing , Ġbundle Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠADDRESS _ B UNDLE _ KEY Ġto Ġ" ws ://${ ns d Service Info . host . host Address }:${ ns d Service Info . port }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Observer s () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . ns d State LiveData . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġn sd State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle N sd State ( ns d State ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle N sd State ( ns d State : ĠN sd State ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( ns d State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠN sd State . Error Ġ-> Ġhandle N sd Service Error ( ns d State . throwable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠN sd State . InProgress Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( motion Container . currentState Ġ!= ĠR . id . end ) Ġmotion Container . transition ToEnd () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Services ( ns d State . service InfoList ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠN sd State . Completed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ns d State . service InfoList . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Services ( ns d State . service InfoList ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Complete Views () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate To Failed Connection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle N sd Service Error ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( throwable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResolve FailedException Ġ-> Ġshow Snackbar Message ( R . string . discover ing _ services _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStart Discovery FailedException Ġ-> Ġnavigate To Failed Connection () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate To Failed Connection () Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( R . id . service Discovery To Connection Failed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Complete Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġcancel Refresh Button . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover N sd Service () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġresources . getString ( R . string . refresh _ list ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġback Button . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Visible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate Up () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠprogressBar . isVisible Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup InProgress Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġcancel Refresh Button . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgo Back To Specify Device () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġresources . getString ( R . string . cancel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġback Button . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠprogressBar . isVisible Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Services ( service InfoList : ĠList < N sd Service Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġn sd Services Adapter ?. submit List ( service InfoList . to Mutable List ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgo Back To Specify Device () Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Nav Controller () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . cancel Service Discovery , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNav Options . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Pop Up To ( R . id . specify Device , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġdiscover N sd Service () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdiscover N sd Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwifi Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). application Context . getSystem Service ( Context . WIFI _ SERVICE ) Ġas ĠW ifi Manager ĊĠĠĠĠĠĠĠ ĠviewModel . discover N sd Service ( wifi Manager ) ĊĠĠĠĠĠĠĠ Ġtime Out Disposable ?. dispose () ĊĠĠĠĠĠĠĠ Ġsetup InProgress Views () ĊĠĠĠĠĠĠĠ Ġtime Out Disposable Ġ= ĠSingle . timer ( SEARCH _ TIME _ T ILL _ FAIL , ĠTimeUnit . MIN UTES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . stop N sd Service Discovery () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġtime Out Disposable ?. dispose () ĊĠĠĠĠĠĠĠ ĠviewModel . stop N sd Service Discovery () ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġn sd Services Adapter Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSEARCH _ TIME _ T ILL _ FAIL Ġ= Ġ 2 L ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠADDRESS _ B UNDLE _ KEY Ġ= Ġ" address Key " ĊĠĠĠ Ġ} Ċ } Ċ