package Ġcom . catal inj ur ji u . wheel bar row Ċ Ċ import Ġandroid . arch . lifecycle . ViewModel Providers Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . app . Fragment Ċ import Ġcom . catal inj ur ji u . wheel bar row . Wheel bar row Fragment . Factory Ċ import Ġcom . catal inj ur ji u . wheel bar row . common . Named Component Ċ import Ġcom . catal inj ur ji u . wheel bar row . common . identity Ċ import Ġcom . catal inj ur ji u . wheel bar row . log . Ch ron icle Ċ import Ġcom . catal inj ur ji u . wheel bar row . store . ViewModel Cargo Holder Ċ import Ġcom . catal inj ur ji u . wheel bar row . store . Wheel bar row Ċ Ċ /** Ċ Ġ* ĠFragment Ġwhich Ġstores Ġan Ġobject Ġas Ġ` Cargo ` Ġacross Ġconfiguration Ġchanges . Ċ Ġ* Ċ Ġ* ĠThe Ġ` Cargo ` Ġis Ġsafe Ġto Ġbe Ġused Ġimmediately Ġafter Ġcalling Ġ` super . onCreate ()` Ġin Ġyour Ġsubclass . Ċ Ġ* ĠAfter Ġthe Ġ` Cargo ` Ġhas Ġbeen Ġset Ġon Ġthe Ġ` Fragment `, Ġtypically Ġthe Ġ` Cargo ` Ġinstance Ġwon 't Ġbe Ġchanged . Ċ Ġ* Ċ Ġ* ĠInstances Ġof Ġthis ĠFragment Ġ** should Ġonly Ġbe Ġcreated ** Ġusing Ġa Ġsubclass Ġof Ċ Ġ* Ġ[ Wheel bar row Fragment . Factory ]. ĠDo Ġnot Ġuse Ġsubclasses Ġof Ġthis Ġ[ Fragment ] Ġcreated Ġusing Ġthe Ġdefault Ċ Ġ* Ġconstructor ! Ċ Ġ* Ċ Ġ* ĠAdding Ġto Ġthe Ġ[ FragmentManager ][ android . support . v 4 . app . FragmentManager ] Ġa Ġ[ Wheel bar row Fragment ] Ċ Ġ* Ġwhich Ġwas Ġnot Ġinitially Ġcreated Ġusing Ġa Ġ[ Wheel bar row Fragment . Factory ] Ġwill Ġresult Ġin Ġa Ġruntime Ċ Ġ* Ġexception . Ċ Ġ* Ċ Ġ* ĠEach Ġsubclass Ġof Ġ` Wheel bar row Fragment ` Ġwill Ġneed Ġto Ġdefine Ġa Ġ[ name ]. ĠThe Ġ` TAG ` Ġused Ġwhen Ġadding Ċ Ġ* Ġthe Ġ` Fragment ` Ġto Ġthe Ġ` FragmentManager ` Ġcan Ġbe Ġalso Ġused Ġas Ġthe Ġ[ name ] Ġof Ġthe Ġ` Fragment `. Ċ Ġ* Ċ Ġ* Ġ[ Cargo Type ] Ġis Ġthe Ġtype Ġof Ġthe Ġ` Cargo ` Ġto Ġbe Ġstored Ġduring Ġa Ġconfiguration Ġchange . Ċ Ġ* Ċ Ġ* Ġ@ see ĠFactory Ċ Ġ* Ċ Ġ* Ġ@ constructor ĠCreates Ġa Ġnew Ġ[ Wheel bar row Fragment ]. Ċ Ġ* Ċ Ġ* ĠCreated Ġby Ġc atal inj Ġon Ġ 2 7 . 0 2 . 2 0 1 8 . Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ abstract Ġclass ĠW heel bar row Fragment < Cargo Type Ġ: ĠAny > Ġ: ĠFragment (), ĠNamed Component Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcargo Ġstored Ġby Ġthis Ġ[ Wheel bar row Fragment ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġval Ġcargo : ĠC argo Type Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ Ġcargo Internal Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcargo Internal : ĠC argo Type ĊĠĠĠ Ġprivate Ġvar Ġdo Persist Cargo To ViewModel : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġdo Read Cargo From ViewModel : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġinitialize Injector () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Injector () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcargo Store : ĠViewModel Cargo Holder < Cargo Type > Ġ= ĠViewModel Providers . of ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( name , ĠViewModel Cargo Holder :: class . java ) Ġas ĠViewModel Cargo Holder < Cargo Type > ĊĠĠĠĠĠĠĠ Ġif Ġ( do Persist Cargo To ViewModel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Cargo Initialized ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcargo Store . cargo Ġ= Ġcargo Internal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCh ron icle . log Debug ( this :: class . java . simple Name , Ġ" Saved Ġcargo : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ cargo Store . identity ()} Ġfor : Ġ${ this . identity ()}. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCh ron icle . log Error ( this :: class . java . simple Name , Ġ" Cannot Ġstore Ġan Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" un initial ised Ġcargo Ġinstance .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Cargo Ġnot Ġinitial ised Ġbut Ġthe Ġflags Ġsay Ġthat Ġthe Ġcargo Ġwas Ġinitial ised Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// needs Ġto Ġbe Ġstored . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Cannot Ġstore Ġun initial ised ĠC argo . ĠPlease Ġmake Ġsure Ġthe " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Fragment Ġis Ġcreated Ġusing Ġa Ġsubclass Ġof ĠW heel bar row Fragment . Factory Ġclass , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" not Ġdirectly Ġvia Ġthe Ġdefault Ġconstructor .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( do Read Cargo From ViewModel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cargo Store . has Cargo ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcargo Internal Ġ= Ġcargo Store . cargo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCh ron icle . log Debug ( this :: class . java . simple Name , Ġ" Re - initial ised Ġcargo : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ cargo Store . identity ()} Ġfor : Ġ${ this . identity ()}. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Cargo Ġwants Ġto Ġbe Ġinitialized Ġfrom Ġthe Ġcargo Ġstore , Ġbut Ġthe Ġstore Ġhas Ġno ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// cargo Ġin Ġit .... an Ġerror ? Ġwrong Ġflags ? Ġcargo Ġoverwritten Ġby Ġthe Ġuser ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCh ron icle . log Error ( this :: class . java . simple Name , Ġ" Cannot Ġinitialize Ġthe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cargo Ġinstance Ġfrom Ġan Ġempty Ġcargo Ġholder .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Empty Ġcargo Ġholder . ĠPlease Ġmake Ġsure Ġyou Ġdidn 't Ġoverride " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" the Ġexisting ĠC argo Ġwith Ġan Ġinvalid / null Ġvalue .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Cargo Initialized (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ:: cargo Internal . isInitialized ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFactory Ġwhich Ġperforms Ġthe Ġinitial Ġconfiguration Ġbetween Ġa Ġ[ Wheel bar row Fragment ] Ġand Ġits ĊĠĠĠĠ Ġ* Ġ` Cargo `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAlways Ġinstantiate Ġsubclasses Ġof Ġ[ Wheel bar row Fragment ] Ġusing Ġa Ġsubclass Ġof Ġthis Ġ[ Factory ]. ĠNot ĊĠĠĠĠ Ġ* Ġdoing Ġso Ġwill Ġresult Ġin Ġa Ġ[ RuntimeException ] Ġbeing Ġthrown Ġwhen Ġadding Ġthe Ġrespective ĊĠĠĠĠ Ġ* Ġ` Wheel bar row Fragment ` Ġto Ġthe Ġ[ FragmentManager ][ android . support . v 4 . app . FragmentManager ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġ` Factory ` Ġworks Ġin Ġ 2 Ġphases : ĠFirst Ġit Ġinstanti ates Ġyour Ġ` Wheel bar row Fragment ` Ġsubclass ĊĠĠĠĠ Ġ* Ġin Ġ[ onCreate Fragment ]. ĠThe Ġfragment Ġreturned Ġhere Ġis Ġnot Ġready Ġto Ġbe Ġused Ġat Ġthis Ġpoint . ĊĠĠĠĠ Ġ* ĠThen Ġit Ġobt ains Ġthe Ġrequired Ġ` Cargo ` Ġvia Ġ[ onCreate Cargo ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFinally , Ġwhen Ġ[ create ] Ġis Ġcalled , Ġa Ġconfigured Ġinstance Ġof Ġyour Ġ[ Wheel bar row Fragment ] Ġis ĊĠĠĠĠ Ġ* Ġreturned . ĠThe Ġ` Wheel bar row Fragment ` Ġreturned Ġby Ġ[ create ()] Ġis Ġready Ġto Ġbe Ġused , Ġand Ġcan Ġbe ĊĠĠĠĠ Ġ* Ġadded Ġto Ġthe Ġ` FragmentManager `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġclass ĠFactory < Cargo Type Ġ: ĠAny > Ġ: ĠW heel bar row < Cargo Type >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcom . catal inj ur ji u . wheel bar row . factory . Factory < Wheel bar row Fragment < Cargo Type >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBind s Ġthe Ġ[ Wheel bar row Fragment ] Ġprovided Ġvia Ġ[ onCreate Fragment ] Ġwith Ġthe Ġ` Cargo ` Ġprovided ĊĠĠĠĠĠĠĠĠ Ġ* Ġvia Ġ[ onCreate Cargo ] Ġand Ġreturns Ġa Ġconfigured Ġ` Wheel bar row Fragment ` Ġready Ġto Ġbe Ġused . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġa Ġsafe Ġto Ġuse Ġinstance Ġof Ġa Ġ[ Wheel bar row Fragment ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfinal Ġoverride Ġfun Ġcreate (): ĠW heel bar row Fragment < Cargo Type > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠW heel bar row Fragment < Cargo Type > Ġ= ĠonCreate Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcargo : ĠC argo Type Ġ= ĠonCreate Cargo () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . cargo Internal Ġ= Ġcargo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . do Persist Cargo To ViewModel Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . do Read Cargo From ViewModel Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġf ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġ[ Factory ] Ġrequires Ġthe Ġ[ Wheel bar row Fragment ] Ġsubclass . ĠThis Ġis Ġwhere Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġto - be - used Ġfragment Ġis Ġcreated , Ġits Ġinitial Ġparameters Ġare Ġset , Ġand Ġwhere Ġthe ĠFragment Ġis ĊĠĠĠĠĠĠĠĠ Ġ* Ġfinally Ġreturned . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe ĠFragment Ġreturned Ġhere Ġis Ġ** not ** Ġready Ġto Ġbe Ġused , Ġuntil Ġ[ create ] Ġhas Ġbeen Ġcalled Ġon ĊĠĠĠĠĠĠĠĠ Ġ* Ġthis Ġ[ Factory ] Ġinstance . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġan Ġinstance Ġof Ġa Ġsubclass Ġof Ġ[ Wheel bar row Fragment ], Ġinitialized Ġfor Ġthe Ġuser 's ĊĠĠĠĠĠĠĠĠ Ġ* Ġneeds , Ġbut Ġnot Ġyet Ġready Ġto Ġbe Ġadded Ġto Ġthe Ġ` FragmentManager `. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ see ĠFactory ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ see ĠW heel bar row Fragment ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun ĠonCreate Fragment (): ĠW heel bar row Fragment < Cargo Type > ĊĠĠĠ Ġ} Ċ }