package Ġapp . me lon . user . ui Ċ Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . os . bundle Of Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . commit Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġapp . me lon . account . api . User Manager Ċ import Ġapp . me lon . base . framework . Base D agger Fragment Ċ import Ġapp . me lon . base . ui . Mel on Button Ċ import Ġapp . me lon . user . Edit Profile Activity Ċ import Ġapp . me lon . user . Follow ers Activity Ċ import Ġapp . me lon . user . Following Activity Ċ import Ġapp . me lon . user . Profile Image Activity Ċ import Ġapp . me lon . user . R Ċ import Ġapp . me lon . user . databinding . Content Profile Header Binding Ċ import Ġapp . me lon . user . databinding . Fragment Profile Binding Ċ import Ġapp . me lon . user . ui . detail . UserProfile Fragment Ċ import Ġapp . me lon . user . ui . detail . UserProfile ViewModel Ċ import Ġapp . me lon . user . ui . detail . UserProfile ViewState Ċ import Ġapp . me lon . user . ui . detail . create Ċ import Ġapp . me lon . user . ui . mine . My Profile Tab Fragment Ċ import Ġapp . me lon . util . event . On Back Pressed Handler Ċ import Ġapp . me lon . util . extensions . getColor Compat Ċ import Ġapp . me lon . util . extensions . resolve Theme Ċ import Ġapp . me lon . util . extensions . viewModel Provider Factory Of Ċ import Ġapp . me lon . util . formatter . Mel on Number Formatter Ċ import Ġco il . load Ċ import Ġco il . transform . Circle Crop Transformation Ċ import Ġcom . google . android . material . app bar . AppBar Layout Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . math . min ĊĊ Ċ internal Ġclass ĠProfile Fragment Ġ: ĠBase D agger Fragment < Fragment Profile Binding >(), ĠOn Back Pressed Handler Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġheader Binding : ĠContent Profile Header Binding Ġget () Ġ= Ġbinding . header ĊĊĠĠĠ Ġprivate Ġval Ġuid : ĠString Ġget () Ġ= Ġarguments ?. getString ( KEY _ USER _ ID ) Ġ?: Ġ"" ĊĠĠĠ Ġprivate Ġval Ġis My Profile Ġget () Ġ= Ġuid Ġ== Ġuser Manager . user !!. id ĊĊĠĠĠ Ġprivate Ġval Ġfragment Container Id Ġget () Ġ= Ġbinding . container . id ĊĠĠĠ Ġprivate Ġval Ġcurrent Fragment : ĠFragment ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġchild FragmentManager . find Fragment ById ( fragment Container Id ) ĊĊĠĠĠ Ġ@ Inject Ġinternal Ġlateinit Ġvar ĠviewModel Factory : ĠUser Profile ViewModel . Factory ĊĠĠĠ Ġ@ Inject Ġinternal Ġlateinit Ġvar Ġformatter : ĠMel on Number Formatter ĊĊĠĠĠ Ġ@ Inject Ġinternal Ġlateinit Ġvar Ġuser Manager : ĠUser Manager ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠUser Profile ViewModel Ġby Ġview Models (:: require Activity ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Provider Factory Of Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Factory . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġuid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Binding ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ) Ġ= ĠFragment Profile Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( binding : ĠFragment Profile Binding , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( binding , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġif Ġ( is My Profile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMy Profile Tab Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Profile Fragment . newInstance ( uid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild FragmentManager . commit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( fragment Container Id , Ġfragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinit Data () ĊĠĠĠĠĠĠĠ Ġinit View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Fragment ?. on Options ItemSelected ( item ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== Ġandroid . R . id . home ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( current Fragment Ġas ? ĠOn Back Pressed Handler )?. on Back Pressed () Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Toolbar () ĊĠĠĠĠĠĠĠ Ġsetup Animation () ĊĠĠĠĠĠĠĠ Ġupdate View Visibility () ĊĠĠĠĠĠĠĠ Ġset Listeners () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Toolbar () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġrequire Activity () Ġas ĠAppCompatActivity ĊĠĠĠĠĠĠĠ Ġactivity . set Support ActionBar ( binding . toolbar ) ĊĠĠĠĠĠĠĠ Ġactivity . support ActionBar ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Display Show Home Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Animation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbackground Height Ġ= Ġresources . get Dimension Pixel Size ( R . dim en . my _ profile _ background _ height ) ĊĠĠĠĠĠĠĠ Ġval Ġaction Bar Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value . complex To Dimension Pixel Size ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). resolve Theme ( android . R . attr . action Bar Size ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . display Metrics ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġtrigger Edge Ġ= Ġbackground Height Ġ- Ġaction Bar Height ĊĊĠĠĠĠĠĠĠ Ġval Ġavatar Size Ġ= Ġresources . get Dimension Pixel Size ( R . dim en . my _ profile _ avatar _ size ) ĊĠĠĠĠĠĠĠ Ġheader Binding . avatar . pivot X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġheader Binding . avatar . pivot Y Ġ= Ġavatar Size . toFloat () ĊĠĠĠĠĠĠĠ Ġbinding . app Bar . add On Offset Changed Listener ( AppBar Layout . On Offset Changed Listener Ġ{ Ġ_, Ġvertical Offset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġratio Ġ= Ġmin (( vertical Offset Ġ* Ġ- 1 f ) Ġ/ Ġtrigger Edge , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Binding . avatar . scale X Ġ= Ġ 1 Ġ- Ġ 0 . 5 f Ġ* Ġratio ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Binding . avatar . scale Y Ġ= Ġ 1 Ġ- Ġ 0 . 5 f Ġ* Ġratio ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . app Bar . add On Offset Changed Listener ( object Ġ: ĠApp Bar Layout . On Offset Changed Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Show Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġscroll Range Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Offset Changed ( app Bar Layout : ĠApp Bar Layout , Ġvertical Offset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scroll Range Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll Range Ġ= Ġapp Bar Layout . total Scroll Range ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar . setTitle TextColor ( Color . TRANSP ARENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar . set BackgroundColor ( Color . TRANSP ARENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( trigger Edge Ġ+ Ġvertical Offset Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar . set BackgroundColor ( require Context (). getColor Compat ( R . color . bg Primary )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar . setTitle TextColor ( app Bar Layout . context . getColor Compat ( R . color . Text Primary )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Show Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Show ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar . set BackgroundColor ( Color . TRANSP ARENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar . setTitle TextColor ( Color . TRANSP ARENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Show Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate View Visibility () Ġ= Ġwith ( header Binding ) Ġ{ ĊĠĠĠĠĠĠĠ Ġedit Profile . isVisible Ġ= Ġis My Profile ĊĠĠĠĠĠĠĠ Ġfollow . isVisible Ġ= Ġis My Profile . not () ĊĊĠĠĠĠĠĠĠ Ġ// Ġtesting ĊĠĠĠĠĠĠĠ Ġfollow . update ( Mel on Button . Style . BORDER , ĠR . string . app _ common _ follow ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġheader Binding . edit Profile . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdit Profile Activity . start ( it . context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġheader Binding . follow . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . toggle Follow State () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtesting ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Binding . follow . update ( Mel on Button . Style . SOLID , ĠR . string . app _ common _ following ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Data () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . select Ob serve ( UserProfile ViewState :: user ). observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġuser Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Ġ?: Ġreturn @ Observer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( header Binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground . load ( user . background Url ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross fade ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavatar . load ( user . avatar Url ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformations ( Circle Crop Transformation ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Username . text Ġ= Ġuser . username ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile UserId . text Ġ= ĠgetString ( R . string . user _ custom _ id , Ġuser . custom Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile School Info . text Ġ= Ġuser . school ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv Follow ers . text Ġ= Ġformatter . format ( user . follow er Count Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv Following . text Ġ= Ġformatter . format ( user . following Count Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription . text Ġ= Ġuser . description . or Empty () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavatar . setOnClickListener Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . avatar Url ?. let Ġ{ Ġurl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProfile Image Activity . start ( require Context (), Ġurl , Ġuser . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfollowing Entry . setOnClickListener Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFollowing Activity . start ( require Context (), Ġuser . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfollow ers Entry . setOnClickListener Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFollow ers Activity . start ( require Context (), Ġuser . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar . title Ġ= Ġuser . username ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ USER _ ID Ġ= Ġ" KEY _ USER _ ID " ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġnew Instance ( uid : ĠString ): ĠProfile Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠProfile Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġbundle Of ( KEY _ USER _ ID Ġto Ġuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }