package Ġcom . sop ho un . ui _ state Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġandroidx . activity . On Back Pressed Callback Ċ import Ġandroidx . annotation . Call Super Ċ import Ġandroidx . annotation . Layout Res Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . sop ho un . ui _ state . state . Ui State Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ abstract Ġclass ĠBase Fragment Ġ: ĠFragment (), ĠCor outine Scope Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġthis Ġproperty Ġto ĠViewModel Ġfactory Ġto Ġsub Ġclass ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar ĠviewModel Factory : ĠViewModel Provider . Factory ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġ_ job Ġ= ĠJob () ĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ job Ġ+ ĠDispatch ers . IO ĊĊĠĠĠ Ġval Ġbase Activity : ĠBase Activity Ġby Ġlazy Ġ{ ĠWeak Reference ( activity ). get () Ġas ĠBase Activity Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ on Back Press ] ĠCallback Ġfor Ġactivity Ġand Ġfragment ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġback Pressed Dispatcher Ġ= Ġobject : ĠOn Back Pressed Callback ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle On Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! on Back Press ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Activity . on Back Press () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSub Ġclass Ġmust s Ġprovide Ġlayout Ġresource ĊĠĠĠĠ Ġ* Ġby Ġoverride Ġthis Ġmethod ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Layout Res Ġabstract Ġfun Ġlayout (): ĠInt ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( layout (), Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbase Activity . on Back Pressed Dispatcher . add Callback ( view Lifecycle Owner , Ġback Pressed Dispatcher ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAttach ĠViewModel Ġwith ĠUi State Ġchanged ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsetup With ViewModel ( var arg ĠviewModel : ĠBase ViewModel ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . ui State (). observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġui State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon StateChanged ( ui State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUI Ġmust Ġoverride Ġthis Ġmethod Ġto Ġupdate Ġtheir ĊĠĠĠĠ Ġ* ĠUI ĠState ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġopen Ġfun Ġon StateChanged ( state : ĠUi State ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Animation ( transit : ĠInt , Ġenter : ĠBoolean , Ġnext Anim : ĠInt ): ĠAnimation ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġlistener Ġto Ġthe Ġanimation Ġof Ġfragment Ġtransition ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( next Anim Ġ!= Ġ 0 x 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= ĠAnimation Utils . load Animation ( context ?. application Context , Ġnext Anim ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation . set Animation Listener ( object Ġ: ĠAnimation . Animation Listener { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAnimation ?) Ġ{ Ġon Fragment Animation Start ( animation ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( animation : ĠAnimation ?) Ġ{ Ġon Fragment Animation Repeat ( animation ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAnimation ?) Ġ{ Ġon Fragment Animation End ( animation ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . onCreate Animation ( transit , Ġenter , Ġnext Anim ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠListen Ġto Ġfragment Ġanimation Ġstart ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġon Fragment Animation Start ( animation : ĠAnimation ?) Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠListen Ġto Ġfragment Ġanimation Ġrepeat ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġon Fragment Animation Repeat ( animation : ĠAnimation ?) Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠListen Ġto Ġfragment Ġanimation Ġend ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġon Fragment Animation End ( animation : ĠAnimation ?) Ġ{} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCancel Ġcoroutine Ġjob ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġ_ job . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġopen Ġfun Ġon Back Press (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ