package Ġch . r my . android . http _ shortcuts . http Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroid . net . ns d . N sd Manager Ċ import Ġandroid . net . ns d . N sd Service Info Ċ import Ġch . r my . android . framework . extensions . log Info Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ object ĠService Discovery Helper Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠSERVICE _ NAME _ SUFFIX Ġ= Ġ". local " ĊĠĠĠ Ġprivate Ġconst Ġval ĠSERVICE _ TYPE Ġ= Ġ"_ http ._ tcp " ĊĠĠĠ Ġprivate Ġconst Ġval ĠDIS COVER _ TIMEOUT Ġ= Ġ 2 0 0 0 L ĊĊĠĠĠ Ġfun Ġis Discover able ( uri : ĠUri ) Ġ= ĊĠĠĠĠĠĠĠ Ġuri . host ?. endsWith ( SERVICE _ NAME _ SUFFIX , Ġignore Case Ġ= Ġtrue ) Ġ== Ġtrue ĊĊĠĠĠ Ġfun Ġdiscover Service ( context : ĠContext , ĠserviceName : ĠString ): ĠSingle < Service Info > Ġ= ĠSingle . create < Service Info > Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġn sd Manager Ġ= Ġcontext . getSystem Service ( Context . NS D _ SERVICE ) Ġas ĠN sd Manager ĊĊĠĠĠĠĠĠĠ Ġval Ġdiscovery Listener Ġ= Ġobject Ġ: ĠN sd Manager . Discovery Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Discovery Failed ( service Type : ĠString ?, ĠerrorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Info (" Start ĠDiscovery ĠFailed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( RuntimeException (" Service ĠDiscovery ĠStart ĠFailed ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Discovery Failed ( service Type : ĠString ?, ĠerrorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( RuntimeException (" Service ĠDiscovery ĠStop ĠFailed ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Discovery Started ( service Type : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Info (" Service ĠDiscovery ĠStarted ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Discovery Stopped ( service Type : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Info (" Service ĠDiscovery ĠSto pped ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Found ( service Info : ĠN sd Service Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Info (" Service ĠFound : Ġ${ service Info . serviceName } Ġ${ service Info . service Type }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Correct ServiceType ( service Info )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn sd Manager . resolve Service ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠN sd Manager . Resolve Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Resolve Failed ( service Info : ĠN sd Service Info , ĠerrorCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Info (" Resolve ĠFailed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Resolved ( service Info : ĠN sd Service Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Info (" Service ĠResolved ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( service Info . serviceName . contains ( serviceName . remove Suffix ( SERVICE _ NAME _ SUFFIX ), Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠService Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġservice Info . host . host Address !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġservice Info . port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Lost ( service Info : ĠN sd Service Info ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Info (" Service ĠL ost ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġn sd Manager . discover Services ( SERVICE _ TYPE , ĠN sd Manager . PROTOCOL _ DNS _ SD , Ġdiscovery Listener ) ĊĠĠĠĠĠĠĠ Ġemitter . set Disposable ( object Ġ: ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn sd Manager . stop Service Discovery ( discovery Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Disposed () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . is Disposed ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠ Ġ. amb With ( Single . error < Service Info >( Service Lookup TimeoutException ()). delay ( DIS COVER _ TIMEOUT , ĠTimeUnit . MILLISECONDS , Ġtrue )) ĊĊĠĠĠ Ġprivate Ġfun Ġis Correct ServiceType ( service Info : ĠN sd Service Info ) Ġ= ĊĠĠĠĠĠĠĠ Ġnormalize ServiceName ( service Info . service Type ) Ġ== ĠSERVICE _ TYPE ĊĊĠĠĠ Ġprivate Ġfun Ġnormalize ServiceName ( serviceName : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ ĠserviceName . trim ('.') ĊĊĠĠĠ Ġclass ĠService Lookup TimeoutException Ġ: ĠException () ĊĊĠĠĠ Ġdata Ġclass ĠService Info ( ĊĠĠĠĠĠĠĠ Ġval Ġaddress : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġport : ĠInt , ĊĠĠĠ Ġ) Ċ } Ċ