package Ġcom . ade mir . exo transition in Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . app . Shared Element Callback Ċ import Ġandroidx . core . os . bundle Of Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . transition . Fade Ċ import Ġandroidx . transition . Slide Ċ import Ġandroidx . transition . Transition Inflater Ċ import Ġcom . ade mir . exo transition in . databinding . Fragment Player Binding Ċ import Ġcom . google . android . ex op layer 2 . ui . Player View ĊĊ Ċ class ĠPlayer Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview Binding : ĠFragment Player Binding ĊĠĠĠ Ġprivate Ġvar Ġvideo : ĠVideo ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġshared Element Callback Ġ= Ġobject Ġ: ĠShared Element Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Shared Element End ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Element Names : ĠMutable List < String > ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Elements : ĠMutable List < View > ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Element Snapshots : ĠMutable List < View >? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Shared Element End ( shared Element Names , Ġshared Elements , Ġshared Element Snapshots ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Elements ?. forEach Ġ{ Ġshared View Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shared View . transition Name Ġ== Ġvideo ?. let (:: get Transition Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= ĠPlayer Singleton . getInstance ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold View Ġ= Ġshared View Ġas ĠPlayer View Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer View . switch Target View ( player , Ġold View , Ġview Binding . player View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon ViewState Restore d ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on ViewState Restore d ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle . add Observer ( view Binding . player View ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Enter Shared Element Callback ( shared Element Callback ) ĊĠĠĠĠĠĠĠ Ġpost p one Enter Transition () ĊĠĠĠĠĠĠĠ Ġread Args () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġview Binding Ġ= ĠFragment Player Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġvideo ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . player View . transition Name Ġ= Ġget Transition Name ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Element Enter Transition Ġ= ĠTransition Inflater . from ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate Transition ( R . transition . video _ shared _ element _ transition ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġview Binding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġshared Element Return Transition Ġ= ĠF ade () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( 2 0 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exclude Target ( view Binding . player View , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġreturn Transition Ġ= ĠSlide (). set Duration ( 2 0 0 0 L ) ĊĠĠĠĠĠĠĠ Ġview Binding . player View . lifecycle Ġ= Ġview Lifecycle Owner . lifecycle ĊĠĠĠĠĠĠĠ Ġview Binding . player View . player Ġ= ĠPlayer Singleton . getInstance ( require Context ()) ĊĠĠĠĠĠĠĠ Ġstart Post p oned Enter Transition () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Args () Ġ= Ġarguments ?. run Ġ{ ĊĠĠĠĠĠĠĠ Ġvideo Ġ= Ġget Parcelable ( VIDEO _ EXTRA ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠV IDE O _ EXTRA Ġ= Ġ" args _ video _ extra " ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( video : ĠVideo ) Ġ= ĠPlayer Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġbundle Of ( VIDEO _ EXTRA Ġto Ġvideo ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Transition Name ( video : ĠVideo ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthis Ġname Ġwon 't Ġbe Ġunique Ġif Ġthe Ġsame Ġvideo Ġappears Ġon Ġthe Ġlist Ġtwice ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" tr _ name _ video :${ video . hashCode () }" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }