package Ġio . tr uere active . demo . flickr . main . home Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . view pager 2 . widget . ViewPager 2 Ċ import Ġcom . google . android . material . tabs . Tab Layout Mediator Ċ import Ġcom . jak ew h art on . r xb ind ing 3 . appcompat . Search View Query Text Event Ċ import Ġcom . jak ew h art on . r xb ind ing 3 . appcompat . query Text Change Events Ċ import Ġio . reactivex . Observable Ċ import Ġio . tr uere active . demo . flickr . F lickr Application Ċ import Ġio . tr uere active . demo . flickr . R Ċ import Ġio . tr uere active . demo . flickr . main . home . di . Home Component Ċ import Ġio . tr uere active . library . core . View Events Ċ import Ġio . tr uere active . library . rx . ab straction .* Ċ import Ġio . tr uere active . library . rx . reactive ui . view Events Until Dead Ċ import Ġkotlinx . android . synt hetic . main . fragment _ feed .* Ċ import Ġkotlinx . android . synt hetic . main . fragment _ feed . view .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠFeed Fragment Ġ: ĠBase Fragment < Feed View Events , ĠFeed State >() Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠFeed Sources Adapter ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ feed , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : ĠFix Ġbug gy Ġview pager ĊĠĠĠ Ġ// Ġ Ġhttps :// www . reddit . com / r / android dev / comments / co 3 ts 6 / re using _ view pager 2 _ fragment state adapter _ in / ĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġsources Pager . off screen Page Limit Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġbar . replace Menu ( R . menu . home _ menu ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġsources Pager . is Save Enabled Ġ= Ġfalse ĊĊĊĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcreate Adapter ( null ) ĊĠĠĠĠĠĠĠ Ġ/* if Ġ(! :: adapter . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcreate Adapter ( null ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Pager . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠDir ty Ġhack Ġto Ġinvalidate ĠView Pager Ġstate Ġso Ġthe Ġadapter Ġcan Ġbe Ġre - attached ĊĠĠĠ Ġ// ĠTODO : ĠNeed Ġto Ġeither Ġreuse Ġadapter ĊĠĠĠ Ġ// ĠĠ Ġor Ġclear Ġpager Ġfrom Ġfragments Ġto Ġbe Ġrestored ĊĠĠĠ Ġ// ĠĠ ĠView Pager 2 ĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġsources Pager . adapter Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( model : ĠFeed State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġadapter . set Sources ( model . sources , Ġ! model . restore d ) ĊĠĠĠĠĠĠĠ Ġadapter . set Sources ( model . sources ) ĊĠĠĠĠĠĠĠ Ġmodel . selected Page ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Pager . setCurrent Item ( it , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Presenter ( ĊĠĠĠĠĠĠĠ Ġview Channel : ĠView Channel < Feed View Events , ĠFeed State >, ĊĠĠĠĠĠĠĠ Ġargs : ĠBundle ?, ĊĠĠĠĠĠĠĠ Ġsaved State : ĠBundle ? ĊĠĠĠ Ġ): ĠBase Presenter Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsearch Events Ġ= Ġview Channel . view Events Until Dead Ġ{ Ġsearch Input Ġ}. share () ĊĊĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( require Activity (). application Ġas ĠF lickr Application ). app Component . home Component () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( search Events ) ĊĠĠĠĠĠĠĠ Ġcomponent . inject ( this ) ĊĠĠĠĠĠĠĠ Ġput Cache ( component ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠFeed Presenter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Channel ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate ViewHolder ( view : ĠView ): ĠFeed View Events Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsearch Item Ġ= Ġbar . menu . find Item ( R . id . action _ search ) ĊĠĠĠĠĠĠĠ Ġval Ġsearch View Ġ= Ġsearch Item . action View Ġas ĠSearch View ĊĠĠĠĠĠĠĠ Ġreturn ĠFeed View Events ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch View ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Component (): ĠHome Component Ġ= Ġget () Ġas ĠHome Component ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Adapter ( sources : ĠList < String >? ): ĠFeed Sources Adapter Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġsources ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFeed Sources Adapter ( this , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠFeed Sources Adapter ( this ) ĊĊĠĠĠĠĠĠĠ Ġsources Pager . adapter Ġ= Ġadapter ĊĊĠĠĠĠĠĠĠ ĠTab Layout Mediator ( sources Tabs , Ġsources Pager ) Ġ{ Ġtab , Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtab . text Ġ= Ġadapter . get Tab Title ( position ) ĊĠĠĠĠĠĠĠ Ġ}. attach () ĊĊĠĠĠĠĠĠĠ Ġ// Ġsources Tabs . tab Indicator ĊĊĠĠĠĠĠĠĠ Ġreturn Ġadapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance (): ĠFeed Fragment Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFeed Fragment () ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ class ĠFeed View Events ( view : ĠView , Ġsearch View : ĠSearch View ) Ġ: ĠView Events Ġ{ ĊĠĠĠ Ġ/* val Ġpage Selected Events : ĠObservable < Int > Ġ= ĊĠĠĠĠĠĠĠ Ġ( view . sources Pager ?. events () Ġ?: ĠObservable . empty ()). share () */ ĊĊĠĠĠ Ġval Ġpage Selected Events : ĠObservable < Int > Ġ= Ġview . sources Pager . events (). share () ĊĊĠĠĠ Ġval Ġsearch Input : ĠObservable < Search View Query Text Event > Ġ= Ġsearch View . query Text Change Events () ĊĠĠĠĠĠĠĠ Ġ. skip Initial Value () ĊĠĠĠĠĠĠĠ Ġ. throttle Last ( 3 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġ. share () Ċ } Ċ Ċ data Ġclass ĠFeed State ( ĊĠĠĠ Ġval Ġsources : ĠList < String >, ĊĠĠĠ Ġval Ġselected Page : ĠInt ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġrestored : ĠBoolean Ġ= Ġfalse Ċ ) Ċ Ċ fun ĠView Pager 2 . events () Ġ= ĠObservable . create < Int > Ġ{ Ġemitter Ġ-> ĊĊĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠView Pager 2 . On Page Change Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Page Selected ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! emitter . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onNext ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġemitter . set C ancellable Ġ{ ĊĠĠĠĠĠĠĠ Ġunregister On Page Change Callback ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġregister On Page Change Callback ( listener ) Ċ }