package Ġcom . android kotlin core . mvp . impl Ċ Ċ import Ġandroid . arch . lifecycle . Generic Lifecycle Observer Ċ import Ġandroid . arch . lifecycle . Lifecycle Ċ import Ġandroid . arch . lifecycle . Lifecycle Owner Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġcom . android kotlin core . mvp .* Ċ import Ġcom . android kotlin core . mvp . addons . Composite EventListener Ċ import Ġcom . android kotlin core . mvp . addons . Emit able Composite EventListener Ċ import Ġcom . android kotlin core . mvp . addons . impl . Behaviour Composite EventListener Ċ import Ġcom . android kotlin core . mvp . impl . M VP Logger . log Ċ import Ġcom . android kotlin core . mvp . impl . permissions . On Request Permissions Result Event Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠPeter Ġon Ġ 0 7 . 0 1 . 2 0 1 7 . Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* ĠM VP Delegate Ġfor ĠActiv ities Ġ& ĠF rag ments Ġwhich Ġmust Ġimplement Ġthe Ġ[ Lifecycle Owner ] Ġinterface Ċ Ġ* ĠThe Ġfollowing Ġmethods Ġmust Ġbe Ġinvoked Ġfrom Ġthe Ġcorresponding ĠActiv ities / Fragments Ġmethods : Ċ Ġ* Ġ[ on Activity Result ] Ċ Ġ* Ġ[ on Request Permissions Result ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġpresent ers Storage Ġ- Ġstorage Ġfor Ġpresent ers . Ġ[ Abstract M VP Delegate ] Ġhandles Ġputting Ġ[ TP res enter ] Ċ Ġ* Ġinto Ġ[ present ers Storage ] Ġand Ġremoving Ġit Ġfrom Ġ[ present ers Storage ] Ċ Ġ* Ġ@ property Ġview Ġ- Ġ[ M VP View ] Ġwith Ġw itch Ġthis Ġdelegate Ġworks Ċ Ġ* Ġ@ property Ġview Persistence Storage Ġ- Ġ[ Bundle ] Ġfrom Ġview Ġwith Ġkey - value Ġpairs Ċ Ġ* Ġ@ property Ġpresenter Id Ġ- Ġinitial Ġpresenter Ġid Ċ Ġ*/ Ċ abstract Ġclass ĠAbstract M VP Delegate < TP res enter , ĠT View >( private Ġval Ġpresent ers Storage : ĠPresent ers Storage < TP res enter , ĠT View >) Ġ: ĊĠĠĠĠĠĠĠ ĠGeneric Lifecycle Observer , ĊĠĠĠĠĠĠĠ ĠM VP View < T View , ĠT Presenter > ĊĊĠĠĠĠĠĠĠ Ġwhere ĠT Presenter Ġ: ĠMV PP res enter < TP res enter , ĠT View >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT View Ġ: ĠM VP View < T View , ĠT Presenter > Ġ{ ĊĊĠĠĠ Ġconstructor () Ġ: Ġthis ( Present ers Storage Impl ()) ĊĊĠĠĠ Ġ// View ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview : ĠM VP View < T View , ĠT Presenter > ĊĠĠĠ Ġprotected Ġval Ġview Persistence Storage : ĠBundle ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal View Ġ= Ġview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( local View Ġis ĠView Persistence Storage ) Ġlocal View . args ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġthrow ĠIllegalStateException ("$ local View Ġmust Ġimplement Ġ${ View Persistence Storage :: class . java . name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġpresenter Id : ĠLong Ġ= Ġ- 1 L ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġshould Ġbe Ġcalled Ġin Ġ[ T View ] Ġinit Ġblock ĊĠĠĠĠ Ġ* Ġ@ param Ġview Ġ- Ġview Ġw itch Ġuses Ġthis Ġdelegate ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġinit ( view : ĠM VP View < T View , ĠT Presenter >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . view Ġ= Ġview ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġis ĠLifecycle Owner ) Ġview . get Lifecycle (). add Observer ( this ) ĊĠĠĠĠĠĠĠ Ġelse Ġthrow ĠIllegalStateException ("$ view Ġmust Ġimplement Ġ${ Lifecycle Owner :: class . java . name } Ġinterface !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ////////////////////////////////// /// ĠM VP View Ġmethods Ġoverriding Ġ// //////////////////////// ///// ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLazy Ġcreation Ġof Ġ[ TP res enter ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġpresenter : ĠT Presenter Ġby Ġlazy Ġ{ Ġcreate Or Restore Presenter () Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ Behaviour Composite EventListener ] Ġto Ġemit Ġ[ Lifecycle . Event ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġinternal Ġval Ġlifecycle Emitter : ĠEmit able Composite EventListener < Lifecycle . Event > Ġ= ĠBe haviour Composite EventListener () ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUse Ġthis Ġlistener Ġto Ġsubscribe Ġon Ġ[ Lifecycle . Event ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġlifecycle : ĠComposite EventListener < Lifecycle . Event > Ġ= Ġlifecycle Emitter ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ Behaviour Composite EventListener ] Ġto Ġemit Ġ[ On Activity Result Event ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġinternal Ġval Ġon Activity Result Emitter : ĠEmit able Composite EventListener < On Activity Result Event > Ġ= ĠBe haviour Composite EventListener () ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUse Ġthis Ġlistener Ġto Ġsubscribe Ġon Ġ[ On Activity Result Event ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġon Activity Result : ĠComposite EventListener < On Activity Result Event > Ġ= Ġon Activity Result Emitter ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ Behaviour Composite EventListener ] Ġto Ġemit Ġ[ On Request Permissions Result Event ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġinternal Ġval Ġon Request Permission Result Emitter : ĠEmit able Composite EventListener < On Request Permissions Result Event > Ġ= ĠBe haviour Composite EventListener () ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUse Ġthis Ġlistener Ġto Ġsubscribe Ġon Ġ[ On Request Permissions Result Event ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġon Request Permission Result : ĠComposite EventListener < On Request Permissions Result Event > Ġ= Ġon Request Permission Result Emitter ĊĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// //////////////////////// ////// ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠActivity Ġresult Ġhandler ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Activity Result Emitter . emit ( On Activity Result Event ( request Code , ĠresultCode , Ġdata )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// //////////////////////// ////// ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest Ġpermissions Ġcallback ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest Code Ġ- Ġpermissions Ġrequest Ġcode ĊĠĠĠĠ Ġ* Ġ@ param Ġpermissions Ġ- Ġlist Ġof Ġrequested Ġpermissions ĊĠĠĠĠ Ġ* Ġ@ param Ġgrant Results Ġ- Ġthe Ġgrant Ġresults Ġfor Ġthe Ġcorresponding Ġpermissions ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) ĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// //////////////////////// ////// ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ Generic Lifecycle Observer . on StateChanged ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon StateChanged ( source : ĠLifecycle Owner , Ġevent : ĠLifecycle . Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ("# STATE _ CHANGED # Ġ${ view . java Class . name } Ġ-> Ġ$ event ") ĊĠĠĠĠĠĠĠ Ġpresenter Ġ// presenter Ġmust Ġbe Ġinitialized Ġhere ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLifecycle . Event . ON _ START Ġ-> Ġattach View To Presenter () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLifecycle . Event . ON _ STOP Ġ-> Ġdetach View From Presenter () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLifecycle . Event . ON _ DESTROY Ġ-> Ġon Destroy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// do Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġ!= ĠLifecycle . Event . ON _ ANY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Emitter . emit ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġcreate Presenter ( view : ĠM VP View < T View , ĠT Presenter >) Ġ= Ġprovide Injector ( view ). create Presenter ( view . java Class , Ġview . mvp Tag ) Ġas ĠT Presenter ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS ear ches Ġfor Ġthe Ġ[ M VP Injector ] Ġamong Ġcandidates : ĊĠĠĠĠ Ġ* Ġ- Ġ[ M VP View ] ĊĠĠĠĠ Ġ* Ġ- Ġ[ M VP View ][ context NotNull ] ĊĠĠĠĠ Ġ* Ġ- Ġ[ Context ] Ġof Ġan Ġapplication ĊĠĠĠĠ Ġ* ĠApplication Ġshould Ġimplement Ġ[ M VP Injector ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġprovide Injector ( view : ĠM VP View < T View , ĠT Presenter >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġas ? ĠM VP Injector Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . context NotNull Ġas ? ĠM VP Injector Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . context NotNull . application Context Ġas ? ĠM VP Injector Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Implementation Ġof Ġ${ M VP Injector :: class . java . name } Ġnot Ġfound !") ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Or Restore Presenter (): ĠT Presenter Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpresenter Extra Id Ġ= Ġ"${ view . java Class . name }. presenter Id " ĊĠĠĠĠĠĠĠ Ġval Ġlocal Presenter Id Ġ= Ġview Persistence Storage . getLong ( presenter Extra Id , ĠP RES ENTER _ NOT _ FOUND ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( local Presenter Id Ġ== ĠP RES ENTER _ NOT _ FOUND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter Id Ġ= Ġpresent ers Storage . generate Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Persistence Storage . put Long ( presenter Extra Id , Ġpresenter Id ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġpresenter Id Ġ= Ġlocal Presenter Id ĊĊĠĠĠĠĠĠĠ Ġvar Ġlocal Presenter Ġ= Ġpresent ers Storage . get ( view , Ġpresenter Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( local Presenter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis First Presenter Creation Ġ= Ġlocal Presenter Id Ġ== ĠP RES ENTER _ NOT _ FOUND ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is First Presenter Creation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// App Ġwas Ġkilled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" View Ġhas Ġpresenter ID Ġ($ presenter Id ), Ġbut Ġpresenter Ġnot Ġfound !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Presenter Ġ= Ġcreate Presenter ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ("# CRE ATING _ PRES ENTER # Ġpresenter Id :$ presenter Id Ġ${ local Presenter . java Class . name } Ġ-> Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ view . java Class . name }; Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" if First Presenter Creation : Ġ$ is First Presenter Creation ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresent ers Storage . put ( view , Ġpresenter Id , Ġlocal Presenter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Presenter . on Created ( is First Presenter Creation ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġlog ("# RE USING _ PRES ENTER # Ġpresenter Id :$ presenter Id Ġ${ local Presenter . java Class . name } Ġ-> Ġ${ view . java Class . name }") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlocal Presenter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġattach View To Presenter () Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġpresenter . attach View ( view Ġas ĠT View ) ĊĠĠĠĠĠĠĠ Ġlog ("# ATTACH _ VIEW # Ġ${ view . java Class . name } Ġ-> Ġ${ presenter . java Class . name }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdetach View From Presenter () Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġpresenter . detach View ( view Ġas ĠT View ) ĊĠĠĠĠĠĠĠ Ġlog ("# DET ACH _ VIEW # Ġ${ view . java Class . name } Ġ-> Ġ${ presenter . java Class . name }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! retain Presenter Instance ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Presenter () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPredicate Ġwhich Ġindicates Ġwhether Ġpresenter Ġshould Ġbe Ġdestroyed Ġwhen Ġview Ġis Ġdestroyed Ġor Ġnot ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġto Ġleft Ġpresenter Ġin Ġstorage ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġretain Presenter Instance (): ĠBoolean ĊĊĠĠĠ Ġprivate Ġfun Ġdestroy Presenter () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ("# DESTROY _ PRES ENTER # Ġpresenter Id :$ presenter Id ; Ġ${ view . java Class . name } Ġ-> Ġ${ presenter . java Class . name }") ĊĠĠĠĠĠĠĠ Ġpresenter . on Destroyed () ĊĠĠĠĠĠĠĠ Ġpresent ers Storage . remove ( view , Ġpresenter Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP RES ENTER _ NOT _ FOUND Ġ= Ġ- 1 L ĊĠĠĠ Ġ} Ċ }