package Ġcom . rav n ner der y . recycle challenge . post list Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . os . Handler Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . rav n ner der y . recycle challenge . database . tables . Comment Ċ import Ġcom . rav n ner der y . recycle challenge . database . Database Dao Ċ import Ġcom . rav n ner der y . recycle challenge . database . tables . Post Ċ import Ġcom . rav n ner der y . recycle challenge . network . Posts Api Ċ import Ġkotlinx . coroutines .* Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ import Ġjava . lang . Runnable Ċ Ċ private Ġlateinit Ġvar Ġrunnable : ĠRunnable Ċ Ċ class ĠPost list ViewModel ( ĊĠĠĠ Ġval Ġdatabase : ĠDatabase Dao , ĊĠĠĠ Ġapplication : ĠApplication Ċ ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġhandler Ġ= ĠHandler () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġload From Api AndSet Into Database () ĊĠĠĠĠĠĠĠ Ġrun Auto Refresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Auto Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġrunnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload From Api AndSet Into Database () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Auto Refresh () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhandler . post Delayed ( run nable , Ġ 9 0 0 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠ Ġclear Database () ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar ĠviewModel Job Ġ= ĠJob () ĊĠĠĠ Ġprivate Ġval Ġui Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main Ġ+ ĠviewModel Job ) ĊĠĠĠ Ġval Ġall Posts From Database Ġ= Ġdatabase . get Posts () ĊĠĠĠ Ġprivate Ġfun Ġload From Api AndSet Into Database () Ġ{ ĊĠĠĠĠĠĠĠ ĠPosts Api . ret rofit Service . get Posts (). enqueue ( object Ġ: ĠCallback < List < Post >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < List < Post >>, Ġresponse : ĠResponse < List < Post >>) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. forEach Ġ{ Ġelm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Post To Database ( elm . id , Ġelm . title , Ġelm . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < List < Post >>, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( t . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠPosts Api . ret rofit Service . get Comments (). enqueue ( object Ġ: ĠCallback < List < Comment >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < List < Comment >>, Ġresponse : ĠResponse < List < Comment >>) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. forEach Ġ{ Ġelm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Comment To Database ( elm . id , Ġelm . name , Ġelm . email , Ġelm . body , Ġelm . post Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < List < Comment >>, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( t . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Post To Database ( id : ĠLong , Ġtitle : ĠString , Ġbody : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Post Ġ= ĠPost ( id , Ġtitle , Ġbody ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsample Ġ= Ġdatabase . get Specific Post ( new Post . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sample . isEmpty ()) Ġdatabase . insert Post ( new Post ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Comment To Database ( ĊĠĠĠĠĠĠĠ Ġid : ĠLong , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġemail : ĠString , ĊĠĠĠĠĠĠĠ Ġbody : ĠString , ĊĠĠĠĠĠĠĠ Ġpost Id : ĠLong ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Comment Ġ= ĠComment ( id , Ġname , Ġemail , Ġbody , Ġpost Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Single Comment ( new Comment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinsert Single Comment ( comment : ĠComment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsample Ġ= Ġdatabase . get Specific Comment ( comment . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sample . isEmpty ()) Ġdatabase . insert Comment ( comment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Database () Ġ{ ĊĠĠĠĠĠĠĠ Ġui Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . delete Posts () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . delete Comments () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ navigate To Details Ġ= ĠMutable LiveData < Long ?> () ĊĠĠĠ Ġval Ġnavigate To Details ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ navigate To Details ĊĊĠĠĠ Ġfun Ġon Post Clicked ( id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ navigate To Details . value Ġ= Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Post Details Navig ated () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ navigate To Details . value Ġ= Ġnull ĊĠĠĠ Ġ} Ċ Ċ }