package Ġcom . l ud os city . find my b ikes . data . network . city b ik _ es Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġretrofit 2 . Response Ċ import Ġjava . io . IOException Ċ Ċ class ĠBi ke System List Network DataSource Ġprivate Ġconstructor () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope IO Ġ= ĠCor outine Scope ( Dispatch ers . IO ) ĊĊĠĠĠ Ġprivate Ġval Ġdownloaded Bi ke System List : ĠMutable LiveData < Bi ke System List Answer Root > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġval Ġdata : ĠLive Data < Bi ke System List Answer Root > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdownloaded Bi ke System List ĊĊĠĠĠ Ġfun Ġstart Fetching Bi ke System List Service ( ctx : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent To Fetch Ġ= ĠIntent ( ctx , ĠFetch City b ik DOT es Data Intent Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent To Fetch . action Ġ= ĠFetch City b ik DOT es Data Intent Service . ACTION _ FETCH _ SYSTEM _ LIST ĊĊĠĠĠĠĠĠĠ ĠFetch City b ik DOT es Data Intent Service . enqueue Work ( ctx , Ġintent To Fetch ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch Bi ke System List ( city b ik _ es API : ĠCity b ik _ es API ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope IO . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġcity b ik _ es API . bi ke Network List ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Answer Root Answer Root Answer : ĠResponse < Bi ke System List Answer Root > ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Answer Root Answer Root Answer Ġ= Ġcall . execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownloaded Bi ke System List . post Value ( list Answer Root Answer Root Answer . body () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// server Ġlevel Ġerror , Ġcould Ġnot Ġretrieve Ġbi ke Ġsystem Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Exception Ġraised Ġtrying Ġto Ġfetch Ġbi ke Ġsystem Ġlist Ġ-- ĠAbort ed ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠBi ke System List Network DataSource :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġ// ĠFor ĠSingleton Ġinstantiation ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOCK Ġ= ĠAny () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġs Instance : ĠBi ke System List Network DataSource ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGet Ġthe Ġsingleton Ġfor Ġthis Ġclass ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance (): ĠBi ke System List Network DataSource Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log . d ( TAG , Ġ" Getting Ġbi ke Ġsystem Ġlist Ġnetwork Ġdata Ġsource ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s Instance Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( LOCK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Instance Ġ= ĠBi ke System List Network DataSource () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Made Ġnew Ġbi ke Ġsystem Ġlist Ġnetwork Ġdata Ġsource ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġs Instance !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }