package Ġapp . me lon . user . image Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . provider . Media Store Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġapp . me lon . account . api . User Manager Ċ import Ġapp . me lon . base . framework . Single Event Ċ import Ġapp . me lon . user . inter actor . Sync Avatar Update Ċ import Ġapp . me lon . user . inter actor . Update Avatar Ċ import Ġapp . me lon . util . storage . Storage Handler Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlin . Result Ċ import Ġkotlinx . coroutines . flow . collect Latest Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util . Date Ċ import Ġjava . util . Locale ĊĊ Ċ internal Ġclass ĠProfile Image ViewModel Ġconstructor ( ĊĠĠĠ Ġapplication : ĠApplication , ĊĠĠĠ Ġprivate Ġval Ġsaved State Handle : ĠSaved State Handle , ĊĠĠĠ Ġprivate Ġval Ġupdate Avatar : ĠUpdate Avatar , ĊĠĠĠ Ġprivate Ġval Ġsync Avatar Change : ĠSync Avatar Update , ĊĠĠĠ Ġprivate Ġval Ġstorage Handler : ĠStorage Handler , ĊĠĠĠ Ġprivate Ġval Ġuser Manager : ĠUser Manager Ċ ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġget Application () ĊĊĠĠĠ Ġprivate Ġval Ġ_ avatar ChangeEvent Ġ= ĠMutable LiveData < Single Event < Uri >>() ĊĠĠĠ Ġinternal Ġval Ġavatar ChangeEvent : ĠLive Data < Single Event < Uri >> Ġ= Ġ_ avatar ChangeEvent ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTake Picture Ġactivity Result Ġaction Ġisn 't Ġreturning Ġthe Ġ[ Uri ] Ġonce Ġthe Ġimage Ġhas Ġbeen Ġtaken , Ġso ĊĠĠĠĠ Ġ* Ġwe Ġneed Ġto Ġsave Ġthe Ġtemporarily Ġcreated ĠURI Ġin Ġ[ saved State Handle ] Ġuntil Ġwe Ġhandle Ġits Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsave Temp or arily Photo Uri ( uri : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsaved State Handle [" temporary Photo Uri "] Ġ= Ġuri ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval Ġtemporary Photo Uri : ĠUri ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsaved State Handle . get (" temporary Photo Uri ") ĊĊĠĠĠ Ġinternal Ġfun Ġavatar Changed ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ avatar ChangeEvent . post Value ( Single Event (( uri ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġdelete Temporary Uri () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary Photo Uri ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . delete ( it , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Temp or arily Photo Uri ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġcreate Ġa Ġ[ Uri ] Ġwhere Ġthe Ġimage Ġwill Ġbe Ġstored ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġsuspend Ġfun Ġcreate Photo Uri (): ĠUri ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimage Collection Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Images . Media . getContent Uri ( Media Store . VOLUME _ EXTERNAL _ PRIMARY ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Images . Media . EXTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Image Ġ= ĠContent Values (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Media Store . Images . Media . DISPLAY _ NAME , Ġgenerate Filename ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġmethod Ġwill Ġperform Ġa Ġbinder Ġtransaction Ġwhich Ġis Ġbetter Ġto Ġexecute Ġoff Ġthe Ġmain Ġthread ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . insert ( image Collection , Ġnew Image ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ update Result Ġ= ĠMutable LiveData < Result < String >>() ĊĠĠĠ Ġinternal Ġval Ġupdate Result : ĠLive Data < Result < String >> Ġ= Ġ_ update Result ĊĊĠĠĠ Ġprivate Ġval Ġ_ sync Result Ġ= ĠMutable LiveData < Unit >() ĊĠĠĠ Ġinternal Ġval Ġsync Result : ĠLive Data < Unit > Ġ= Ġ_ sync Result ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Avatar . observe (). collect Latest Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ update Result . post Value ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġcheck Is My Profile ( uid : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Manager . user ?. id Ġ== Ġuid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġsync Avatar Update ToLocal ( uid : ĠString , Ġurl : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsync Avatar Change . update Avatar ( uid , Ġurl ) ĊĠĠĠĠĠĠĠ Ġ_ sync Result . post Value ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġupdate Avatar ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġavatar Ġ= Ġstorage Handler . copy File To Cache Dir ( uri , Ġfilename Ġ= ĠAV AT AR _ CACHE _ FILENAME ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Avatar ( Update Avatar . Params ( avatar )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAV AT AR _ CACHE _ FILENAME Ġ= Ġ" updated _ avatar " ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġgenerate Filename ( extension : ĠString Ġ= Ġ" jpg "): ĠString Ġ{ ĊĠĠĠ Ġval Ġcurrent DateTime Ġ= ĠSimpleDateFormat (" yyyy - MM - dd _ HH : mm : ss ", ĠLocale . getDefault ()). format ( Date ()) ĊĠĠĠ Ġreturn Ġ" Mel on _${ current DateTime }. $ extension " Ċ }