package Ġcom . t awk . framework . mv vm . extension ĊĊ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . net . Network Ċ import Ġandroid . net . Network Capabilities Ċ import Ġandroid . net . Network Request Ċ import Ġandroid . os . Build Ċ import Ġandroidx . annotation . Int Range Ċ import Ġandroidx . annotation . Requires Permission Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . channels . await Close Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . callback Flow Ċ import Ġkotlinx . coroutines . flow . combine Ċ Ċ // https :// stackoverflow . com / questions / 5 3 5 3 2 4 0 6 / act iven etwork info - type - is - deprecated - in - api - level - 2 8 Ċ @ Experimental Cor outines Api Ċ class ĠConnection Watcher Ċ @ Requires Permission ( android . Manifest . permission . ACCESS _ NETWORK _ STATE ) Ċ constructor ( ĊĠĠĠ Ġapplication : ĠApplication Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġconnectivity Manager Ġ= ĊĠĠĠĠĠĠĠ Ġapplication . application Context . getSystem Service ( Context . CONNECT IVITY _ SERVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġas ĠConnect ivity Manager ĊĊĠĠĠ Ġ// Ġgeneral Ġavailability Ġof ĠInternet Ġover Ġany Ġtype ĊĠĠĠ Ġvar Ġis Online Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Fields () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġis Over Wifi Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Fields () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġis Over Cell ular Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Fields () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġis Over Ethernet Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Fields () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġprivate Ġfun Ġupdate Fields () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork Availability Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnectivity Manager . get Network Capabilities ( connectivity Manager . active Network ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( network Availability Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Availability . has Capability ( Network Capabilities . NET _ CAP ABILITY _ INTER NET ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Availability . has Capability ( Network Capabilities . NET _ CAP ABILITY _ VALID ATED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// has Ġnetwork ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Online Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwifi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Over Wifi Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Availability . has Transport ( Network Capabilities . TRANSPORT _ WIFI ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcell ular ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Over Cell ular Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Availability . has Transport ( Network Capabilities . TRANSPORT _ CELL ULAR ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġe thernet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Over Ethernet Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Availability . has Transport ( Network Capabilities . TRANSPORT _ ETHER NET ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Online Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Over Wifi Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Over Cell ular Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Over Ethernet Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġconnectivity Manager . active Network Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info Ġ!= Ġnull Ġ&& Ġinfo . isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Online Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwifi Ġ= Ġconnectivity Manager . get Network Info ( Connectivity Manager . TYPE _ WIFI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Over Wifi Ġ= Ġwifi Ġ!= Ġnull Ġ&& Ġwifi . isConnected ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell ular Ġ= Ġconnectivity Manager . get Network Info ( Connectivity Manager . TYPE _ MOB ILE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Over Cell ular Ġ= Ġcell ular Ġ!= Ġnull Ġ&& Ġcell ular . isConnected ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe thernet Ġ= Ġconnectivity Manager . get Network Info ( Connectivity Manager . TYPE _ ETHER NET ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Over Ethernet Ġ= Ġe thernet Ġ!= Ġnull Ġ&& Ġe thernet . isConnected ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Online Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Over Wifi Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Over Cell ular Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Over Ethernet Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwatch Network (): ĠFlow < Boolean > Ġ= Ġwatch Wifi () ĊĠĠĠĠĠĠĠ Ġ. combine ( watch Cell ular ()) Ġ{ Ġwifi , Ġcell ular Ġ-> Ġwifi Ġ|| Ġcell ular Ġ} ĊĠĠĠĠĠĠĠ Ġ. combine ( watch Ethernet ()) Ġ{ Ġwifi And Cell ular , Ġe thernet Ġ-> Ġwifi And Cell ular Ġ|| Ġe thernet Ġ} ĊĊĊĠĠĠ Ġfun Ġwatch Wifi (): ĠFlow < Boolean > Ġ= Ġcallback Flow ForType ( Network Capabilities . TRANSPORT _ WIFI ) ĊĊĠĠĠ Ġfun Ġwatch Cell ular (): ĠFlow < Boolean > Ġ= Ġcallback Flow ForType ( Network Capabilities . TRANSPORT _ CELL ULAR ) ĊĊĠĠĠ Ġfun Ġwatch Ethernet (): ĠFlow < Boolean > Ġ= Ġcallback Flow ForType ( Network Capabilities . TRANSPORT _ ETHER NET ) ĊĊĠĠĠ Ġprivate Ġfun Ġcallback Flow ForType (@ Int Range ( from Ġ= Ġ 0 , Ġto Ġ= Ġ 7 ) Ġtype : ĠInt ) Ġ= Ġcallback Flow Ġ{ ĊĊĠĠĠĠĠĠĠ Ġtry Send ( false ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnetwork Request Ġ= ĠNetwork Request . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Transport Type ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġobject Ġ: ĠConnect ivity Manager . Network Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Lost ( network : ĠNetwork ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Send ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Unavailable () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Send ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon L osing ( network : ĠNetwork , Ġmax Ms To Live : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Available ( network : ĠNetwork ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Send ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconnectivity Manager . register Network Callback ( network Request , Ġcallback ) ĊĊĠĠĠĠĠĠĠ Ġawait Close Ġ{ Ġconnectivity Manager . unregister Network Callback ( callback ) Ġ} ĊĠĠĠ Ġ} Ċ }