package Ġcom . k ard ia . membership Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Application Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . util . Log Ċ import Ġcom . app sf ly er . Apps Fly er Conversion Listener Ċ import Ġcom . app sf ly er . Apps Fly er Lib Ċ import Ġcom . app sf ly er . dee plink . Deep Link Listener Ċ import Ġcom . k ard ia . membership . core . di . Application Component Ċ import Ġcom . k ard ia . membership . core . di . Application Module Ċ import Ġcom . k ard ia . membership . core . di . D agger Application Component Ċ import Ġcom . k ard ia . membership . features . utils . App Constants ĊĊ Ċ class ĠAndroid Application Ġ: ĠApplication () Ġ{ ĊĠĠĠ Ġval ĠLOG _ TAG Ġ= Ġ" Apps Fly er _ Deep Link " ĊĠĠĠ Ġval ĠDL _ ATTR S Ġ= Ġ" dl _ attrs " ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġis Activity Visible (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġactivity Visible ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġactivity Res umed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Visible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġactivity Paused () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Visible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġactivity Visible Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġapp Component : ĠApplication Component Ġby Ġlazy ( mode Ġ= ĠLazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ ĠD agger Application Component ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. application Module ( Application Module ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġrunning Activities : ĠArrayList < Class <* >> Ġ= ĠArrayList () ĊĊĠĠĠ Ġ@ Suppress Lint (" Hardware Ids ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ Ġthis . inject Members () ĊĠĠĠĠĠĠĠ Ġinit Apps Fly er () ĊĊĠĠĠĠĠĠĠ Ġvar ĠdeviceId : ĠString Ġ= ĠSettings . Secure . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . Secure . ANDROID _ ID ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠ Ġ/* Ġif ( Build Config . DEBUG ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= Ġ" e 3 a 0 a 9 e 5 a 5 b 5 d 7 6 7 " ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠ ĠApp Constants . DEVICE _ ID Ġ= ĠdeviceId ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinject Members () Ġ= Ġapp Component . inject ( this ) ĊĊĠĠĠ Ġfun Ġadd This Activity To Running Activity ies ( cls : ĠClass < *> ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! running Activities . contains ( cls )) Ġrunning Activities . add ( cls !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove This Activity From Running Activities ( cls : ĠClass < *> ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( running Activities . contains ( cls )) Ġrunning Activities . remove ( cls ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Activity In Back Stack ( cls : ĠClass < *> ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrunning Activities . contains ( cls ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Apps Fly er () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp sf ly er Ġ= ĠApps Fly er Lib . getInstance () ĊĠĠĠĠĠĠĠ Ġapp sf ly er . set Min Time Between Sessions ( 0 ) ĊĠĠĠĠĠĠĠ Ġapp sf ly er . set Debug Log ( true ) ĊĊĠĠĠĠĠĠĠ Ġapp sf ly er . subscribe For Deep Link ( Deep Link Listener Ġ{ Ġdeep Link Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( deep Link Result . status . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" FOUND " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Deep Ġlink Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" NOT _ FOUND " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Deep Ġlink Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Deep Link Listener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdl Status Ġ== ĠDeep Link Result . Status . ERROR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdl Error Ġ= Ġdeep Link Result . error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" There Ġwas Ġan Ġerror Ġgetting ĠDeep ĠLink Ġdata : Ġ$ dl Error ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Deep Link Listener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeep Link Obj Ġ= Ġdeep Link Result . deep Link ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" The ĠDeep Link Ġdata Ġis : Ġ$ deep Link Obj ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Deep Link Ġdata Ġcame Ġback Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Deep Link Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAn Ġexample Ġfor Ġusing Ġis _ deferred ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Link Obj . is Deferred ?. let { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" This Ġis Ġa Ġdeferred Ġdeep Ġlink ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" This Ġis Ġa Ġdirect Ġdeep Ġlink ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeep Link Obj . getString Value ( App Constants . KEY _ REF ERR AL _ USER )?. let { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Constants . USER _ INV ITE Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAn Ġexample Ġfor Ġusing Ġa Ġgeneric Ġgetter Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠuserId : ĠString ? Ġ= Ġ"" Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Ġ= Ġdeep Link Obj . deep Link Value Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" The ĠDeep Link Ġwill Ġroute Ġto : Ġ$ fruit Name ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Custom Ġparam Ġfruit _ name Ġwas Ġnot Ġfound Ġin ĠDeep Link Ġdata ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Deep Link Listener Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġgo To F ruit ( fruit Name , Ġdeep Link Obj ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġconversion Data Listener Ġ= Ġobject Ġ: ĠApps Fly er Conversion Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Conversion Data Success ( data : ĠMutable Map < String , ĠAny > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ Ġcv Data Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcv Data . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( LOG _ TAG , Ġ" conversion _ attribute : Ġ Ġ${ it . key } Ġ= Ġ${ it . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Conversion Data Fail ( error : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" error Ġon At tribution Failure Ġ: Ġ Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon App Open At tribution ( data : ĠMutable Map < String , ĠString > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" on App Open _ attribute : Ġ${ it . key } Ġ= Ġ${ it . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon At tribution Failure ( error : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" error Ġon At tribution Failure Ġ: Ġ Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġapp sf ly er . init ( Build Config . KEY _ APPS _ FL Y ER , Ġconversion Data Listener , Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġapp sf ly er . start ( this ) ĊĊĠĠĠĠĠĠĠ Ġ/* ĠSet Ġto Ġtrue Ġto Ġsee Ġthe Ġdebug Ġlogs . ĠComment Ġout Ġor Ġset Ġto Ġfalse Ġto Ġstop Ġthe Ġfunction Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġapp sf ly er . set Debug Log ( true ) ĊĊĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġprivate Ġfun Ġgo To F ruit ( fruit Name : ĠString , Ġdl Data : ĠDeep Link ?) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġfruit ClassName Ġ= Ġfruit Name Ġ+ Ġ" Activity " Ċ // ĠĠĠĠĠĠĠ Ġtry Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfruit Class Ġ= ĠClass . forName ( this . packageName Ġ+ Ġ"." Ġ+ Ġfruit ClassName ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Looking Ġfor Ġclass Ġ$ fruit Class ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( application Context , Ġfruit Class ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dl Data Ġ!= Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ- Ġmake ĠDeep Link ĠParcel able Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj To Str Ġ= ĠGson (). toJson ( dl Data ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( DL _ ATTR S , Ġobj To Str ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Deep Ġlinking Ġfailed Ġlooking Ġfor Ġ$ fruit Name ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ } Ċ