/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠL ittle ĠD rops Ġof ĠR ain ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠMIT ĠLicense Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// opensource . org / licenses / MIT Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . presentation . ui . user _ profile Ċ Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . result . Activity Result Callback Ċ import Ġandroidx . activity . result . Activity Result Launcher Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . appcompat . app . ActionBar Drawer Toggle Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ import Ġandroidx . drawer layout . widget . Drawer Layout Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . navigation . find Nav Controller Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . R Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . dao . Files Dao Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . dao . User Dao Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . interfaces . On File Uploaded Failure Listener Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . data . interfaces . On File Uploaded Listener Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . databinding . Fragment UserProfile Binding Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . domain . helpers . Logged User Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . domain . helpers . is Safe To Access ViewModel Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . domain . helpers . run On Ui Thread Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . presentation . contracts . Crop Image Result Contract Ċ import Ġapp . web . die g of lass a _ site . lit tled rop so fr ain . presentation . helper . view Lifecycle Ċ import Ġco il . load Ċ import Ġcom . google . android . material . bottomnavigation . Bottom Navigation View Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ import Ġorg . k oin . android x . view model . ext . android . state ViewModel Ċ Ċ class ĠUser Profile Fragment Ġ: ĊĠĠĠ ĠFragment (), ĊĠĠĠ ĠOn File Uploaded Listener , ĊĠĠĠ ĠOn File Uploaded Failure Listener , ĊĠĠĠ ĠActivity Result Callback < Uri ?> Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance () Ġ= ĠUser Profile Fragment () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtoggle : ĠAction Bar Drawer Toggle ĊĊĠĠĠ Ġval ĠviewModel : ĠUser Profile ViewModel Ġby Ġstate ViewModel () ĊĠĠĠ Ġprivate Ġvar Ġbinding : ĠFragment UserProfile Binding Ġby Ġview Lifecycle () ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠgetContent Launcher : ĠActivity Result Launcher < String > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcrop Image Launcher : ĠActivity Result Launcher < Pair < Uri , ĠPair < Float , ĠFloat >>> ĊĠĠĠ Ġprivate Ġvar Ġis Stopped Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment UserProfile Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġtoolbar Ġ= Ġactivity ?. findViewById < Toolbar >( R . id . toolbar ) ĊĠĠĠĠĠĠĠ Ġtoolbar ?. set Navigation OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawer Layout Ġ= Ġactivity ?. findViewById < Drawer Layout >( R . id . drawer _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Ġ= ĠAction Bar Drawer Toggle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . navigation _ drawer _ open , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . navigation _ drawer _ close ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout ?. add Drawer Listener ( toggle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drawer Layout Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle . sync State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. find Nav Controller ( R . id . nav _ host _ fragment )?. navigate Up () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfab Ġ= Ġactivity ?. findViewById < Floating ActionButton >( R . id . fab ) ĊĠĠĠĠĠĠĠ Ġfab ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġbinding . user Btn Update . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġbinding . user Btn Change Image . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġbinding . user Btn Change Image . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetContent Launcher . launch (" image /* ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . user Btn Update . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Logged User . user LiveData . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog ged User . user LiveData . value !!. name Ġ= Ġbinding . user Ed t Txt Name . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog ged User . user LiveData . value !!. email Ġ= Ġbinding . user Txt Vw Email . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Dao . insert OrUpdate ( Logged User . user LiveData . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , ĠgetString ( R . string . saved ), ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate Up () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . user Btn Exit . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate Up () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcrop Image Launcher Ġ= Ġregister For Activity Result ( Crop Image Result Contract (), Ġthis ) ĊĠĠĠĠĠĠĠ ĠgetContent Launcher Ġ= Ġregister For Activity Result ( Activity Result Contracts . Get Content ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Logged User . user LiveData . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Logged User . user LiveData . value !!. imageUrl Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles Dao . remove ( Uri . parse ( Logged User . user LiveData . value !!. imageUrl )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog ged User . user LiveData . value !!. imageUrl Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . user Picture . setImage Drawable ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠPair ( it , ĠC rop Image Result Contract . AS PECT _ RATIO _ BOX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrop Image Launcher . launch ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠsetCurrent User To UI () ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . name Ġ= Ġbinding . user Ed t Txt Name . text . toString () ĊĠĠĠĠĠĠĠ ĠviewModel . email Ġ= Ġbinding . user Txt Vw Email . text . toString () ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon ViewState Restore d ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on ViewState Restore d ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġupdate UI ( viewModel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Stopped Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this :: toggle . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawer Layout : ĠDraw er Layout Ġ= Ġrequire Activity (). findViewById ( R . id . drawer _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout . remove Drawer Listener ( toggle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Stopped Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate UI ( view State : ĠUser Profile ViewModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . user Ed t Txt Name . setText ( view State . name ) ĊĠĠĠĠĠĠĠ Ġbinding . user Txt Vw Email . text Ġ= Ġview State . email ĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe ĠUI ĊĠĠĠĠĠĠĠ Ġval Ġb nv Ġ= Ġactivity ?. findViewById < Bottom Navigation View >( R . id . nav _ bottom ) ĊĠĠĠĠĠĠĠ Ġb nv ?. visibility Ġ= ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Loading Screen () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . user Profile Progress . visibility Ġ= ĠView . VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Loading Screen () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Safe To Access ViewModel () Ġ&& Ġ! is Stopped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . user Profile Progress . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetCurrent User To UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠLog ged User . user LiveData . value ĊĠĠĠĠĠĠĠ ĠLog ged User . user LiveData . value Ġ= Ġuser ĊĠĠĠĠĠĠĠ Ġif Ġ( Logged User . user LiveData . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . name Ġ= ĠLog ged User . user LiveData . value ?. name !! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . email Ġ= ĠLog ged User . user LiveData . value ?. email !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UI ( viewModel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . user Ed t Txt Name . setText ( Logged User . user LiveData . value !!. name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . user Txt Vw Email . text Ġ= ĠLog ged User . user LiveData . value !!. email ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . user Picture . load ( Logged User . user LiveData . value !!. imageUrl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholder ( R . drawable . image _ placeholder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . user Btn Change Image . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . user Btn Update . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( uri : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Loading Screen () ĊĠĠĠĠĠĠĠ ĠFiles Dao . insert ( uri !! , Ġthis , Ġthis , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon File Uploaded ( local : ĠUri , Ġremote : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Logged User . user LiveData . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Logged User . user LiveData . value !!. imageUrl Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles Dao . remove ( Uri . parse ( Logged User . user LiveData . value !!. imageUrl )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog ged User . user LiveData . value !!. imageUrl Ġ= Ġremote . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . user Picture . load ( Logged User . user LiveData . value !!. imageUrl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholder ( R . drawable . image _ placeholder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhide Loading Screen () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon File Uploaded Failure ( file : ĠUri , Ġexception : ĠException ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( context , ĠgetString ( R . string . file _ upload _ failure ), ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġhide Loading Screen () ĊĠĠĠ Ġ} Ċ } Ċ