/******************************************************************************* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠCopyright Ġ( C ) Ġ 2 0 1 7 Ġby ĠMax ĠL v Ġ< max . c . lv @ gmail . com > ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠCopyright Ġ( C ) Ġ 2 0 1 7 Ġby ĠMy god ĠStudio Ġ< contact - shadow socks - android @ my god . be > Ġ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠThis Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify ĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby ĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġthe ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor ĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġ( at Ġyour Ġoption ) Ġany Ġlater Ġversion . ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , ĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense ĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġalong Ġwith Ġthis Ġprogram . ĠIf Ġnot , Ġsee Ġ< http :// www . gnu . org / licenses />. ĠĠĠĠĠĠ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ************************************************************************* ******/ Ċ Ċ package Ġcom . github . shadow socks . bg Ċ Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġcom . github . shadow socks . Boot Receiver Ċ import Ġcom . github . shadow socks . Core Ċ import Ġcom . github . shadow socks . core . R Ċ import Ġcom . github . shadow socks . net . Hosts File Ċ import Ġcom . github . shadow socks . preference . DataStore Ċ import Ġcom . github . shadow socks . utils . Action Ċ import Ġcom . github . shadow socks . utils . Key Ċ import Ġcom . github . shadow socks . utils . print Log Ċ import Ġcom . github . shadow socks . utils . readable Message Ċ import Ġkotlinx . coroutines . Cancellation Exception Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . net . Unknown Host Exception Ċ Ċ /** Ċ Ġ* ĠShadow socks Ġservice Ġat Ġits Ġminimum . Ċ Ġ*/ Ċ class ĠProxy Test Service Ġ: ĠProxy Service () Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt { ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġif Ġ( data . state Ġ!= ĠBase Service . State . Stopped ) Ġreturn ĠService . START _ NOT _ STICK Y ĊĠĠĠĠĠĠĠ Ġval Ġprofile Pair Ġ= ĠCore . current Profile ĊĠĠĠĠĠĠĠ Ġif Ġ( profile Pair Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgrace fully Ġshutdown : Ġhttps :// stackoverflow . com / q / 4 7 3 3 7 8 5 7 / 2 2 4 5 1 0 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Runner ( false , ĠgetString ( R . string . profile _ empty )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠService . START _ NOT _ STICK Y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ( profile , Ġfallback ) Ġ= Ġprofile Pair ĊĠĠĠĠĠĠĠ Ġprofile . name Ġ= Ġprofile . formatted Name ĠĠĠ Ġ// Ġsave Ġname Ġfor Ġlater Ġqueries ĊĠĠĠĠĠĠĠ Ġval Ġproxy Ġ= ĠProxy Instance ( profile ) ĊĠĠĠĠĠĠĠ Ġdata . proxy Ġ= Ġproxy ĊĠĠĠĠĠĠĠ Ġdata . udp Fallback Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ ĠBoot Receiver . enabled Ġ= ĠData Store . persist Ac ross Reboot ĊĠĠĠĠĠĠĠ Ġif Ġ(! data . close Receiver Registered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Receiver ( data . close Receiver , ĠIntent Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Action . RE LOAD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Intent . ACTION _ SHUT DOWN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Action . CLOSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ"$ packageName . SERVICE ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . close Receiver Registered Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata . change State ( Base Service . State . Connecting ) ĊĠĠĠĠĠĠĠ Ġdata . connecting Job Ġ= ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExec utable . kill All () ĠĠĠ Ġ// Ġclean Ġup Ġold Ġprocesses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Init () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhosts Ġ= ĠHost s File ( DataStore . public Store . getString ( Key . hosts ) Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy . init ( this @ Proxy Test Service , Ġhosts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . processes Ġ= ĠGu arded Process Pool Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Log ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Runner ( false , Ġit . readable Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Processes ( hosts ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// proxy . schedule Update () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// data . udp Fallback ?. schedule Update () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . change State ( Base Service . State . Connected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġjob Ġwas Ġcancelled , Ġit Ġis Ġcancell er 's Ġresponsibility Ġto Ġcall Ġstop Runner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠUnknown Host Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Runner ( false , ĠgetString ( R . string . invalid _ server )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exc Ġis ĠBase Service . Expected Exception ) Ġexc . printStackTrace () Ġelse Ġprint Log ( exc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Runner ( false , Ġ"${ getString ( R . string . service _ failed )} : Ġ${ exc . readable Message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . connecting Job Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠService . START _ NOT _ STICK Y ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġstart Runner () Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Service ( Intent ( this , Ġjava Class )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( pol ipo Thread == null ) super . onCreate () ĊĠĠĠ Ġ} Ċ } Ċ