/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠK a ush ik ĠN . ĠSan ji Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . ka ush ik ns an ji . top stor iest icker . ui . main Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . ka ush ik ns an ji . top stor iest icker . R Ċ import Ġcom . ka ush ik ns an ji . top stor iest icker . data . model . News Article Ċ import Ġcom . ka ush ik ns an ji . top stor iest icker . di . component . Activity Component Ċ import Ġcom . ka ush ik ns an ji . top stor iest icker . ui . base . Base Activity Ċ import Ġcom . ka ush ik ns an ji . top stor iest icker . ui . main . news . News Adapter Ċ import Ġcom . ka ush ik ns an ji . top stor iest icker . utils . common . Intent Utility Ċ import Ġcom . ka ush ik ns an ji . top stor iest icker . utils . common . observe Event Ċ import Ġcom . ka ush ik ns an ji . top stor iest icker . utils . common . observe NonNull Ċ import Ġcom . ka ush ik ns an ji . top stor iest icker . utils . widget . Vertical ListItem Spacing Decoration Ċ import Ġcom . ka ush ik ns an ji . top stor iest icker . utils . widget . getFirst Visible Item Position Ċ import Ġcom . ka ush ik ns an ji . top stor iest icker . utils . widget . smooth V Scroll To Position With View Top Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* Ġ[ Base Activity ] Ġsubclass Ġthat Ġinfl ates Ġthe Ġlayout Ġ' R . layout . activity _ main ' Ġto Ġshow Ġthe ĠMain Ġscreen . Ċ Ġ* Ġ[ Main ViewModel ] Ġis Ġthe Ġprimary Ġ[ android x . lifecycle . ViewModel ] Ġof Ġthis ĠActivity . Ċ Ġ* Ċ Ġ* Ġ@ author ĠK a ush ik ĠN ĠSan ji Ċ Ġ*/ Ċ class ĠMainActivity Ġ: ĠBase Activity < Main ViewModel >(), ĠNews Adapter . Listener Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠConstant Ġused Ġfor Ġlogs ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" MainActivity " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠLinearLayoutManager Ġinstance Ġprovided Ġby ĠD agger ĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġlinear LayoutManager : ĠLinearLayoutManager ĊĊĠĠĠ Ġ// ĠNews Adapter Ġinstance Ġprovided Ġby ĠD agger ĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġnews Adapter : ĠNews Adapter ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInject s Ġdependencies Ġexposed Ġby Ġ[ Activity Component ] Ġinto ĠActivity . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġinject Dependencies ( activity Component : ĠActivity Component ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity Component . inject ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe ĠResource ĠLayout ĠId Ġfor Ġthe ĠActivity . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġprovide Layout Id (): ĠInt Ġ= ĠR . layout . activity _ main ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitializes Ġthe ĠLayout Ġof Ġthe ĠActivity . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġsetup View ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSetting Ġup ĠRecyclerView ĊĠĠĠĠĠĠĠ Ġrv _ main . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe ĠLayout ĠManager Ġto ĠLinearLayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= Ġlinear LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe ĠAdapter Ġfor ĠRecyclerView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġnews Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd ĠList ĠItem ĠSp acing ĠDecor ation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVertical ListItem Spacing Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Dimension Pixel Size ( R . dim en . list _ item _ spacing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetting Ġup ĠSw ipe Refresh Layout ĊĠĠĠĠĠĠĠ Ġswipe _ refresh _ main . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConfigure Ġthe Ġprogress Ġcircle Ġindicator Ġcolors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Color Scheme Resources ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . color . color P ink 5 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . color . color Pur ple 5 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . color . color In digo 5 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . color . color Green 5 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRegister Ġa ĠListener Ġon Ġthe ĠSw ipe Ġrefresh ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelegate Ġto Ġthe ĠViewModel Ġto Ġrefresh Ġthe Ġcontent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Refresh () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Ġthat Ġinitializes Ġthe Ġ[ android x . lifecycle . LiveData ] Ġob servers . ĊĠĠĠĠ Ġ* ĠCan Ġbe Ġoverridden Ġby Ġsubclasses Ġto Ġinitialize Ġother Ġ[ android x . lifecycle . LiveData ] Ġob servers . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġsetup Observer s () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setup Observer s () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġan Ġobserver Ġon Ġthe ĠNew ĠArticles ĠEvent , Ġto Ġsubmit Ġit Ġto Ġthe ĠAdapter ĊĠĠĠĠĠĠĠ ĠviewModel . live Articles . observe Event ( this ) Ġ{ Ġarticles : ĠList < News Article > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnews Adapter . submit List ( articles ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġan Ġobserver Ġon ĠDownloading ĠProgress ĠLive Data , Ġto Ġshow Ġthe Ġloading Ġindication Ġon Ġthe ĠSw ipe Refresh Layout ĊĠĠĠĠĠĠĠ ĠviewModel . loading Progress . observe NonNull ( this ) Ġ{ Ġstate : ĠBoolean Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġswipe _ refresh _ main . is Refresh ing Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġan Ġobserver Ġfor ĠScroll Ġto ĠTop ĠEvent , Ġto Ġscroll Ġto Ġthe Ġtop most Ġitem Ġin Ġthe ĠRecyclerView ĊĠĠĠĠĠĠĠ ĠviewModel . scrollTo Top . observe Event ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv _ main . smooth Scroll To Position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 5 ) Ġ// ĠScroll Ġto Ġtop Ġafter Ġ 5 ms ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġan Ġobserver Ġon ĠNews ĠArticle Ġlaunch ĠEvents , Ġto Ġopen Ġthe Ġsame Ġin Ġa ĠBrowser ĊĠĠĠĠĠĠĠ ĠviewModel . launch Article . observe Event ( this ) Ġ{ Ġarticle : ĠNews Article Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelegate Ġto Ġthe Ġutility Ġto Ġhandle ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Utility . open Link ( this , Ġarticle . web Url ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġan Ġobserver Ġon ĠLast ĠSc rolled ĠPosition ĠEvents Ġto Ġrestore Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġsc rolled Ġposition Ġon ĠRecyclerView ĊĠĠĠĠĠĠĠ ĠviewModel . last Sc rolled Position . observe Event ( this ) Ġ{ Ġscroll To Position : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠScroll Ġto Ġtop Ġafter Ġ 1 0 ms Ġin Ġorder Ġto Ġallow Ġthe ĠRecyclerView Ġto Ġload Ġthe Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv _ main . smooth V Scroll To Position With View Top ( scrollTo Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCallback ĠMethod Ġof Ġ[ News Adapter . Listener ] Ġinvoked Ġwhen Ġthe Ġuser Ġclicks Ġon Ġthe ĠAdapter ĠItem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġitem Data ĠData Ġof Ġthe ĠAdapter ĠItem . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Item Click ( item Data : ĠNews Article ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . on Item Click ( item Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġno Ġlonger Ġvisible Ġto Ġthe Ġuser . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDelegate Ġto Ġthe ĠViewModel Ġto Ġsave Ġand Ġrestore Ġthe Ġsc rolled Ġposition Ġlater , ĊĠĠĠĠĠĠĠ Ġ// Ġonly Ġif Ġthe Ġposition Ġis Ġvalid ĊĠĠĠĠĠĠĠ Ġrv _ main . getFirst Visible Item Position (). take If Ġ{ Ġit Ġ> ĠRecyclerView . NO _ POSITION Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . save Last Sc rolled Position ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }