package Ġcom . code path . apps . rest client template Ċ Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . swiper ef resh layout . widget . Swipe Refresh Layout Ċ import Ġcom . code path . apps . rest client template . models . Tweet Ċ import Ġcom . code path . as yn ch ttp client . callback . Json HttpResponse Handler Ċ import Ġokhttp 3 . Headers Ċ import Ġorg . json . JSONException Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ class ĠTimeline Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġclient : ĠTwitter Client ĊĊĠĠĠ Ġlateinit Ġvar Ġrv T weets : ĠRecyclerView ĊĠĠĠ Ġlateinit Ġvar Ġadapter : ĠT weets Adapter ĊĠĠĠ Ġlateinit Ġvar Ġs rl Container : ĠSw ipe Refresh Layout ĊĊĠĠĠ Ġlateinit Ġvar Ġscroll Listener : ĠEnd less RecyclerView Scroll Listener ĊĊĠĠĠ Ġvar Ġlowest Max Id : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġval Ġtweets Ġ= ĠArrayList < Tweet >() ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ timeline ) ĊĊĠĠĠĠĠĠĠ Ġclient Ġ= ĠTwitter Application . get RestClient ( this ) ĊĊĠĠĠĠĠĠĠ Ġrv T weets Ġ= ĠfindViewById ( R . id . rv T weets ) ĊĠĠĠĠĠĠĠ Ġs rl Container Ġ= ĠfindViewById ( R . id . srl Container ) ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠT weets Adapter ( tweets ) ĊĠĠĠĠĠĠĠ Ġvar Ġlinear LayoutManager Ġ= ĠLinearLayoutManager ( this ) ĊĠĠĠĠĠĠĠ Ġrv T weets . layout Manager Ġ= Ġlinear LayoutManager ĊĠĠĠĠĠĠĠ Ġrv T weets . adapter Ġ= Ġadapter ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnd less ĠScroll ĠListener ĊĠĠĠĠĠĠĠ Ġscroll Listener Ġ= Ġobject Ġ: ĠEnd less RecyclerView Scroll Listener ( linear LayoutManager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonLoad More ( page : ĠInt , Ġtotal Items Count : ĠInt , Ġview : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTrigger ed Ġonly Ġwhen Ġnew Ġdata Ġneeds Ġto Ġbe Ġappended Ġto Ġthe Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġwhatever Ġcode Ġis Ġneeded Ġto Ġappend Ġnew Ġitems Ġto Ġthe Ġbottom Ġof Ġthe Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload More Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrv T weets . add On Scroll Listener ( scroll Listener ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSw ipe ĠRefresh ĠLayout ĊĠĠĠĠĠĠĠ Ġs rl Container . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠYour Ġcode Ġto Ġrefresh Ġthe Ġlist Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġyou Ġcall Ġswipe Container . set Refresh ing ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonce Ġthe Ġnetwork Ġrequest Ġhas Ġcompleted Ġsuccessfully . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Timeline Async () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠConfigure Ġthe Ġrefresh ing Ġcolors Ġfor Ġs rl Container ĊĠĠĠĠĠĠĠ Ġs rl Container . setColor Scheme Resources ( android . R . color . holo _ blue _ bright , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . color . holo _ green _ light , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . color . holo _ orange _ light , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . color . holo _ red _ light ) ĊĊĊĊĠĠĠĠĠĠĠ Ġpopulate Home Timeline () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload More Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . populate Home Timeline 2 ( lowest Max Id , Ġobject : ĠJson HttpResponse Handler () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( statusCode : ĠInt , Ġheaders : ĠHeaders , Ġjson : ĠJson HttpResponse Handler . JSON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Success ! ĠAnother Ġ 2 5 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Array Ġ= Ġjson . json Array ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġretrieved T weets Ġ= ĠTweet . fromJson Array ( json Array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtweets . addAll ( retrie ved T weets ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlowest Max Id Ġ= Ġtweets [ tweets . size Ġ- Ġ 1 ]. uid ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" JSONException Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders : ĠHeaders , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable : ĠThrowable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Fetch Ġtimeline Ġerror ", Ġthrowable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Timeline Async () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSend Ġthe Ġnetwork Ġrequest Ġto Ġfetch Ġthe Ġupdated Ġdata ĊĠĠĠĠĠĠĠ Ġ// Ġ` client ` Ġhere Ġis Ġan Ġinstance Ġof ĠAndroid ĠAsync ĠHTTP ĊĠĠĠĠĠĠĠ Ġ// Ġget Home Timeline Ġis Ġan Ġexample Ġendpoint . ĊĠĠĠĠĠĠĠ Ġclient . populate Home Timeline ( object : ĠJson HttpResponse Handler () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( statusCode : ĠInt , Ġheaders : ĠHeaders , Ġjson : ĠJSON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemember Ġto ĠCLEAR ĠOUT Ġold Ġitems Ġbefore Ġapp ending Ġin Ġthe Ġnew Ġones ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... the Ġdata Ġhas Ġcome Ġback , Ġadd Ġnew Ġitems Ġto Ġyour Ġadapter ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Array Ġ= Ġjson . json Array ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġretrieved T weets Ġ= ĠTweet . fromJson Array ( json Array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtweets . addAll ( retrie ved T weets ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlowest Max Id Ġ= Ġtweets [ tweets . size Ġ- Ġ 1 ]. uid ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġcall Ġset Refresh ing ( false ) Ġto Ġsignal Ġrefresh Ġhas Ġfinished ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs rl Container . set Refresh ing ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" JSON ĠException Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders : ĠHeaders , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable : ĠThrowable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Fetch Ġtimeline Ġerror ", Ġthrowable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpopulate Home Timeline () Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . populate Home Timeline ( object Ġ: ĠJson HttpResponse Handler () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( statusCode : ĠInt , Ġheaders : ĠHeaders , Ġjson : ĠJSON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Success !") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Array Ġ= Ġjson . json Array ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġretrieved T weets Ġ= ĠTweet . fromJson Array ( json Array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtweets . addAll ( retrie ved T weets ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlowest Max Id Ġ= Ġtweets [ tweets . size Ġ- Ġ 1 ]. uid ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" JSON ĠException Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders : ĠHeaders ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable : ĠThrowable ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Failure ", Ġthrowable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Timeline Activity " ĊĠĠĠ Ġ} Ċ }