package Ġcom . kon den ko . po cket w aka . domain . menu Ċ Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . De cel erate Interpolator Ċ import Ġandroidx . core . view . do On Layout Ċ import Ġandroidx . core . view . is G one Ċ import Ġandroidx . transition . Transition Manager Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Dialog Fragment Ċ import Ġcom . jak ew h art on . r xb ind ing 3 . view . click s Ċ import Ġcom . kon den ko . po cket w aka . R Ċ import Ġcom . kon den ko . po cket w aka . ui . Scale Ċ import Ġcom . kon den ko . po cket w aka . ui . scale Ċ import Ġcom . kon den ko . po cket w aka . utils . W aka Log Ċ import Ġcom . kon den ko . po cket w aka . utils . extensions . dp Ċ import Ġcom . kon den ko . po cket w aka . utils . extensions . set Margins Ċ import Ġcom . kon den ko . po cket w aka . utils . extensions . setSize Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġkotlinx . android . synt hetic . main . dialog _ app _ rating .* Ċ import Ġkotlinx . android . synt hetic . main . dialog _ app _ rating . view .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . math . round ToInt Ċ Ċ class ĠApp Rating Bottom Sheet Dialog Ġ: ĠBottom Sheet Dialog Fragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġrating Changes Ġ= ĠPublish Subject . create < Int >() ĊĊĠĠĠ Ġprivate Ġval Ġsend Feedback Click s Ġ= ĠPublish Subject . create < Unit >() ĊĊĠĠĠ Ġprivate Ġvar Ġis Negative Feedback State Shown Ġ= Ġfalse ĊĊĠĠĠ Ġvar Ġrating Reaction Delay : ĠLong Ġ= Ġ 3 0 0 ĊĊĠĠĠ Ġvar Ġexpanded Height Dp Ġ= Ġ 2 4 6 ĊĊĠĠĠ Ġvar Ġrating Bar Scale Collapsed Ġ= Ġ 0 . 7 f ĊĊĠĠĠ Ġvar Ġrating : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġvar Ġon Dismiss : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . dialog _ app _ rating , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Check Result ") ĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġrating bar _ rating _ dialog . rating Changes (). subscribe With ( rating Changes ) ĊĠĠĠĠĠĠĠ Ġbutton _ low _ rating _ action . click s (). subscribe With ( send Feedback Click s ) ĊĠĠĠĠĠĠĠ Ġrating bar _ rating _ dialog . rating Ġ= Ġrating ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġon Dismiss Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Dismiss ( dialog : ĠDialog Interface ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Dismiss ( dialog ) ĊĠĠĠĠĠĠĠ ĠW aka Log . d (" on Dismiss Ġ= Ġ$ on Dismiss ") ĊĠĠĠĠĠĠĠ Ġon Dismiss ?. invoke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrating Changes (): ĠObservable < Int > Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġrating Changes . delay ( rating Reaction Delay , ĠTimeUnit . MILLISECONDS , ĠAndroid Schedulers . main Thread ()) ĊĊĠĠĠ Ġfun Ġsend Feedback Click s () Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġsend Feedback Click s ĊĊĠĠĠ Ġfun Ġshow Low Rating State ( show : ĠBoolean , Ġis Mail Available : ĠBoolean , Ġsupport Email : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Negative Feedback State Shown Ġ&& Ġ! show Ġ|| Ġ! is Negative Feedback State Shown Ġ&& Ġshow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Negative Feedback State Shown Ġ= Ġshow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Mail Available Ġ&& Ġsupport Email Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext view _ low _ rating _ message . text Ġ= ĠgetString ( R . string . rating _ dialog _ low _ rating _ message _ no _ email _ app , Ġsupport Email ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! is Mail Available Ġ&& Ġsupport Email Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext view _ low _ rating _ message . text Ġ= ĠgetString ( R . string . rating _ dialog _ low _ rating _ message _ no _ email _ address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġview Ġas ? ĠViewGroup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent ?. do On Layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . update Title Margin ( show ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . animate Layout (! show , Ġ! show Ġ|| Ġ! is Mail Available Ġ&& Ġsupport Email Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠView . update Title Margin ( show Low Rating State : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrating Bar Margin Bottom Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. resources ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Dimension ( R . dim en . margin _ rating _ dialog _ rating _ bar _ bottom ). round ToInt () ĊĠĠĠĠĠĠĠ Ġrating bar _ rating _ dialog . set Margins ( bottom Ġ= Ġif Ġ( show Low Rating State ) Ġ 0 Ġelse Ġrating Bar Margin Bottom ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠViewGroup . animate Layout ( show Low Rating Mes ssage : ĠBoolean , Ġshow Low Rating Action : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Dialog Height Ġ= Ġheight . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġtarget Dialog Height Ġ= Ġrequire Context (). dp ( expanded Height Dp ) ĊĠĠĠĠĠĠĠ Ġval Ġinitial Rating Bar Scale Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġval Ġtarget Rating Bar Scale Ġ= ĠScale . of ( rating Bar Scale Collapsed ) ĊĠĠĠĠĠĠĠ ĠValue Animator . of Float ( 0 f , Ġ 1 f ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠDec el erate Interpolator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 3 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfraction Ġ= Ġanimated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsheet Height Ġ= Ġfraction . fraction To Value ( initial Dialog Height , Ġtarget Dialog Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrating Bar Scale Ġ= Ġfraction . fraction To Value ( initial Rating Bar Scale , Ġtarget Rating Bar Scale . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Size ( height Ġ= Ġsheet Height . round ToInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrating bar _ rating _ dialog . scale Ġ= ĠScale . of ( rating Bar Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext view _ low _ rating _ message ?. is G one Ġ= Ġshow Low Rating Mes ssage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton _ low _ rating _ action ?. is G one Ġ= Ġshow Low Rating Action ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransition Manager . begin Delayed Transition ( this @ animate Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFloat . fraction To Value ( initial Value : ĠFloat , Ġtarget Value : ĠFloat ) Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġinitial Value Ġ+ Ġ( this Ġ* Ġ( target Value Ġ- Ġinitial Value )) Ċ Ċ }