package Ġcom . example . android . architecture . blueprint s . todo app . data . source . remote Ċ Ċ import Ġcom . example . android . architecture . blueprint s . todo app . data . Task Ċ import Ġcom . google . common . reflect . Type Token Ċ import Ġcom . google . firebase . database .* Ċ import Ġcom . google . gson . Gson Ċ import Ġorg . json . JSONArray Ċ import Ġorg . json . JSONObject Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util .* Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . suspend Coroutine ĊĊ Ċ class ĠFirebase Database Helper Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġdatabase : ĠFirebase Database ĊĠĠĠ Ġprivate Ġvar Ġdb Reference : ĠDatabase Reference ĊĊĠĠĠ Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . database Ġ= ĠFirebase Database . getInstance () ĊĠĠĠĠĠĠĠ Ġthis . db Reference Ġ= Ġthis . database . getReference (" Tasks ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert From JSON StringTo Class ( json String : ĠString ): ĠList < Task > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠ Ġval Ġobject List Ġ= Ġgson . fromJson ( json String , ĠArray < Task >:: class . java ). asList () ĊĠĠĠĠĠĠĠ Ġreturn Ġobject List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert From JSON StringTo Class 2 ( json String : ĠString ): ĠList < Task > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠList < Task > Ġ= Ġgson . fromJson ( json String , Ġobject Ġ: ĠType Token < List < Task >>() Ġ{} . type ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Data Class To JSON String ( task : ĠTask ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠ Ġvar Ġjson String Ġ= Ġgson . toJson ( Task ( task . title , Ġtask . description , Ġtask . is Completed , Ġtask . is Favorite , Ġtask . due Date , Ġtask . time , Ġtask . contact Id String )) ĊĠĠĠĠĠĠĠ Ġreturn Ġjson String ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave JSON String ( todo List : ĠList < Task >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ""" {" uid ": 1 ," description ":" Test "} """ ĊĊĠĠĠĠĠĠĠ Ġ""" "{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" fo os " Ġ: Ġ[{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" prop 1 ":" value 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" prop 2 ":" value 2 " ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" prop 1 ":" value 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" prop 2 ":" value 4 " ĊĠĠĠĠĠĠĠ Ġ}] ĊĠĠĠĠĠĠĠ Ġ} """ ĊĊĠĠĠĠĠĠĠ Ġvar Ġjson String Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġfor Ġ( task Ġin Ġtodo List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstring Ġ= Ġconvert Data Class To JSON String ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson String . plus ( string ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġjson String ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstore JSON String ( todo List : ĠList < Task >): ĠJSONObject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĠJSONArray () ĊĠĠĠĠĠĠĠ Ġfor Ġ( task Ġin Ġtodo List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . put ( convert Data Class To JSON String ( task )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠ ĠjsonObject . put (" task ", Ġarray ) ĊĠĠĠĠĠĠĠ Ġreturn ĠjsonObject ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġread Tasks (): ĠList < Task > Ġ= ĊĠĠĠĠĠĠĠ Ġsuspend Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( data Snapshot : ĠData Snapshot ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtodo List Ġ= ĠArrayList < Task >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( task Ġin Ġdata Snapshot . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġtask . getValue ( Task :: class . java ) Ġas ĠTask ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtodo List . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( todo List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġempty List : ĠList < Task > Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( emptyList ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" some Ġerror Ġoccurred Ġwhile Ġloading Ġdata Ġfrom Ġfirebase Ġdb ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Reference . addListener For Single Value Event ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġsave To Database ( todo List : ĠList < Task >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtodo List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Reference . child (" task Ġ${ it . id } "). setValue ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTim ber . i (" Firebase Ġdatabase Ġupdated ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġdelete All Tasks () Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Reference . database . getReference (" Tasks "). remove Value () ĊĠĠĠĠĠĠĠ ĠTim ber . i (" Firebase Ġdata Ġdeleted ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Task ( taskId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Reference . child (" task Ġ$ taskId "). remove Value () ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ