package Ġorg . ion project . android . courses Ċ Ċ import Ġandroidx . lifecycle .* Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . await All Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . ion project . android . common . model . Program me Offer Ċ import Ġorg . ion project . android . common . model . Program me Offer Summary Ċ import Ġorg . ion project . android . common . repositories . Program mes Repository Ċ import Ġorg . ion project . android . offline . Catalog Repository Ċ import Ġorg . ion project . android . offline . models .* Ċ import Ġjava . net . URI Ċ Ċ class ĠCour ses ViewModel ( private Ġval Ġprogram mes Repository : ĠProgram mes Repository ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġprogram me Offers LiveData Ġ= ĠMutable LiveData < List < Program me Offer >>() ĊĊĠĠĠ Ġfun Ġobserve Courses LiveData ( ĊĠĠĠĠĠĠĠ Ġlifecycle Owner : ĠLifecycle Owner , ĊĠĠĠĠĠĠĠ ĠonUpdate : Ġ() Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprogram me Offers LiveData . observe ( lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġmandatory Courses Ġ= Ġempty List < Program me Offer >() ĊĠĠĠ Ġprivate Ġvar Ġoptional Courses Ġ= Ġempty List < Program me Offer >() ĊĊĠĠĠ Ġ// Indic ates Ġif Ġthe Ġcurrent Ġlist Ġin Ġlive Data Ġis Ġthe Ġmandatory Courses ĊĠĠĠ Ġprivate Ġvar Ġare Mandatory Ġ= Ġtrue ĊĊĠĠĠ Ġval Ġprogram me Offers : ĠList < Program me Offer > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġprogram me Offers LiveData . value Ġ?: Ġempty List () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLa unches Ġmultiple Ġcor outines Ġwhich Ġwill Ġbe Ġobtaining Ġprogram me Offers Ġand Ġupdating Ġthe Ġlive Ġdata . ĊĠĠĠĠ Ġ* ĠThe Ġcor outines Ġare Ġlaunched Ġwith Ġ[ kotlin x . coroutines . Main Coroutine Dispatcher . immediate ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetAll Courses From Cur ric ular Term ( ĊĠĠĠĠĠĠĠ Ġprogram me Offer Sum maries : ĠList < Program me Offer Summary >, ĊĠĠĠĠĠĠĠ Ġcur ric ular Term : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeferred Offers Ġ= Ġmutable ListOf < Deferred < Program me Offer ? >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Launch ing Ġparallel Ġcor outines Ġto Ġincrease Ġthe Ġspeed Ġof Ġthe Ġmethod Ġexecution ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( program me Offer Summary Ġin Ġprogram me Offer Sum maries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( program me Offer Summary . term Numbers . contains ( cur ric ular Term )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Offers . add ( async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram mes Repository . get Program me Offer Details ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram me Offer Summary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Mandatory Courses Ġ= Ġmutable ListOf < Program me Offer >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Optional Courses Ġ= Ġmutable ListOf < Program me Offer >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Await Ġfor Ġresults Ġand Ġthen Ġseparate Ġcourses Ġin Ġmandatory Ġand Ġoptional ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Offers . await All (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . optional ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Optional Courses . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Mandatory Courses . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmandatory Courses Ġ= Ġnew Mandatory Courses ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptional Courses Ġ= Ġnew Optional Courses ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogram me Offers LiveData . post Value ( mandatory Courses ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġ[ program me Offers ] Ġcontent Ġfrom Ġmandatory Ġcourses Ġto Ġoptional Ġcourses ĊĠĠĠ Ġor Ġvice - ver sa . ĊĠĠĠĠ Ġ* Ġ@ returns Ġtrue Ġif Ġthe Ġnew Ġlist Ġtype Ġis Ġmandatory Ġelse Ġfalse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġchange ListType (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġare Mandatory Ġ= Ġ! are Mandatory ĊĠĠĠĠĠĠĠ Ġprogram me Offers LiveData . post Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( are Mandatory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmandatory Courses ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptional Courses ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġare Mandatory ĊĠĠĠ Ġ} Ċ } Ċ