package Ġcom . ga ur av . f ret el lo . utils Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . live Data Ċ import Ġandroidx . lifecycle . map Ċ import Ġcom . ga ur av . f ret el lo . data . remote . ApiResponse Handler Ċ import Ġcom . ga ur av . f ret el lo . databinding . Custom Network Failed Binding Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ Ċ fun ĠContext . show Long Toast ( message : ĠString ) Ġ{ ĊĠĠĠ ĠToast . makeText ( this , Ġmessage , ĠToast . LENGTH _ LONG ). show () Ċ } Ċ Ċ fun ĠFragment . handle ApiError ( ĊĠĠĠ Ġerror : ĠApiResponse Handler . Error , ĊĠĠĠ Ġactivity : ĠFragment Activity Ċ ) Ġ{ ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġerror . is Network Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . check Network Connection ( activity Ġas ĠLifecycle Owner ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( error . message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġexpected Ġscenarios . ĠExample Ġ: ĠAuthentication Ġfailure , Ġtoken Ġexpiry , Ġetc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġerror . data ?. string (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . show Long Toast ( errorMessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun ĠActivity . check Network Connection ( lifecycle Owner : ĠLifecycle Owner ) Ġ{ ĊĠĠĠ Ġval Ġnetwork Connection Ġ= ĠNetwork Connection ( application Context ) ĊĠĠĠ Ġnetwork Connection . observe ( lifecycle Owner , Ġ{ Ġis Network Connected Ġ-> ĊĠĠĠĠĠĠĠ ĠTim ber . d (" check Network Connection Ġis Network Connected Ġ: Ġ$ is Network Connected ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Network Connected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠCustom Network Failed Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set ContentView ( binding . root ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . button Retry Connection . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Not Ġconnected Ġto Ġthe Ġnetwork Ġ!! ĠRetry Ġcalled Ġ!!! Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . re create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ċ } Ċ Ċ fun Ġget Formatted DateTime ( dateTime String : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġparsed Date Ġ= ĠLocalDateTime . parse ( dateTime String , ĠDateTime Formatter . ISO _ DATE _ TIME ) ĊĠĠĠ Ġreturn Ġparsed Date . format ( DateTime Formatter . of Pattern ( Constants . CONVERT ED _ DATE _ FORMAT )) Ċ } Ċ Ċ fun Ġ< T , ĠL > Ġresponse LiveData ( ĊĠĠĠ Ġroom Query To Retrieve Data : Ġ() Ġ-> ĠLive Data < T >, ĊĠĠĠ Ġnetwork Request : Ġsuspend Ġ() Ġ-> ĠApiResponse Handler < L >, ĊĠĠĠ Ġroom Query To SaveData : Ġsuspend Ġ( L ) Ġ-> ĠUnit Ċ ): ĠLive Data < ApiResponse Handler < T >> Ġ= Ġlive Data ( Dispatch ers . IO ) Ġ{ ĊĊĠĠĠ Ġemit ( ApiResponse Handler . loading ( null )) ĊĊĠĠĠ Ġ// ĠGet Ġdata Ġfrom Ġroom Ġdb ĊĠĠĠ Ġval Ġsource Ġ= Ġroom Query To Retrieve Data (). map Ġ{ ĠApiResponse Handler . success ( it ) Ġ} ĊĠĠĠ Ġemit Source ( source ) ĊĠĠĠ ĠTim ber . d (" Room Ġquery Ġto Ġget Ġsession Ġ: Ġ$ latest Value ") ĊĊĠĠĠ Ġ// ĠUpdate Ġdata Ġto Ġroom Ġdb Ġfrom ĠAPI ĊĠĠĠ Ġwhen Ġ( val Ġapi Response Ġ= Ġnetwork Request ()) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġis ĠApiResponse Handler . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi Response . data ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" network Request Ġto Ġget Ġsession Ġ: Ġ$ source ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroom Query To SaveData ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠApiResponse Handler . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse Handler . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi Response . message Ġ?: Ġ" API Ġresponse Ġerror ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit Source ( source ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApiResponse Handler . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Something Ġwent Ġwrong , Ġplease Ġtry Ġagain Ġlater ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit Source ( source ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ