package Ġeu . rick v ans ch ijn del . sol arg raph . activities Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . net . Network Info Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . preference . Preference Manager Ċ import Ġandroid . support . design . widget . Snackbar Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġcom . github . mike phil . chart ing . data . Entry Ċ import Ġcom . github . mike phil . chart ing . data . Line Data Ċ import Ġcom . github . mike phil . chart ing . data . Line DataSet Ċ import Ġcom . github . mike phil . chart ing . highlight . Highlight Ċ import Ġcom . github . mike phil . chart ing . listener . On Chart Value Selected Listener Ċ import Ġeu . rick v ans ch ijn del . sol arg raph . R Ċ import Ġeu . rick v ans ch ijn del . sol arg raph . Response Code Ċ import Ġeu . rick v ans ch ijn del . sol arg raph . models . Production Response Ċ import Ġeu . rick v ans ch ijn del . sol arg raph . rest . Api Impl Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . Single Observer Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġretrofit 2 . Response Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util . Locale Ċ import Ġjava . util . Date Ċ import Ġkotlinx . android . synt hetic . main . activity _ graph . network _ info Ċ import Ġkotlinx . android . synt hetic . main . activity _ graph . today _ power Ċ import Ġkotlinx . android . synt hetic . main . activity _ graph . monthly _ power Ċ import Ġkotlinx . android . synt hetic . main . activity _ graph . total _ power Ċ import Ġkotlinx . android . synt hetic . main . activity _ graph . graph Ċ import Ġkotlinx . android . synt hetic . main . activity _ graph . graph _ sn ack _ layout Ċ Ċ class ĠGraph Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġapi Impl : ĠApi Impl ? Ġ= Ġnull ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Graph Activity " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= Ġmenu Inflater ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . graph _ menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item ?. itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . logout _ button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Username And Password () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestart Application () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ graph ) ĊĊĠĠĠĠĠĠĠ Ġsetup Graph () ĊĊĠĠĠĠĠĠĠ Ġval Ġnetwork Info Ġ= Ġget Active Network Info () ĊĠĠĠĠĠĠĠ Ġif Ġ( network Info ?. isConnected Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Username And Password () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretrieve Data () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork _ info . setText ( R . string . no _ connection ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Username And Password () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġusername Ġ= ĠPreference Manager . getDefault SharedPreferences ( application Context ). getString ( Login Activity . USERNAME _ PREFER ENCE _ NAME , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= ĠPreference Manager . getDefault SharedPreferences ( application Context ). getString ( Login Activity . PASSWORD _ PREFER ENCE _ NAME , Ġ"") ĊĠĠĠĠĠĠĠ Ġapi Impl Ġ= ĠApi Impl ( username , Ġpassword ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Username And Password () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= ĠPreference Manager . getDefault SharedPreferences ( application Context ). edit () ĊĠĠĠĠĠĠĠ Ġeditor . remove ( Login Activity . USERNAME _ PREFER ENCE _ NAME ) ĊĠĠĠĠĠĠĠ Ġeditor . remove ( Login Activity . PASSWORD _ PREFER ENCE _ NAME ) ĊĠĠĠĠĠĠĠ Ġeditor . apply () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrestart Application () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartActivity Ġ= ĠIntent ( application Context , ĠRedirect Activity :: class . java ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( startActivity ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Production Data (): ĠSingle < Response < Production Response >> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( api Impl Ġ== Ġnull Ġ|| Ġapi Impl ?. client Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġapi Impl ?. client ?. get Available Sites ()?. flatMap ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ flatMap Ġapi Impl ?. client ?. get Production Data ( it . body () !!. to Typed Array ()[ 0 ]. public _ key ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretrieve Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork _ info . setText ( R . string . retrie ving _ data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget Production Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . subscribe ( object Ġ: ĠSingle Observer < Response < Production Response >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( response : ĠResponse < Production Response >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response . code ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse Code . OK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġresponse . body () !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Data Retrie ved ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse Code . UN AUTHORIZ ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Username And Password () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestart Application () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork _ info . text Ġ= Ġresponse . message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Subscribe ( d : ĠDis posable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġe . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork _ info . text Ġ= Ġe . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Data Retrie ved ( response Data : ĠProduction Response ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġk pis Ġ= Ġresponse Data . stats . kp is ĊĠĠĠĠĠĠĠ Ġval Ġoutput Today Ġ= Ġk pis . output _ today ĊĠĠĠĠĠĠĠ Ġval Ġoutput Month Ġ= Ġk pis . output _ month ĊĠĠĠĠĠĠĠ Ġval Ġoutput Total Ġ= Ġk pis . output _ to _ date ĊĠĠĠĠĠĠĠ Ġtoday _ power . text Ġ= ĠgetString ( R . string . today _ power , Ġoutput Today ) ĊĠĠĠĠĠĠĠ Ġmonthly _ power . text Ġ= ĠgetString ( R . string . month _ power , Ġoutput Month ) ĊĠĠĠĠĠĠĠ Ġtotal _ power . text Ġ= ĠgetString ( R . string . total _ power , Ġoutput Total ) ĊĊĠĠĠĠĠĠĠ Ġval Ġreal Time Power Map Ġ= Ġresponse Data . stats . graphs . realtime _ power ĊĠĠĠĠĠĠĠ Ġval Ġdate Formatter Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm : ss ", ĠLocale . US ) ĊĠĠĠĠĠĠĠ Ġvar Ġdata Points Ġ= ĠarrayOf < Entry >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġreal Time Power Map . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpower Ġ= Ġreal Time Power Map [ key ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġdate Formatter . parse ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġlose Ġsome Ġprecision Ġby Ġconverting Ġto Ġfloat Ġunfortunately ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġvisible Ġas Ġrounding Ġerrors Ġin Ġthe Ġ 1 5 Ġminutes Ġbetween Ġdata Ġpoints Ġ( e . g . Ġ 1 4 : 1 4 Ġinstead Ġof Ġ 1 4 : 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Points Ġ+= ĠEntry ( date . time . toFloat (), Ġpower . toFloat ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsorted Data Points Ġ= Ġdata Points . sorted With ( compare By ({ Ġit . x Ġ})) ĊĊĠĠĠĠĠĠĠ Ġval Ġseries Ġ= ĠLine DataSet ( sorted Data Points , Ġ" Power ") ĊĠĠĠĠĠĠĠ Ġseries . color Ġ= ĠColor . GREEN ĊĠĠĠĠĠĠĠ Ġseries . lineWidth Ġ= Ġ 5 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠLine Data ( series ) ĊĠĠĠĠĠĠĠ Ġdata . set Draw Values ( false ) ĊĠĠĠĠĠĠĠ Ġgraph . data Ġ= Ġdata ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Power Ġ= Ġsorted Data Points . first OrNull Ġ{ Ġit . y Ġ> Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlast Power Ġ= Ġsorted Data Points . last OrNull Ġ{ Ġit . y Ġ> Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( first Power Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . xAxis . axis Minimum Ġ= Ġfirst Power . x ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( last Power Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph . xAxis . axis Maximum Ġ= Ġlast Power . x ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnetwork _ info . setText ( R . string . got _ data ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġredraw ĊĠĠĠĠĠĠĠ Ġgraph . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Active Network Info (): ĠNetwork Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnectivity Manager Ġ= Ġget System Service ( Context . CONNECT IVITY _ SERVICE ) Ġas ĠConnect ivity Manager ĊĠĠĠĠĠĠĠ Ġreturn Ġconnectivity Manager . active Network Info ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Graph () Ġ{ ĊĠĠĠĠĠĠĠ Ġgraph . set No Data Text (" Waiting Ġfor Ġdata ...") ĊĠĠĠĠĠĠĠ Ġgraph . legend . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ// Ġwould Ġbe Ġcool Ġif Ġthis Ġformatter Ġcould Ġround Ġto Ġ 1 5 Ġmins , Ġas Ġthe Ġdata Ġis Ġlike Ġthat ĊĠĠĠĠĠĠĠ Ġ// Ġalready Ġand Ġwe Ġlose Ġsome Ġprecision Ġby Ġusing Ġfloats Ġas Ġdata Ġtype Ġ( MP Android Chart Ġrequires Ġthis ) ĊĠĠĠĠĠĠĠ Ġval Ġtime Formatter Ġ= ĠSimpleDateFormat (" HH : mm ", ĠLocale . US ) ĊĠĠĠĠĠĠĠ Ġgraph . setOn Chart Value Selected Listener ( object Ġ: ĠOn Chart Value Selected Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Nothing Selected () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Value Selected ( e : ĠEntry ?, Ġh : ĠHighlight ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( graph _ sn ack _ layout , Ġ" Power : Ġ${ e ?. y } W Ġat Ġ${ time Formatter . format ( e ?. x )} ", ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġgraph . is Scale X Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġgraph . is Scale Y Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġgraph . description . isEnabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġgraph . xAxis . setValue Formatter Ġ{ Ġvalue , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġround Ġto Ġnearest Ġ 1 5 Ġminutes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġmight Ġnot Ġwork Ġcorrectly Ġwhen Ġthe Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġmore Ġprecision Ġ( more Ġoften Ġthan Ġevery Ġ 1 5 Ġminutes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbut Ġit Ġdoes Ġwork Ġfor Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit 'll Ġprobably Ġfail Ġin Ġthe Ġhigher Ġvalues Ġwhen Ġthat Ġday Ġcomes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrounded Date Ġ= ĠDate ( value . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrounded Date . minutes Ġ= Ġ( rounded Date . minutes Ġ+ Ġ 8 ) Ġ/ Ġ 1 5 Ġ* Ġ 1 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrounded Date . seconds Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Formatter . format ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ