package Ġcom . coin ninja . coin keeper . ui . market Ċ Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . recyclerview . widget . Divider Item Decoration Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . swiper ef resh layout . widget . Swipe Refresh Layout Ċ import Ġapp . drop bit . commons . currency . US DC urrency Ċ import Ġapp . drop bit . commons . currency . as Formatted Us d Currency String Ċ import Ġapp . drop bit . commons . util . decimal Formatted Ċ import Ġcom . coin ninja . coin keeper . R Ċ import Ġcom . coin ninja . coin keeper . service . client . model . H istorical Price Record Ċ import Ġcom . coin ninja . coin keeper . service . client . model . News Article Ċ import Ġcom . coin ninja . coin keeper . ui . base . Base Activity Ċ import Ġcom . coin ninja . coin keeper . ui . news . News Adapter Ċ import Ġcom . coin ninja . coin keeper . ui . news . News ViewModel Ċ import Ġcom . coin ninja . coin keeper . viewModel . Market Data ViewModel Ċ import Ġcom . github . mike phil . chart ing . charts . Line Chart Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . Round ingMode Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠMarket Screen Activity Ġ: ĠBase Activity () Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġmarket Chart Controller : ĠMarket Chart Controller ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġmarket Data ViewModel : ĠMarket Data ViewModel ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġmarket Chart Button Bar Controller : ĠMarket Chart Button Bar Controller ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġnews Adapter : ĠNews Adapter ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġnews ViewModel : ĠNews ViewModel ĊĊĠĠĠ Ġinternal Ġvar Ġcurrent Gran ularity : ĠGr an ularity Ġ= ĠGr an ularity . DAY ĊĊĠĠĠ Ġinternal Ġval Ġcurrent Gran ularity Observer Ġ= ĠObserver < Gran ularity > Ġ{ Ġgranularity Ġ-> ĊĠĠĠĠĠĠĠ Ġcurrent Gran ularity Ġ= Ġgranularity ĊĠĠĠĠĠĠĠ Ġmarket Chart Button Bar Controller . on Gran ularity Changed ( current Gran ularity , Ġgranularity Bar ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar ĠisLoading : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġvar ĠpageSize : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġval Ġarticle Change Observer Ġ= ĠObserver < List < News Article >> Ġ{ Ġloaded Articles Ġ-> ĊĠĠĠĠĠĠĠ ĠfindViewById < Swipe Refresh Layout >( R . id . pull _ to _ refresh )?. apply Ġ{ Ġis Refresh ing Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġnews Adapter . add Articles ( loaded Articles ) ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġnews Adapter . item Count ĊĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġon Scroll Changed Observer Ġ= Ġobject Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < RecyclerView >( R . id . news )?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . layout Manager ?. let Ġ{ Ġlayout Manager Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlinear LayoutManager Ġ= Ġlayout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisible ItemCount Ġ= Ġlinear LayoutManager . child Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal ItemCount Ġ= Ġlinear LayoutManager . item Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Visible Item Position Ġ= Ġlinear LayoutManager . findFirst Visible Item Position () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isLoading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( visible ItemCount Ġ+ Ġfirst Visible Item Position ) Ġ>= Ġtotal ItemCount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġfirst Visible Item Position Ġ>= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġtotal ItemCount Ġ>= ĠpageSize Ġ- Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload News Articles () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval Ġbtc Price Observer Ġ= ĠObserver < US DC urrency > Ġ{ Ġprice Ġ-> ĊĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . price )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġprice . to Formatted Currency () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval Ġperiod Data Observer Ġ= ĠObserver < List < H istorical Price Record >> Ġ{ Ġprices Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġchart Stats Ġ= Ġmarket Chart Controller . render Period Data ( line Chart , Ġmarket Chart Controller . getData For Gran ularity ( current Gran ularity , Ġprices . reversed ())) ĊĠĠĠĠĠĠĠ Ġupdate Price Movement ( chart Stats ) ĊĠĠĠĠĠĠĠ Ġupdate MinMax ( chart Stats ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinternal Ġval Ġgranularity Bar : ĠViewGroup ? Ġget () Ġ= ĠfindViewById ( R . id . market _ gran ularity ) ĊĠĠĠ Ġinternal Ġval Ġline Chart : ĠLine Chart ? Ġget () Ġ= ĠfindViewById ( R . id . chart ) ĊĠĠĠ Ġinternal Ġval Ġmarket Sent iment : ĠTextView ? Ġget () Ġ= ĠfindViewById ( R . id . market _ sentiment ) ĊĠĠĠ Ġinternal Ġval Ġmarket High : ĠTextView ? Ġget () Ġ= ĠfindViewById ( R . id . market _ high ) ĊĠĠĠ Ġinternal Ġval Ġmarket Low : ĠTextView ? Ġget () Ġ= ĠfindViewById ( R . id . market _ low ) ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ market ) ĊĠĠĠĠĠĠĠ Ġmarket Chart Controller . configure Chart ( line Chart ) ĊĠĠĠĠĠĠĠ Ġset Layout Description ( R . xml . motion _ scene _ charts ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġmarket Chart Button Bar Controller . setup Button Bar ( current Gran ularity , Ġgranularity Bar , Ġmarket Data ViewModel ) ĊĠĠĠĠĠĠĠ Ġmarket Data ViewModel . current Gran ularity . observe ( this , Ġcurrent Gran ularity Observer ) ĊĠĠĠĠĠĠĠ Ġmarket Data ViewModel . current Btc Price . observe ( this , Ġbtc Price Observer ) ĊĠĠĠĠĠĠĠ Ġmarket Data ViewModel . period Data . observe ( this , Ġperiod Data Observer ) ĊĠĠĠĠĠĠĠ Ġmarket Data ViewModel . load Gran ularity ( current Gran ularity ) ĊĠĠĠĠĠĠĠ Ġmarket Data ViewModel . load Current Price () ĊĠĠĠĠĠĠĠ Ġsetup News List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restore InstanceState ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsavedInstanceState ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Gran ularity Ġ= ĠGr an ularity . from ( savedInstanceState . getInt (" GRAN ULAR ITY ", Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġout State . put Int (" GRAN ULAR ITY ", Ġcurrent Gran ularity . ord ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġload News Articles () Ġ{ ĊĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġnews ViewModel . fetch News ( news Adapter . item Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Refresh News () Ġ{ ĊĠĠĠĠĠĠĠ Ġnews Adapter . clear Articles () ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġload News Articles () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup News List () Ġ{ ĊĠĠĠĠĠĠĠ ĠfindViewById < RecyclerView >( R . id . news )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . layout Manager Ġ= Ġlayout Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Decoration ( Divider Item Decoration ( context , Ġlayout Manager . orientation )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Has Fixed Size ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġnews Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Scroll Listener ( on Scroll Changed Observer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠfindViewById < Swipe Refresh Layout >( R . id . pull _ to _ refresh )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Refresh Listener Ġ{ Ġon Refresh News () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnews Adapter . clear Articles () ĊĠĠĠĠĠĠĠ Ġnews ViewModel . articles . observe ( this , Ġarticle Change Observer ) ĊĠĠĠĠĠĠĠ Ġload News Articles () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġupdate MinMax ( chart Stats : ĠChart Stats ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmarket Low ?. text Ġ= Ġchart Stats . low . as Formatted Us d Currency String () ĊĠĠĠĠĠĠĠ Ġmarket High ?. text Ġ= Ġchart Stats . high . as Formatted Us d Currency String () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġupdate Price Movement ( chart Stats : ĠChart Stats ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġappearance : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġleader : ĠString ĊĊĠĠĠĠĠĠĠ Ġif Ġ( chart Stats . percentage Difference Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappearance Ġ= ĠR . style . TextAppearance _ Chart _ Sent iment _ Down ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleader Ġ= Ġ"-" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappearance Ġ= ĠR . style . TextAppearance _ Chart _ Sent iment _ Up ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleader Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprice Diff Ġ= Ġif Ġ( chart Stats . price Difference Ġ> Ġ 0 ) Ġchart Stats . price Difference Ġelse Ġchart Stats . price Difference Ġ* Ġ- 1 ĊĠĠĠĠĠĠĠ Ġval Ġpercent Diff Ġ= Ġif Ġ( chart Stats . percentage Difference Ġ> Ġ 0 ) Ġchart Stats . percentage Difference Ġelse Ġchart Stats . percentage Difference Ġ* Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġmarket Sent iment ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġcontext . getString ( R . string . market _ movement _ up , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleader , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUSD Currency ( price Diff . toDouble ()). to Formatted Currency (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal ( percent Diff . toDouble ()). set Scale ( 2 , ĠRound ingMode . HALF _ E VEN ). toDouble (). decimal Formatted (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . percentage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset TextAppearance ( appearance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset TextAppearance ( context , Ġappearance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ