package Ġchat . sphinx . chat _ tri be . ui Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . core . view . is G one Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġapp . cash . exhaustive . Ex haustive Ċ import Ġby . kir ich 1 4 0 9 . view binding delegate . view Binding Ċ import Ġchat . sphinx . chat _ common . databinding .* Ċ import Ġchat . sphinx . chat _ common . ui . Chat Fragment Ċ import Ġchat . sphinx . chat _ tri be . R Ċ import Ġchat . sphinx . chat _ tri be . databinding . Fragment Chat Tri be Binding Ċ import Ġchat . sphinx . chat _ tri be . databinding . Layout Pod cast Player Footer Binding Ċ import Ġchat . sphinx . concept _ image _ loader . Image Loader Ċ import Ġchat . sphinx . concept _ image _ loader . Image Loader Options Ċ import Ġchat . sphinx . concept _ image _ loader . Transformation Ċ import Ġchat . sphinx . menu _ bottom . databinding . Layout Menu Bottom Binding Ċ import Ġchat . sphinx . resources . databinding . Layout Boost Fire works Binding Ċ import Ġchat . sphinx . resources . getString Ċ import Ġchat . sphinx . wrapper _ common . Photo Url Ċ import Ġchat . sphinx . wrapper _ common . lightning . Sat Ċ import Ġchat . sphinx . wrapper _ common . lightning . as Formatted String Ċ import Ġchat . sphinx . wrapper _ contact . Contact Ċ import Ġchat . sphinx . wrapper _ podcast . Pod cast Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġio . mat the wn el son . android _ feature _ screens . util . g one Ċ import Ġio . mat the wn el son . android _ feature _ screens . util . g one If False Ċ import Ġio . mat the wn el son . android _ feature _ screens . util . visible Ċ import Ġio . mat the wn el son . concept _ views . view state . collect Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjavax . inject . Inject Ċ Ċ @ Android EntryPoint Ċ internal Ġclass ĠChat Tri be Fragment : ĠChat Fragment < ĊĠĠĠĠĠĠĠ ĠFragment Chat Tri be Binding , ĊĠĠĠĠĠĠĠ ĠChat Tri be Fragment Args , ĊĠĠĠĠĠĠĠ ĠChat Tri be ViewModel , ĊĠĠĠĠĠĠĠ Ġ>( R . layout . fragment _ chat _ tri be ) Ċ { ĊĠĠĠ Ġprivate Ġval Ġpod cast Player Binding : ĠLayout Pod cast Player Footer Binding Ġby Ġview Binding ( Layout Pod cast Player Footer Binding :: bind , ĠR . id . include _ podcast _ player _ footer ) ĊĊĠĠĠ Ġoverride Ġval Ġbinding : ĠFragment Chat Tri be Binding Ġby Ġview Binding ( Fragment Chat Tri be Binding :: bind ) ĊĊĠĠĠ Ġoverride Ġval Ġfooter Binding : ĠLayout Chat Footer Binding Ġby Ġview Binding ( ĊĠĠĠĠĠĠĠ ĠLayout Chat Footer Binding :: bind , ĠR . id . include _ chat _ tri be _ footer ĊĠĠĠ Ġ) ĊĠĠĠ Ġoverride Ġval Ġheader Binding : ĠLayout Chat Header Binding Ġby Ġview Binding ( ĊĠĠĠĠĠĠĠ ĠLayout Chat Header Binding :: bind , ĠR . id . include _ chat _ tri be _ header ĊĠĠĠ Ġ) ĊĠĠĠ Ġoverride Ġval Ġreply ing Message Binding : ĠLayout Message Reply Binding Ġby Ġview Binding ( ĊĠĠĠĠĠĠĠ ĠLayout Message Reply Binding :: bind , ĠR . id . include _ chat _ tri be _ message _ reply ĊĠĠĠ Ġ) ĊĠĠĠ Ġoverride Ġval Ġselected Message Binding : ĠLayout Selected Message Binding Ġby Ġview Binding ( ĊĠĠĠĠĠĠĠ ĠLayout Selected Message Binding :: bind , ĠR . id . include _ chat _ tri be _ selected _ message ĊĠĠĠ Ġ) ĊĠĠĠ Ġoverride Ġval Ġselected Message Holder Binding : ĠLayout Message Holder Binding Ġby Ġview Binding ( ĊĠĠĠĠĠĠĠ ĠLayout Message Holder Binding :: bind , ĠR . id . include _ layout _ message _ holder _ selected _ message ĊĠĠĠ Ġ) ĊĠĠĠ Ġoverride Ġval Ġattachment Send Binding : ĠLayout Attachment Send Preview Binding Ġby Ġview Binding ( ĊĠĠĠĠĠĠĠ ĠLayout Attachment Send Preview Binding :: bind , ĠR . id . include _ chat _ tri be _ attachment _ send _ preview ĊĠĠĠ Ġ) ĊĠĠĠ Ġoverride Ġval Ġmenu Binding : ĠLayout Chat Menu Binding Ġby Ġview Binding ( ĊĠĠĠĠĠĠĠ ĠLayout Chat Menu Binding :: bind , ĠR . id . include _ chat _ tri be _ menu ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġval Ġcall Menu Binding : ĠLayout Menu Bottom Binding Ġby Ġview Binding ( ĊĠĠĠĠĠĠĠ ĠLayout Menu Bottom Binding :: bind , ĠR . id . include _ layout _ menu _ bottom _ call ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġboost Animation Binding : ĠLayout Boost Fire works Binding Ġby Ġview Binding ( ĊĠĠĠĠĠĠĠ ĠLayout Boost Fire works Binding :: bind , ĠR . id . include _ layout _ boost _ fire works ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġval Ġmenu Enable Payments : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġval Ġre cyclerView : ĠRecyclerView ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbinding . re cyclerView Messages ĊĊĠĠĠ Ġoverride Ġval ĠviewModel : ĠChat Tri be ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġimage Loader In j : ĠImage Loader < ImageView > ĊĠĠĠ Ġoverride Ġval Ġimage Loader : ĠImage Loader < ImageView > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġimage Loader In j ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsetup Boost Animation ( ĊĠĠĠĠĠĠĠ Ġphoto Url : ĠPhoto Url ?, ĊĠĠĠĠĠĠĠ Ġamount : ĠSat ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġboost Animation Binding . apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġphoto Url ?. let Ġ{ Ġphoto Url Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Loader . load ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageView Profile Picture , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphoto Url . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Loader Options . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. placeholder Res Id ( chat . sphinx . podcast _ player . R . drawable . ic _ profile _ avatar _ circle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transformation ( Transformation . Circle Crop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView S ats Amount . text Ġ= Ġamount ?. as Formatted String () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlo tt ie Animation View . add Animator Listener ( object Ġ: ĠAn imator . Animator Listener { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . g one ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( animation : ĠAn imator ?) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Cancel ( animation : ĠAn imator ?) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAn imator ?) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfigure Cont ributions ( cont ributions : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġheader Binding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Chat Header Cont ributions Icon . visible ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Chat Header Cont ributions . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġcontributions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfigure Pod cast Player ( podcast : ĠPod cast ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpod cast Player Binding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( root . is G one ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To Bottom ( callback Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . g one If False ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Play Pause Button ( podcast . is Playing ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Episode Ġ= Ġpod cast . getCurrent Episode () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Episode Title . text Ġ= Ġcurrent Episode . title ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ProgressBar ( podcast ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Pod cast OnClick Listeners ( podcast ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset ProgressBar ( podcast : ĠPod cast ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Stop Supervisor . scope . launch ( viewModel . main Immediate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress : ĠInt Ġ= Ġwith Context ( viewModel . io ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpod cast . get Playing Progress ( viewModel :: retrieve Episode Duration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠArithmetic Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpod cast Player Binding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress With Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar Container . meas ured Width . toDouble () Ġ* Ġ( progress . toDouble () Ġ/ Ġ 1 0 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . layout Params . width Ġ= Ġprogress With . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . request Layout () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Loading Wheel ( show : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpod cast Player Binding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar Audio Loading . g one If False ( show ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Play Pause Button ( playing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpod cast Player Binding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Play Pause Button . text Ġ= ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( playing ) ĠR . string . material _ icon _ name _ pause _ button Ġelse ĠR . string . material _ icon _ name _ play _ button ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Pod cast OnClick Listeners ( podcast : ĠPod cast ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpod cast Player Binding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Episode Title . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . goTo Pod cast Player Screen () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Play Pause Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . play Pause Pod cast () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Forward 3 0 Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . seek To ( 3 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ProgressBar ( podcast ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Boost Pod cast Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . send Pod cast Boost () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboost Animation Binding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . visible ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlo tt ie Animation View . play Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsubscribe To ViewState Flow () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . subscribe To ViewState Flow () ĊĊĠĠĠĠĠĠĠ Ġon Stop Supervisor . scope . launch ( viewModel . main Immediate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . podcast ViewState Container . collect Ġ{ Ġview State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Ex haustive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( view State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPod cast ViewState . Idle Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPod cast ViewState . Pod cast Loaded Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Pod cast Player ( view State . podcast ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPod cast ViewState . Pod cast Cont ributions Loaded Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Cont ributions ( view State . cont ributions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPod cast ViewState . Service Inactive Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Play Pause Button ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPod cast ViewState . Service Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Loading Wheel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPod cast ViewState . Media State Update Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Loading Wheel ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Pod cast Player ( view State . podcast ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon Stop Supervisor . scope . launch ( viewModel . main Immediate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . boost Animation ViewState Container . collect Ġ{ Ġview State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Ex haustive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( view State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoost Animation ViewState . Idle Ġ-> Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoost Animation ViewState . Bo os Animation Info Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Boost Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . photoUrl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview State . amount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ