/** Ċ Ġ* Ġ@ author ĠSar av anan Ċ Ġ* Ċ Ġ* Ċ Ġ*/ Ċ package Ġcom . kotlin . li ved ata . ui . login Ċ Ċ import Ġcom . kotlin . li ved ata . api . API Repo Ċ import Ġandroid . arch . lifecycle . LiveData Ċ import Ġandroid . arch . lifecycle . Mutable LiveData Ċ import Ġandroid . arch . lifecycle . Transform ations Ċ import Ġandroid . arch . lifecycle . ViewModel Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . kotlin . li ved ata . model . Login Response Ċ import Ġcom . kotlin . li ved ata . util . Absent LiveData Ċ import Ġcom . kotlin . li ved ata . util . Resource Ċ import Ġcom . kotlin . li ved ata . view model . API Request Data Ċ import Ġokhttp 3 . RequestBody Ċ import Ġokhttp 3 . ResponseBody Ċ Ċ open Ġclass ĠLogin ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġpublic Ġvar Ġgson : ĠGson Ġ= ĠGson () ĊĠĠĠ Ġval Ġ_ login Ġ= ĠMutable LiveData < API Request Data >() ĊĊĠĠĠ Ġvar ĠAPI Repo : ĠAPI Repo Ġ= ĠAPI Repo () ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDirect ly ĠCall Ġthe Ġrepo Ġmethods ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcall API ( login : ĠAPI Request Data ): ĠLive Data < Resource < ResponseBody >> Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlive Data : ĠLive Data < Resource < ResponseBody >> Ġ= ĠAPI Repo . post API Repo ( login ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlive Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġfunction Ġreturn Ġthe Ġuser Ġlogin Ġdetails ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠLive Data < Resource < Login Response >> ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġget Response (): LiveData < Resource < T >> { ĊĊĠĠĠĠĠĠĠ Ġvar Ġresponse : ĠLive Data < Resource < T >> Ġ= ĠTransform ations . switch Map (_ login ) Ġ{ Ġlogin Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( login Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAbs ent LiveData . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAPI Repo . post API Repo < T >( login ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ Ġresponse ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Direct Ġcall Ġrepo Ġwith ĠLogin Response ĊĠĠĠ Ġvar Ġrepositories : ĠLive Data < Resource < Login Response >> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresponse : ĠLive Data < Resource < Login Response >> Ġ= ĠTransform ations . switch Map (_ login ) Ġ{ Ġlogin Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( login Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAbs ent LiveData . create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAPI Repo . post API Repo < Login Response >( login ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse ; ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġresponse ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠConvert Ġresponse Ġbody Ġto Ġjson Ġpo jo ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġconvert Json ( response : ĠResource < ResponseBody >): ĠResource < T > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( response . data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( T :: class . java . simple Name . equals ( Login Response :: class . java . simple Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResource < Login Response >( response . status , Ġgson . fromJson ( response . data . string (), ĠLogin Response :: class . java ), Ġresponse . message ) Ġas ĠResource < T > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull Ġas ĠResource < T > ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġlogin Ġrequest Ġbody Ġin Ġmutable Ġvariable ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlogin ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Login ( login : ĠAPI Request Data ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ login . value Ġ!= Ġlogin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ login . value Ġ= Ġlogin ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetry Ġoption Ġto Ġcall Ġapi Ġagain . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġfun Ġretry () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ login . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ login . value Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }