package Ġcom . al wan . b aj ps ub mission 3 . data . source . remote Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . al wan . b aj ps ub mission 3 . data . source . remote . response . movie . Movie Detail Response Ċ import Ġcom . al wan . b aj ps ub mission 3 . data . source . remote . response . movie . Movies Response Ċ import Ġcom . al wan . b aj ps ub mission 3 . data . source . remote . response . tv show . Tv Show Detail Response Ċ import Ġcom . al wan . b aj ps ub mission 3 . data . source . remote . response . tv show . Tv Shows Response Ċ import Ġcom . al wan . b aj ps ub mission 3 . network . Ret rofit Config Ċ import Ġcom . al wan . b aj ps ub mission 3 . utils . Esp ress o Id ling Resource Ċ import Ġcom . al wan . b aj ps ub mission 3 . utils . Network Info . API _ KEY Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response ĊĊ Ċ class ĠRemote DataSource Ġ{ ĊĊĠĠĠ Ġfun Ġget Movies (): ĠLive Data < ApiResponse < ArrayList < Movie Detail Response >>> Ġ{ ĊĠĠĠĠĠĠĠ ĠE sp ress o Id ling Resource . increment () ĊĠĠĠĠĠĠĠ Ġval Ġmovies Ġ= ĠMutable LiveData < ApiResponse < ArrayList < Movie Detail Response >> >() ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠRet rofit Config . api Instance . get Movies ( API _ KEY ) ĊĊĠĠĠĠĠĠĠ Ġclient . enqueue ( object Ġ: ĠCallback < Movies Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < Movies Response >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < Movies Response > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovies . post Value ( ApiResponse . success ( response . body ()?. results Ġas ĠArrayList < Movie Detail Response > )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE sp ress o Id ling Resource . decrement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Movies Response >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Remote DataSource ", Ġ" get Movies Ġon Failure Ġ: Ġ${ t . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE sp ress o Id ling Resource . decrement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmovies ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Detail Movie ( movie Id : ĠString ) Ġ: ĠLive Data < ApiResponse < Movie Detail Response >> { ĊĠĠĠĠĠĠĠ ĠE sp ress o Id ling Resource . increment () ĊĠĠĠĠĠĠĠ Ġval Ġdetail Movie Ġ= ĠMutable LiveData < ApiResponse < Movie Detail Response >>() ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠRet rofit Config . api Instance . get Movie Detail ( movie Id , ĠAPI _ KEY ) ĊĊĠĠĠĠĠĠĠ Ġclient . enqueue ( object Ġ: ĠCallback < Movie Detail Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < Movie Detail Response >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < Movie Detail Response > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail Movie . post Value ( ApiResponse . success ( response . body () Ġas ĠMovie Detail Response )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE sp ress o Id ling Resource . decrement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Movie Detail Response >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Remote DataSource ", Ġ" get Movie Detail Ġon Failure Ġ: Ġ${ t . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE sp ress o Id ling Resource . decrement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdetail Movie ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Tv Shows () Ġ: ĠLive Data < ApiResponse < ArrayList < Tv Show Detail Response >>> Ġ{ ĊĠĠĠĠĠĠĠ ĠE sp ress o Id ling Resource . increment () ĊĠĠĠĠĠĠĠ Ġval Ġtv Shows Ġ= ĠMutable LiveData < ApiResponse < ArrayList < Tv Show Detail Response >> >() ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠRet rofit Config . api Instance . get Tv Shows ( API _ KEY ) ĊĊĠĠĠĠĠĠĠ Ġclient . enqueue ( object Ġ: ĠCallback < Tv Shows Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < Tv Shows Response >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < Tv Shows Response > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv Shows . post Value ( ApiResponse . success ( response . body ()?. results Ġas ĠArrayList < Tv Show Detail Response > )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE sp ress o Id ling Resource . decrement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Tv Shows Response >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Remote DataSource ", Ġ" get Tv Shows Ġon Failure Ġ: Ġ${ t . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE sp ress o Id ling Resource . decrement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtv Shows ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Detail Tv Show ( tv Show Id : ĠString ) Ġ: ĠLive Data < ApiResponse < Tv Show Detail Response >> Ġ{ ĊĠĠĠĠĠĠĠ ĠE sp ress o Id ling Resource . increment () ĊĠĠĠĠĠĠĠ Ġval Ġdetail Tv Show Ġ= ĠMutable LiveData < ApiResponse < Tv Show Detail Response >>() ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠRet rofit Config . api Instance . get Tv Show Detail ( tv Show Id , ĠAPI _ KEY ) ĊĠĠĠĠĠĠĠ Ġclient . enqueue ( object Ġ: ĠCallback < Tv Show Detail Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < Tv Show Detail Response >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < Tv Show Detail Response > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail Tv Show . post Value ( ApiResponse . success ( response . body () Ġas ĠT v Show Detail Response )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE sp ress o Id ling Resource . decrement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Tv Show Detail Response >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Remote DataSource ", Ġ" get Detail Tv Show Ġon Failure Ġ: Ġ${ t . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE sp ress o Id ling Resource . decrement () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdetail Tv Show ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinstance : ĠRemote DataSource ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance (): ĠRemote DataSource Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ?: Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ?: ĠRemote DataSource () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }