package Ġcom . ct ech . eat y . ui . user . view Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . app . Fragment Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġcom . ct ech . eat y . R Ċ import Ġcom . ct ech . eat y . base . Base Redux Fragment Ċ import Ġcom . ct ech . eat y . base . redux . Store Ċ import Ġcom . ct ech . eat y . di . Injectable Ċ import Ġcom . ct ech . eat y . ui . home . view . Product ViewHolder Ċ import Ġcom . ct ech . eat y . ui . home . view model . Product Item ViewModel Ċ import Ġcom . ct ech . eat y . ui . user . action . User Action Ċ import Ġcom . ct ech . eat y . ui . user . state . User Detail State Ċ import Ġcom . ct ech . eat y . ui . user . view model . User Detail ViewModel Ċ import Ġcom . ct ech . eat y . util . glide . G lide Image Loader Ċ import Ġcom . ct ech . eat y . util . rx . plus Assign Ċ import Ġcom . ct ech . eat y . util . set Padding Top Ċ import Ġcom . ct ech . eat y . widget . recyclerview . Infinite Scroll Listener Ċ import Ġcom . ct ech . eat y . widget . recyclerview . Slide In Item Animator Ċ import Ġcom . ct ech . eat y . widget . recyclerview . Vertical Space Item Decoration Ċ import Ġkotlinx . android . synt hetic . main . fragment _ user .* Ċ import Ġtim ber . log . Tim ber Ċ import Ġvn . t iki . no adapter 2 . Diff Callback Ċ import Ġvn . t iki . no adapter 2 . Only Adapter Ċ import Ġjavax . inject . Inject ĊĊ Ċ class ĠUser Detail Fragment Ġ: ĠBase Redux Fragment < User Detail State >(), ĠInjectable Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠUSER _ ID _ KEY Ġ= Ġ" userId " ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( id : ĠInt ): ĠFragment Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= ĠBundle () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= ĠUser Detail Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . put Int ( USER _ ID _ KEY , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . arguments Ġ= Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragment ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġstore : ĠStore < User Detail State > ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar ĠviewModel : ĠUser Detail ViewModel ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġimage Loader : ĠG lide Image Loader ĊĊĠĠĠ Ġprivate Ġval ĠprogressBar Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity !!. findViewById < View >( R . id . progress Bar ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcontainer Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity !!. findViewById < View >( R . id . container ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠuserId Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġarguments !!. getInt ( USER _ ID _ KEY ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdiff Callback Ġ= Ġobject Ġ: ĠDiff Callback Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠAny , Ġnew Item : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Item Ġis ĠProduct Item ViewModel Ġ&& Ġnew Item Ġis ĠProduct Item ViewModel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold Item . id Ġ== Ġnew Item . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠAny , Ġnew Item : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold Item Ġ== Ġnew Item ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġadapter : ĠOnly Adapter Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠOnly Adapter . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. diff Callback ( diff Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on ItemClickListener Ġ{ Ġview , Ġitem , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġis ĠProduct Item ViewModel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( view . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . fl Product Holder Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . navigate Product ( item . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. view Holder Factory Ġ{ Ġview Group , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProduct ViewHolder . create ( view Group ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstore (): ĠStore < User Detail State > Ġ= Ġstore ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ user , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġsetup RecyclerView () ĊĠĠĠĠĠĠĠ Ġsetup ViewModel () ĊĠĠĠĠĠĠĠ Ġstore . dispatch ( User Action . Load ( userId )) ĊĠĠĠĠĠĠĠ Ġstore . dispatch ( User Action . Load Product ( userId )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Content ( list : ĠList < Product Item ViewModel >) Ġ{ ĊĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġv Error . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġrv Products . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġrv Products . set Padding Top ( activity !!. findViewById < View >( R . id . tv Product Count ). bottom ) ĊĠĠĠĠĠĠĠ Ġadapter . set Items ( list ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġrender Load Error ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġv Error . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ ĠTim ber . e ( error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Loading () Ġ{ ĊĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup ViewModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= ĠviewModel . loading Product (). subscribe Ġ{ Ġrender Loading () Ġ} ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= ĠviewModel . load Product Error (). subscribe Ġ{ Ġrender Load Error ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= ĠviewModel . body (). subscribe Ġ{ Ġrender Content ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= ĠviewModel . empty (). subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Content ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠ Ġrv Products . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġrv Products . layout Manager Ġ= Ġlayout Manager ĊĠĠĠĠĠĠĠ Ġrv Products . item Animator Ġ= ĠSlide In Item Animator () ĊĠĠĠĠĠĠĠ Ġrv Products . addItem Decoration ( Vertical Space Item Decoration ( Product ViewHolder :: class . java , Ġresources . get Dimension Pixel Size ( R . dim en . divider _ space ))) ĊĠĠĠĠĠĠĠ Ġrv Products . add On Scroll Listener ( Infinite Scroll Listener ( layout Manager , Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore . dispatch ( User Action . Load More Product ( userId )) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġrv Products . setOn Touch Listener Ġ{ Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Visible Ġ= Ġlayout Manager . findFirst Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Visible Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Touch Listener Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter . item Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Touch Listener Ġcontainer . dispatch Touch Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv h Ġ= Ġrv Products . find ViewHolder For Adapter Position ( 0 ) Ġ?: Ġreturn @ setOn Touch Listener Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Top Ġ= Ġv h . item View . top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . y Ġ< Ġfirst Top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Touch Listener Ġcontainer . dispatch Touch Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Touch Listener Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }