package Ġcom . app . y am amz . y am am zip scanner . ui . details Ċ Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . lifecycle .* Ċ import Ġcom . app . y am amz . y am am zip scanner . model . Port Ċ import Ġcom . app . y am amz . y am am zip scanner . repository . Device Scanner Repository Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠDetails ViewModel Ġ@ Inject Ġconstructor ( Ċ Ġvar Ġdevice Scanner Device Scanner Repository : ĠDevice Scanner Repository Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġsearch Open Ports ( ip String : ĠString , Ġscope : ĠCor outine Scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ isLoading . post Value ( true ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Scanner Device Scanner Repository . search Open Ports ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope = scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip String Ġ= Ġip String , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonStart Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ isLoading . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ isLoading . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ Ġ_ isLoading . post Value ( false ) Ġ}). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ open Ports . value Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ isLoading . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġcheck If Wifi Connected () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Scanner Device Scanner Repository . check If Wifi Connected ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonStart Ġ= Ġ{ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ Ġ}). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Wifi Connected . value Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġping Ip ( ip : String ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġ_ ping . post Value ( device Scanner Device Scanner Repository . get Ping ( ip )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġget External Ip () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ external Ip . post Value ( device Scanner Device Scanner Repository . get External Ip ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ isLoading : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġval ĠisLoading : ĠLive Data < Boolean > Ġget () Ġ= Ġ_ isLoading ĊĠĠĠ Ġprivate Ġval Ġ_ open Ports : ĠMutable LiveData < List < Port >> Ġ= ĠMutable LiveData ( mutable ListOf ()) ĊĠĠĠ Ġval Ġopen Ports : ĠLive Data < List < Port >> Ġget () Ġ= Ġ_ open Ports ĊĠĠĠ Ġprivate Ġval Ġ_ is Wifi Connected : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData ( true ) ĊĠĠĠ Ġval Ġis Wifi Connected : ĠLive Data < Boolean > Ġget () Ġ= Ġ_ is Wifi Connected ĊĠĠĠ Ġprivate Ġval Ġ_ ping : ĠMutable LiveData < String > Ġ= ĠMutable LiveData (" Ping ing ") ĊĠĠĠ Ġval Ġping : ĠLive Data < String > Ġget () Ġ= Ġ_ ping ĊĠĠĠ Ġprivate Ġval Ġ_ external Ip : ĠMutable LiveData < String > Ġ= ĠMutable LiveData (" Getting ĠExternal ĠIp ") ĊĠĠĠ Ġval Ġexternal Ip : ĠLive Data < String > Ġget () Ġ= Ġ_ external Ip ĊĊĊĊ Ċ }