package Ġcom . mu zz ley . app Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroidx . core . util . Pair Ċ import Ġandroidx . swiper ef resh layout . widget . Swipe Refresh Layout Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroid . view . MenuItem Ċ import Ġcom . mu zz ley . App Ċ import Ġcom . mu zz ley . Constants Ċ import Ġcom . mu zz ley . Navigator Ċ import Ġcom . mu zz ley . R Ċ import Ġcom . mu zz ley . app . cards . Container Adapter Ċ import Ġcom . mu zz ley . app . profiles .* Ċ import Ġcom . mu zz ley . model . discovery . Action Ċ import Ġcom . mu zz ley . model . discovery . Network Info Ċ import Ġcom . mu zz ley . model . discovery . Param Ċ import Ġcom . mu zz ley . model . profiles .* Ċ import Ġcom . mu zz ley . services . Preferences Repository Ċ import Ġcom . mu zz ley . util .* Ċ import Ġcom . mu zz ley . util . rx . Rx Comp os ers Ċ import Ġcom . mu zz ley . util . ui . hide Ċ import Ġcom . mu zz ley . util . ui . show Ċ import Ġio . reactivex . Observable Ċ import Ġkotlinx . android . synt hetic . main . activity _ profiles .* Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠPro files Activity Ġ: ĠAppCompatActivity (), ĠSw ipe Refresh Layout . On Refresh Listener , ĠPro files I View { ĊĠĠĠĠĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLOCAL _ DIS COVERY _ PREFIX Ġ= Ġ" mu z discovery "; ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠHTTP _ PREFIX Ġ= Ġ" http " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠURL _ REQUEST Ġ= Ġ" url Request " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠWITH _ FO OTER Ġ= Ġ" footer " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ LOCATION Ġ= Ġ" extra - location " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ PROFILE _ NAME Ġ= Ġ" extra - profile - name " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ PROFILE _ ID Ġ= Ġ" profile _ id "; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠView State Ġ{ ĠLO ADING , ĠBL ANK , ĠDATA , ĠERROR Ġ} Ċ // ĠĠĠ Ġenum Ġclass ĠActive Ġ{ ĠPRO FILES , ĠB UND LES , ĠSERVICES Ġ} ĊĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġnavigator : ĠNavigator ĠĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġprofiles Presenter : ĠPro files Presenter ĠĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġbundle Flow : ĠBundle Flow ĠĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġrecipe Navigator : ĠRecipe Navigator ĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġpreferences Repository : ĠPreferences Repository ĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġrecipe Interactor : ĠRecipe Interactor Ċ Ċ // ĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġmodels Store : ĠModels Store ĊĊĠĠĠ Ġvar Ġbundles And Profiles : ĠPair < Bund les , ĠPro files Data >? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġprofile : ĠProfile ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġspan Count : ĠInt Ġ= Ġ 0 ĠĊĠĠĠ Ġvar Ġgrid LayoutManager : ĠGrid LayoutManager ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġadapter : ĠContainer Adapter < *> ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġactive Ġ= ĠConstants . Active . PRO FILES ĊĊĠĠĠ Ġprivate Ġvar Ġdoing Stuff Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġrun Refresh Ġ= Ġtrue ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun ĠonCreate ( savedInstanceState : Ġandroid . os . Bundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ); ĊĠĠĠĠĠĠĠ ĠApp . app Component . inject ( this ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ profiles ) ĊĠĠĠĠĠĠĠ Ġconfig ActionBar () ĊĊĠĠĠĠĠĠĠ Ġswipe Refresh . setOn Refresh Listener ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġview Width Ġ= ĠScreen Inspector . get Screen Width ( this ); ĊĠĠĠĠĠĠĠ Ġval Ġcard View Width Ġ= Ġget Resources (). get Dimension ( R . dim en . tile _ min _ width ); ĊĠĠĠĠĠĠĠ Ġval Ġspan Count Ġ= ĠMath . max ( 2 , ĠMath . floor (( view Width Ġ/ Ġcard View Width ). toDouble ()). toInt ()) ĠĊĊĠĠĠĠĠĠĠ Ġgrid LayoutManager Ġ= ĠGrid LayoutManager ( this , Ġspan Count ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cycle Children On Detach Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠLinearLayoutManager . VERTICAL ; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġre cyclerView . apply Ġ{ ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= Ġgrid LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// todo : Ġmove Ġthis Ġto Ġon Resume Ċ // ĠĠĠĠĠĠĠ Ġprofiles Presenter . attach View ( this ) ĊĊĠĠĠĠĠĠĠ Ġon Refresh () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġprofiles Presenter . det t ach View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow State ( state : ĠView State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview Flip per . display ed Child Ġ= Ġstate . ordinal ; ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġconfig ActionBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġget Support ActionBar ()?. apply { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Display Home As Up Enabled ( true ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Home Button Enabled ( true ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġupdate Control () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsegments Ġ= Ġmutable ListOf ( Constants . Active . PRO FILES Ġto ĠgetString ( R . string . mobile _ devices )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( bundles And Profiles ?. first ?. bundles . isNotNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegments . add ( Constants . Active . B UND LES Ġto ĠgetString ( R . string . mobile _ bundles )) ĊĠĠĠĠĠĠĠ Ġif Ġ( bundles And Profiles ?. first ?. services . isNotNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegments . add ( Constants . Active . SERVICES Ġto ĠgetString ( R . string . mobile _ services )) ĊĠĠĠĠĠĠĠ Ġif Ġ( segments . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment ed Group . hide () ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment ed Group . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment ed Group . set Container Data ( segments . map Ġ{ Ġit . second Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent . has Extra ( Constants . DEFAULT _ SEGMENT )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Ġ= Ġintent . get Serializable Extra ( Constants . DEFAULT _ SEGMENT ) Ġas ĠConstants . Active ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . remove Extra ( Constants . DEFAULT _ SEGMENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġsegments . indexOf First Ġ{ Ġit . first Ġ== Ġactive Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegment ed Group . setSelected ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment ed Group . listen Selected (). subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Ġ= Ġsegments [ it ]. first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Ui () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Ui () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( active Ġ== ĠConstants . Active . SERVICES Ġ&& Ġbundles And Profiles ?. first ?. services . isNotNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠContainer Adapter < Bundle >( this , ĠR . layout . bundle ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetData ( bundles And Profiles !!. first !!. services ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow State ( ViewState . DATA ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( active Ġ== ĠConstants . Active . B UND LES Ġ&& Ġbundles And Profiles ?. first ?. bundles . isNotNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠContainer Adapter < Bundle >( this , ĠR . layout . bundle ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetData ( bundles And Profiles !!. first !!. bundles ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow State ( ViewState . DATA ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( active Ġ== ĠConstants . Active . PRO FILES Ġ&& Ġbundles And Profiles ?. second ?. profiles . isNotNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠContainer Adapter < Profile >( this , ĠR . layout . profile ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetData ( bundles And Profiles !!. second !!. profiles ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow State ( ViewState . DATA ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow State ( ViewState . BLANK ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride ĠĊĠĠĠ Ġfun Ġshow Data ( bundles Profiles Data Pair : ĠPair < Bund les , ĠPro files Data >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . bundles And Profiles Ġ= Ġbundles Profiles Data Pair ĊĠĠĠĠĠĠĠ Ġupdate Control () ĊĠĠĠĠĠĠĠ Ġupdate Ui () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠRESULT _ OK ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== Ġ 4 5 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( navigator . new Subscriptions Intent ( Intent . FLAG _ ACTIVITY _ CLEAR _ TOP ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( Profiles Activity . EXTRA _ PROFILE _ NAME , Ġprofile . name ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( Profiles Activity . EXTRA _ PROFILE _ ID , Ġprofile . id ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== Ġ 4 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle Flow . curr Bundle State Ġ= ĠBundle Flow . Bundle State . auth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" got Ġback Ġfrom ĠAuth Activity Ġand Ġis Ġauth ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBundle Navigator . navigate To ( this , bundle Flow . next Bundle State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġshow Bundle State ( state : ĠBundle Flow . Bundle State ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBundle Navigator . navigate To ( this , state ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ċ // ĠĠĠ Ġfun Ġexecute Recipe Action ( recipe State : ĠRecipe State ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġrecipe State . result ?. response ?. payload ?. let Ġ{ Ġpayload Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recipe State . action Ġ== ĠRecipe Action . oauth Ġ&& Ġpayload . url Request Ġ== Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa url Ġ= Ġpayload . authorization _ url Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a url Ġ!= Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofiles Presenter . get Recipe Authorization Url Request ( a url ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( Rx Comp os ers . apply Io Refresh ( this :: show Loading )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload . url Request Ġ= Ġit Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe Navigator . navigate To ( this , Ġrecipe State ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error ( it , false ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recipe State . action Ġ== Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error ( RuntimeException (" Unknown Ġaction ")) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe Navigator . navigate To ( this , Ġrecipe State ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ġ?: Ġshow Error ( RuntimeException (" Missing Ġpayload ")) Ċ // Ċ // ĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġexecute Recipe Action ( recipe State : ĠRecipe State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrecipe State . result ?. response ?. payload ?. let Ġ{ Ġpayload Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( recipe State . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġshow Error ( RuntimeException (" Unknown Ġaction ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecipe Action . oauth Ġ-> Ġiff Ġ( payload . url Request Ġ== Ġnull Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload . authorization _ url ?. let Ġ{ Ġa url Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofiles Presenter . get Recipe Authorization Url Request ( a url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( Rx Comp os ers . apply Io Refresh ( this :: show Loading )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload . url Request Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe Navigator . navigate To ( this , Ġrecipe State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error ( it , false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġshow Error ( RuntimeException (" Missing Ġauthorization _ url ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrecipe Navigator . navigate To ( this , Ġrecipe State ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecipe Action . udp Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( ĠAction ( null , Action . TYPE _ NETWORK _ INFO , ĠParam (). apply Ġ{ Ġp Interface Ġ= Ġ" wifi "; Ġ Ġis Broadcast Ġ= Ġtrue Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġrecipe Interactor . get ActionResult String ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork Info Ġ= Ġit . parse Json < Network Info >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠAction ( null , ĠAction . TYPE _ UDP , ĠParam (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Ġ= Ġnetwork Info !!. broadcast !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġpayload . port !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġttl Ġ= Ġpayload . ttl !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Expect Response Ġ= Ġpayload . expect _ response !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġpayload . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipe Interactor . get ActionResult String ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġresponses Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfib aro Packets Ġ= Ġresponses . filter { Ġit . contains (" com . fib aro .") } Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġfib aro Packets . map Ġ{ Ġto Map ( it ) Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" results : Ġ$ results ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( Rx Comp os ers . apply Io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" udp Ġresults : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( it ," Error Ġsending Ġudp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġrecipe Navigator . navigate To ( this , Ġrecipe State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġshow Error ( RuntimeException (" Missing Ġpayload ")) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . id . home Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofiles Presenter . cancel Activity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġprofiles Presenter . cancel Activity () ĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed (); ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġshow Loading ( show : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġswipe Refresh . post Ġ{ Ġswipe Refresh . is Refresh ing Ġ= Ġshow Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Error ( t : ĠThrowable ) Ġ= Ġshow Error ( t , false ) ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġshow Error ( t : ĠThrowable , Ġshow Error Page : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdoing Stuff Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġshow Loading ( false ) ĊĠĠĠĠĠĠĠ ĠTim ber . d ( t , Ġ" show Error ") ĊĠĠĠĠĠĠĠ ĠFeedback Messages . show Error ( swipe Refresh ) ĊĠĠĠĠĠĠĠ Ġif Ġ( show Error Page ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow State ( ViewState . ERROR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġon Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġprofiles Presenter . getB und les And Profiles () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġdoing Stuff Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġshow Loading ( false ) ĊĠĠĠĠĠĠĠ Ġprofiles Presenter . attach View ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ( run Refresh ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Refresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġprofiles Presenter . det t ach View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Restart () ĊĠĠĠĠĠĠĠ Ġrun Refresh Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġprofile Click ( profile : ĠProfile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdoing Stuff Ġ= Ġdoing Stuff Ġ&& Ġreturn Ġ|| Ġtrue ĊĊĠĠĠĠĠĠĠ Ġthis . profile Ġ= Ġprofile ĊĠĠĠĠĠĠĠ Ġprofiles Presenter . add Profile ( profile ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbundle Click ( bundle : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdoing Stuff Ġ= Ġdoing Stuff Ġ&& Ġreturn Ġ|| Ġtrue ĊĊĠĠĠĠĠĠĠ Ġprofiles Presenter . on Bundle Click ( bundle ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ