package Ġch . bf h . mad . e azy time . projects Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Type face Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġch . bf h . mad . e azy time . R Ċ import Ġch . bf h . mad . e azy time . data . repo . Project Repo Ċ import Ġch . bf h . mad . e azy time . util . E azy Time Date Util Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . joda . time . LocalDateTime Ċ import Ġorg . joda . time . Seconds Ċ import Ġjava . util .* Ċ Ċ class ĠProjects Re cycle ListAdapter ( var Ġcontext : ĠContext , Ġvar Ġproject Repo : ĠProject Repo ) Ġ: ĠList Adapter < Project ListItem , ĠProjects Re cycle ListAdapter . ViewHolder >( Diff CallBack ()) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtimers : ĠMutable List < My Update Timer > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġvar Ġon Item Click : Ġ(( Project ListItem ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġvar Ġon Item Long Click : Ġ(( Project ListItem ) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠitemView : ĠView ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠ ĠitemView Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . item _ project , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn ĠViewHolder ( item View ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject ListItem Ġ= ĠgetItem ( position ) ĊĠĠĠĠĠĠĠ Ġholder . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind ( project ListItem ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject ListItem ?. let Ġ{ Ġproject Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Color Tag ( tag TV , Ġproject Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ProjectName ( name TV , Ġproject Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Default Project ( is Default TV , Ġproject Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Time ( time TV , Ġproject Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Time ( time TV : ĠTextView , Ġproject Item : ĠProject ListItem ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproject Item . previous Time Seconds ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime TV . text Ġ= ĠE azy Time Date Util . from Seconds To HH mm SS ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( project Item . active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime TV . setType face ( null , ĠType face . BOLD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime TV . setTextColor ( Context Compat . getColor ( context , ĠR . color . e azy Time _ color Black )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy Update Timer Ġ= ĠMy Update Timer ( time TV , Ġproject Item . previous Time Seconds , Ġproject Item . current StartTime ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimers . add ( my Update Timer ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimer (). schedule At Fixed Rate ( my Update Timer , Ġ 0 , Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Default Project ( default TV : ĠTextView , Ġproject Item : ĠProject ListItem ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( project Item . default Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault TV . text Ġ= Ġcontext . getString ( R . string . is _ default _ project ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault TV . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat ProjectName ( name TV : ĠTextView , Ġproject Item : ĠProject ListItem ) Ġ{ ĊĠĠĠĠĠĠĠ Ġname TV . text Ġ= Ġproject Item . name ĊĠĠĠĠĠĠĠ Ġif Ġ( project Item . active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname TV . setType face ( null , ĠType face . BOLD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname TV . setTextColor ( Context Compat . getColor ( context , ĠR . color . e azy Time _ color Black )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Color Tag ( color Tag : ĠTextView , Ġproject Item : ĠProject ListItem ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcolor Tag . set BackgroundColor ( Color . parse Color ( project Item . color )) ĊĠĠĠĠĠĠĠ Ġcolor Tag . text Ġ= Ġproject Item . short Code ?. toUpperCase () ĊĠĠĠĠĠĠĠ Ġif Ġ( project Item . active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Tag . setType face ( null , ĠType face . BOLD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Tag . setTextColor ( Context Compat . getColor ( context , ĠR . color . e azy Time _ color Black )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Timers () Ġ{ ĊĠĠĠĠĠĠĠ Ġtimers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtimers . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Item ( view Holder : ĠRecyclerView . ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremoved Position Ġ= ĠviewHolder . adapter Position ĊĠĠĠĠĠĠĠ Ġval Ġproject Item Ġ= ĠgetItem ( removed Position ) ĊĠĠĠĠĠĠĠ Ġdelete Project ( project Item ) ĊĠĠĠĠĠĠĠ Ġif Ġ( project Item . active ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( view Holder . item View , Ġcontext . getString ( R . string . active _ projects _ cant _ be _ deleted ), ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( removed Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrollback Delete Project ( project Item ) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( view Holder . item View , Ġcontext . getString ( R . string . pri ject _ is _ deleted ), ĠSn ackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( context . getString ( R . string . rollback )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Inserted ( removed Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrollback Delete Project ( project Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Project ( project Item : ĠProject ListItem ) Ġ= ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Repo . delete Project ( project Item . id !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrollback Delete Project ( project Item : ĠProject ListItem ) Ġ= ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproject Repo . rollback Delete Project ( project Item . id !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtag TV Ġ= ĠitemView . findViewById < TextView >( R . id . project _ list _ item _ color _ tag ) !! ĊĠĠĠĠĠĠĠ Ġval Ġname TV Ġ= ĠitemView . findViewById < TextView >( R . id . project _ list _ item _ project _ name ) !! ĊĠĠĠĠĠĠĠ Ġval Ġtime TV Ġ= ĠitemView . findViewById < TextView >( R . id . project _ list _ item _ project _ time ) !! ĊĠĠĠĠĠĠĠ Ġval Ġis Default TV Ġ= ĠitemView . findViewById < TextView >( R . id . project _ list _ item _ project _ is Default ) !! ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( project ListItem : ĠProject ListItem ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Click ?. invoke ( project ListItem ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . setOn Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Long Click ?. invoke ( project ListItem ) ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMy Update Timer ( private Ġval Ġtime TV : ĠTextView ?, Ġprev Time : ĠInt ? Ġ= Ġ 0 , ĠstartDate : ĠLocalDateTime ?) Ġ: ĠTimer Task () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcounter Ġ= Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġprev Time ?. let Ġ{ Ġcounter Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ ĠstartDate ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Seconds Ġ= ĠSecond s . seconds Between ( it , ĠLocalDateTime ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Ġ+= Ġcurrent Seconds . seconds ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġthis Ġto Ġsupport ĠAPI ĠLevel Ġlower Ġthan Ġ 2 7 Ġ( Android Ġ 8 . 0 . 0 ) ĊĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime TV ?. text Ġ= ĠE azy Time Date Util . from Seconds To HH mm SS ( counter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcounter ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠDiff CallBack Ġ: ĠDiff Util . Item Callback < Project ListItem >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠProject ListItem , Ġnew Item : ĠProject ListItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġold Item . id Ġ== Ġnew Item . id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠProject ListItem , Ġnew Item : ĠProject ListItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġold Item . id Ġ== Ġnew Item . id Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . active Ġ== Ġnew Item . active Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . default Ġ== Ġnew Item . default Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . color Ġ== Ġnew Item . color Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . previous Time Seconds Ġ== Ġnew Item . previous Time Seconds Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . current StartTime Ġ== Ġnew Item . current StartTime Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . short Code Ġ== Ġnew Item . short Code Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . name Ġ== Ġnew Item . name Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . is Deleted Ġ== Ġnew Item . is Deleted ĊĠĠĠ Ġ} Ċ }