/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġandroidx . work . impl . constraints . track ers Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . net . Connectivity Manager . Network Callback Ċ import Ġandroid . net . Network Ċ import Ġandroid . net . Network Capabilities Ċ import Ġandroid . os . Build Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . annotation . Restrict To Ċ import Ġandroidx . core . net . Connectivity Manager Compat Ċ import Ġandroidx . work . Logger Ċ import Ġandroidx . work . impl . constraints . Network State Ċ import Ġandroidx . work . impl . utils . getActive Network Compat Ċ import Ġandroidx . work . impl . utils . get Network Capabilities Compat Ċ import Ġandroidx . work . impl . utils . has Capability Compat Ċ import Ġandroidx . work . impl . utils . register Default Network Callback Compat Ċ import Ġandroidx . work . impl . utils . task executor . Task Executor Ċ import Ġandroidx . work . impl . utils . unregister Network Callback Compat Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Constraint Tracker ] Ġfor Ġmonitoring Ġnetwork Ġstate . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠFor ĠAPI Ġ 2 4 Ġand Ġup : ĠNetwork Ġstate Ġis Ġtracked Ġusing Ġa Ġregistered Ġ[ Network Callback ] Ġwith Ċ Ġ* Ġ[ Connectivity Manager . register Default Network Callback ], Ġadded Ġin ĠAPI Ġ 2 4 . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠFor ĠAPI Ġ 2 3 Ġand Ġbelow : ĠNetwork Ġstate Ġis Ġtracked Ġusing Ġa Ġ[ android . content . Broadcast Receiver ]. Ċ Ġ* ĠM uch Ġless Ġefficient Ġthan Ġtracking Ġwith Ġ[ Network Callback ] s Ġand Ġ[ Connectivity Manager ]. Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠBased Ġon Ġ[ android . app . job . Job Scheduler ]' s ĠConnect ivity Controller Ġon ĠAPI Ġ 2 6 . Ċ Ġ* Ġ{@ see Ġhttps :// android . google source . com / platform / frameworks / base / +/ oreo - release / services / core / java / com / android / server / job / controllers / Connectivity Controller . java } Ċ Ġ* Ġ@ hide Ċ Ġ*/ Ċ @ Restrict To ( Restrict To . Scope . LIBRARY _ GROUP ) Ċ fun ĠNetwork State Tracker ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġtask Executor : ĠTask Executor Ċ ): ĠConstraint Tracker < Network State > Ġ{ ĊĠĠĠ Ġ// ĠBased Ġon Ġrequiring ĠConnect ivity Manager # register Default Network Callback Ġ- Ġadded Ġin ĠAPI Ġ 2 4 . ĊĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 4 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠNetwork State Tracker 2 4 ( context , Ġtask Executor ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠNetwork State Tracker Pre 2 4 ( context , Ġtask Executor ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠTAG Ġ= ĠLogger . tag With Prefix (" Network State Tracker ") Ċ Ċ internal Ġval ĠConnect ivity Manager . isActive Network Validated : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ< Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfalse Ġ// ĠNET _ CAP ABILITY _ VALID ATED Ġnot Ġavailable Ġuntil ĠAPI Ġ 2 3 . ĠUsed Ġon ĠAPI Ġ 2 6 +. ĊĠĠĠ Ġ} Ġelse Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnetwork Ġ= Ġget Active Network Compat () ĊĠĠĠĠĠĠĠ Ġval Ġcapabilities Ġ= Ġget Network Capabilities Compat ( network ) ĊĠĠĠĠĠĠĠ Ġ( capabilities ?. has Capability Compat ( Network Capabilities . NET _ CAP ABILITY _ VALID ATED )) Ġ?: Ġfalse ĊĠĠĠ Ġ} Ġcatch Ġ( exception : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġb / 1 6 3 3 4 2 7 9 8 ĊĠĠĠĠĠĠĠ ĠLogger . get (). error ( TAG , Ġ" Unable Ġto Ġvalidate Ġactive Ġnetwork ", Ġexception ) ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} Ċ Ċ @ Suppress (" DE PREC ATION ") Ċ internal Ġval ĠConnect ivity Manager . active Network State : ĠNetwork State ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġget Active Network Info () Ġinstead Ġof Ġget Network Info ( network ) Ġbecause Ġit Ġcan Ġdetect ĠV P Ns . ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġactive Network Info ĊĠĠĠĠĠĠĠ Ġval Ġis Connected Ġ= Ġinfo Ġ!= Ġnull Ġ&& Ġinfo . isConnected ĊĠĠĠĠĠĠĠ Ġval ĠisValid ated Ġ= ĠisActive Network Validated ĊĠĠĠĠĠĠĠ Ġval Ġis Meter ed Ġ= ĠConnect ivity Manager Compat . isActive Network Meter ed ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġis Not Roaming Ġ= Ġinfo Ġ!= Ġnull Ġ&& Ġ! info . is Roaming ĊĠĠĠĠĠĠĠ Ġreturn ĠNetwork State ( isConnected , ĠisValid ated , Ġis Meter ed , Ġis Not Roaming ) ĊĠĠĠ Ġ} Ġ// Ġb / 1 6 3 3 4 2 7 9 8 Ċ Ċ internal Ġclass ĠNetwork State Tracker Pre 2 4 ( context : ĠContext , Ġtask Executor : ĠTask Executor ) Ġ: ĊĠĠĠ ĠBroadcast Receiver Constraint Tracker < Network State >( context , Ġtask Executor ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġconnectivity Manager : ĠConnect ivity Manager Ġ= ĊĠĠĠĠĠĠĠ Ġapp Context . getSystem Service ( Context . CONNECT IVITY _ SERVICE ) Ġas ĠConnect ivity Manager ĊĊĠĠĠ Ġoverride Ġfun Ġon Broadcast Receive ( intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠ Ġif Ġ( intent . action Ġ== ĠConnect ivity Manager . CONNECT IVITY _ ACTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . get (). debug ( TAG , Ġ" Network Ġbroadcast Ġreceived ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġconnectivity Manager . active Network State ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġoverride Ġval Ġintent Filter : ĠIntent Filter ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠIntent Filter ( Connectivity Manager . CONNECT IVITY _ ACTION ) ĊĠĠĠ Ġoverride Ġval ĠinitialState : ĠNetwork State ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġconnectivity Manager . active Network State Ċ } Ċ Ċ @ Requires Api ( 2 4 ) Ċ internal Ġclass ĠNetwork State Tracker 2 4 ( context : ĠContext , Ġtask Executor : ĠTask Executor ) Ġ: ĊĠĠĠ ĠConstraint Tracker < Network State >( context , Ġtask Executor ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġconnectivity Manager : ĠConnect ivity Manager Ġ= ĊĠĠĠĠĠĠĠ Ġapp Context . getSystem Service ( Context . CONNECT IVITY _ SERVICE ) Ġas ĠConnect ivity Manager ĊĠĠĠ Ġoverride Ġval ĠinitialState : ĠNetwork State ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġconnectivity Manager . active Network State ĊĊĠĠĠ Ġprivate Ġval Ġnetwork Callback Ġ= Ġobject Ġ: ĠNetwork Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Capabilities Changed ( network : ĠNetwork , Ġcapabilities : ĠNetwork Capabilities ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe ĠNetwork Ġparameter Ġis Ġun reli able Ġwhen Ġa ĠVPN Ġapp Ġis Ġrunning Ġ- Ġuse Ġactive Ġnetwork . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . get (). debug ( TAG , Ġ" Network Ġcapabilities Ġchanged : Ġ$ capabilities ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġconnectivity Manager . active Network State ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Lost ( network : ĠNetwork ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . get (). debug ( TAG , Ġ" Network Ġconnection Ġlost ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġconnectivity Manager . active Network State ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart Tracking () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . get (). debug ( TAG , Ġ" Register ing Ġnetwork Ġcallback ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnectivity Manager . register Default Network Callback Compat ( network Callback ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCatch ing Ġthe Ġexceptions Ġsince Ġand Ġmoving Ġon Ġ- Ġthis Ġtracker Ġis Ġonly Ġused Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG reedy Scheduler Ġand Ġthere Ġis Ġnothing Ġto Ġbe Ġdone Ġabout Ġdevice - specific Ġbugs . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIllegalStateException : ĠH app ening Ġon ĠNVIDIA ĠSh ield ĠK 1 ĠTable ts . Ġ ĠSee Ġb / 1 3 6 5 6 9 3 4 2 . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSecurity Exception : ĠH app ening Ġon ĠSol one ĠW 1 4 5 0 . Ġ ĠSee Ġb / 1 5 3 2 4 6 1 3 6 . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . get (). error ( TAG , Ġ" Received Ġexception Ġwhile Ġregistering Ġnetwork Ġcallback ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . get (). error ( TAG , Ġ" Received Ġexception Ġwhile Ġregistering Ġnetwork Ġcallback ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop Tracking () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . get (). debug ( TAG , Ġ" Unregister ing Ġnetwork Ġcallback ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnectivity Manager . unregister Network Callback Compat ( network Callback ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCatch ing Ġthe Ġexceptions Ġsince Ġand Ġmoving Ġon Ġ- Ġthis Ġtracker Ġis Ġonly Ġused Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG reedy Scheduler Ġand Ġthere Ġis Ġnothing Ġto Ġbe Ġdone Ġabout Ġdevice - specific Ġbugs . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIllegalStateException : ĠH app ening Ġon ĠNVIDIA ĠSh ield ĠK 1 ĠTable ts . Ġ ĠSee Ġb / 1 3 6 5 6 9 3 4 2 . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSecurity Exception : ĠH app ening Ġon ĠSol one ĠW 1 4 5 0 . Ġ ĠSee Ġb / 1 5 3 2 4 6 1 3 6 . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . get (). error ( TAG , Ġ" Received Ġexception Ġwhile Ġunregister ing Ġnetwork Ġcallback ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . get (). error ( TAG , Ġ" Received Ġexception Ġwhile Ġunregister ing Ġnetwork Ġcallback ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }