package Ġkit to ku . osc Ċ Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . net . Vpn Service Ċ import Ġandroid . os . Build Ċ import Ġandroid . service . quick settings . Tile Service Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġkit to ku . osc . preference . Osc Preference Ċ import Ġkit to ku . osc . preference . accessor . getBoolean Pref Value Ċ import Ġkit to ku . osc . preference . accessor . set Boolean Pref Value ĊĊ Ċ internal Ġconst Ġval ĠACTION _ VPN _ CONNECT Ġ= Ġ" kit to ku . osc . connect " Ċ internal Ġconst Ġval ĠACTION _ VPN _ DIS CONNECT Ġ= Ġ" kit to ku . osc . disconnect " Ċ Ċ internal Ġclass ĠS stp Vpn Service Ġ: ĠV pn Service () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprefs : ĠSharedPreferences ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlistener : ĠSharedPreferences . On Shared Preference ChangeListener ĊĠĠĠ Ġinternal Ġval ĠCHAN NEL _ ID Ġ= Ġ" Open S ST P Client " ĊĠĠĠ Ġprivate Ġvar Ġcontrol Client : ĠControl Client ? Ġ Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġset Root State ( state : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Boolean Pref Value ( state , ĠO sc Preference . ROOT _ STATE , Ġprefs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Tile Listening () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTile Service . request Listening State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComponent Name ( application Context , ĠS stp Tile Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġprefs Ġ= ĠPreference Manager . getDefault SharedPreferences ( application Context ) ĊĊĠĠĠĠĠĠĠ Ġlistener Ġ= ĠSharedPreferences . On Shared Preference ChangeListener Ġ{ Ġ_, Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== ĠO sc Preference . ROOT _ STATE . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= Ġget Boolean Pref Value ( Osc Preference . ROOT _ STATE , Ġprefs ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Boolean Pref Value ( newState , ĠO sc Preference . HOME _ CON NE CTOR , Ġprefs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Tile Listening () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprefs . register On Shared Preference ChangeListener ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( ACTION _ VPN _ DIS CONNECT Ġ== Ġintent ?. action Ġ?: Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol Client ?. kill ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol Client Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠService . START _ NOT _ STICK Y ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol Client ?. kill ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol Client Ġ= ĠControl Client ( this ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbe Fore gro unded () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Root State ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠService . START _ STICK Y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbe Fore gro unded () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠNotification Channel ( CHANNEL _ ID , ĠCHAN NEL _ ID , ĠNotification Manager . IMPORT ANCE _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Manager : ĠNotification Manager Ġ= Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . create Notification Channel ( channel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS stp Vpn Service :: class . java ĊĠĠĠĠĠĠĠ Ġ). setAction ( ACTION _ VPN _ DIS CONNECT ) ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . getService ( application Context , Ġ 0 , Ġintent , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNotification Compat . Builder ( application Context , ĠCHAN NEL _ ID ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Small Icon ( R . drawable . ic _ baseline _ vpn _ lock _ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setContent Text (" Disconnect ĠS ST P Ġconnection ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . priority Ġ= ĠNotification Compat . PRIORITY _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setContent Intent ( pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setAuto Cancel ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstart Foreground ( 1 , Ġbuilder . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontrol Client ?. kill ( null ) ĊĠĠĠĠĠĠĠ Ġset Root State ( false ) ĊĠĠĠĠĠĠĠ Ġprefs . unregister On Shared Preference ChangeListener ( listener ) ĊĠĠĠ Ġ} Ċ } Ċ