package Ġcom . optim iz ely . app . ui . main Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . widget . Swipe Refresh Layout Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġcom . optim iz ely . app . Opt ly Application Ċ import Ġcom . optim iz ely . app . R Ċ import Ġcom . optim iz ely . app . data . Optim iz ely Apis Service Ċ import Ġcom . optim iz ely . app . data . Project Ċ import Ġcom . optim iz ely . app . data . Token Ċ import Ġcom . optim iz ely . app . main . Projects Detail Activity Ċ import Ġcom . optim iz ely . app . ui . Base Activity Ċ import Ġorg . jetbrains . ank o .* Ċ import Ġorg . jetbrains . ank o . recyclerview . v 7 . on Item Touch Listener Ċ import Ġorg . jetbrains . ank o . recyclerview . v 7 . re cyclerView Ċ import Ġorg . jetbrains . ank o . support . v 4 . on Refresh Ċ import Ġorg . jetbrains . ank o . support . v 4 . swipe Refresh Layout Ċ import Ġrx . Subscription Ċ import Ġrx . android . schedul ers . Android Schedulers Ċ import Ġrx . functions . Action 1 Ċ import Ġrx . lang . kotlin . observable Ċ import Ġrx . schedul ers . Schedulers Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠMainActivity Ġ: ĠBase Activity (), ĠProjects Presenter Ġ{ ĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġoptim iz ely Apis Service : ĠOptim iz ely Apis Service ĊĊĠĠĠ Ġlateinit Ġvar Ġview : ĠProjects View ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠOpt ly Application . graph . inject ( this ) ĊĊĠĠĠĠĠĠĠ Ġval Ġui Ġ= ĠMainActivity Ui ( this ) ĊĠĠĠĠĠĠĠ Ġui . set ContentView ( this ) ĊĠĠĠĠĠĠĠ Ġview Ġ= Ġui ĊĊĠĠĠĠĠĠĠ Ġload () ĊĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġload Ġof Ġthis ĠActivity . Ġ ĠThis Ġwould Ġbe Ġnon - null Ġif ĠActivity Ġis Ġbeing Ġre created Ġfrom ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġuser Ġrot ating Ġthe Ġdevice Ġor Ġother Ġconfiguration Ġchanges . ĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrefresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġmanage Sub ( refresh ( Action 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug (" Ref reshed Ġprojects ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġview . on Projects ( it ) ĊĠĠĠĠĠĠĠ Ġ}, ĠAction 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unable Ġto Ġrefresh Ġprojects ", Ġit ) ĊĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠFetch Ġprojects Ġfrom Ġthe Ġserver Ġand Ġstore Ġthem ĊĠĠĠ Ġfun Ġrefresh ( success : ĠAction 1 < List < Project >>, Ġerror : ĠAction 1 < Throwable >): ĠSubscription Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrealm . where ( Token :: class . java ). findFirst Async (). as Observable < Token >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Loaded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. first (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrealm . copyFrom Realm ( it ) ĊĠĠĠĠĠĠĠ Ġ}. observe On ( Schedulers . io ()). flatMap Ġ{ Ġauth Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptim iz ely Apis Service . projects (" Bearer Ġ${ auth Response . accessToken }") ĊĠĠĠĠĠĠĠ Ġ}. observe On ( Android Schedulers . main Thread ()). flatMap Ġ{ Ġprojects Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobservable < List < Project >> Ġ{ Ġsubscriber Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrealm . execute Transaction Async ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy To Realm OrUpdate ( projects ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug (" Saved Ġprojects Ġto Ġrealm ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber . onNext ( realm . where ( Project :: class . java ). findAll ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber . on Completed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber . onError ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. subscribe ( success , Ġerror ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload () Ġ{ ĊĠĠĠĠĠĠĠ Ġmanage Sub ( load ( Action 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug (" Loaded Ġprojects ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . on Projects ( it ) ĊĠĠĠĠĠĠĠ Ġ}, ĠAction 1 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unable Ġto Ġload Ġprojects ", Ġit ) ĊĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload ( success : ĠAction 1 < List < Project >>, Ġerror : ĠAction 1 < Throwable >): ĠSubscription Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrealm . where ( Project :: class . java ). findAll Async (). as Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . is Loaded Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . toList () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( success , Ġerror ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġmenu ; Ġthis Ġadds Ġitems Ġto Ġthe Ġaction Ġbar Ġif Ġit Ġis Ġpresent . ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu _ main , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠHandle Ġaction Ġbar Ġitem Ġclicks Ġhere . ĠThe Ġaction Ġbar Ġwill ĊĠĠĠĠĠĠĠ Ġ// Ġautomatically Ġhandle Ġclicks Ġon Ġthe ĠHome / Up Ġbutton , Ġso Ġlong ĊĠĠĠĠĠĠĠ Ġ// Ġas Ġyou Ġspecify Ġa Ġparent Ġactivity Ġin ĠAndroid Manifest . xml . ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġitem . itemId ĊĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== ĠR . id . action _ settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMainActivity Ui ( val Ġpresenter : ĠProjects Presenter ? Ġ= Ġnull ) Ġ: ĠAn ko Component < MainActivity >, ĠAn ko Logger , ĠProjects View Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġprojects Adapter : ĠProjects Adapter ĊĠĠĠ Ġlateinit Ġvar Ġswipe Refresh Layout : ĠSw ipe Refresh Layout ĊĊĠĠĠ Ġclass ĠProjects Adapter ( val Ġui : ĠAn ko Context < MainActivity >, Ġvar Ġprojects : ĠList < Project >) Ġ: ĠRecyclerView . Adapter < Projects Adapter . ViewHolder >(), ĠAn ko Logger Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder ?, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġprojects [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . textView . text Ġ= Ġproject . projectName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug (" Bound Ġview Ġholder ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup ?, Ġview Type : ĠInt ): ĠViewHolder ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= ĠTextView ( ui . ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . onClick Ġ{ Ġui . ctx . startActivity < Projects Detail Activity >() Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠViewHolder ( textView ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprojects . size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠViewHolder ( val ĠtextView : ĠTextView ) Ġ: ĠRecyclerView . ViewHolder ( textView ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Projects ( projects : ĠList < Project >) Ġ{ ĊĠĠĠĠĠĠĠ Ġprojects Adapter . projects Ġ= Ġprojects ĊĠĠĠĠĠĠĠ Ġprojects Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġswipe Refresh Layout . is Refresh ing Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate View ( ui : ĠAn ko Context < MainActivity >) Ġ= Ġui . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġprojects Adapter Ġ= ĠProjects Adapter ( ui , Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġvertical Layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Refresh Layout Ġ= Ġswipe Refresh Layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Refresh Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter ?. refresh () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . adapter Ġ= Ġprojects Adapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. view Ċ } Ċ Ċ interface ĠProjects Presenter Ġ{ ĊĠĠĠ Ġfun Ġrefresh () ĊĠĠĠ Ġfun Ġload () Ċ } Ċ Ċ interface ĠProjects View Ġ{ ĊĠĠĠ Ġfun Ġon Projects ( projects : ĠList < Project >) Ċ } Ċ