package Ġco . zw . amo ses uw ali . dog playground . models . view models Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle .* Ċ import Ġco . zw . amo ses uw ali . dog playground . helpers . u ib inders . Bre edList Adapter Ċ import Ġco . zw . amo ses uw ali . dog playground . database . fav B reed . Fav B reed Dao Ċ import Ġco . zw . amo ses uw ali . dog playground . database . fav B reed . Fav B reed Entity Ċ import Ġco . zw . amo ses uw ali . dog playground . models . B reed Detail Model Ċ import Ġco . zw . amo ses uw ali . dog playground . models . B reed Random Response Ċ import Ġco . zw . amo ses uw ali . dog playground . models . Server Response Ċ import Ġco . zw . amo ses uw ali . dog playground . api . Dog C eo Api Ċ import Ġco . zw . amo ses uw ali . dog playground . database . fav B reed . Fav B reed Repository Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util . concurrent . Flow Ċ import Ġkotlin . reflect . full . member Properties Ċ Ċ class ĠSelect Fav B reed ViewModel ( private Ġval Ġfav B reed Dao : ĠF av B reed Dao ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġenum Ġclass ĠDog C eo Api Status Ġ{ ĠLO ADING , ĠERROR , ĠDONE Ġ} ĊĠĠĠ Ġ// ĠThe Ġinternal ĠMutable LiveData Ġthat Ġstores Ġthe Ġstatus Ġof Ġthe Ġmost Ġrecent Ġrequest ĊĠĠĠ Ġprivate Ġval Ġ_ status Ġ= ĠMutable LiveData < Dog C eo Api Status >() ĊĊĠĠĠ Ġval Ġdog ListAdapter = ĠBre edList Adapter () ĊĠĠĠ Ġ// ĠThe Ġexternal Ġimmutable ĠLive Data Ġfor Ġthe Ġrequest Ġstatus ĊĠĠĠ Ġval Ġstatus : ĠLive Data < Dog C eo Api Status > Ġ= Ġ_ status ĊĠĠĠ Ġval Ġis Selected List Empty : ĠMutable LiveData < Boolean > Ġ= Ġdog ListAdapter . isSelected List NotEmpty ĊĠĠĠ Ġval Ġselected B reed s Count : ĠMutable LiveData < String > Ġ= Ġdog ListAdapter . selected B reed s Count ĊĠĠĠ Ġval Ġtotal B reed s Count = Mutable LiveData < String >(" 0 ") ĊĊĠĠĠ Ġ// ĠIntern ally , Ġwe Ġuse Ġa ĠMutable LiveData , Ġbecause Ġwe Ġwill Ġbe Ġupdating Ġthe ĠList Ġof ĠM ars Photo ĊĠĠĠ Ġ// Ġwith Ġnew Ġvalues ĊĠĠĠ Ġprivate Ġval Ġ_ dog B reed s Ġ= ĠMutable LiveData < List < B reed Detail Model >>() ĊĠĠĠ Ġprivate Ġval Ġ_ dog B reed s Live Ġ= ĠMutable LiveData < List < B reed Detail Model >>() ĊĊĠĠĠ Ġ// ĠThe Ġexternal ĠLive Data Ġinterface Ġto Ġthe Ġproperty Ġis Ġimmutable , Ġso Ġonly Ġthis Ġclass Ġcan Ġmodify ĊĠĠĠ Ġval Ġdog B reed s : ĠLive Data < List < B reed Detail Model >> Ġ= Ġ_ dog B reed s ĊĠĠĠ Ġval Ġselected B reed s Ġ= Mutable LiveData < String >(" 0 ") ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġget M ars Photos () Ġon Ġinit Ġso Ġwe Ġcan Ġdisplay Ġstatus Ġimmediately . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġget Dog B reed s List () ĊĠĠĠ Ġ} ĊĠĠĠ Ġclass ĠSelect Fav B reed ViewModel Factory ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfav B reed Dao : ĠF av B reed Dao ĊĠĠĠ Ġ) Ġ: ĠViewModel Provider . Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel > Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( model Class . isAssignableFrom ( Select Fav B reed ViewModel :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSelect Fav B reed ViewModel ( fav B reed Dao ) Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unknown ĠViewModel Ġclass ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets ĠM ars Ġphotos Ġinformation Ġfrom Ġthe ĠM ars ĠAPI ĠRet rofit Ġservice Ġand Ġupdates Ġthe ĊĠĠĠĠ Ġ* Ġ[ B reed Random Response ] Ġ[ List ] Ġ[ LiveData ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Dog B reed s List () Ġ{ ĊĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status . value Ġ= ĠDog C eo Api Status . LOADING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Response Response : ĠServer Response Ġ= ĠDog C eo Api . ret rofit Service . get Dog Bre edList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp List Ġ= Ġmutable ListOf < B reed Detail Model >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( dog B reed Ġin Ġserver Response Response . message :: class . member Properties ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp List . add ( B reed Detail Model ( dog B reed . name , Ġ Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected B reed s . value = temp List . size . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ dog B reed s . value Ġ= Ġ Ġtemp List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ dog B reed s Live . value = temp List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status . value Ġ= ĠDog C eo Api Status . DONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal B reed s Count . value = temp List . size . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" ________________ __", e . message . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status . value Ġ= ĠDog C eo Api Status . ERROR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget B reed Image ( bre ed Name : String ) Ġ: String { ĊĠĠĠĠĠĠĠ Ġvar Ġb reed Url Image Ġ= bre ed Name ĊĠĠĠĠĠĠĠ ĠviewModel Scope . async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Response Response : ĠB reed Random Response Ġ= ĠDog C eo Api . ret rofit Service . get Dog B reed Random Image ( bre ed Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb reed Url Image Ġ= Ġserver Response Response . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ("__ Get __ bre ed Url Image __", Ġb reed Url Image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" ________________ __", e . message . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. await () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġb reed Url Image ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch B reed From Fav List ( bre ed : CharSequence ){ ĊĠĠĠĠĠĠĠĠ Ġ_ dog B reed s . value = Ġ_ dog B reed s Live . value ĊĠĠĠĠĠĠĠĠ Ġif ( bre ed . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ dog B reed s . value =_ dog B reed s . value ?. filter Ġ{ Ġit . bre ed Name . contains ( bre ed , true ) Ġ} ĊĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ dog B reed s . value = Ġ_ dog B reed s Live . value ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Selected Fav B reed s (){ ĊĠĠĠĠĠĠĠ ĠGlobal Scope . async { Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġfav B reed Dao . delete All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdog ListAdapter . selected B reed s . value ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfav B reed Dao . insert All ( Fav B reed Entity ( 0 , it . bre ed Name , getB reed Image ( it . bre ed Name ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" ADDING Ġ>>> >> ", it . bre ed Name . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ }