/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 1 7 - 2 0 1 9 ĠWire Guard ĠLLC . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ package Ġcom . wire guard . android Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Strict Mode Ċ import Ġandroid . os . Strict Mode . Thread Policy Ċ import Ġandroid . os . Strict Mode . Vm Policy Ċ import Ġandroid . util . Log Ċ import Ġandroidx . appcompat . app . AppCompat Delegate Ċ import Ġandroidx . datastore . DataStore Ċ import Ġandroidx . datastore . preferences . Preferences Ċ import Ġandroidx . datastore . preferences . create DataStore Ċ import Ġcom . wire guard . android . backend . Backend Ċ import Ġcom . wire guard . android . backend . Go Backend Ċ import Ġcom . wire guard . android . backend . Wg Quick Backend Ċ import Ġcom . wire guard . android . config Store . File Config Store Ċ import Ġcom . wire guard . android . model . Tunnel Manager Ċ import Ġcom . wire guard . android . util . Module Loader Ċ import Ġcom . wire guard . android . util . Root Shell Ċ import Ġcom . wire guard . android . util . Tools Installer Ċ import Ġcom . wire guard . android . util . User Kn obs Ċ import Ġcom . wire guard . android . util . application Scope Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . cancel Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . flow . launch In Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util . Locale Ċ Ċ class ĠApplication Ġ: Ġandroid . app . Application () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġfuture Backend Ġ= ĠComp letable Deferred < Backend >() ĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope Ġ= ĠCor outine Scope ( Job () Ġ+ ĠDispatch ers . Main . immediate ) ĊĠĠĠ Ġprivate Ġvar Ġbackend : ĠBackend ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmodule Loader : ĠModule Loader ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġroot Shell : ĠRoot Shell ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpreferences DataStore : ĠData Store < Preferences > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtools Installer : ĠTools Installer ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtunnel Manager : ĠT unnel Manager ĊĊĠĠĠ Ġoverride Ġfun Ġattach Base Context ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . attach Base Context ( context ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . MIN _ SDK _ VERSION Ġ> ĠBuild . VERSION . SDK _ INT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ MAIN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ HOME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ CLEAR _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . exit ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStrict Mode . set Vm Policy ( Vm Policy . Builder (). detect All (). penalty Log (). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStrict Mode . set Thread Policy ( Thread Policy . Builder (). detect All (). penalty Log (). build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġdetermine Backend (): ĠBackend Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbackend : ĠBackend ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġdid Start Root Shell Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ(! Module Loader . is Module Loaded () Ġ&& Ġmodule Loader . module M ight Exist ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Shell . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdid Start Root Shell Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Loader . load Module () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! User Kn obs . disable Kernel Module . first () Ġ&& ĠModule Loader . is Module Loaded ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! did Start Root Shell ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Shell . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwg Quick Backend Ġ= ĠW g Quick Backend ( application Context , Ġroot Shell , Ġtools Installer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwg Quick Backend . set Multiple Tunnel s ( User Kn obs . multiple Tunnel s . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackend Ġ= Ġwg Quick Backend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Kn obs . multiple Tunnel s . on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwg Quick Backend . set Multiple Tunnel s ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. launch In ( coroutine Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( backend Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackend Ġ= ĠGo Backend ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGo Backend . set Always On Callback Ġ{ Ġget (). application Scope . launch Ġ{ Ġget (). tunnel Manager . restore State ( true ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbackend ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , ĠUSER _ AGENT ) ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ Ġroot Shell Ġ= ĠRoot Shell ( application Context ) ĊĠĠĠĠĠĠĠ Ġtools Installer Ġ= ĠTools Installer ( application Context , Ġroot Shell ) ĊĠĠĠĠĠĠĠ Ġmodule Loader Ġ= ĠModule Loader ( application Context , Ġroot Shell , ĠUSER _ AGENT ) ĊĠĠĠĠĠĠĠ Ġpreferences DataStore Ġ= Ġapplication Context . create DataStore ( name Ġ= Ġ" settings ") ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAppCompat Delegate . setDefault Night Mode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( User Kn obs . dark Theme . first ()) ĠAppCompat Delegate . MODE _ N IGHT _ YES Ġelse ĠAppCompat Delegate . MODE _ N IGHT _ NO ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAppCompat Delegate . setDefault Night Mode ( AppCompat Delegate . MODE _ N IGHT _ FOLLOW _ SYSTEM ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtunnel Manager Ġ= ĠT unnel Manager ( File Config Store ( application Context )) ĊĠĠĠĠĠĠĠ Ġtunnel Manager . onCreate () ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackend Ġ= Ġdetermine Backend () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture Backend . complete ( backend !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠLog . get StackTrace String ( e )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Terminate () Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . cancel () ĊĠĠĠĠĠĠĠ Ġsuper . on Terminate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠUSER _ AGENT Ġ= ĠString . format ( Locale . EN GL ISH , Ġ" Wire Guard /% s Ġ( Android Ġ% d ; Ġ% s ; Ġ% s ; Ġ% s Ġ% s ; Ġ% s )", ĠBuild Config . VERSION _ NAME , ĠBuild . VERSION . SDK _ INT , Ġif Ġ( Build . SUPPORTED _ AB IS . isNotEmpty ()) ĠBuild . SUPPORTED _ AB IS [ 0 ] Ġelse Ġ" unknown ĠABI ", ĠBuild . BOARD , ĠBuild . MAN U FACT UR ER , ĠBuild . MODEL , ĠBuild . F ING ER PRINT ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Wire Guard / Application " ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġweak Self : ĠWeak Reference < Application > ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget (): ĠApplication Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġweak Self . get () !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġget Backend () Ġ= Ġget (). future Backend . await () ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Module Loader () Ġ= Ġget (). module Loader ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Root Shell () Ġ= Ġget (). root Shell ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Preferences DataStore () Ġ= Ġget (). preferences DataStore ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Tools Installer () Ġ= Ġget (). tools Installer ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Tunnel Manager () Ġ= Ġget (). tunnel Manager ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Coroutine Scope () Ġ= Ġget (). coroutine Scope ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġweak Self Ġ= ĠWeak Reference ( this ) ĊĠĠĠ Ġ} Ċ } Ċ