package Ġcom . pr 0 gram m . app . ui Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . core . view . isVisible Ċ import Ġcom . pr 0 gram m . app . R Ċ import Ġcom . pr 0 gram m . app . feed . ContentType Ċ import Ġcom . pr 0 gram m . app . milliseconds Ċ import Ġcom . pr 0 gram m . app . orm . Ben is Record Ċ import Ġcom . pr 0 gram m . app . orm . Cached Vote Ċ import Ġcom . pr 0 gram m . app . services .* Ċ import Ġcom . pr 0 gram m . app . ui . base . Base AppCompatActivity Ċ import Ġcom . pr 0 gram m . app . ui . base . launch When Created Ċ import Ġcom . pr 0 gram m . app . ui . base . launch When Started Ċ import Ġcom . pr 0 gram m . app . ui . views . Circle Chart View Ċ import Ġcom . pr 0 gram m . app . ui . views . Time Range Selector View Ċ import Ġcom . pr 0 gram m . app . ui . views . format Score Ċ import Ġcom . pr 0 gram m . app . util . di . instance Ċ import Ġcom . pr 0 gram m . app . util . dp Ċ import Ġcom . pr 0 gram m . app . util . find Ċ import Ġcom . pr 0 gram m . app . util . getColor Compat Ċ import Ġcom . pr 0 gram m . app . util . observe Change Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . with Timeout Ċ import Ġk ot ter knife . bind View Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . Experimental Time Ċ Ċ @ Opt In ( Experimental Time :: class ) Ċ class ĠStatistics Activity Ġ: ĠBase AppCompatActivity (" Statistics Activity ") Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠuserService : ĠUserService Ġby Ġinstance () ĊĠĠĠ Ġprivate Ġval Ġvote Service : ĠV ote Service Ġby Ġinstance () ĊĠĠĠ Ġprivate Ġval Ġstats Service : ĠStatistics Service Ġby Ġinstance () ĊĊĠĠĠ Ġprivate Ġval Ġben is Graph : ĠView Ġby Ġbind View ( R . id . ben is _ graph ) ĊĠĠĠ Ġprivate Ġval Ġben is Graph Loading : ĠView Ġby Ġbind View ( R . id . ben is _ graph _ loading ) ĊĠĠĠ Ġprivate Ġval Ġben is Graph Empty : ĠView Ġby Ġbind View ( R . id . ben is _ graph _ empty ) ĊĠĠĠ Ġprivate Ġval Ġben is Graph Time Selector : ĠTime Range Selector View Ġby Ġbind View ( R . id . graph _ time _ selector ) ĊĊĠĠĠ Ġprivate Ġval Ġben is Change Day : ĠTextView Ġby Ġbind View ( R . id . stats _ change _ day ) ĊĠĠĠ Ġprivate Ġval Ġben is Change Week : ĠTextView Ġby Ġbind View ( R . id . stats _ change _ week ) ĊĠĠĠ Ġprivate Ġval Ġben is Change Month : ĠTextView Ġby Ġbind View ( R . id . stats _ change _ month ) ĊĊĠĠĠ Ġprivate Ġval Ġvote Count Up : ĠTextView Ġby Ġbind View ( R . id . stats _ up ) ĊĠĠĠ Ġprivate Ġval Ġvote Count Down : ĠTextView Ġby Ġbind View ( R . id . stats _ down ) ĊĊĠĠĠ Ġprivate Ġval Ġvotes By Tags : ĠCircle Chart View Ġby Ġbind View ( R . id . votes _ by _ tags ) ĊĠĠĠ Ġprivate Ġval Ġvotes By Items : ĠCircle Chart View Ġby Ġbind View ( R . id . votes _ by _ items ) ĊĠĠĠ Ġprivate Ġval Ġvotes By Comments : ĠCircle Chart View Ġby Ġbind View ( R . id . votes _ by _ comments ) ĊĊĠĠĠ Ġprivate Ġval Ġtypes Of Upload : ĠCircle Chart View Ġby Ġbind View ( R . id . types _ uploads ) ĊĠĠĠ Ġprivate Ġval Ġtypes By F avorites : ĠCircle Chart View Ġby Ġbind View ( R . id . types _ favorites ) ĊĊĠĠĠ Ġprivate Ġvar Ġben is Values : ĠList < Ben is Record > Ġby Ġobserve Change ( listOf ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġredraw Ben is Graph () ĊĠĠĠĠĠĠĠ Ġupdate Time Range () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġben is Time Range Start : ĠLong Ġby Ġobserve Change ( 0 L ) Ġ{ Ġredraw Ben is Graph () Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Theme ( Theme Helper . theme . no ActionBar ) ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ statistics ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġsetup Ġtoolbar Ġas Ġaction bar ĊĠĠĠĠĠĠĠ Ġval Ġtb Ġ= Ġfind < Toolbar >( R . id . toolbar ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( tb ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġand Ġshow Ġback Ġbutton ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Display Show Home Enabled ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlaunch When Started Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġben is Graph Time Selector . selected Time Range . collect Ġ{ Ġmillis Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġben is Time Range Start Ġ= ĠSystem . currentTimeMillis () Ġ- Ġmillis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlaunch When Created ( ignore Errors Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Vote Counts ( vote Service . summary ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlaunch When Created ( ignore Errors Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdelay Ġquerying Ġthe Ġdata Ġfor Ġa Ġmoment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcom . pr 0 gram m . app . util . delay ( 2 0 0 . milliseconds ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġget Ġthe Ġvalues Ġnow . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġben is Values Ġ= ĠuserService . load Ben is Records (). records ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠuserService . name ?. let Ġ{ Ġusername Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch When Created Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Content Types ( types Of Upload , Ġusername ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġshow Content Types ( view : ĠCircle Chart View , Ġusername : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Timeout ( Duration . minutes ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstats Service . stats For Upload s ( username ). collect Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Content Types ( view , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Content Types ( view : ĠCircle Chart View , Ġstats : ĠStatistics Service . Stats ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcounts Ġ= Ġstats . counts ĊĠĠĠĠĠĠĠ Ġval Ġs fw Ġ= Ġcounts [ ContentType . S FW ] Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġn sf w Ġ= Ġ( counts [ ContentType . NS FW ] Ġ?: Ġ 0 ) Ġ+ Ġ( counts [ ContentType . NS FP ] Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġns fl Ġ= Ġcounts [ ContentType . NS FL ] Ġ?: Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCircle Chart View . Value ( sf w , Ġget Color Compat ( R . color . type _ sf w )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCircle Chart View . Value ( ns fw , Ġget Color Compat ( R . color . type _ ns fw )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCircle Chart View . Value ( ns fl , Ġget Color Compat ( R . color . type _ ns fl ))) ĊĊĊĠĠĠĠĠĠĠ Ġview . chart Values Ġ= Ġvalues ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠ Ġprivate Ġfun Ġhandle Vote Counts ( votes : ĠMap < Cached Vote . Type , ĠV ote Service . Summary >) Ġ{ ĊĠĠĠĠĠĠĠ Ġvote Count Up . text Ġ= Ġ" UP Ġ" Ġ+ Ġvotes . values . sum Of Ġ{ Ġit . up Ġ} ĊĠĠĠĠĠĠĠ Ġvote Count Down . text Ġ= Ġ" DOWN Ġ" Ġ+ Ġvotes . values . sum Of Ġ{ Ġit . down Ġ} ĊĊĠĠĠĠĠĠĠ Ġvotes By Tags . chart Values Ġ= Ġto Chart Values ( votes [ Cached Vote . Type . TAG ]) ĊĠĠĠĠĠĠĠ Ġvotes By Items . chart Values Ġ= Ġto Chart Values ( votes [ Cached Vote . Type . ITEM ]) ĊĠĠĠĠĠĠĠ Ġvotes By Comments . chart Values Ġ= Ġto Chart Values ( votes [ Cached Vote . Type . COMMENT ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Chart Values ( summary : ĠV ote Service . Summary ?): ĠList < Circle Chart View . Value > Ġ{ ĊĠĠĠĠĠĠĠ Ġsummary Ġ?: Ġreturn ĠlistOf () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCircle Chart View . Value ( summary . up , Ġget Color Compat ( R . color . stats _ up )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCircle Chart View . Value (- summary . down , Ġget Color Compat ( R . color . stats _ down ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Time Range () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ben is Values . size Ġ> Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġben is Values . min Of Ġ{ Ġv Ġ-> Ġv . time Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġben is Values . max Of Ġ{ Ġv Ġ-> Ġv . time Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġben is Graph Time Selector . max Range In Millis Ġ= Ġ( max Ġ- Ġmin ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġredraw Ben is Graph () Ġ{ ĊĠĠĠĠĠĠĠ Ġben is Graph Loading . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġben is Graph Time Selector . isVisible Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġvar Ġactual Values Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġrecords Ġ= Ġoptimize Values By ( ben is Values ) Ġ{ Ġit . ben is . toDouble () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġshow Ġif Ġnot Ġenough Ġdata Ġavailable ĊĠĠĠĠĠĠĠ Ġif Ġ( records . size Ġ< Ġ 2 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecords . all Ġ{ Ġit . ben is Ġ== Ġrecords [ 0 ]. ben is Ġ} Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis () Ġ- Ġrecords [ 0 ]. time Ġ< Ġ 6 0 Ġ* Ġ 1 0 0 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġben is Graph Empty . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġben is Graph Time Selector . isVisible Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecords Ġ= Ġrandom Ben is Graph () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Values Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġconvert Ġto Ġgraph ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= ĠGraph ( records . map Ġ{ ĠGraph . Point ( it . time . toDouble (), Ġit . ben is . toDouble ()) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Ġsub - sample Ġto Ġonly Ġa Ġfew Ġpoints . ĊĠĠĠĠĠĠĠ Ġval Ġstart Value Ġ= Ġben is Time Range Start . toDouble (). coerce At Least ( original . first . x ) ĊĠĠĠĠĠĠĠ Ġval Ġsampled Ġ= Ġoriginal . sample E quid istant ( steps Ġ= Ġ 1 6 , Ġstart Ġ= Ġstart Value ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġbuild Ġthe Ġvisual ĊĠĠĠĠĠĠĠ Ġval Ġdr Ġ= ĠGraph Drawable ( sampled ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Color Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfill Color Ġ= Ġ 0 xa 0 ffffff L . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth Ġ= Ġdp ( 4 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighlight Fill Color Ġ= Ġget Color Compat ( Theme Helper . primary Color Dark ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġhighlight Ġfor Ġthe Ġa Ġleft - ish Ġand Ġa Ġright - ish Ġpoint . ĊĠĠĠĠĠĠĠ Ġdr . highlight s . add ( Graph Drawable . Highlight ( 2 , Ġformat Score ( sampled [ 2 ]. y . toInt ()))) ĊĠĠĠĠĠĠĠ Ġdr . highlight s . add ( Graph Drawable . Highlight ( 1 3 , Ġformat Score ( sampled [ 1 3 ]. y . toInt ()))) ĊĊĠĠĠĠĠĠĠ Ġ// Ġand Ġshow Ġthe Ġgraph ĊĠĠĠĠĠĠĠ ĠView Compat . setBackground ( ben is Graph , Ġdr ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( actual Values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcalculate Ġthe Ġrecent Ġchanges Ġof Ġben is ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformat Change ( original , Ġ 1 , Ġben is Change Day ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformat Change ( original , Ġ 7 , Ġben is Change Week ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformat Change ( original , Ġ 3 0 , Ġben is Change Month ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrandom Ben is Graph (): ĠList < Ben is Record > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġ( Math . random () Ġ* Ġ 1 0 0 0 0 ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġtime Scale Ġ= ĠTimeUnit . DAYS . to Millis ( 3 L ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠlistOf ( 0 , Ġ 1 0 0 , Ġ 7 5 , Ġ 1 5 0 , Ġ 9 0 , Ġ 6 0 , Ġ 1 3 0 , Ġ 1 6 0 , Ġ 9 0 , Ġ 7 0 , Ġ 6 0 , Ġ 1 3 0 , Ġ 1 7 0 , Ġ 2 1 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġvalues . map Indexed Ġ{ Ġindex , Ġvalue Ġ-> ĠBen is Record ( time Scale Ġ* Ġindex . to Long (), Ġoffset Ġ+ Ġ 1 0 Ġ* Ġvalue ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Change ( graph : ĠGraph , Ġdays : ĠLong , Ġview : ĠTextView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmillis Ġ= ĠTimeUnit . DAYS . to Millis ( days ). toDouble () ĊĊĠĠĠĠĠĠĠ Ġval Ġnow Value Ġ= Ġgraph . last . y ĊĠĠĠĠĠĠĠ Ġval Ġbase Value Ġ= Ġgraph . value At ( graph . last . x Ġ- Ġmillis ) ĊĊĠĠĠĠĠĠĠ Ġval Ġabs Change Ġ= Ġnow Value Ġ- Ġbase Value ĊĊĠĠĠĠĠĠĠ Ġview . text Ġ= Ġformat Score ( abs Change . toInt ()) ĊĠĠĠĠĠĠĠ Ġview . setTextColor ( getColor Compat ( if Ġ( abs Change Ġ< Ġ 0 ) ĠR . color . stats _ down Ġelse ĠR . color . stats _ up )) ĊĠĠĠ Ġ} Ċ } Ċ