package Ġcom . example . instagram _ clone _ clean _ architecture . app . domain . data _ source Ċ Ċ import Ġandroid . net . Uri Ċ import Ġcom . example . instagram _ clone _ clean _ architecture . app . domain . model . User Domain Model Ċ import Ġcom . example . library _ base . domain . exception . Failure Ċ import Ġcom . example . library _ base . domain . utility . Either Ċ import Ġjava . io . File Ċ Ċ interface ĠCache DataSource Ġ{ ĊĊĠĠĠ Ġfun Ġinit ( cacheDir : ĠFile ): ĠUnit ĊĊĠĠĠ Ġfun Ġget AuthToken (): ĠString ? ĊĊĠĠĠ Ġfun Ġcache AuthToken ( token : ĠString ?): ĠUnit ĊĊĠĠĠ Ġsuspend Ġfun Ġcache Compressed Upload Image ( ĊĠĠĠĠĠĠĠ ĠfileName : ĠString , ĊĠĠĠĠĠĠĠ ĠbyteArray : ĠByteArray ĊĠĠĠ Ġ): ĠEither < File , ĠFailure > ĊĊĠĠĠ Ġsuspend Ġfun Ġcache Login UserProfile ( user Profile : ĠUser Domain Model ?): ĠEither < Unit , ĠFailure > ĊĊĠĠĠ Ġsuspend Ġfun Ġget Login User (): ĠEither < User Domain Model , ĠFailure > ĊĊĠĠĠ Ġ// ĠWhen Ġprompt Ġuser Ġto Ġchoose Ġimage Ġeither Ġfor Ġavatar Ġor Ġpost , Ġthe Ġactivity / fragment Ġwill ĊĠĠĠ Ġ// Ġpaused Ġand Ġawait Ġfor Ġresult . ĠSo , Ġin Ġorder Ġto Ġprovide Ġuser Ġa Ġselect - and - return - experience , ĊĠĠĠ Ġ// Ġthe Ġapplication Ġdiv ides Ġthe Ġprocess Ġinto Ġthree Ġsteps : ĊĠĠĠ Ġ// ĠĠĠĠĠĠ 1 . ĠPrompt Ġuser Ġto Ġselect / take Ġphoto Ġeither Ġfrom Ġfragment Ġor Ġactivity , Ġand Ġthe Ġactivity / ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġfragment Ġwill Ġpause Ġto Ġwait Ġfor Ġreturn . ĊĠĠĠ Ġ// ĠĠĠĠĠĠ 2 . ĠAfter Ġreturn Ġfrom Ġcamera / gallery , Ġthe Ġ` on Activity Result ` Ġof Ġactivity Ġshould Ġbe Ġtriggered , ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġit Ġis Ġthis Ġpoint Ġwe Ġcall Ġ` load Image ` Ġthrough Ġdedicated ĠUse Case Ġto Ġcache Ġfile Ġin ĠLocal DataSource . ĊĠĠĠ Ġ// ĠĠĠĠĠĠ 3 . ĠAfter Ġ` on Activity Result `, Ġactivity / fragment Ġwill Ġresume . ĠSo , Ġby Ġcalling Ġ` load Image ` Ġthrough ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġdedicated ĠUse Case Ġin Ġ` onStart ` Ġcan Ġreturn Ġcache Ġimage Ġin ĠLocal DataSource . ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġ( If Ġthere 's Ġno Ġloaded - image , Ġjust Ġallow Ġuser Ġto Ġselect Ġagain .) ĊĊĠĠĠ Ġsuspend Ġfun Ġcache User Selected Image Uri ( uri : ĠUri ): ĠEither < Unit , ĠFailure > ĊĊĠĠĠ Ġsuspend Ġfun Ġconsume Cached Selected Image Uri (): ĠEither < Uri , ĠFailure > Ċ Ċ }