package Ġcom . we il iz an . k its un eb i . ui . main Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content .* Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcn . bert sir . z bar . Qr Config Ċ import Ġcn . bert sir . z bar . Qr Manager Ċ import Ġcn . bert sir . z bar . utils . Size Util Ċ import Ġcn . bert sir . z bar . view . Scan Line View Ċ import Ġcom . af ol le st ad . material dialogs . Material Dialog Ċ import Ġcom . af ol le st ad . material dialogs . Which Button Ċ import Ġcom . af ol le st ad . material dialogs . actions . set ActionButton Enabled Ċ import Ġcom . af ol le st ad . material dialogs . input . getInput Field Ċ import Ġcom . af ol le st ad . material dialogs . input . input Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . permission x . gu olin dev . Permission X Ċ import Ġcom . we il iz an . k its un eb i . R Ċ import Ġcom . we il iz an . k its un eb i . common . show Alert Ċ import Ġcom . we il iz an . k its un eb i . databinding . Activity Main Binding Ċ import Ġcom . we il iz an . k its un eb i . model . V mess URL Ċ import Ġcom . we il iz an . k its un eb i . service . Simple Vpn Service Ċ import Ġcom . we il iz an . k its un eb i . storage . Preferences Ċ import Ġcom . we il iz an . k its un eb i . ui . Subscribe Config Activity Ċ import Ġcom . we il iz an . k its un eb i . ui . custom . Custom Activity Ċ import Ġcom . we il iz an . k its un eb i . ui . loc at . Log cat Activity Ċ import Ġcom . we il iz an . k its un eb i . ui . proxy log . Proxy Log Activity Ċ import Ġcom . we il iz an . k its un eb i . ui . qrcode . QR Scan Activity Ċ import Ġcom . we il iz an . k its un eb i . ui . settings . Settings Activity Ċ import Ġcom . we il iz an . k its un eb i . util . base 6 4 Decode Ċ import Ġcom . we il iz an . k its un eb i . util . get Clipboard Contents Ċ import Ġcom . we il iz an . k its un eb i . util . toast Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* ĊĊ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġjava Class . simple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġrunning Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġstarting Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġstopping Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Main Binding Ċ // ĠĠĠ Ġprivate Ġlateinit Ġvar Ġconfig String : ĠString Ċ // ĠĠĠ Ġval Ġm Notification Id Ġ= Ġ 1 Ċ // ĠĠĠ Ġvar Ġm Notification Manager : ĠNotification Manager ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Main Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( binding . toolbar ) Ċ Ċ // ĠĠĠĠĠĠĠ Ġm Notification Manager Ġ= Ġthis . getSystem Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĊĠĠĠĠĠĠĠ Ġregister Receiver ( broadcast Receiver , ĠIntent Filter (" vpn _ stopped ")) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( broadcast Receiver , ĠIntent Filter (" vpn _ started ")) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġmake Ġa Ġlist ĊĠĠĠĠĠĠĠ Ġregister Receiver ( broadcast Receiver , ĠIntent Filter (" vpn _ start _ err ")) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( broadcast Receiver , ĠIntent Filter (" vpn _ start _ err _ dns ")) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( broadcast Receiver , ĠIntent Filter (" vpn _ start _ err _ config ")) ĊĊĠĠĠĠĠĠĠ Ġregister Receiver ( broadcast Receiver , ĠIntent Filter (" p ong ")) ĊĊĠĠĠĠĠĠĠ Ġsend Broadcast ( Intent (" ping ")) ĊĊĠĠĠĠĠĠĠ Ġfab . setOnClickListener Ġ{ Ġview Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! running Ġ&& Ġ! starting ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstarting Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . setImage Resource ( android . R . drawable . ic _ media _ ff ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig String Ġ= Ġconfig View . text . toString () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreferences . putString ( application Context , ĠConstants . Companion . PREFER ENCE _ CONFIG _ KEY , Ġconfig String ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠV pn Service . prepare ( this ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ!= Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , Ġ 1 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Activity Result ( 1 , ĠActivity . RESULT _ OK , Ġnull ); Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( running Ġ&& Ġ! stopping ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstopping Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Broadcast ( Intent (" stop _ vpn ")) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠRESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠSimple Vpn Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Service ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġsend Broadcast ( Intent (" ping ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu _ main , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . import _ from _ clipboard _ btn Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġget Clipboard Contents ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( this , Ġ" åī ª è´ ´ æĿ¿ ä¸ºç©º ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġparse V mess Url ( url . trim ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġtoast ( this , Ġ" URL è§£æŀĲ å¤±è´¥ ") Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Config ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( this , Ġ" å¯¼åħ¥ æĪĲåĬŁ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . add _ custom _ configuration Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Dialog ( this ). show Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ( null , Ġ" åĲįç§° ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhint Ġ= Ġ" è¯·è¾ĵåħ¥ åĲįç§° ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxLength Ġ= Ġ 2 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Positive Button Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġdialog , Ġtext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Field Ġ= Ġdialog . getInput Field () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠisValid Ġ= Ġinput Field . length () Ġ< Ġ 1 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Field . error Ġ= Ġif Ġ( isValid ) Ġnull Ġelse Ġ" æĸĩä»¶ åĲį ä¸įèĥ½ è¶ħè¿ĩ 1 0 ä¸ª åŃĹç¬¦ " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . set ActionButton Enabled ( Which Button . POSITIVE , ĠisValid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnegative Button ( text Ġ= Ġ" åıĸæ¶Ī ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button ( text Ġ= Ġ" ç¡®å®ļ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this @ MainActivity , ĠCustom Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" filename ", Ġit . getInput Field (). text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Options ItemSelected : Ġ${ it . getInput Field (). text . toString () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . scan _ code _ to _ add Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqr Config Ġ= ĠQ r Config . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show Light ( true ) Ġ// æĺ¾ç¤º æīĭ çĶµ çŃ Ĵ æĮīéĴ® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show Title ( true ) Ġ// æĺ¾ç¤º Title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show Album ( true ) Ġ// æĺ¾ç¤º ä»İ çĽ¸ åĨĮ éĢīæĭ© æĮīéĴ® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Corner Color ( Context Compat . getColor ( this , ĠR . color . color Primary )) Ġ// è®¾ç½® æī«æıı æ¡Ĩ é¢ľèī² ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Line Color ( Context Compat . getColor ( this , ĠR . color . color Primary )) Ġ// è®¾ç½® æī«æıı çº¿ é¢ľèī² ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Line Speed ( Qr Config . LINE _ MEDIUM ) Ġ// è®¾ç½® æī«æıı çº¿ éĢŁåº¦ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Scan Type ( Qr Config . SCAN VIEW _ TYPE _ QR CODE ) Ġ// è®¾ç½® æī« çłģ ç±»åŀĭ ï¼Ī äºĮ ç»´ çłģ ï¼Į æĿ¡ å½¢ çłģ ï¼Į åħ¨éĥ¨ ï¼Į èĩªå®ļä¹ī ï¼Į é»ĺè®¤ä¸º äºĮ ç»´ çłģ ï¼ī ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Play Sound ( true ) Ġ// æĺ¯åĲ¦ æī«æıı æĪĲåĬŁ åĲİ bi ~ çļĦ å£° éŁ³ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setIs Only Center ( true ) Ġ// æĺ¯åĲ¦ åıª è¯ĨåĪ« æ¡Ĩ ä¸Ń åĨħå®¹ ( é»ĺè®¤ä¸º åħ¨ å±ı è¯ĨåĪ« ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle Text (" æī« çłģ ") Ġ// è®¾ç½® Til te æĸĩåŃĹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Zoom ( false ) Ġ// æĺ¯åĲ¦ å¼ĢåĲ¯ èĩªåĬ¨ ç¼© æĶ¾ ( å®ŀ éªĮ æĢ§ åĬŁèĥ½ ï¼Į ä¸į å»ºè®® ä½¿çĶ¨ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set F inger Zoom ( true ) Ġ// æĺ¯åĲ¦ å¼Ģå§ĭ åıĮ æĮĩ ç¼© æĶ¾ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Double Engine ( false ) Ġ// æĺ¯åĲ¦ å¼ĢåĲ¯ åıĮ å¼ķ æĵ İ è¯ĨåĪ« ( ä»ħ å¯¹ è¯ĨåĪ« äºĮ ç»´ çłģ æľīæķĪ ï¼Į å¹¶ä¸Ķ å¼ĢåĲ¯ åĲİ åıª è¯ĨåĪ« æ¡Ĩ åĨħ åĬŁèĥ½ å°Ĩ å¤± æķĪ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Looper Scan ( false ) Ġ// æĺ¯åĲ¦ è¿ŀ ç»Ń æī«æıı äºĮ ç»´ çłģ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Scan Line Style ( Scan Line View . style Hybrid ) Ġ// æī«æıı çº¿ æł·å¼ı ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Light ( false ) Ġ// èĩªåĬ¨ çģ ¯ åħī ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show V ibr ator ( false ) Ġ// æĺ¯åĲ¦ éľ ĩ åĬ¨ æıĲ é ĨĴ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Scanner Size ( Size Util . dip 2 px ( this , Ġ 3 0 0 ), ĠSize Util . dip 2 px ( this , Ġ 3 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQ r Manager . getInstance (). init ( qr Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. register Callback ( this @ MainActivity ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Scan Success : Ġ${ result . content }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( this , result . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġresult . content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! content . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġparse V mess Url ( content . trim ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Options ItemSelected : Ġ$ data ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Config ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( this , Ġ" å¯¼åħ¥ æĪĲåĬŁ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( this , Ġ" URL è§£æŀĲ å¤±è´¥ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġtoast ( this , Ġ" å¯¼åħ¥ å¤±è´¥ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPermission X . init ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. permissions ( Manifest . permission . CAMERA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Explain Request Reason Ġ{ Ġscope , Ġdenied List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . show Request Reason Dialog ( den ied List , Ġ" æī«æıı äºĮ ç»´ çłģ éľĢè¦ģ çĽ¸ æľº æĿĥéĻĲ ", Ġ" åİ» æİĪæĿĥ ", Ġ" åıĸæ¶Ī ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Forward To Settings Ġ{ Ġscope , Ġdenied List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . show Forward To Settings Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdenied List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" æĤ¨ éľĢè¦ģ åľ¨ âĢľ è®¾ç½® âĢĿ ä¸Ń æīĭåĬ¨ æİĪ äºĪ å¿ħè¦ģ çļĦ æĿĥéĻĲ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" åİ» æİĪæĿĥ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" åıĸæ¶Ī " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. request Ġ{ Ġall Granted , Ġgranted List , Ġdenied List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( all Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQR Scan Activity . start ( this , Ġqr Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( this , Ġ" çĽ¸ æľº æĿĥéĻĲ è¢« æĭ Ĵ ç»Ŀ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . subscribe _ config _ btn Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠSubscribe Config Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . log _ btn Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠProxy Log Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . log cat _ btn Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠLog cat Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . settings _ btn Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠSettings Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . help _ btn Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" https :// github . com / we ili 7 1 / k its un eb i - android ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Config ( data : ĠV mess URL ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < V mess URL >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . ps Ġ= Ġi . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( data . copy ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . config List . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . item Decoration Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Decoration ( Main Adapter . Spaces Item Decoration ( 2 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . adapter Ġ= ĠMain Adapter ( list , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse V mess Url ( url : ĠString ): ĠV mess URL ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url . matches ( Regex (""" ^ v mess :// . +$ "" "))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġbase 6 4 Decode ( url . replace (" v mess :// ", Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" parse V mess Url : Ġjson : Ġ$ json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGson (). fromJson ( json , ĠV mess URL :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( broadcast Receiver ) ĊĠĠĠ Ġ} ĊĊ Ċ // ĠĠĠ Ġprivate Ġfun Ġstart Notification () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġ// ĠBuild ĠNotification Ġ, Ġset O ngo ing Ġkeeps Ġthe Ġnotification Ġalways Ġin Ġstatus Ġbar Ċ // ĠĠĠĠĠĠĠ Ġval Ġm Builder Ġ= ĠNotification Compat . Builder ( this , ĠgetString ( R . string . notification _ channel _ id )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title (" K its un eb i ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text (" Touch Ġto Ġopen Ġthe Ġapp ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . notification _ icon _ background ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set When ( System . currentTimeMillis ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( true ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠCreate Ġpending Ġintent , Ġmention Ġthe ĠActivity Ġwhich Ġneeds Ġto Ġbe Ċ // ĠĠĠĠĠĠĠ Ġ// triggered Ġwhen Ġuser Ġclicks Ġon Ġnotification ( Stop Script . class Ġin Ġthis Ġcase ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġcontent Intent Ġ= ĠPending Intent . getActivity ( this , Ġ 0 , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( this , ĠMainActivity :: class . java ), ĠPending Intent . FLAG _ UPDATE _ CURRENT ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġm Builder . setContent Intent ( content Intent ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠBuilds Ġthe Ġnotification Ġand Ġissues Ġit . Ċ // ĠĠĠĠĠĠĠ Ġm Notification Manager ?. notify ( m Notification Id , Ġm Builder . build ()) Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġbroadcast Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent ?. action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" vpn _ stopped " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstopping Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . setImage Resource ( android . R . drawable . ic _ media _ play ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Notification Manager ?. cancel ( m Notification Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" vpn _ started " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstarting Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . setImage Resource ( android . R . drawable . ic _ media _ pause ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" vpn _ start _ err " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstarting Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . setImage Resource ( android . R . drawable . ic _ media _ play ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Alert ( it , Ġ" Start ĠVPN Ġservice Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" vpn _ start _ err _ dns " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstarting Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . setImage Resource ( android . R . drawable . ic _ media _ play ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Alert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Start ĠVPN Ġservice Ġfailed : ĠNot Ġconfiguring ĠDNS Ġright , Ġmust Ġhas Ġat Ġleast Ġ 1 Ġdns Ġserver Ġand Ġmust n 't Ġinclude Ġ\" localhost \"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" vpn _ start _ err _ config " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstarting Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . setImage Resource ( android . R . drawable . ic _ media _ play ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Alert ( it , Ġ" Start ĠVPN Ġservice Ġfailed : ĠInvalid ĠV 2 Ray Ġconfig .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" p ong " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . setImage Resource ( android . R . drawable . ic _ media _ pause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreferences . put Bool ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . vpn _ is _ running ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }